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

#771 closed defect (remind)

Función Range de TimeSet

Reported by: Iván Robles Owned by: Víctor de Buen Remiro
Priority: highest Milestone: Mantainance
Component: TimeAlgebra Version: 2.0.1
Severity: blocker Keywords:
Cc:

Description

Buenas tardes,

estamos intendando generar el timeSet de las semanas en los que una serie tiene datos:

Para ello hacemos una serie que tiene datos en 2007 y 2009, 2008 omitido.
Nos hacemos el timeSet de una serie donde no es omitido con la función SerTms "timesetDatos ".
Después nos calculamos los lunes de las semanas que tienen algun dato "lunesSemanasConDato ".

Por ultimo creamos un timeSet con Range todos los dias de la semana de las semanas que tienen dato.

Esta última instrucción nos rellena correctamente las semanas de 2007 y 2009, pero los años anteriores y posteriores solo nos deja los lunes, no semanas completas

  Serie seriesOrig = Log(SetSumC(SetOfSerie(
    SubSer(2*CalInd(Y(2007),Diario),y2007m01d01,y2007m12d31),
   SubSer(2*CalInd(Y(2009),Diario),y2009m01d01,y2009m12d31))));

  TimeSet timesetDatos = SerTms(Not(SerIsUnknown(seriesOrig)));

  TimeSet lunesSemanasConDato = Range(timesetDatos, -6, 0)*WD(1);

  TimeSet   semanasConDatos = Range(lunesSemanasConDato, 0, 6);

Gracias,
Un cordial saludo

Change History (3)

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

Milestone: Manteinance
Status: newaccepted

En primer lugar lo malo no es que sólo deje los lunes lo malo es que los deja, cuando debería estar vacío fuera del intervalo de definición de la serie ya que esta no tiene datos fuera de su rango por ser una serie finita.

Por otro lado, efectivamente hay errores conocidos al usar algunas expresiones del álgebra del tiempo sobre el resultado de aplicar la función SerTms a una serie finita, que es un conjunto acotado en un intervalo, y cuando se intenta acceder fuera del intervalo pueden ocurrir cosas raras.

La solución a este problema interno, y un conjunto de problemas relacionados, no es en absoluto trivial, y aún menos si se pretende mantener el nivel de eficiencia actual del álgebra del tiempo. Ya lo estuve intentando durante meses sin dar con ella, pero sí que puedo ofrecer algún parche para sobrellevarlo.

Lo más sencillo es añadir sendos valores falsos en dos fechas fuera del intervalo: una lo bastante anterior y otra lo bastante posterior a las fechas de trabajo para que no interfieran con los resultados. Por ejemplo, siguiendo con el caso propuesto, si en nuestro proyecto no tenemos ningún dato anterior a 2001 ni posterior a 2011 podemos hacer lo siguiente

  Serie seriesOrig = Log(SetSumC(SetOfSerie(
   SubSer(2*CalInd(Y(2000),Diario),y2000m12d31,y2000m12d31),
   SubSer(2*CalInd(Y(2007),Diario),y2007m01d01,y2007m12d31),
   SubSer(2*CalInd(Y(2009),Diario),y2009m01d01,y2009m12d31),
   SubSer(2*CalInd(Y(2012),Diario),y2012m01d01,y2012m01d01)
  )));

  TimeSet timesetDatos = SerTms(Not(SerIsUnknown(seriesOrig)));
  Set dates.1 = Dates(timesetDatos, y2006,y2011);
  WriteLn("TRACE Card(dates.1)="<<Card(dates.1));

  TimeSet lunesSemanasConDato = Range(timesetDatos, -6, 0)*WD(1);
  Set dates.2 = Dates(lunesSemanasConDato, y2006,y2011);
  WriteLn("TRACE Card(dates.2)="<<Card(dates.2));

  TimeSet semanasConDatos = Range(lunesSemanasConDato, 0, 6);

  Set dates.3 = Dates(semanasConDatos, y2006,y2011);
  WriteLn("TRACE Card(dates.3)="<<Card(dates.3));

Si con esto os podéis apañar dejaré el ticket como "remind" por si alguna vez hay tiempo de atacar estos problemas.

comment:2 Changed 15 years ago by Iván Robles

Ok, nos apañamos con esto.

Gracias

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

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