﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	resolution	keywords	cc
577	Creación de una M-Variable con el mismo nombre que otra que ya existe	imendez	Pedro Gea	"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.
"	defect	accepted	critical	Next	Models			
