Opened 14 years ago
Last modified 14 years ago
#577 accepted defect
Creación de una M-Variable con el mismo nombre que otra que ya existe
Reported by: | imendez | Owned by: | Pedro Gea |
---|---|---|---|
Priority: | critical | Milestone: | Next |
Component: | Models | Keywords: | |
Cc: |
Description
Hola, por error (como suelen ocurrir estas cosas) me he encontrado con un problema que me parece muy peligroso.
Resumiendo, cuando se crea una M-Variable con el mismo nombre que otra que ya existe, MMS utiliza la que ya existe y no da ningún aviso ni error, por lo que el usuario no es consciente de que no se está utilizando la variable que él ha querido definir.
Ese "error" del usuario me parece de tal gravedad que, en mi opinión, MMS debería dar error y no crear la variable.
Os cuento cómo me he encontrado con este problema:
- Tengo un DataSet (que adjunto) con 24 series diarias, una por cada hora.
- Defino un modelo, y 24 submodelos.
- En cada submodelo, la serie de la hora h, y(t,h) es el output, con transformación logarítmica. Además, hay un explicative term (ET en adelante) que es la serie de la hora anterior, y(t,h-1)
- Por tanto, el modelo es: Ln(y(t,h)) = a*y(t,h-1) + N(t,h)
En realidad, yo quería que el ET fuera en logaritmos, pero se me olvidó y gracias a eso me encontré el problema. La otra "causa" es que llamé igual a la serie de cada hora que aparece como output y como ET de la hora posterior. Lo que ocurre al hacer esto es lo siguiente:
- En la iteración 1 de 24, el output es la hora 00 y el ET la hora 23. El output está en logaritmos, y el ET en identidad.
- En las iteración 2 de 24, el output (hora 01) va en logaritmos, pero el ET (hora 00) también, pues en la iteración 1 ya se ha creado una M-Variable para esta hora que está en logaritmos (el output). Ambas M-Variables (el output de la iteración 1 y el ET de la 2) se llaman igual, y MMS no avisa del error.
- Lo mismo ocurre con las iteraciones 3-23 de 24.
- En la última iteración, el output va en identidad (¡!), porque en la primera se utilizó como ET, y se creó una M-Variable en identidad. Además, el ET va en logaritmos. Es decir, este submodelo resulta al revés de lo que se pretendía definir: y(t,h) = a*Ln(y(t,h-1)) + N(t,h)
A continuación tenéis el código para reproducirlo (espero que sea autosuficiente, si no decidme qué funciones faltan). Hay que cambiar al menos el nombre del Repositorio donde se busca el DataSet IbeEnePrePrc.DataSet_01.
NameBlock GetDataSet_INELO(Anything info) // INELO: If Not Exists, LOad { Real dsFound = MMS::Container::FindDataSet(info); If(dsFound, MMS::Container::GetDataSet(dsFound), { WriteLn("GetDataSet_INELO:\nDataSet "<< info +" not loaded", "W"); NameBlock repo = info["Repository"]; repo::LoadDataSet(info) }) }; NameBlock IbeEnePrePrc.DataSet_01 = GetDataSet_INELO( [[ Text DataSetName = "IbeDs1",//parametrizar Text DataSetVersion = "1.0", NameBlock Repository = PrePrc.Repo ]]); WriteLn("\t\tCreando el modelo de resumen de demanda, nacional clientes, "+ "mercado ibérico...\t"+ Time); Text ModelName = "RDeNacCli_PaiMI_PerHor_FecDia"; Text ModelVers = "1.0"; Text ModelDesc = "Modelo de resumen de demanda, clientes nacionales, "+ "mercado ibérico, series por cada hora en fechado diario"; MMS::@Model Model = MMS::Container::ReplaceModel([[ Text _.name = ModelName; Text _.version = ModelVers; Text _.description = ModelDesc; Set _.dataSets = [[ IbeEnePrePrc.DataSet_01::GetName(?) ]] ]]); NameBlock DsMod = Model::GetDataSet(1); Set CjtoVar = DsMod::GetVariables(?); Set SubModels = For(1, Card(CjtoVar), NameBlock(Real n) { //Real n = 24; NameBlock varOut = CjtoVar[n]; Text output = varOut::GetIdentifier(?); Text expression = varOut::GetExpression(?); Text arima = "P1_7DIF0_1AR1_0MA0_7"; Text description = varOut::GetDescription(?); Real boxcox.01 = 0; Real boxcox.02 = 1; Serie srOutput = varOut::GetData(?); Date desde = First(srOutput); Date hasta = Last(srOutput); Text subModelName = output; MMS::@Submodel subModel = Model::CreateSubmodel([[ Text _.name = subModelName; Text _.description = description; NameBlock _.output = [[ Text _.name = output; Text _.variable = output; MMS::@Transformation _.transformation = MMS::@Transformation.BoxCox::Default(boxcox.01, boxcox.02) ]]; Date _.begin = desde; Date _.end = hasta; NameBlock _.noise = [[ Text _.type = "ARIMA"; Text _.arimaLabel = arima; Real _.sigma = 1 ]] ]]); NameBlock varInp = If(EQ(n, 1), CjtoVar[Card(CjtoVar)], CjtoVar[n-1]); NameBlock expTer = subModel::CreateExpTerm_Coefficient([[ Text _.name = varInp::GetIdentifier(?); Text _.description = varInp::GetDescription(?); NameBlock _.input = [[ Text _.name = "Inp_"+ varInp::GetIdentifier(?); Text _.variable = varInp::GetIdentifier(?); MMS::@Transformation _.transformation = MMS::@Transformation.BoxCox::Default(boxcox.01, boxcox.02) ]]; Real _.coefficient = 0.02 ]]); subModel }); Real Model::Save_AtRepository(PrePrc.Repo, "Default");
Un saludo.
Change History (4)
comment:1 Changed 14 years ago by
Milestone: | → Release 0.6 |
---|
comment:2 Changed 14 years ago by
Owner: | set to Pedro Gea |
---|---|
Status: | new → accepted |
comment:3 Changed 14 years ago by
comment:4 Changed 13 years ago by
Los archivos adjuntos con datos privados se han ubicado en la unidad local B.
Explico un poco la situación.
En MMS las m-variables son unos objetos independientes a los submodelos (en los que actúan como output) o los términos explicativos (en los que actúan como input), y pueden crearse de manera individual mediante un código similar a:
Para más información sobre la construcción de parámetros de omitido véase: #578.
Si las m-variables se construyen previamente (quizá sería esto aconsejable) en la creación de submodelos o términos basta con citarlas:
Sin embargo lo más común es crear ambos (m-variable y submodelo/término) a la vez. Por ello se permitió introducir en los argumentos de unos los argumentos del otro:
Como podría ocurrir que se creara un término explicativo en un bucle para un conjunto de submodelos, y para no tener que usar una expresión distinta para el primer submodelo (véase la construcción de términos explicativos en: MatVeh.1_02_model.tol) se admitió que podría indicarse el nameblock de construcción tantas veces como se quisiera, que sólo se usaría la primera vez.
Quizá la solución sea comprobar que la nueva definición coincide con la ya existente, y de lo contrario mostrar un error.
En el caso de crear modelos complejos en los que una m-variable participa en más de un submodelo o término explicativo se recomienda crear las m-variables previamente.
Nótese también que este hecho de que se creen m-variables a la vez que los submodelo o términos explicativos que las enlazarían se está comentando con un mensaje del tipo:
[@Model::_.ObtainMVariable] Se creará la m-variable: '...'