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

Closed 14 years ago

#879 closed defect (fixed)

Reassigning NameBlocks

Reported by: pgea@… Owned by: Víctor de Buen Remiro
Priority: highest Milestone:
Component: OOP Version:
Severity: major Keywords:
Cc:

Description

Al usar BSR con "modelDefs" de tipo NameBlock que contienen series infinitas, nos encontramos con mensajes del tipo:

Warning: [] No se puede copiar una serie no acotada

Warning: [] No se puede aplicar PutValue (:=) a una serie temporal con otra que no tiene fechas acotadas, por lo que será truncada por las fechas por defecto en curso: [,]

Según parece el truncamiento de las series, se debe a la reasignación de un NameBlock.
(Véase stdlib/math/stat/models/bayesian/bysMcmc/_cycler.tol línea 61)

Podemos ver lo que ocurre con el ejemplo sencillo:

NameBlock nb1 = [[ Serie serie = CalInd(C,C) ]];
NameBlock nb2 = [[ Real void = ? ]];
NameBlock nb2 := nb1;

Este comportamiento puede resultar un tanto inesperado ya que una asignación del tipo:

NameBlock nb1 = nb2;

se entiende como "crea un nuevo NameBlock nb1 que apunte al mismo NameBlock que nb2": Ref(nb1) = Ref(nb2);

Mientras que la reasignación:

NameBlock nb1 := nb2;

se entiende como "modifica el NameBlock al que apunta nb1 copiando el contenido de nb2": nb1 := Copy(nb2)

Este comportamiento es distinto al de los Set donde tanto la asignación como la reasignación actúan sobre la referencia:

Set st1 = st2;
Set st1 := st2;

Entendiéndose: Ref(st1) = Ref(st2) y Ref(st1) := Ref(st2) respectivamente.

Realmente no estoy en contra del criterio escogido, pues de hecho acostumbro a aprovechar esta circunstancia para "destruir" objetos haciendo:

NameBlock a := [[ Real NULL=? ]]

La alternativa es no utilizar NameBlock´s como referencias para ser resignadas sino conjuntos (Set) destinados a contener el NameBlock. Algo como:

Set nb1_ = [[ NameBlock nb1 = [[ Serie serie = CalInd(C,C) ]] ]];
Set nb2_ = [[ NameBlock nb2 = [[Real void = ? ]] ]];
Set nb2_ := nb1_;

Y según el criterio actual parece que es la StdLib la que tendría que cambiar eso.

Creo que quizá podría aprovecharse para revisar los criterios usados en la asignación y reasignación. Quizá podría abrirse un tique dedicado a eso. Yo sigo echando mucho de menos que no existan dos operadores distintos para ello.

Otra cosa que no entiendo, y quizá debería abrir un nuevo tique es, porqué no se pueden copiar las series infinitas. Supongo que el asunto éste de las series tiene algunas complicaciones que no
adivino a imaginar.
Quizá hubiera sido bueno tener dos tipos de objetos "series finitas" y "series infinitas" de manera similar a como existen Matrix y VMatrix, de modo que fuese fácil distinguir unas de otras.

Change History (4)

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

Desde el ticket #712 tanto el operador de copia (:=) como el propio Copy utilizan internamente DeepCopy para que las instancias de objetos puedan tener su propia vida independiente sin efectos colaterales.

Por otra parte es sumamente complicado el manejo de series infinitas por lo que es imposible su copia interna por ser objetos virtuales.

Yo creo que es muy desaconsejable el uso de series infinitas dentro de un NameBlock del que se van a hacer copias. Son características casi incompatibles los objetos NameBlock y los objetos virtuales como TimeSet o las series infinitas. De hecho una buena costumbre cuando no queda más remedio es almacenar simplemente la expresión de texto TOL que devuelve el objeto, bien reconstruyéndola bien haciendo referencia a un objeto previamente construido y accesible en el ámbito de uso.

En el actual estadio de TOL este tipo de cosas me temo que no son reparables, si es que hay algo mal, que tampoco lo tengo claro. Es imposible hacer cambios tan profundos y mantener compatibilidad hacia atrás al mismo tiempo.

comment:2 Changed 15 years ago by Pedro Gea

(In [2065]) refs #879
Soluciona el problema de reasignar el NameBlock _.importer
Deja abierta la cuestión de cómo debería comportarse el operador := (PutValue) con los NameBlock´s

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

Component: KernelOOP

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

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