close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 13 years ago

Last modified 13 years ago

#1451 reopened doubt

Uso adecuado de los timesets

Reported by: Pedro Gea Owned by: Víctor de Buen Remiro
Priority: highest Milestone: Mantainance
Component: Kernel Version: 3.1
Severity: critical Keywords:
Cc:

Description

El uso de TimeSets (que no sean de los precompilados en TOL o predefinidos en la StdLib) tienen un comportamiento que me resulta un tanto incomprensible al guardar y cargar seires desde arhivos OZA.

No logro averiguar cual es la manera adecuada o la mejor manera de hacer esto, sin obtener mensajes de advertencia como los siguientes y lo que ello conlleva:

  • Al guardar:
    Warning: [] OIS: 
    El TimeSet no acotado 
    CtSem445 = Dating(data);
     depende de símbolos no visibles globalmente. Sólo los datos almacenados en la cache en [y1900m01d01,y2030m08d17] estarán accesibles cuando sea cargado
    
  • Al cargar:
    Warning: [] OIS: 
    Cannot rebuild virtual expression of non bounded TimeSet CtSem445 = Dating(serie)
    Only cached dates will be accessible between [y1900m01d01,y2030m08d17]
    To avoid this problem save just bounded time sets or use expressions that could be evaluated at OIS loading time.
    
  • Al cargar (nuevo):
    Warning: [] El objecto OIS ya tiene offset asignado: CtSem445
    

No entiendo incluso porqué me aparecen estos mensajes aunque tenga el timeset CtSem445 compilado y global antes y después de hacer uso de las funciones Ois.Load y Ois.Store.

¿Podría ponerse un ejemplo del uso adecuado de un timeset personalizado en el marco de un proyecto?

¿Hay alguna manera de sanear un OZA ya guardado (rehaciéndolo claro) para que deje de dar estos errores?

Attachments (1)

serie.oza (20.5 KB) - added by Pedro Gea 13 years ago.

Download all attachments as: .zip

Change History (19)

comment:1 Changed 13 years ago by Víctor de Buen Remiro

Por favor, necesito un código que reproduzca el problema.

comment:2 Changed 13 years ago by Víctor de Buen Remiro

Yo escribo estos tres ficheros:

  • check.01.tol :
    TimeSet CtSem445 =
    D(1)*M(1)+WD(6)-(D(2)+D(3))*M(1)-(D(31)+D(30)+D(29)+D(28)+D(27))*M(12);
    
  • check.02.tol :
    Set Include("check.01.tol");
    Serie ser = SubSer(CalVar(C,CtSem445), y2001, y2012);
    Real Ois.Store([[ser]],"ser.oza");
    
  • check.03.tol :
    Set Include("check.01.tol");
    Set Include("ser.oza");
    

Compilo el segundo en una sesión y luego el tercero en otra sesión y no me da ningún warning.

comment:3 Changed 13 years ago by Víctor de Buen Remiro

Si almacenas un TimeSet infinito cuya expresión depende de variables locales te avisa de que en la carga no será posible reconstruir la expresión porque no la puede adivinar, y sólo podrá usarse en el intervalo finito entre las fechas especificadas.

Si cuando lo cargas intentas usarlo fuera de ahí tendrías resultados imprevistos.

Lo único que me resulta extraño, y si es cierto se debe a un error en TOL, es que al cargar te dé el warning a pesar de existir como global. Yo eso no lo he visto jamás pero claro, tampoco se me ocurre usar fechados con expresiones no globales.

comment:4 Changed 13 years ago by Víctor de Buen Remiro

Ahora cambio el fichero check.01.tol para intentar reproducir el problema creando adrede un CtSem445_loc con expresión local irresoluble:

TimeSet CtSem445_glo =
D(1)*M(1)+WD(6)-(D(2)+D(3))*M(1)-(D(31)+D(30)+D(29)+D(28)+D(27))*M(12);

Serie ser.0 = CalVar(C,CtSem445_glo);
TimeSet CtSem445_loc = {
  Serie data = ser.0;
  Dating(data)
};

También cambio el segundo para meter ese CtSem445_loc en el OIS

Set Include("check.01.tol");
Set Include("check.01.tol");
Serie ser.1 = SubSer(CalVar(C,CtSem445_glo), y2001, y2012);
Serie ser.2 = SubSer(CalVar(C,CtSem445_loc), y2001, y2012);
Real Ois.Store([[ser.1,ser.2]],"ser.oza");

Lógicamente al compilarlo me da el warning esperado lo cual es absolutamente necesario pues estamos haciendo algo que puede ocasionar errores del peor tipo posible: los que no se ven.

Sin embargo al compilar el tercer fichero sin cambios no da ningún tipo de problema al existir CtSem445_loc lo que evita tener que reproducirlo.

Si en lugar de eso no cargo el check.01.tol e intento cargar el ser.oza entonces sí me da el warning porque estoy usando una foto finita de un TimeSet infinito, lo cual entraña un grave peligro si nos salimos del intervalo.

comment:5 Changed 13 years ago by Pedro Gea

Probablemente el error lo encuentre porque el TimeSet CtSem445 que se usó para crear la serie no es 'exactamente' el mismo que yo uso para leerlo, pero aquí hay un ejemplo que da el warning:

TimeSet CtSem445 = 
  D(1)*M(1)+WD(6)-(D(2)+D(3))*M(1)-(D(31)+D(30)+D(29)+D(28)+D(27))*M(12);
Set Ois.Load("serie.oza");

¿Puede hacerse algo para arrgelarlo y volverlo a guardar?

Changed 13 years ago by Pedro Gea

Attachment: serie.oza added

comment:6 Changed 13 years ago by Víctor de Buen Remiro

No es posible modificar un OIS bajo ningún concepto y sólo se pueden crear con Ois.Store, Ois.Create y Ois.UseModule.

Lo que hay que hacer es generarlo bien desde el principio.


comment:7 Changed 13 years ago by Víctor de Buen Remiro

Con lo que me has pasado ahora ya lo he reproducido.
A ver si veo lo que pasa.

comment:8 Changed 13 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: newclosed

(In [4202]) Fixes #1451

If there is a visible TimeSet with the same name of an OIS-stored TimeSet which expression is not reproducible, then the previously created will be used to avoid heavy warnings.

comment:9 Changed 13 years ago by Víctor de Buen Remiro

(In [4203]) Fixes #1451

If there is a visible TimeSet with the same name of an OIS-stored TimeSet which expression is not reproducible
then the previously created will be used to avoid heavy warnings.

comment:10 Changed 13 years ago by Víctor de Buen Remiro

En las versiones v3.1 p004 y v3.2 b004 que están siendo subidas a tol-project en este momento, he metido un parche temporal para evitar que salga el mensaje en estos casos concretos, pero hay que hacer alguna comprobación más porque existe el peligro de que se traiga un OZA creado en una sesión de TOL donde se usaba un TimeSet con el mismo nombre pero totalmente distinto del que se tiene creado en la sesión de carga del OZA y los resultados podrían ser desastrosos.

Para hacer un chequeo seguro podemos contrastar la caché almacenada en el OZA para ver que coincide con el TimeSet actual pero eso llevará un poco más de tiempo de programar y al fin y al cabo es una posibilidad remota aunque no desdeñable.

comment:11 Changed 13 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: closedreopened

comment:12 Changed 13 years ago by Víctor de Buen Remiro

Resolution: remind
Status: reopenedclosed

comment:13 Changed 13 years ago by Pedro Gea

Resolution: remind
Status: closedreopened

Reabro el tique porque sigo sin entender lo que está ocurriendo y cómo evitarlo (evitar lo que pasa y no que se vean las advertencias).

Me gustaría saber qué puedo hacer para corregir el oza (rehaciéndolo, claro está) para que las advertencias no se muestren (ni al guardar, ni al cargar) porque el oza se está haciendo bien.

Creo que aún no he entendido bien cómo se está guardando un timeset en un oza, o siquiera si hay varias maneras según algún criterio y qué criterio es ése. No entiendo de dónde proceden las limitaciones y cual es el mecanismo recomendado. No sé bien de qué dependede de que el timeset o la serie se almacene colapsado en un determinado intervalo de fechas y cuales serían esas fechas, si en un oza se pueden guardar varios timesets (en series o no) con el mismo nombre pero distinto valor, etc.

No sé si podría ser interesante organizar algún tipo de seminario o acción formativa para esclarecer estas cosas.

comment:14 Changed 13 years ago by Víctor de Buen Remiro

Pues yo ya no sé qué más explicar. O el TimeSet tiene una expresión reproducible, es decir, sólo depende de objetos que están accesibles, o no se puede reproducir. Es que lo dice la palabra. Si no se puede reproducir sólo se puede recuperar la caché almacenada. No entiendo qué es lo que no entiendes.

comment:15 Changed 13 years ago by Víctor de Buen Remiro

En un OIS se almacena una foto de un conjunto arbitrario de objetos TOL de cualquier naturaleza. Tú puedes almacenar objetos de TimeSet o de cualquier tipo que tengan el mismo nombre local o ningún nombre. No hay nada que te lo impida, si puedes crear el conjunto TOL puedes guardarlo en OIS. Lo que no se puede tener es distintos TimeSet globales con el mismo nombre porque TOL no te va a dejar crearlos.

Por otra parte, todos los TimeSet, tengan o no una expresión reproducible, sean locales o globales, finitos o infinitos, da igual, siempre tienen una caché temporal en RAM con un hash de las fechas que le pertenecen entre las fechas para las que haya sido consultado. Esa cache se usa en TOL para no repetir cálculos pesados y para acelerar ciertas operaciones del álgebra del tiempo. Lo que hace OIS es, ya que está lo almacena, por si acaso en el proceso de carga en una sesión posterior es incapaz de reproducir la expresión, para que al menos puedas ver la foto.

No hay una forma analítica de definir qué es una expresión reproducible, y de hecho depende de qué cosas hayas cargado en TOL antes de cargar el OZA. Pero es algo absolutamente trivial de explicar: si se puede compilar la expresión es reproducible y si no, pues no lo es. Es decir depende de que estén vivas todas las dependencias que tenga.

De hecho podría ser reproducible en tiempo de creación y no salirte el warning y luego al cargar en otra sesión en la que no estuvieran cargadas todas las dependencias y entonces ya dejaría de serlo y te daría el warning de carga. Y lo mismo al revés, podría ser no reproducible en la creación y no en la carga, aunque esto casi habría que hacerlo adrede pues de otra forma casi seguro que sería por algún error.

No hay forma de mantener la integridad referencial entre distintas sesiones de TOL, lo que hay es lo que puede haber, no se puede ir más allá.

Yo los TimeSet los creo siempre en global con expresiones globales y jamás he tenido ningún problema. Si hay expresiones masivas, repetitivas o de cierta complejidad y resulta demasiado tedioso escribir las expresiones manualmente, entonces recurro a IncludeText para crearlos en base a expresiones creadas como texto de forma mecánica.

comment:16 Changed 13 years ago by Víctor de Buen Remiro

(In [4336]) Refs #1451

comment:17 Changed 13 years ago by Víctor de Buen Remiro

(In [4920]) Refs #1451

comment:18 Changed 13 years ago by Víctor de Buen Remiro

(In [4921]) Refs #1451

Note: See TracTickets for help on using tickets.