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.

Ticket #60: syntaxerror.tol

File syntaxerror.tol, 13.5 KB (added by Alfredo Torre, 21 years ago)

Try to run it or check the syntax

Line 
1//////////////////////////////////////////////////////////////////////////////
2// FILE    : pestimation.tol
3// PURPOSE : Estimation processes and functions
4//////////////////////////////////////////////////////////////////////////////
5
6
7//////////////////////////////////////////////////////////////////////////////
8// Inicio de la sesion de estimacion
9//////////////////////////////////////////////////////////////////////////////
10 WriteLn("SqlEstStart(EstSession, Output, Dating)...");
11Set EstKey     = SqlEstStart(EstSession, Output, Dating); 
12Set InfoEstSes = SqlEstSesGet(EstSession);
13Text EstSessionIni = If(IsEmpty(InfoEstSes), "", InfoEstSes->SessionIni);
14
15Set InfoOutDat = SqlOutDatGet(Output, Dating);
16
17//////////////////////////////////////////////////////////////////////////////
18// Estructura BoxCox
19//////////////////////////////////////////////////////////////////////////////
20Real SqlEstUpdateState(EstKey, "Definicion de estructura BOX-COX");
21Real SqlProConUpdateTrace(IdProcess, "Definicion de estructura BOX-COX");
22
23Set InfoTransf = SqlTraGet(InfoOutDat->Transformation);
24Set BoxCox     = BoxCoxStruct(InfoTransf->Power,InfoTransf->Translation);
25 
26
27//////////////////////////////////////////////////////////////////////////////
28// Estructura ARIMA
29//////////////////////////////////////////////////////////////////////////////
30Real SqlEstUpdateState(EstKey, "Definicion del modelo ARIMA");
31Real SqlProConUpdateTrace(IdProcess, "Definicion del modelo ARIMA");
32
33//Set ARIMA = SqlEvalARIMA(InfoOutDat->Arima);
34Set ARIMA = GetArimaFromLabel(InfoOutDat->Arima);
35
36
37//////////////////////////////////////////////////////////////////////////////
38// Conjunto Temporal de Omitidos
39//////////////////////////////////////////////////////////////////////////////
40Real SqlEstUpdateState(EstKey, "Calculando el TimeSet de omitidos");
41
42Real SqlProConUpdateTrace(IdProcess, "Calculando el TimeSet de omitidos");
43
44Text    TimeSetOmitDB = InfoOutDat->TimeSetOmit;
45
46TimeSet TimeSetOmit   = If(TimeSetOmitDB == "", W, Eval(TimeSetOmitDB +";"));
47
48
49////////////////////////////////////////////////////////////////////////////
50// Serie Output: Carga de datos
51////////////////////////////////////////////////////////////////////////////
52
53Real SqlEstUpdateState(EstKey, "Construccion de la serie output");
54Real SqlProConUpdateTrace(IdProcess, "Construccion de la serie output");
55Text FunTra    = InfoTransf->FunctionTra;
56Text FunTraInv = InfoTransf->FunctionTraInv;
57
58Code Transf    = If(FunTra == "", TraIdentity, Eval(FunTra));
59Code TransfInv = If(FunTraInv == "", TraIdentityInv, Eval(FunTraInv));
60
61Set ParamOutDat = SqlOutDatGetParam(Output, Dating);
62
63//Serie OutputOrig = SqlOutGetData(Output);
64
65Set   OutputSet   = SqlNodInfGetOpe(ParamOutDat->Cabecera,
66                                    ParamOutDat->Producto,
67                                    ParamOutDat->Nodo,
68                                    ParamOutDat->Inicio,
69                                    UnknownDate);
70
71//Provisional hasta que funcione SqlOutDatGetParam modificar IniTmp
72/*
73Set OutputSet = SqlNodInfGetOpe("ELMUNDO", "DIARIO", "CAMCAP", y2000m01d02,
74                                UnknownDate);
75*/
76//SrFiltro.SubOut
77Serie OutputOrig = OutputSet -> Venta;
78PutDescription("Serie de datos original", OutputOrig);
79Serie Output     = If(FunTra == "", OutputOrig, Transf(OuputOrig));
80PutDescription("Serie a estimar. Serie de datos transformados por la funcion
81Transf", Output);
82
83Serie OutputBoxCox = BoxCoxTransf(Output, BoxCox);
84PutDescription("Serie Output con la transformacion BoxCox", Output);
85
86
87//////////////////////////////////////////////////////////////////////////////
88// Fechas de estimacion
89//////////////////////////////////////////////////////////////////////////////
90Real SqlEstUpdateState(EstKey, "Fechas de estimacion");
91Real SqlProConUpdateTrace(IdProcess, "Fechas de estimacion");
92
93Date IniOut    = If(IsUnknownDate(InfoOutDat->IniEst), First(OutputOrig),
94                                                      InfoOutDat->IniEst);
95
96Date IniEstSes = If(IsUnknownDate(InfoEstSes->IniDate), First(OutputOrig),
97                                                        InfoEstSes->IniDate);
98Date EndEstSes = If(IsUnknownDate(InfoEstSes->EndDate), Last(OutputOrig),
99                                                        InfoEstSes->EndDate);   
100
101
102//Date IniEstSes = If(IsEmpty(InfoEstSes), First(OutputOrig), UnknownDate);
103Date EndOut    = If(IsUnknownDate(InfoOutDat->EndEst), Last(OutputOrig),
104                                                       InfoOutDat->EndEst);
105//Date EndEstSes = If(IsEmpty(InfoEstSes), Last(OutputOrig), UnknownDate); 
106Date IniEstim = Max(IniOut, IniEstSes);
107Date EndEstim = Min(EndOut, EndEstSes);
108
109Real DegARIMA =
110{
111  Polyn aR  = BinGroup("*", Traspose(ARIMA)[2]);
112  Polyn mA  = BinGroup("*", Traspose(ARIMA)[3]);
113  Polyn dif = BinGroup("*", Traspose(ARIMA)[4]);
114  Degree(aR * mA * dif)
115};
116Date IniInput = Succ(IniEstim, Eval(Dating +";"), -(DegARIMA+7));
117
118Text WriteLn("IniOut:    "<<IniOut);
119Text WriteLn("IniEstSes: "<<IniEstSes);
120Text WriteLn("EndOut:    "<<EndOut);
121Text WriteLn("EndEstSes: "<<EndEstSes);
122Text WriteLn("IniEstim:  "<<IniEstim);
123Text WriteLn("EndEstim:  "<<EndEstim);
124Text WriteLn("IniInput:  "<<IniInput);
125 
126
127//////////////////////////////////////////////////////////////////////////////
128// Session Inicial
129//////////////////////////////////////////////////////////////////////////////
130Real Able2Agg = EstSessionIni != "";
131PutDescription("Indica si en la estimacion en curso se puede agregar.",
132Able2Agg);
133
134Real EstSetInpEffIsSaved = If(Not(Able2Agg), Copy(FALSE),
135SqlEstSetInpEffIsSaved(EstSessionIni, Output, Dating));
136Set  SetInpEff.SesIni    = If(Not(EstSetInpEffIsSaved), Empty,
137SqlEstSetInpEffGetSeries(EstSessionIni, Output, Dating, IniInput, EndEstim));
138
139
140//////////////////////////////////////////////////////////////////////////////
141// Efectos Verano de la sesion inicial
142//////////////////////////////////////////////////////////////////////////////
143Set SEffVerSesIni   = Select(SetInpEff.SesIni, Real(Serie sr)
144{ Or(TextMatch(Name(sr), "*Verano*"), TextMatch(Name(sr), "*CicVer*")) });
145Serie SrEffAgrVer   = If(!Card(SEffVerSesIni),
146                          CalInd(W,Dating(OutputOrig)), SetSum(SEffVerSesIni));
147Serie OutputFiltVer = IfSer(Not(OutputOrig), OutputOrig,
148                            OutputOrig << Exp(OutputBoxCox - SrEffAgrVer));
149
150
151//////////////////////////////////////////////////////////////////////////////
152// Carga de los conjuntos de inputs
153// * El conjunto CalcSetInput sustituye a las inclusiones que aparecen
154// arriba
155//////////////////////////////////////////////////////////////////////////////
156Real SqlEstUpdateState(EstKey, "Construccion de inputs para el output");
157Real SqlProConUpdateTrace(IdProcess,
158                          "Construccion de inputs para el output");
159
160Set OutputSetInput = SqlOutSetInpGetSetInput(Output, Dating);
161
162
163Real SqlEstUpdateState(EstKey, "Guardando en EstimationSetInput");
164Real EstSetInpSave = SqlEstSetInpSave(EstKey);
165
166
167
168Real SqlEstUpdateState(EstKey, "Calculando los inputs");
169
170Set CalcSetInput   = EvalSet(OutputSetInput, Text(Set s)
171{
172  Text nameSet = s->SetInput;
173  Text exprInp = SqlSetInpCalculation(nameSet);
174  Text WriteLn("trace: "+ exprInp);
175  //"WriteLn("+ Quotes + ToUpper(nameSet) +"..."+ Quotes +");\n"+
176   exprInp
177});
178
179Real EmptyCalcSetInput = IsEmpty(CalcSetInput);
180//Text CreaInpTxt = BinGroup("+", CalcSetInput);
181
182Text CreaInpTxt = If(EmptyCalcSetInput, "",
183                     BinGroup("+", CalcSetInput));
184
185//Set  CreaInp  = IncludeText(CreaInpTxt);
186
187Set  CreaInp    = If(EmptyCalcSetInput, Empty,
188                     IncludeText(CreaInpTxt));
189
190
191Set InfoSetInput = EvalSet(OutputSetInput, Set(Set s)
192{
193  Text  nameSet        = s->SetInput;
194  Set   sSetInpRecur   = SqlSetInpGetSISonRecur(nameSet);
195  Text  agreg          = s->AggregationType;
196  Text  agregEst       = If(And(agreg != "NOT", Able2Agg), agreg,
197  {
198    If(Able2Agg,
199       WriteLn("WARNING: No se puede agregar el conjunto "+ nameSet +". "+
200               "No hay sesion de estimacion inicial definida."));
201    "NOT"
202  });
203
204  Set   sInputDB       = SqlInpGetInput(Traspose(sSetInpRecur)[1]);
205  Set   sInputDef      = InputDB2InputDef(sInputDB, Dating);
206  Set   sInfo = SetOfAnything(nameSet, sInputDef, sInputDB, agregEst);
207  Eval("Set sInfo"+ nameSet +" = sInfo;")
208});
209
210 
211//Set Input = If(IsEmpty(OutputSetInput), Empty,
212  //             BinGroup("<<",  Traspose(InfoSetInput)[2]));
213
214Set InputDB = If(IsEmpty(OutputSetInput), Empty,
215{
216  Set infoSetInput.T = Traspose(InfoSetInput);
217  Set infoSetInput.WAgg = For(1, Card(infoSetInput.T[3]), Set(Real n)
218  {
219    EvalSet(infoSetInput.T[3][n], Set(Set sInp)
220    { PutStructure("InputDBAggSt", SetOfText(infoSetInput.T[4][n])<<sInp) })
221  });
222  BinGroup("<<",  infoSetInput.WAgg)
223}));
224
225// Conjunto de inputs a estimar (sin contar los agregados)
226Set SetInput.Est = Select(InfoSetInput, Real(Set s) { s[4] == "NOT" });
227
228
229Set Input.NotAgg.PolDB = If(IsEmpty(SetInput.Est), Empty,
230                            BinGroup("<<",  Traspose(SetInput.Est)[2]));
231Set Input.NotAgg = If(IsEmpty(Input.NotAgg.PolDB), Empty,
232If(Not(Able2Agg), Input.NotAgg.PolDB,
233EvalSet(Input.NotAgg.PolDB, Set(Set s)
234{
235  Polyn polDB  = s->Omega;
236  Polyn polEst = SqlEstInpGetEstimatedPolyn(EstSessionIni, Output,
237                                            Dating, Name(s->X));
238  Polyn polIni = If(IsUnknownPolyn(polEst), polDB,
239  If(EQ(Degree(polDB), Degree(polEst)), polEst,
240  {
241    WriteLn("ERROR: \n"+
242            "Polinomio inicial en la BBDD con distinto grado del estimado!"+
243            "Cogiendo polinomio inicial de la tabla Input de la BBDD.");
244    polDB
245  }));
246  InputDef(polIni, s->X)
247})));
248
249// Conjunto de inputs a restar del output en la estimacion
250Set SetInput.Out = Select(InfoSetInput, Real(Set s) { s[4] == "OUT" });
251Serie SrFiltro.SubOut = If(Or(Not(Able2Agg), IsEmpty(SetInput.Out)),
252CalInd(W, Eval(Dating+";")),
253SetSum(EvalSet(SetInput.Out, Serie(Set s)
254{
255 Eval("Serie "+SqlEstSetInpEffNameSrAgg(EstSessionIni,Output,Dating,s[1])+";")
256//Eval("Serie "+ EstSessionIni +"."+ Output +"."+ Dating +"."+ s[1] +";")
257})));
258
259// Conjunto de inputs a estimar como agregados
260Set SetInput.Set = Select(InfoSetInput, Real(Set s) { s[4] == "SET" });
261Set Input.SetInp = If(Or(Not(Able2Agg), IsEmpty(SetInput.Set)), Empty,
262EvalSet(SetInput.Set, Set(Set s)
263{
264  Eval("Serie "+ s[1] +
265  " = "+ SqlEstSetInpEffNameSrAgg(EstSessionIni,Output,Dating,s[1]) +";");
266  Eval("InputDef(1, "+ s[1] +");")
267}));
268
269// Conjunto de inputs a estimar como agregados en una sola serie
270Set SetInput.Fil = Select(InfoSetInput, Real(Set s) { s[4] == "FIL" });
271Serie SrFiltro.Input = If(Or(Not(Able2Agg), IsEmpty(SetInput.Fil)),
272CalInd(W, Eval(Dating+";")),
273SetSum(EvalSet(SetInput.Fil, Serie(Set s)
274{
275 Eval("Serie "+SqlEstSetInpEffNameSrAgg(EstSessionIni,Output,Dating,s[1])+";")
276})));
277Set Input.Fil = If(Or(Not(Able2Agg), IsEmpty(SetInput.Fil)), Empty,
278SetOfSet(InputDef(1, SrFiltro.Input)));
279
280Set Input = Input.NotAgg << Input.SetInp << Input.Fil;
281
282
283
284//////////////////////////////////////////////////////////////////////////////
285// Estimacion del Modelo
286//////////////////////////////////////////////////////////////////////////////
287Serie Output.Filt = Output - SrFiltro.SubOut;
288PutDescription("Serie Output menos posibles conjuntos de input agregados",
289Output);
290
291Set AprioriSet = Empty;
292
293Real SqlEstUpdateState(EstKey, "Estimando modelo ...");
294Real SqlProConUpdateTrace(IdProcess, "Estimando modelo ...");
295
296Set ModDefEst = EstimModel
297(
298Output,
299TimeSetOmit,
300ARIMA,
301BoxCox,
302Input,
303SrFiltro.SubOut,
304IniEstim,
305EndEstim,
306AprioriSet
307);
308
309Set ModDef = ModDefEst[1];
310Set ModEst = ModDefEst[2];
311Set StdRes = ModDefEst[3];
312Set InputNull = ModDefEst[4];
313Real SqlEstUpdateState(EstKey, "Finalizacion de la estimacion del modelo");
314Real SqlProConUpdateTrace(IdProcess,
315                          "Finalizacion de la estimacion del modelo");
316
317
318If(GT(Card(InputNull), 0),
319WriteLn("WARNING: "+
320        "Hay inputs que no han entrado en la estimacion!!!\n"<< InputNull));
321
322//////////////////////////////////////////////////////////////////////////////
323// Comprobacion de los resultados de la estimacion
324//////////////////////////////////////////////////////////////////////////////
325Real DesTipEst = If(ObjectExist("Set", "ModEst"),
326                    If(IsEmpty(ModEst), ?, ModEst[1][8]),
327                    ?);
328Real EstOK = Not(IsUnknown(DesTipEst));
329
330
331//////////////////////////////////////////////////////////////////////////////
332// Grabacion de los resultados en la Base de Datos
333//////////////////////////////////////////////////////////////////////////////
334Real SqlEstUpdateState(EstKey, "Volcado a la base de datos");
335Real SqlProConUpdateTrace(IdProcess, "Volcado a la base de datos");
336
337Real CtrSav = If(And(EstOK, SqlSavEst),
338SqlSaveEstimation(Output, ModEst, EstKey, InputDB),
339{
340  Text txt = If(Not(EstOK), "Error en la estimacion", "Variable SqlSavEst");
341  WriteLn("WARNING: No se guardan los resultados en la BD. "+ txt +".");
342  FALSE
343});
344
345WriteLn("WARNING: Guardando en estimation con CtrSav TRUE. "+
346        "Revisar la funcion SqlSaveEstimation");
347//Set  InfoEndEst = SqlEstBuildInfo(InfoOutDat, ModEst,OutputSetInput,CtrSav);
348Set  InfoEndEst = SqlEstBuildInfo(InfoOutDat, ModEst, OutputSetInput, TRUE);
349Real CtrEnd = SqlEstEnd(EstKey, InfoEndEst);
350Real ActEnd = SqlProConUpdateTraActExe(IdProcess, "Output estimado", "Y");
351Real Exit = SqlProConUpdateTraAct(IdProcess, "Proceso finalizado", "N");
352