| 1 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 2 | // File: functions.tol |
|---|
| 3 | // Purpose: It defines functions to create useful general input variables: |
|---|
| 4 | // summer, Easter, Christmas & festives |
|---|
| 5 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 6 | |
|---|
| 7 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 8 | // Structures |
|---|
| 9 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 10 | |
|---|
| 11 | Struct InputDef( |
|---|
| 12 | Polyn Omega, |
|---|
| 13 | Serie X |
|---|
| 14 | ); |
|---|
| 15 | |
|---|
| 16 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 17 | // Constants |
|---|
| 18 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 19 | |
|---|
| 20 | Set Standard.Variables = Empty; |
|---|
| 21 | |
|---|
| 22 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 23 | // Functions |
|---|
| 24 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 25 | |
|---|
| 26 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 27 | TimeSet Festive.National(Text counrty) |
|---|
| 28 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 29 | { |
|---|
| 30 | Set s.Brazil = [[ "Brasil", "brasil", "BRASIL", "Brazil","brazil", "BRAZIL", |
|---|
| 31 | "Bra", "bra", "BRA" |
|---|
| 32 | ]]; |
|---|
| 33 | Set s.Spain = [[ "España", "españa", "ESPAÑA", "Spain","spain", "SPAIN", |
|---|
| 34 | "Spa","spa", "SPA" |
|---|
| 35 | ]]; |
|---|
| 36 | |
|---|
| 37 | Set s.Countries = s.Brazil + s.Spain; |
|---|
| 38 | |
|---|
| 39 | TimeSet If(Not(counrty <: s.Countries), |
|---|
| 40 | { |
|---|
| 41 | WriteLn("[Festive.National] There are not definited national festives "+ |
|---|
| 42 | "of: "+country,"W"); |
|---|
| 43 | TimeSet W |
|---|
| 44 | }, |
|---|
| 45 | { |
|---|
| 46 | TimeSet Festive.National.Brazil(Real void) |
|---|
| 47 | { |
|---|
| 48 | Set festives = [[ |
|---|
| 49 | TimeSet DiaDoTravalho = D(1)*M(5), |
|---|
| 50 | TimeSet RevolConst = D(9)*M(7), |
|---|
| 51 | TimeSet IndepBras = D(7)*M(9), |
|---|
| 52 | TimeSet NossaSenApar = D(12)*M(10), |
|---|
| 53 | TimeSet ServidorPublico = D(28)*M(10), |
|---|
| 54 | TimeSet Finados = D(2)*M(11), |
|---|
| 55 | TimeSet ProclamacaoRepublica = D(15)*M(11), |
|---|
| 56 | TimeSet Tiradentes = D(21)*M(4) |
|---|
| 57 | ]]; |
|---|
| 58 | |
|---|
| 59 | TimeSet BinGroup("+",festives) |
|---|
| 60 | }; |
|---|
| 61 | |
|---|
| 62 | TimeSet Festive.National.Spain(Real void) |
|---|
| 63 | { |
|---|
| 64 | Set festives = [[ |
|---|
| 65 | TimeSet Constitucion = D(6)*M(12), |
|---|
| 66 | TimeSet DiaDelPilar = D(12)*M(10), |
|---|
| 67 | TimeSet DiaDelTrabajo = D(1)*M(5), |
|---|
| 68 | TimeSet Inmaculada = D(8)*M(12), |
|---|
| 69 | TimeSet TodosLosSantos = D(1)*M(11), |
|---|
| 70 | TimeSet VirgenAgosto = D(15)*M(8) |
|---|
| 71 | ]]; |
|---|
| 72 | |
|---|
| 73 | TimeSet BinGroup("+",festives) |
|---|
| 74 | }; |
|---|
| 75 | |
|---|
| 76 | TimeSet Case( |
|---|
| 77 | counrty <: s.Brazil, Festive.National.Brazil(?), |
|---|
| 78 | counrty <: s.Spain, Festive.National.Spain(?), |
|---|
| 79 | True, TimeSet W |
|---|
| 80 | ) |
|---|
| 81 | }) |
|---|
| 82 | }; |
|---|
| 83 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 84 | PutDescription("It builds the timeset of national festives by country.", |
|---|
| 85 | Festive.National); |
|---|
| 86 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 87 | |
|---|
| 88 | |
|---|
| 89 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 90 | Set Build.Festives.Struct(TimeSet festives, Real referenceDay) |
|---|
| 91 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 92 | { |
|---|
| 93 | Real Yini = 1981; |
|---|
| 94 | Real Yfin = Year(Today)+3; |
|---|
| 95 | TimeSet limit = BinGroup("+",For(Yini,Yfin,TimeSet (Real j){ Y(j) })); |
|---|
| 96 | TimeSet limFes = festives*limit; |
|---|
| 97 | |
|---|
| 98 | // It gives the relative frequency coefficient between festives by day |
|---|
| 99 | Real CoefNor(Real k) |
|---|
| 100 | { |
|---|
| 101 | TimeSet tms.k = limFes*WD(k); |
|---|
| 102 | TimeSet tms.R = limFes*WD(referenceDay); |
|---|
| 103 | |
|---|
| 104 | Real _k = SumS(CalInd(tms.k,Diario)); |
|---|
| 105 | Real _ref = SumS(CalInd(tms.R,Diario)); |
|---|
| 106 | |
|---|
| 107 | Real If(_ref, _k/_ref, |
|---|
| 108 | { |
|---|
| 109 | Text WriteLn("[Build.Festives.Struct][CoefNor]: You have selected a not" |
|---|
| 110 | +" valid reference day. There are not festives in WD("+ |
|---|
| 111 | IntText(referenceDay)+") within your sample","W"); |
|---|
| 112 | Real Stop |
|---|
| 113 | }) |
|---|
| 114 | }; |
|---|
| 115 | |
|---|
| 116 | // It creates a generic input for the festives |
|---|
| 117 | Set festives.Nationals = [[ |
|---|
| 118 | Set InputDef( |
|---|
| 119 | Polyn 1, |
|---|
| 120 | Serie Fes.National = SubSer(CalInd(festives,Diario),DefFirst,DefLast) |
|---|
| 121 | ) |
|---|
| 122 | ]]; |
|---|
| 123 | |
|---|
| 124 | // It creates the inputs fitters for the festive inputs |
|---|
| 125 | Set festives.Fitters = For(1,7,Set (Real k) |
|---|
| 126 | { |
|---|
| 127 | Set If(EQ(k,referenceDay), Empty, |
|---|
| 128 | { |
|---|
| 129 | Text name = "Fes.Fit.WD"+IntText(k); |
|---|
| 130 | Serie fes.k = CalInd(festives*WD(k),Diario); |
|---|
| 131 | Serie fes.r = CalInd(festives*WD(referenceDay),Diario)*CoefNor(k); |
|---|
| 132 | Serie fes.f = SubSer(fes.k - fes.r,DefFirst,DefLast); |
|---|
| 133 | |
|---|
| 134 | Set InputDef(Polyn 1,Serie PutName(name,fes.f)) |
|---|
| 135 | }) |
|---|
| 136 | }) - [[ Empty ]]; |
|---|
| 137 | |
|---|
| 138 | // Set of satellites |
|---|
| 139 | Set Satellites = [[ |
|---|
| 140 | Set WD.1 = [[ Real -1 ]], |
|---|
| 141 | Set WD.2 = [[ Real -1 ]], |
|---|
| 142 | Set WD.3 = Empty, |
|---|
| 143 | Set WD.4 = [[ 1,2,3 ]], |
|---|
| 144 | Set WD.5 = [[ 1,2 ]], |
|---|
| 145 | Set WD.6 = [[ Real -1 ]], |
|---|
| 146 | Set WD.7 = [[ 1 ]] |
|---|
| 147 | ]]; |
|---|
| 148 | |
|---|
| 149 | // It creates the inputs satellites for the festive inputs |
|---|
| 150 | Set festives.Satellites = BinGroup("<<",For(1,7,Set (Real j) |
|---|
| 151 | { |
|---|
| 152 | Set If(Not(Card(Satellites[j])), Empty, |
|---|
| 153 | Set EvalSet(Satellites[j],Set (Real k) |
|---|
| 154 | { |
|---|
| 155 | Text succ = If(GT(k,0),IntText(k),"_"+IntText(SqRt(k^2))); |
|---|
| 156 | Text name = "Fes.Sat.Succ"+succ+".Fes."+Name(Satellites[j]); |
|---|
| 157 | TimeSet tms = festives*WD(j); |
|---|
| 158 | Serie sat.k = SubSer( |
|---|
| 159 | CalInd(Succ(tms,k,Diario),Diario), |
|---|
| 160 | DefFirst, |
|---|
| 161 | DefLast |
|---|
| 162 | ); |
|---|
| 163 | |
|---|
| 164 | Set InputDef(Polyn 1,Serie PutName(name,sat.k)) |
|---|
| 165 | }) |
|---|
| 166 | ) |
|---|
| 167 | }) - [[ Empty ]]); |
|---|
| 168 | |
|---|
| 169 | Set struct = festives.Nationals << festives.Fitters << festives.Satellites; |
|---|
| 170 | |
|---|
| 171 | Set EvalSet(struct,Real (Set idef) |
|---|
| 172 | { |
|---|
| 173 | Set Standard.Variables := Standard.Variables + [[ Serie idef->X ]] |
|---|
| 174 | }); |
|---|
| 175 | |
|---|
| 176 | Set struct |
|---|
| 177 | }; |
|---|
| 178 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 179 | PutDescription("It builds an InputDef structure for festives in three steps: |
|---|
| 180 | 1-> A generic input for all festives. |
|---|
| 181 | 2-> A set of fitters per week day. |
|---|
| 182 | 3-> A set of satellites around festives. |
|---|
| 183 | ", |
|---|
| 184 | Build.Festives.Struct); |
|---|
| 185 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 186 | |
|---|
| 187 | |
|---|
| 188 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 189 | Set Build.KeyDays.Series(TimeSet day, Text label) |
|---|
| 190 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 191 | { |
|---|
| 192 | Set For(1,7,Serie (Real k) |
|---|
| 193 | { |
|---|
| 194 | Serie input = CalInd(day*WD(k),Diario); |
|---|
| 195 | |
|---|
| 196 | Text label2 = If(label == "", |
|---|
| 197 | "Holiday.key.WD"+IntText(k), |
|---|
| 198 | label+".WD"+IntText(k) |
|---|
| 199 | ); |
|---|
| 200 | |
|---|
| 201 | Serie PutName(label2,input) |
|---|
| 202 | }) |
|---|
| 203 | }; |
|---|
| 204 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 205 | PutDescription("", |
|---|
| 206 | Build.KeyDays.Series); |
|---|
| 207 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 208 | |
|---|
| 209 | |
|---|
| 210 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 211 | Set Build.Holiday.KeyDays(TimeSet iniSat) |
|---|
| 212 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 213 | { |
|---|
| 214 | TimeSet summer = M(6)+M(7)+M(8)+M(9); |
|---|
| 215 | TimeSet Christmas = M(11)+M(12)+M(1); |
|---|
| 216 | Real check.summer = SumS(CalInd(iniSat*summer,Diario)); |
|---|
| 217 | Real check.Christmas = SumS(CalInd(iniSat*Christmas,Diario)); |
|---|
| 218 | |
|---|
| 219 | TimeSet tmsSat_00 = Range(iniSat, 0, 6, Diario)*WD(6); |
|---|
| 220 | TimeSet tmsMon_00 = Succ(tmsSat_00, 2, Diario); |
|---|
| 221 | |
|---|
| 222 | Serie holiday.IndSem_00_WD5 = F:CalInd(tmsSat_00, Diario); |
|---|
| 223 | Serie holiday.IndSem_00_WD6 = CalInd(tmsSat_00, Diario); |
|---|
| 224 | Serie holiday.IndSem_00_WD7 = B:CalInd(tmsSat_00, Diario); |
|---|
| 225 | Serie holiday.IndSem_00_Rest = (1+B+B^2+B^3):CalInd(tmsMon_00, Diario); |
|---|
| 226 | |
|---|
| 227 | Set key.Days = Case( |
|---|
| 228 | check.summer, |
|---|
| 229 | { |
|---|
| 230 | Text label = "Summer.key."; |
|---|
| 231 | |
|---|
| 232 | Set Inp.15Jun = Build.KeyDays.Series(D(15)*M(6), label+"15Jun"); |
|---|
| 233 | Set Inp.01Jul = Build.KeyDays.Series(D(1)*M(7), label+"01Jul"); |
|---|
| 234 | Set Inp.15Jul = Build.KeyDays.Series(D(15)*M(7), label+"15Jul"); |
|---|
| 235 | Set Inp.01Aug = Build.KeyDays.Series(D(1)*M(8), label+"01Aug"); |
|---|
| 236 | Set Inp.15Aug = Build.KeyDays.Series(D(15)*M(8), label+"15Aug"); |
|---|
| 237 | Set Inp.01Sep = Build.KeyDays.Series(D(1)*M(9), label+"01Sep"); |
|---|
| 238 | Set Inp.15Sep = Build.KeyDays.Series(D(15)*M(9), label+"15Sep"); |
|---|
| 239 | |
|---|
| 240 | Set Inp.15Jun << Inp.01Jul << Inp.15Jul << Inp.01Aug << Inp.15Aug << |
|---|
| 241 | Inp.01Sep << Inp.15Sep |
|---|
| 242 | }, |
|---|
| 243 | check.Christmas, |
|---|
| 244 | { |
|---|
| 245 | Text label = "Christmas.key."; |
|---|
| 246 | |
|---|
| 247 | Set Inp.24Dec = Build.KeyDays.Series(D(24)*M(12), label+"24Dec"); |
|---|
| 248 | Set Inp.25Dec = Build.KeyDays.Series(D(25)*M(12), label+"25Dec"); |
|---|
| 249 | Set Inp.31Dec = Build.KeyDays.Series(D(31)*M(12), label+"31Dec"); |
|---|
| 250 | Set Inp.01Jan = Build.KeyDays.Series(D(1)*M(1), label+"01Jan"); |
|---|
| 251 | |
|---|
| 252 | Set Inp.24Dec << Inp.25Dec << Inp.31Dec << Inp.01Jan |
|---|
| 253 | }, |
|---|
| 254 | True, Empty |
|---|
| 255 | ); |
|---|
| 256 | |
|---|
| 257 | Set key.Days << [[ |
|---|
| 258 | holiday.IndSem_00_WD5, |
|---|
| 259 | holiday.IndSem_00_WD6, |
|---|
| 260 | holiday.IndSem_00_WD7, |
|---|
| 261 | holiday.IndSem_00_Rest |
|---|
| 262 | ]] |
|---|
| 263 | }; |
|---|
| 264 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 265 | PutDescription("It builds the set of series of key days in holidays, and the |
|---|
| 266 | weekend days arround", |
|---|
| 267 | Build.Holiday.KeyDays); |
|---|
| 268 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 269 | |
|---|
| 270 | |
|---|
| 271 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 272 | Set Build.Weekly.HolidayStruct(TimeSet iniSat, Real numSem) |
|---|
| 273 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 274 | { |
|---|
| 275 | TimeSet summer = M(6)+M(7)+M(8)+M(9); |
|---|
| 276 | TimeSet Christmas = M(11)+M(12)+M(1); |
|---|
| 277 | Real check.summer = SumS(CalInd(iniSat*summer,Diario)); |
|---|
| 278 | Real check.Christmas = SumS(CalInd(iniSat*Christmas,Diario)); |
|---|
| 279 | |
|---|
| 280 | Text label = Case( |
|---|
| 281 | check.summer, "Summer.IndWeek.", |
|---|
| 282 | check.Christmas,"Christmas.IndWeek.", |
|---|
| 283 | True, "Holidays.IndWeek." |
|---|
| 284 | ); |
|---|
| 285 | |
|---|
| 286 | Set sKeyDays = Build.Holiday.KeyDays(iniSat); |
|---|
| 287 | |
|---|
| 288 | Set sIndWeeks = For(1,numSem,Set (Real n) |
|---|
| 289 | { |
|---|
| 290 | TimeSet rng.Sat = Range(iniSat, 0, 6, Diario)*WD(6); |
|---|
| 291 | TimeSet tmsSatN = Succ(rng.Sat, n, WD(6)); |
|---|
| 292 | TimeSet tmsMonN = Succ(Succ(rng.Sat,2,Diario),n,WD(1)); |
|---|
| 293 | |
|---|
| 294 | Serie srWD5 = F:CalInd(tmsSatN, Diario); |
|---|
| 295 | Serie srWD6 = CalInd(tmsSatN, Diario); |
|---|
| 296 | Serie srWD7 = B:CalInd(tmsSatN, Diario); |
|---|
| 297 | Serie srRest = (1+B+B^2+B^3):CalInd(tmsMonN, Diario); |
|---|
| 298 | |
|---|
| 299 | Text nameWD5 = label+FormatReal(n, "%02.0lf")+"_WD5"; |
|---|
| 300 | Text nameWD6 = label+FormatReal(n, "%02.0lf")+"_WD6"; |
|---|
| 301 | Text nameWD7 = label+FormatReal(n, "%02.0lf")+"_WD7"; |
|---|
| 302 | Text nameRest = label+FormatReal(n, "%02.0lf")+"_Rest"; |
|---|
| 303 | |
|---|
| 304 | Set If(LT(n, numSem), |
|---|
| 305 | [[ |
|---|
| 306 | Serie PutName(nameWD5,srWD5), |
|---|
| 307 | Serie PutName(nameWD6,srWD6), |
|---|
| 308 | Serie PutName(nameWD7,srWD7), |
|---|
| 309 | Serie PutName(nameRest,srRest) |
|---|
| 310 | ]], |
|---|
| 311 | [[ |
|---|
| 312 | Serie PutName(nameWD5,srWD5), |
|---|
| 313 | Serie PutName(nameWD6,srWD6), |
|---|
| 314 | Serie PutName(nameWD7,srWD7) |
|---|
| 315 | ]] |
|---|
| 316 | ) |
|---|
| 317 | }); |
|---|
| 318 | |
|---|
| 319 | Set result = BinGroup("<<",sIndWeeks) << sKeyDays; |
|---|
| 320 | |
|---|
| 321 | Set sHolidayStruct = EvalSet(result,Serie (Serie sr) |
|---|
| 322 | { |
|---|
| 323 | Text name = Identify(sr); |
|---|
| 324 | Serie sr2 = SubSer(sr,DefFirst,DefLast); |
|---|
| 325 | |
|---|
| 326 | Serie PutName(name,sr2) |
|---|
| 327 | }); |
|---|
| 328 | |
|---|
| 329 | Set struct = EvalSet(sHolidayStruct,Set (Serie s) |
|---|
| 330 | { |
|---|
| 331 | Set InputDef(Polyn 1, Serie s) |
|---|
| 332 | }); |
|---|
| 333 | |
|---|
| 334 | Set EvalSet(struct,Real (Set idef) |
|---|
| 335 | { |
|---|
| 336 | Set Standard.Variables := Standard.Variables + [[ Serie idef->X ]] |
|---|
| 337 | }); |
|---|
| 338 | |
|---|
| 339 | Set struct |
|---|
| 340 | }; |
|---|
| 341 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 342 | PutDescription("Devuelve la estructura de escalones de variables por semana, |
|---|
| 343 | en Sol y NotSol, definidos de manera que todos los inputs toman valor todos |
|---|
| 344 | los años.", |
|---|
| 345 | Build.Weekly.HolidayStruct); |
|---|
| 346 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 347 | |
|---|
| 348 | |
|---|
| 349 | ////////////////////////////////////////////////////////////////////////////// |
|---|
| 350 | // FIN |
|---|
| 351 | ////////////////////////////////////////////////////////////////////////////// |
|---|