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)
Change History (9)
Changed 12 years ago by
Attachment: | ArgumentosQueBloqueanSetSerDat.oza added |
---|
comment:1 Changed 12 years ago by
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:4 Changed 12 years ago by
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 follow-up: 6 Changed 12 years ago by
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 Changed 12 years ago by
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
comment:8 Changed 12 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
Estos tres argumentos bloquean la función SetSerDat en Tol 3, pero no en Tol 2