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

Closed 14 years ago

#1237 closed defect (fixed)

BysMcmc: Error parsing joint.bsr

Reported by: Pedro Gea Owned by: Víctor de Buen Remiro
Priority: highest Milestone: Mantainance
Component: BysMCMC Version: head
Severity: blocker Keywords:
Cc:

Description

Se ha encontrado un error estraño al crear restricciones para una combinación de parámetros.

El error encontrado dice:

ERROR: [101] [BSR.Parse] Expected symbol ';' 
 File:'joint.bsr' Line:44 Col:1127
El diseño del parser modular de BSR puede verse en https://www.tol-project.org/ticket/745
Puede ver un ejemplos de la sintaxis de BSR en http://cvs.tol-project.org/viewcvs.cgi/*checkout*/tol/stdlib/math/stat/models/bayesian/bysMcmc/test_01/parse.bsr
...

pero allí no parece que haya nada raro (más allá de la longitud de la línea).

Adjunto archivos ascii para reproducirlo.

Attachments (1)

MMS.T661.zip (20.3 KB) - added by Pedro Gea 14 years ago.

Download all attachments as: .zip

Change History (11)

Changed 14 years ago by Pedro Gea

Attachment: MMS.T661.zip added

comment:1 Changed 14 years ago by Pedro Gea

Otros detalles en: MMS#661.

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

Status: newaccepted

El problema está precisamente en la longitud de la línea.
Si la recorto a menos de 1024 caracteres funciona.
No tengo la menor idea de por dónde aparece esa restricción ni si se puede evitar fácilmente.
Desde luego en mi código no hago nada adrede en ese sentido.
Tendré que revisar la documentación de boot::spirit y si no encuentro nada cambiar el parser para que admita saltos de línea dentro de las inequaciones y ecuaciones, y el Import para que meta saltos cada 1024 caracteres.

comment:3 Changed 14 years ago by Pedro Gea

No estoy convencido que sea la longitud, pues he reproducido el error con restricciones más cortas, por ejemplo con:

+0<=+1*TPr_MetSer.Min.Uni_GeoUFe.XX_GOpXX_GGeB.VC1OffNetFixo_GCoXX_TSaA1.PrCo_FreDia__RecargaTot__Linear.1+1*TPr_MetSer.Min.Uni_GeoUFe.XX_GOpXX_GGeB.VC1OffNetFixo_GCoXX_TSaA1.PrCo_FreDia__RecargaTot__Linear.10;

No sé si puede ser algo relativo a que el nombre de un parámetro está contenido en el otro o algo así.

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

Pues no es eso, no.
De hecho he reemplazado en los .bsr el prefijo común TPr_MetSer.Min.Uni_GeoUFe.XX_GOpXX_GGeB.VC1OffNetFixo_GCoXX_TSaA1.PrCo_FreDia por Tpr y pasa igual: falla, o mejor dicho, dice que falla, en la aparentemente inocente línea

+0<=+1*Tpr__RecargaTot__Linear.1+1*Tpr__RecargaTot__Linear.10;

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

Aún no sé si tendrá que ver con esto o no pero hay algo extraño en la línea 15 del master.bsr

Include primary module "./Submodels/TPr_MetSer.Min.Uni_GeoUFe.XX_GOpXX_GGeB.VC1OffNetFixo_GCoXX_TSaA1.PrCo_Fr~1/primary.bsr";

Parece ser que al windows de la máquina que sea le ha parecido largo el nombre de directorio

TPr_MetSer.Min.Uni_GeoUFe.XX_GOpXX_GGeB.VC1OffNetFixo_GCoXX_TSaA1.PrCo_FreDia

y lo ha recortado a

TPr_MetSer.Min.Uni_GeoUFe.XX_GOpXX_GGeB.VC1OffNetFixo_GCoXX_TSaA1.PrCo_Fr~1

Algo hay que hacer con el tema de la nomenclatura porque esos nombres acaban siendo inmanejables por uno u otro motivo.

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

No tengo la menor idea de porqué pero está fallando el boost::spirit y como es una versión vieja no encuentro documentación ni foros ni nada.

Probando a dar palos de ciego he encontrado una forma de evitar el error, que no de arreglarlo: basta cambiar los sufijos de la forma ".xx" ó "_xx" donde x es una cifra por letras. Parece que por algún motivo que se me escapa no admite 2 ó mas cifras después del último punto ó '_', pero sólo cuando está leyendo una ecuación o inecuación y aparece una variable externa, es decir, que no aparece en la cabecera de declaraciones. En cambio sí te deja declarar variables con ese formato, y el caso es que la definición del parser es muy modular y esa parte está reutilizada al 100%, así que debería hacer lo mismo pero misteriosamente no es así. Se trata de código ajeno muy complicado de depurar por lo que me temo que tampoco puedo ir más allá.

En este caso concreto, por ejemplo, en vez de "...RecargaTotLinear.10" se pone "...RecargaTotLinear.A" ó "RecargaTotLinear.AB" y ya no falla. Propongo que en vez de usar los sufijos ".1", ".2" etc. lo hagáis de momento con ".a", ".b", etc.

Esto es un parche para que podáis continuar por ahora, mientras veo porqué puede pasar algo tan absurdo. Si no lo encuentro, que creo que difícilmente lo voy a encontrar, ya he visto otra forma de evitarlo bastante elegantemente: permitir la declaración de variables externas poniendo "nombre_variable <- EXTERN" para que no dé duplicados. Lo malo es que esto requiere tocar el Import y el código de BSR así que llevará un poquillo más de trabajo, pero creo que no habrá más remedio. Esta forma ya me gusta bastante más pues de hecho tiene todo el sentido del mundo que haya que declarar las variabes antes de usarlas, así que no sería un parche sino una mejora.

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

(In [3612]) Refs #1237

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

(In [3613]) Refs #1237

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

(In [3616]) Refs #1237

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

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