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 12 years ago

Closed 12 years ago

#1607 closed defect (fixed)

La función SetSerDat se bloquea con unos ciertos argumentos en tol 3, en tol 2 funciona

Reported by: jmarinero Owned by: Víctor de Buen Remiro
Priority: normal Milestone: Mantainance
Component: Kernel Version: 3.1
Severity: major Keywords:
Cc:

Description

Hola, buenas.

Un código que hasta ahora nos funcionaba y tardaba escasos segundos, ahora no funciona. Se queda el tol atascado, haciendo no se sabe qué.

Hemos rastreado el problema hasta la función SetSerDat.

Si se llama a la función SetSerDat con los tres objetos que están en el oza adjunto como argumento, el tol se queda bloqueado. Hemos esperado una media hora a que se desbloquee pero no termine nunca.

Lo que le pasamos como argumento es un total de unos 4000 valores reales (he comprobado que no tiene omitidos ni nada parecido), una fecha de inicio y un fechado (medio horario en este caso, definido como Mi(0) + Mi(30))

Antes era instantáneo y ahora se atasca en dicha función y no puedo seguir rastreando al ser ya parte del código tol.

Recientemente actualicé a Tol 3. He comprobado que en tol 2.0.1 lo ejecuta sin problemas (2.0.1 b8 2011 - 07 - 12, para ser exactos) tardando un par de segundos. Así que el problema está en la nueva versión de tol

Gracias por adelantado, un saludo

Attachments (1)

ArgumentosQueBloqueanSetSerDat.oza (117.9 KB) - added by jmarinero 12 years ago.
Estos tres argumentos bloquean la función SetSerDat en Tol 3, pero no en Tol 2

Download all attachments as: .zip

Change History (9)

Changed 12 years ago by jmarinero

Estos tres argumentos bloquean la función SetSerDat en Tol 3, pero no en Tol 2

comment:1 Changed 12 years ago by Pedro Gea

La función SetSerDat forma parte de la StdLib y puedes encontrar su implementación TOL en: StdLib/general/grammars/_serie.tol.

En esencia el código que se está ejecutando es:

Set Oza = Include("ArgumentosQueBloqueanSetSerDat.oza");
Set datos = Oza[1];
Date ini = Oza[2];
TimeSet fechado = Oza[3];
// [SetSetDat]
Real inDat = Belong(ini, fechado);
Real If(inDat==0, 
  PutWarning(FormatDate(ini)+" does not belong to " + Name(fechado), 0),
  0);
Date ini_fec = If(inDat, ini, Succ(ini, fechado));
// [SetSer]
Matrix coef  = GetNumeric(datos);
Polyn pol    = MatPol(coef);
Serie result = pol:Pulse(ini,fechado);
Date LastDay = Succ(ini,fechado,Card(datos)-1);
Serie SubSer(result,ini,LastDay)

TOL, como dices, se bloquea al ejecutar esto, concretamente en la última línea al querer hacer el SubSer de la serie.

Habría que averiguar por qué ocurre esto, pero como alternativa te dejo el siguiente código que se apoya en la variante para matrices, compilada en C y probablemente mucho más eficaz:

Set Oza = Include("ArgumentosQueBloqueanSetSerDat.oza");
Set datos = Oza[1];
Date ini = Oza[2];
TimeSet fechado = Oza[3];
Serie MatSerSet(SetRow(datos), fechado, ini)[1];

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

(In [5251]) Refs #1607

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

(In [5252]) Refs #1607

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

La función SerSetDat ha sido mejorada en el paquete StdLib.0.6 que ya está disponible en el repositorio OTAN. Para poder usarlo hay que actualizar la mejora usando el gestor de paquetes de TolBase o bien con la sentencia

Real TolPackage::UpgradeAll(?);

Luego hay que arrancar una nueva versión para que los cambios tengan efecto.

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

La anterior implementación de SerSetDat era completamente demencial pues precisa aplicar un polinomio de orden igual al número de datos sobre una serie infinita, lo cual impide usar la caché interna de series temporales e incurre en un coste cuadrático.

De hecho, lo que no entiendo es cómo es posible que antes tardara sólo 2 segundos, pero lo cierto es que con la nueva versión matricial tarda décimas de segundo.

comment:6 in reply to:  5 Changed 12 years ago by jmarinero

Muchísimas gracias.

Hemos actualizado stdlib a 0.6 y ahora funciona correctamente. Gracias por daros tanta prisa.

Un saludo

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

(In [5422]) Refs #1607
In SerDat argument datos could be any thing with numbers

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

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.