1 | ////////////////////////////////////////////////////////////////////////////// |
---|
2 | Real CheckModel(Set algSetNode) |
---|
3 | ////////////////////////////////////////////////////////////////////////////// |
---|
4 | { |
---|
5 | Text nameOutput = GetNameModel(algSetNode); |
---|
6 | @MMS.Model model = MMS::GetModel([[nameOutput,GetVersion(?)]]); |
---|
7 | Set outputs = model::GetOutputs(?); |
---|
8 | Set EvalSet(outputs, Real (NameBlock output){ |
---|
9 | Serie outputSer = output::GetData(?); |
---|
10 | Date iniOutput = Max(First(outputSer),output::GetModelBegin(?)); |
---|
11 | Date endOutput = Min(Last(outputSer),output::GetModelEnd(?)); |
---|
12 | Set setExpTerm = output::GetExpTerms(?); |
---|
13 | Set EvalSet(setExpTerm, Real (NameBlock ET){ |
---|
14 | Serie serExpTerm = ET::GetData(?); |
---|
15 | Serie subSerExpTerm = SubSer(serExpTerm,iniOutput,endOutput); |
---|
16 | If(And( |
---|
17 | AvrS(subSerExpTerm)==0, |
---|
18 | StDsS(subSerExpTerm)==0, |
---|
19 | CheckPriorExpTerm(model,ET)==0, |
---|
20 | CheckHierExpTerm(model,ET)==0 |
---|
21 | ) |
---|
22 | , |
---|
23 | ET::SetIsActive(0) |
---|
24 | , |
---|
25 | ET::SetIsActive(1) |
---|
26 | ); |
---|
27 | Real 1 |
---|
28 | }); |
---|
29 | |
---|
30 | Real 1 |
---|
31 | }); |
---|
32 | |
---|
33 | Real 1 |
---|
34 | |
---|
35 | }; |
---|
36 | ////////////////////////////////////////////////////////////////////////////// |
---|
37 | PutDescription("Chequea el modelo. Quita los inputs que son cero", |
---|
38 | CheckModel); |
---|
39 | ////////////////////////////////////////////////////////////////////////////// |
---|
40 | |
---|
41 | ////////////////////////////////////////////////////////////////////////////// |
---|
42 | Real CheckPriorExpTerm(NameBlock model,NameBlock ET) |
---|
43 | ////////////////////////////////////////////////////////////////////////////// |
---|
44 | { |
---|
45 | Set priors = model::GetPriors(?); |
---|
46 | If(IsEmpty(priors),0, |
---|
47 | { |
---|
48 | Set hasprior = EvalSet(priors, Real (NameBlock prior){ |
---|
49 | //Set setElements = prior::GetElements(?); |
---|
50 | //Set priorElements = EvalSet(setElements, Real (NameBlock element){ |
---|
51 | //Real (prior::GetElement::GetParent(?)::GetName(?)==ET::GetName(?)) |
---|
52 | |
---|
53 | //}); |
---|
54 | Real If(prior::GetElement(?)::GetParent(?)::GetName(?)==ET::GetName(?), |
---|
55 | 1,0) |
---|
56 | }); |
---|
57 | |
---|
58 | SetSum(hasprior) |
---|
59 | } |
---|
60 | ) |
---|
61 | |
---|
62 | }; |
---|
63 | ////////////////////////////////////////////////////////////////////////////// |
---|
64 | PutDescription("Chequea el modelo. |
---|
65 | Comprueba si un termino explicativo tiene priors", |
---|
66 | CheckPriorExpTerm); |
---|
67 | ////////////////////////////////////////////////////////////////////////////// |
---|
68 | |
---|
69 | |
---|
70 | ////////////////////////////////////////////////////////////////////////////// |
---|
71 | Real CheckHierExpTerm(NameBlock model,NameBlock ET) |
---|
72 | ////////////////////////////////////////////////////////////////////////////// |
---|
73 | { |
---|
74 | Set hierarchies = model::GetHierarchies(?); |
---|
75 | |
---|
76 | If(IsEmpty(hierarchies),0, |
---|
77 | { |
---|
78 | Set hashierarchie = EvalSet(hierarchies, Real (NameBlock hierarchie){ |
---|
79 | Set setElements = hierarchie::GetElements(?); |
---|
80 | Set hierarchieElements = EvalSet(setElements, Real (NameBlock element){ |
---|
81 | Real (element::GetParent(?)::GetName(?)==ET::GetName(?)) |
---|
82 | |
---|
83 | }); |
---|
84 | SetSum(hierarchieElements) |
---|
85 | }); |
---|
86 | |
---|
87 | SetSum(hashierarchie) |
---|
88 | } |
---|
89 | ) |
---|
90 | }; |
---|
91 | ////////////////////////////////////////////////////////////////////////////// |
---|
92 | PutDescription("Chequea el modelo. |
---|
93 | Comprueba si un termino explicativo tiene jerarquias", |
---|
94 | CheckHierExpTerm); |
---|
95 | ////////////////////////////////////////////////////////////////////////////// |
---|
96 | |
---|
97 | ////////////////////////////////////////////////////////////////////////////// |
---|
98 | Real LinComWarning(NameBlock model) |
---|
99 | ////////////////////////////////////////////////////////////////////////////// |
---|
100 | { |
---|
101 | WriteLn("Entrando en lincomwarning"); |
---|
102 | Set outputs = model::GetOutputs(?); |
---|
103 | |
---|
104 | WriteLn("Cogiendo outputs en lincomwarning"); |
---|
105 | |
---|
106 | Real SetProd(EvalSet(outputs,Real (NameBlock output) |
---|
107 | { |
---|
108 | // Para cada output definido en el modelo, sacamos sus fechas de domino, |
---|
109 | // diferencia y terminos explicativos |
---|
110 | Serie outputSer = output::GetData(?); |
---|
111 | WriteLn("Cogiendo datos de outputs en lincomwarning"); |
---|
112 | |
---|
113 | Date iniCalc = Max(First(outputSer),output::GetModelBegin(?)); |
---|
114 | Date endCalc = Min(Last(outputSer),output::GetModelEnd(?)); |
---|
115 | Polyn dif = output::GetARIMA(?)::GetDif(?); |
---|
116 | Set expTerms = model::GetExpTerms(?); |
---|
117 | |
---|
118 | // Para cada término explicativo, miro que sea no nulo, que no tenga prior |
---|
119 | // y en tal caso devuelvo la serie input, si no lo eliminamos del calculo |
---|
120 | Set series = EvalSet(expTerms,Serie (NameBlock expTerm) |
---|
121 | { |
---|
122 | |
---|
123 | Serie serExpTerm = expTerm::GetData(?); |
---|
124 | WriteLn("Cogiendo datos de terminos explicativos en lincomwarning"); |
---|
125 | |
---|
126 | Serie subSerExpTerm = SubSer(serExpTerm,iniCalc,endCalc); |
---|
127 | Serie Case( |
---|
128 | And(Or( |
---|
129 | CheckPriorExpTerm(model,expTerm)>=1, |
---|
130 | CheckHierExpTerm(model,expTerm)>=1 |
---|
131 | ),Not(MaxS(subSerExpTerm)==1/0)) |
---|
132 | , |
---|
133 | { |
---|
134 | expTerm::SetIsActive(1); |
---|
135 | UnknownSerie |
---|
136 | }, |
---|
137 | Or(And(MaxS(subSerExpTerm)==0, |
---|
138 | MinS(subSerExpTerm)==0),MaxS(subSerExpTerm)==1/0), |
---|
139 | { |
---|
140 | expTerm::SetIsActive(0); |
---|
141 | UnknownSerie |
---|
142 | } |
---|
143 | , |
---|
144 | 1 |
---|
145 | , |
---|
146 | { |
---|
147 | expTerm::SetIsActive(1); |
---|
148 | Eval("Serie "+expTerm::GetName(?)+" = subSerExpTerm") |
---|
149 | } |
---|
150 | ) |
---|
151 | |
---|
152 | }) - [[ Serie UnknownSerie ]]; |
---|
153 | |
---|
154 | |
---|
155 | // Paso las series input a matriz |
---|
156 | Matrix inputs = SerSetMat(series); |
---|
157 | Matrix matrix = inputs*Tra(inputs); |
---|
158 | Matrix inputs:= UnknownMatrix;//--> Ahorro de memoria en matrices grandes |
---|
159 | |
---|
160 | // Antes que SVD, llamo a GaussInverse, mucho mas rapida, si devuelve |
---|
161 | // una matriz de 0x0 entonces es que no tiene inversa (hay combinacion |
---|
162 | // lineal), y entonces llamo a SVD. Está escrito asi para ahorrar memoria |
---|
163 | |
---|
164 | Set svd = { |
---|
165 | Matrix gaussInv = GaussInverse(matrix); |
---|
166 | Set svd = If( And(EQ(Rows(gaussInv),0),EQ(Columns(gaussInv),0)), |
---|
167 | //SVD(matrix), |
---|
168 | RoundSVD(SVD(matrix),False,0.5,10^(-12)), |
---|
169 | Empty |
---|
170 | ); |
---|
171 | Matrix matrix:= UnknownMatrix;//--> Ahorro de memoria en matrices grandes |
---|
172 | Set svd |
---|
173 | }; |
---|
174 | |
---|
175 | Real If(Not(Card(svd)), Real False, |
---|
176 | { |
---|
177 | // Saco la última columna de la segunda matriz de autovectores |
---|
178 | Matrix lastCol = SubCol(svd[3],[[ Columns(svd[3]) ]]); |
---|
179 | Set svd := Empty;//--> Ahorro de memoria en matrices grandes |
---|
180 | |
---|
181 | // Miro los elementos no nulos, que son las ecuaciones de los |
---|
182 | // parametros que hacen c.l. |
---|
183 | Matrix LogicLC = Not(Not(lastCol)); |
---|
184 | |
---|
185 | // Transformamos LogicLC en set para buscar |
---|
186 | Set indices = BinGroup("<<",MatSet(LogicLC)); |
---|
187 | |
---|
188 | // Selecionamos las series con indice no nulo |
---|
189 | Real c = 0; |
---|
190 | Set lcw = EvalSet(series,Text (Serie x) |
---|
191 | { |
---|
192 | Real c := c+1; |
---|
193 | Text If(indices[c], Name(x), "") |
---|
194 | }) - [[ "" ]]; |
---|
195 | |
---|
196 | Text txt2File = TxtListItemQuote(lcw,","+NL); |
---|
197 | |
---|
198 | // Sacamos los input que tienen combinacion lineal en traza y en fichero |
---|
199 | // .log, por si lo ejecutas en remoto sin tolbase |
---|
200 | Text WriteLn("[LinComWarning] THERE ARE "+IntText(Card(lcw))+" LINEAR" |
---|
201 | +"COMBINATIONS OF INPUT SERIES CHECK LOG DIRECTORY!!"+NL+NL+NL+ |
---|
202 | txt2File+NL+NL+NL, |
---|
203 | Text "E"); |
---|
204 | |
---|
205 | Set EvalSet(lcw,Real (Text nameParameter){ |
---|
206 | NameBlock expTermPrior = model::GetExpTerm(nameParameter); |
---|
207 | Set parameterPrior = expTermPrior::GetParameters(?); |
---|
208 | Set EvalSet(parameterPrior, Real (NameBlock parameterPrior) |
---|
209 | { |
---|
210 | Text parameterName = parameterPrior::GetIndex(?); |
---|
211 | Real model::CreatePrior( |
---|
212 | [[ |
---|
213 | Text _.element = parameterName; |
---|
214 | Real _.average = 0; |
---|
215 | Real _.sigma = 10 |
---|
216 | ]] |
---|
217 | ) |
---|
218 | }); |
---|
219 | Real 1 |
---|
220 | }); |
---|
221 | |
---|
222 | Text logRoute = PathProject+"log/lincom/lincom_"+ |
---|
223 | model::GetName(?)+ |
---|
224 | FormatDate(Now) +".log"; |
---|
225 | |
---|
226 | Text WriteFile(logRoute,txt2File); |
---|
227 | |
---|
228 | Real 1//Stop |
---|
229 | }) |
---|
230 | })) |
---|
231 | }; |
---|
232 | ////////////////////////////////////////////////////////////////////////////// |
---|
233 | PutDescription("Combprueba si existen combinaciones lineales en la estrategia |
---|
234 | que recibe como argumento", |
---|
235 | LinComWarning); |
---|
236 | ////////////////////////////////////////////////////////////////////////////// |
---|
237 | |
---|
238 | |
---|
239 | ////////////////////////////////////////////////////////////////////////////// |
---|
240 | Set RoundSVD(Set svd,Real trasposed, Real minSparse, Real tolerance) |
---|
241 | ////////////////////////////////////////////////////////////////////////////// |
---|
242 | {/* |
---|
243 | Set svd = SVD(matrix); |
---|
244 | Real trasposed = False; |
---|
245 | Real minSparse = 0.5; |
---|
246 | Real tolerance = 10^(-12); |
---|
247 | */ |
---|
248 | Set EvalSet(svd,Matrix (Matrix matrix) |
---|
249 | { |
---|
250 | VMatrix vmatrix = Mat2VMat( |
---|
251 | matrix, // matrix to transform |
---|
252 | trasposed, // does it trasposed? |
---|
253 | minSparse, // minSparse |
---|
254 | tolerance); // tolerance |
---|
255 | |
---|
256 | Matrix VMat2Mat(vmatrix) |
---|
257 | }) |
---|
258 | }; |
---|
259 | ////////////////////////////////////////////////////////////////////////////// |
---|
260 | PutDescription("It rounds an exit of SVD function to avoid negligible values. |
---|
261 | It needs: |
---|
262 | matrix --> matrix to transform |
---|
263 | trasposed --> does it trasposed? (True or False) |
---|
264 | minSparse --> minSparse use 0.5 by default |
---|
265 | tolerance --> round use 10^(-10) by default |
---|
266 | ", |
---|
267 | RoundSVD); |
---|
268 | ////////////////////////////////////////////////////////////////////////////// |
---|