1 /*
2  * Copyright © 2003-2020 Dynare Team
3  *
4  * This file is part of Dynare.
5  *
6  * Dynare is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Dynare is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef _COMPUTINGTASKS_HH
21 #define _COMPUTINGTASKS_HH
22 
23 #include <ostream>
24 
25 #include "SymbolList.hh"
26 #include "SymbolTable.hh"
27 #include "Statement.hh"
28 #include "StaticModel.hh"
29 #include "DynamicModel.hh"
30 #include "ModelEquationBlock.hh"
31 
32 class SteadyStatement : public Statement
33 {
34 private:
35   const OptionsList options_list;
36 public:
37   explicit SteadyStatement(OptionsList options_list_arg);
38   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
39   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
40   void writeJsonOutput(ostream &output) const override;
41 };
42 
43 class CheckStatement : public Statement
44 {
45 private:
46   const OptionsList options_list;
47 public:
48   explicit CheckStatement(OptionsList options_list_arg);
49   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
50   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
51   void writeJsonOutput(ostream &output) const override;
52 };
53 
54 class SimulStatement : public Statement
55 {
56 private:
57   const OptionsList options_list;
58 public:
59   explicit SimulStatement(OptionsList options_list_arg);
60   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
61   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
62   void writeJsonOutput(ostream &output) const override;
63 };
64 
65 class PerfectForesightSetupStatement : public Statement
66 {
67 private:
68   const OptionsList options_list;
69 public:
70   explicit PerfectForesightSetupStatement(OptionsList options_list_arg);
71   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
72   void writeJsonOutput(ostream &output) const override;
73 };
74 
75 class PerfectForesightSolverStatement : public Statement
76 {
77 private:
78   const OptionsList options_list;
79 public:
80   explicit PerfectForesightSolverStatement(OptionsList options_list_arg);
81   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
82   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
83   void writeJsonOutput(ostream &output) const override;
84 };
85 
86 class PriorPosteriorFunctionStatement : public Statement
87 {
88 private:
89   const bool prior_func;
90   const OptionsList options_list;
91 public:
92   PriorPosteriorFunctionStatement(const bool prior_func_arg, OptionsList options_list_arg);
93   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
94   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
95   void writeJsonOutput(ostream &output) const override;
96 };
97 
98 class ModelInfoStatement : public Statement
99 {
100 private:
101   const OptionsList options_list;
102 public:
103   explicit ModelInfoStatement(OptionsList options_list_arg);
104   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
105   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
106   void writeJsonOutput(ostream &output) const override;
107 };
108 
109 class StochSimulStatement : public Statement
110 {
111 private:
112   SymbolList symbol_list;
113   const OptionsList options_list;
114 public:
115   StochSimulStatement(SymbolList symbol_list_arg,
116                       OptionsList options_list_arg);
117   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
118   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
119   void writeJsonOutput(ostream &output) const override;
120 };
121 
122 class PacModelStatement : public Statement
123 {
124 public:
125   const string name, aux_model_name, discount;
126   expr_t growth, original_growth;
127 private:
128   const double steady_state_growth_rate_number;
129   const int steady_state_growth_rate_symb_id;
130   const SymbolTable &symbol_table;
131   vector<tuple<int, int, int, double>> growth_info;
132 public:
133   PacModelStatement(string name_arg,
134                     string aux_model_name_arg,
135                     string discount_arg,
136                     expr_t growth_arg,
137                     double steady_state_growth_rate_number_arg,
138                     int steady_state_growth_rate_symb_id_arg,
139                     const SymbolTable &symbol_table_arg);
140   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
141   void overwriteGrowth(expr_t new_growth);
142   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
143   void writeJsonOutput(ostream &output) const override;
144 };
145 
146 class VarRestrictionsStatement : public Statement
147 {
148 private:
149   using var_restriction_eq_crosseq_t = pair<pair<int, pair<int, int>>, expr_t>;
150   const string var_model_name;
151   const map<string, vector<string>> var_map;
152   const map<int, map<int, SymbolList>> exclusion_restrictions;
153   using equation_restrictions_t = map<int, pair<pair<var_restriction_eq_crosseq_t, var_restriction_eq_crosseq_t>, double>>;
154   const equation_restrictions_t equation_restrictions;
155   using crossequation_restrictions_t = vector<pair<pair<var_restriction_eq_crosseq_t, var_restriction_eq_crosseq_t>, double>>;
156   const crossequation_restrictions_t crossequation_restrictions;
157   const map<pair<int, int>, double> covariance_number_restriction;
158   const map<pair<int, int>, pair<int, int>> covariance_pair_restriction;
159   const SymbolTable &symbol_table;
160   int findIdxInVector(const vector<string> &vecvars, const string &var) const;
161 public:
162   VarRestrictionsStatement(string var_model_name_arg,
163                            map<string, vector<string>> var_map_arg,
164                            map<int, map<int, SymbolList>> exclusion_restrictions_arg,
165                            equation_restrictions_t equation_restrictions_arg,
166                            crossequation_restrictions_t crossequation_restrictions_arg,
167                            map<pair<int, int>, double> covariance_number_restriction_arg,
168                            map<pair<int, int>, pair<int, int>> covariance_pair_restriction_arg,
169                            const SymbolTable &symbol_table_arg);
170   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
171 };
172 
173 class VarEstimationStatement : public Statement
174 {
175 private:
176   const OptionsList options_list;
177 public:
178   explicit VarEstimationStatement(OptionsList options_list_arg);
179   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
180   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
181 };
182 
183 class ForecastStatement : public Statement
184 {
185 private:
186   const SymbolList symbol_list;
187   const OptionsList options_list;
188 public:
189   ForecastStatement(SymbolList symbol_list_arg,
190                     OptionsList options_list_arg);
191   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
192   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
193   void writeJsonOutput(ostream &output) const override;
194 };
195 
196 class RamseyModelStatement : public Statement
197 {
198 private:
199   const OptionsList options_list;
200 public:
201   explicit RamseyModelStatement(OptionsList options_list_arg);
202   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
203   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
204   void writeJsonOutput(ostream &output) const override;
205 };
206 
207 class RamseyConstraintsStatement : public Statement
208 {
209 public:
210   struct Constraint
211   {
212     int endo;
213     BinaryOpcode code;
214     expr_t expression;
215   };
216   using constraints_t = vector<Constraint>;
217 private:
218   const SymbolTable &symbol_table;
219   const constraints_t constraints;
220 public:
221   RamseyConstraintsStatement(const SymbolTable &symbol_table_arg, constraints_t constraints_arg);
222   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
223   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
224   void writeJsonOutput(ostream &output) const override;
225 };
226 
227 class RamseyPolicyStatement : public Statement
228 {
229 private:
230   const SymbolTable &symbol_table;
231   const SymbolList symbol_list;
232   const OptionsList options_list;
233 public:
234   RamseyPolicyStatement(const SymbolTable &symbol_table_arg,
235                         SymbolList symbol_list_arg,
236                         OptionsList options_list_arg);
237   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
238   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
239   void writeJsonOutput(ostream &output) const override;
240 };
241 
242 class EvaluatePlannerObjective : public Statement
243 {
244 public:
245   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
246   void writeJsonOutput(ostream &output) const override;
247 };
248 
249 class DiscretionaryPolicyStatement : public Statement
250 {
251 private:
252   const SymbolList symbol_list;
253   const OptionsList options_list;
254 public:
255   DiscretionaryPolicyStatement(SymbolList symbol_list_arg,
256                                OptionsList options_list_arg);
257   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
258   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
259   void writeJsonOutput(ostream &output) const override;
260 };
261 
262 class RplotStatement : public Statement
263 {
264 private:
265   const SymbolList symbol_list;
266 public:
267   explicit RplotStatement(SymbolList symbol_list_arg);
268   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
269   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
270   void writeJsonOutput(ostream &output) const override;
271 };
272 
273 class UnitRootVarsStatement : public Statement
274 {
275 public:
276   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
277   void writeJsonOutput(ostream &output) const override;
278 };
279 
280 class PeriodsStatement : public Statement
281 {
282 private:
283   const int periods;
284 public:
285   explicit PeriodsStatement(int periods_arg);
286   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
287   void writeJsonOutput(ostream &output) const override;
288 };
289 
290 class DsampleStatement : public Statement
291 {
292 private:
293   const int val1, val2;
294 public:
295   explicit DsampleStatement(int val1_arg);
296   DsampleStatement(int val1_arg, int val2_arg);
297   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
298   void writeJsonOutput(ostream &output) const override;
299 };
300 
301 class EstimationStatement : public Statement
302 {
303 private:
304   const SymbolTable &symbol_table;
305   const SymbolList symbol_list;
306   const OptionsList options_list;
307 public:
308   EstimationStatement(const SymbolTable &symbol_table_arg,
309                       SymbolList symbol_list_arg,
310                       OptionsList options_list_arg);
311   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
312   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
313   void writeJsonOutput(ostream &output) const override;
314 };
315 
316 class DynareSensitivityStatement : public Statement
317 {
318 private:
319   const OptionsList options_list;
320 public:
321   explicit DynareSensitivityStatement(OptionsList options_list_arg);
322   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
323   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
324   void writeJsonOutput(ostream &output) const override;
325 };
326 
327 class ObservationTrendsStatement : public Statement
328 {
329 public:
330   using trend_elements_t = map<string, expr_t>;
331 private:
332   const trend_elements_t trend_elements;
333   const SymbolTable &symbol_table;
334 public:
335   ObservationTrendsStatement(trend_elements_t trend_elements_arg,
336                              const SymbolTable &symbol_table_arg);
337   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
338   void writeJsonOutput(ostream &output) const override;
339 };
340 
341 class OsrParamsStatement : public Statement
342 {
343 private:
344   const SymbolList symbol_list;
345   const SymbolTable &symbol_table;
346 public:
347   OsrParamsStatement(SymbolList symbol_list_arg, const SymbolTable &symbol_table_arg);
348   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
349   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
350   void writeJsonOutput(ostream &output) const override;
351 };
352 
353 class OsrStatement : public Statement
354 {
355 private:
356   const SymbolList symbol_list;
357   const OptionsList options_list;
358 public:
359   OsrStatement(SymbolList symbol_list_arg,
360                OptionsList options_list_arg);
361   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
362   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
363   void writeJsonOutput(ostream &output) const override;
364 };
365 
366 //! Temporary structure used when parsing estimation_params* statements
367 class OsrParams
368 {
369 public:
370   string name;
371   expr_t low_bound, up_bound;
372 
373   void
init(const DataTree & datatree)374   init(const DataTree &datatree)
375   {
376     name = "";
377     low_bound = datatree.MinusInfinity;
378     up_bound = datatree.Infinity;
379   }
380 };
381 
382 class OsrParamsBoundsStatement : public Statement
383 {
384 private:
385   const vector<OsrParams> osr_params_list;
386 public:
387   explicit OsrParamsBoundsStatement(vector<OsrParams> osr_params_list_arg);
388   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
389   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
390   void writeJsonOutput(ostream &output) const override;
391 };
392 
393 class DynaTypeStatement : public Statement
394 {
395 private:
396   const SymbolList symbol_list;
397   const string filename;
398 public:
399   DynaTypeStatement(SymbolList symbol_list_arg,
400                     string filename_arg);
401   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
402   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
403   void writeJsonOutput(ostream &output) const override;
404 };
405 
406 class DynaSaveStatement : public Statement
407 {
408 private:
409   const SymbolList symbol_list;
410   const string filename;
411 public:
412   DynaSaveStatement(SymbolList symbol_list_arg,
413                     string filename_arg);
414   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
415   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
416   void writeJsonOutput(ostream &output) const override;
417 };
418 
419 class ModelComparisonStatement : public Statement
420 {
421 public:
422   using filename_list_t = vector<pair<string, string>>;
423 private:
424   filename_list_t filename_list;
425   OptionsList options_list;
426 public:
427   ModelComparisonStatement(filename_list_t filename_list_arg,
428                            OptionsList options_list_arg);
429   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
430   void writeJsonOutput(ostream &output) const override;
431 };
432 
433 //! Temporary structure used when parsing estimation_params* statements
434 class EstimationParams
435 {
436 public:
437   int type;
438   string name, name2;
439   PriorDistributions prior;
440   expr_t init_val, low_bound, up_bound, mean, std, p3, p4, jscale;
441 
442   void
init(const DataTree & datatree)443   init(const DataTree &datatree)
444   {
445     type = 0;
446     name = "";
447     name2 = "";
448     prior = PriorDistributions::noShape;
449     init_val = datatree.NaN;
450     low_bound = datatree.MinusInfinity;
451     up_bound = datatree.Infinity;
452     mean = datatree.NaN;
453     std = datatree.NaN;
454     p3 = datatree.NaN;
455     p4 = datatree.NaN;
456     jscale = datatree.NaN;
457   }
458 };
459 
460 class EstimatedParamsStatement : public Statement
461 {
462 private:
463   const vector<EstimationParams> estim_params_list;
464   const SymbolTable &symbol_table;
465 public:
466   EstimatedParamsStatement(vector<EstimationParams> estim_params_list_arg,
467                            const SymbolTable &symbol_table_arg);
468   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
469   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
470   void writeJsonOutput(ostream &output) const override;
471 };
472 
473 class EstimatedParamsInitStatement : public Statement
474 {
475 private:
476   const vector<EstimationParams> estim_params_list;
477   const SymbolTable &symbol_table;
478   const bool use_calibration;
479 public:
480   EstimatedParamsInitStatement(vector<EstimationParams> estim_params_list_arg,
481                                const SymbolTable &symbol_table_arg,
482                                const bool use_calibration_arg);
483   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
484   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
485   void writeJsonOutput(ostream &output) const override;
486 };
487 
488 class EstimatedParamsBoundsStatement : public Statement
489 {
490 private:
491   const vector<EstimationParams> estim_params_list;
492   const SymbolTable &symbol_table;
493 public:
494   EstimatedParamsBoundsStatement(vector<EstimationParams> estim_params_list_arg,
495                                  const SymbolTable &symbol_table_arg);
496   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
497   void writeJsonOutput(ostream &output) const override;
498 };
499 
500 class OptimWeightsStatement : public Statement
501 {
502 public:
503   using var_weights_t = map<string, expr_t>;
504   using covar_weights_t = map<pair<string, string>, expr_t>;
505 private:
506   const var_weights_t var_weights;
507   const covar_weights_t covar_weights;
508   const SymbolTable &symbol_table;
509 public:
510   OptimWeightsStatement(var_weights_t var_weights_arg,
511                         covar_weights_t covar_weights_arg,
512                         const SymbolTable &symbol_table_arg);
513   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
514   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
515   void writeJsonOutput(ostream &output) const override;
516 };
517 
518 class PlannerObjectiveStatement : public Statement
519 {
520 private:
521   StaticModel model_tree;
522   bool computing_pass_called{false};
523 public:
524   explicit PlannerObjectiveStatement(const StaticModel &model_tree_arg);
525   /*! \todo check there are only endogenous variables at the current period in the objective
526     (no exogenous, no lead/lag) */
527   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
528   /*! \todo allow for the possibility of disabling temporary terms */
529   void computingPass() override;
530   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
531   void writeJsonOutput(ostream &output) const override;
532   //! Return a reference the Planner Objective model tree
533   const StaticModel &getPlannerObjective() const;
534 };
535 
536 class BVARDensityStatement : public Statement
537 {
538 private:
539   const int maxnlags;
540   const OptionsList options_list;
541 public:
542   BVARDensityStatement(int maxnlags_arg, OptionsList options_list_arg);
543   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
544   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
545   void writeJsonOutput(ostream &output) const override;
546 };
547 
548 class BVARForecastStatement : public Statement
549 {
550 private:
551   const int nlags;
552   const OptionsList options_list;
553 public:
554   BVARForecastStatement(int nlags_arg, OptionsList options_list_arg);
555   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
556   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
557   void writeJsonOutput(ostream &output) const override;
558 };
559 
560 class SBVARStatement : public Statement
561 {
562 private:
563   const OptionsList options_list;
564 public:
565   explicit SBVARStatement(OptionsList options_list_arg);
566   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
567   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
568   void writeJsonOutput(ostream &output) const override;
569 };
570 
571 class MSSBVAREstimationStatement : public Statement
572 {
573 private:
574   const OptionsList options_list;
575 public:
576   explicit MSSBVAREstimationStatement(OptionsList options_list_arg);
577   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
578   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
579   void writeJsonOutput(ostream &output) const override;
580 };
581 
582 class MSSBVARSimulationStatement : public Statement
583 {
584 private:
585   const OptionsList options_list;
586 public:
587   explicit MSSBVARSimulationStatement(OptionsList options_list_arg);
588   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
589   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
590   void writeJsonOutput(ostream &output) const override;
591 };
592 
593 class MSSBVARComputeMDDStatement : public Statement
594 {
595 private:
596   const OptionsList options_list;
597 public:
598   explicit MSSBVARComputeMDDStatement(OptionsList options_list_arg);
599   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
600   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
601   void writeJsonOutput(ostream &output) const override;
602 };
603 
604 class MSSBVARComputeProbabilitiesStatement : public Statement
605 {
606 private:
607   const OptionsList options_list;
608 public:
609   explicit MSSBVARComputeProbabilitiesStatement(OptionsList options_list_arg);
610   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
611   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
612   void writeJsonOutput(ostream &output) const override;
613 };
614 
615 class MSSBVARIrfStatement : public Statement
616 {
617 private:
618   const SymbolList symbol_list;
619   const OptionsList options_list;
620 public:
621   MSSBVARIrfStatement(SymbolList symbol_list_arg,
622                       OptionsList options_list_arg);
623   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
624   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
625   void writeJsonOutput(ostream &output) const override;
626 };
627 
628 class MSSBVARForecastStatement : public Statement
629 {
630 private:
631   const OptionsList options_list;
632 public:
633   explicit MSSBVARForecastStatement(OptionsList options_list_arg);
634   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
635   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
636   void writeJsonOutput(ostream &output) const override;
637 };
638 
639 class MSSBVARVarianceDecompositionStatement : public Statement
640 {
641 private:
642   const OptionsList options_list;
643 public:
644   explicit MSSBVARVarianceDecompositionStatement(OptionsList options_list_arg);
645   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
646   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
647   void writeJsonOutput(ostream &output) const override;
648 };
649 
650 class IdentificationStatement : public Statement
651 {
652 private:
653   OptionsList options_list;
654 public:
655   explicit IdentificationStatement(OptionsList options_list_arg);
656   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
657   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
658   void writeJsonOutput(ostream &output) const override;
659 };
660 
661 class WriteLatexDynamicModelStatement : public Statement
662 {
663 private:
664   const DynamicModel &dynamic_model;
665   const bool write_equation_tags;
666 public:
667   WriteLatexDynamicModelStatement(const DynamicModel &dynamic_model_arg, bool write_equation_tags_arg);
668   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
669   void writeJsonOutput(ostream &output) const override;
670 };
671 
672 class WriteLatexStaticModelStatement : public Statement
673 {
674 private:
675   const StaticModel &static_model;
676   const bool write_equation_tags;
677 public:
678   WriteLatexStaticModelStatement(const StaticModel &static_model_arg, bool write_equation_tags_arg);
679   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
680   void writeJsonOutput(ostream &output) const override;
681 };
682 
683 class WriteLatexOriginalModelStatement : public Statement
684 {
685 private:
686   const DynamicModel &original_model;
687   const bool write_equation_tags;
688 public:
689   WriteLatexOriginalModelStatement(const DynamicModel &original_model_arg, bool write_equation_tags_arg);
690   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
691   void writeJsonOutput(ostream &output) const override;
692 };
693 
694 class WriteLatexSteadyStateModelStatement : public Statement
695 {
696 private:
697   const SteadyStateModel &steady_state_model;
698 public:
699   explicit WriteLatexSteadyStateModelStatement(const SteadyStateModel &steady_state_model_arg);
700   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
701   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
702   void writeJsonOutput(ostream &output) const override;
703 };
704 
705 class ShockDecompositionStatement : public Statement
706 {
707 private:
708   const SymbolList symbol_list;
709   const OptionsList options_list;
710 public:
711   ShockDecompositionStatement(SymbolList symbol_list_arg,
712                               OptionsList options_list_arg);
713   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
714   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
715   void writeJsonOutput(ostream &output) const override;
716 };
717 
718 class RealtimeShockDecompositionStatement : public Statement
719 {
720 private:
721   const SymbolList symbol_list;
722   const OptionsList options_list;
723 public:
724   RealtimeShockDecompositionStatement(SymbolList symbol_list_arg,
725                                       OptionsList options_list_arg);
726   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
727   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
728   void writeJsonOutput(ostream &output) const override;
729 };
730 
731 class PlotShockDecompositionStatement : public Statement
732 {
733 private:
734   const SymbolList symbol_list;
735   const OptionsList options_list;
736 public:
737   PlotShockDecompositionStatement(SymbolList symbol_list_arg,
738                                   OptionsList options_list_arg);
739   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
740   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
741   void writeJsonOutput(ostream &output) const override;
742 };
743 
744 class InitialConditionDecompositionStatement : public Statement
745 {
746 private:
747   const SymbolList symbol_list;
748   const OptionsList options_list;
749 public:
750   InitialConditionDecompositionStatement(SymbolList symbol_list_arg,
751                                          OptionsList options_list_arg);
752   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
753   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
754   void writeJsonOutput(ostream &output) const override;
755 };
756 
757 class SqueezeShockDecompositionStatement : public Statement
758 {
759 private:
760   const SymbolList symbol_list;
761 public:
762   SqueezeShockDecompositionStatement(SymbolList symbol_list_arg);
763   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
764   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
765   void writeJsonOutput(ostream &output) const override;
766 };
767 
768 class ConditionalForecastStatement : public Statement
769 {
770 private:
771   const OptionsList options_list;
772 public:
773   explicit ConditionalForecastStatement(OptionsList options_list_arg);
774   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
775   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
776   void writeJsonOutput(ostream &output) const override;
777 };
778 
779 class PlotConditionalForecastStatement : public Statement
780 {
781 private:
782   //! A value of -1 indicates that the user didn't specify a value
783   const int periods;
784   const SymbolList symbol_list;
785 public:
786   PlotConditionalForecastStatement(int periods_arg, SymbolList symbol_list_arg);
787   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
788   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
789   void writeJsonOutput(ostream &output) const override;
790 };
791 
792 class CalibSmootherStatement : public Statement
793 {
794 private:
795   const SymbolList symbol_list;
796   const OptionsList options_list;
797 public:
798   CalibSmootherStatement(SymbolList symbol_list_arg,
799                          OptionsList options_list_arg);
800   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
801   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
802   void writeJsonOutput(ostream &output) const override;
803 };
804 
805 class ExtendedPathStatement : public Statement
806 {
807 private:
808   const OptionsList options_list;
809 public:
810   explicit ExtendedPathStatement(OptionsList options_list_arg);
811   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
812   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
813   void writeJsonOutput(ostream &output) const override;
814 };
815 
816 class SvarIdentificationStatement : public Statement
817 {
818 public:
819   //  using svar_identification_exclusion_t = map<pair<int, int>, vector<int>>;
820   struct svar_identification_restriction
821   {
822     int equation;
823     int restriction_nbr;
824     int lag;
825     int variable;
826     expr_t value;
827   };
828 
829   using svar_identification_restrictions_t = vector<svar_identification_restriction>;
830 private:
831   const svar_identification_restrictions_t restrictions;
832   const bool upper_cholesky_present, lower_cholesky_present, constants_exclusion_present;
833   const SymbolTable &symbol_table;
834   int getMaxLag() const;
835 public:
836   SvarIdentificationStatement(svar_identification_restrictions_t restrictions_arg,
837                               bool upper_cholesky_present_arg,
838                               bool lower_cholesky_present_arg,
839                               bool constants_exclusion_present_arg,
840                               const SymbolTable &symbol_table_arg);
841   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
842   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
843   void writeJsonOutput(ostream &output) const override;
844 };
845 
846 class MarkovSwitchingStatement : public Statement
847 {
848 private:
849   const OptionsList options_list;
850   map<pair<int, int>, double> restriction_map;
851 public:
852   explicit MarkovSwitchingStatement(OptionsList options_list_arg);
853   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
854   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
855   void writeJsonOutput(ostream &output) const override;
856 };
857 
858 class SvarStatement : public Statement
859 {
860 private:
861   const OptionsList options_list;
862 public:
863   explicit SvarStatement(OptionsList options_list_arg);
864   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
865   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
866   void writeJsonOutput(ostream &output) const override;
867 };
868 
869 class SvarGlobalIdentificationCheckStatement : public Statement
870 {
871 public:
872   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
873   void writeJsonOutput(ostream &output) const override;
874 };
875 
876 class SetTimeStatement : public Statement
877 {
878 private:
879   const OptionsList options_list;
880 public:
881   explicit SetTimeStatement(OptionsList options_list_arg);
882   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
883   void writeJsonOutput(ostream &output) const override;
884 };
885 
886 class EstimationDataStatement : public Statement
887 {
888 private:
889   const OptionsList options_list;
890 public:
891   explicit EstimationDataStatement(OptionsList options_list_arg);
892   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
893   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
894   void writeJsonOutput(ostream &output) const override;
895 };
896 
897 class SubsamplesStatement : public Statement
898 {
899 public:
900   //! Storage for declaring subsamples: map<subsample_name, <date1, date2 >
901   using subsample_declaration_map_t = map<string, pair<string, string>>;
902 private:
903   const string name1, name2;
904   const subsample_declaration_map_t subsample_declaration_map;
905   const SymbolTable &symbol_table;
906 public:
907   SubsamplesStatement(string name1_arg,
908                       string name2_arg,
909                       subsample_declaration_map_t subsample_declaration_map_arg,
910                       const SymbolTable &symbol_table_arg);
911   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
912   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
913   void writeJsonOutput(ostream &output) const override;
914 };
915 
916 class SubsamplesEqualStatement : public Statement
917 {
918 private:
919   const string to_name1, to_name2, from_name1, from_name2;
920   const SymbolTable &symbol_table;
921 public:
922   SubsamplesEqualStatement(string to_name1_arg,
923                            string to_name2_arg,
924                            string from_name1_arg,
925                            string from_name2_arg,
926                            const SymbolTable &symbol_table_arg);
927   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
928   void writeJsonOutput(ostream &output) const override;
929 };
930 
931 class JointPriorStatement : public Statement
932 {
933 private:
934   const vector<string> joint_parameters;
935   const PriorDistributions prior_shape;
936   const OptionsList options_list;
937 public:
938   JointPriorStatement(vector<string> joint_parameters_arg,
939                       PriorDistributions prior_shape_arg,
940                       OptionsList options_list_arg);
941   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
942   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
943   void writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const;
944   void writeJsonOutput(ostream &output) const override;
945 };
946 
947 class BasicPriorStatement : public Statement
948 {
949 protected:
950   const string name, subsample_name;
951   const PriorDistributions prior_shape;
952   const expr_t variance;
953   const OptionsList options_list;
954   BasicPriorStatement(string name_arg,
955                       string subsample_name_arg,
956                       PriorDistributions prior_shape_arg,
957                       expr_t variance_arg,
958                       OptionsList options_list_arg);
959   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
960   void get_base_name(const SymbolType symb_type, string &lhs_field) const;
961   void writeCommonOutput(ostream &output, const string &lhs_field) const;
962   void writeCommonOutputHelper(ostream &output, const string &field, const string &lhs_field) const;
963   void writePriorOutput(ostream &output, string &lhs_field, const string &name2) const;
964   bool is_structural_innovation(const SymbolType symb_type) const;
965   void writePriorIndex(ostream &output, const string &lhs_field) const;
966   void writeVarianceOption(ostream &output, const string &lhs_field) const;
967   void writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const;
968   void writeShape(ostream &output, const string &lhs_field) const;
969   void writeJsonShape(ostream &output) const;
970   void writeJsonPriorOutput(ostream &output) const;
971 };
972 
973 class PriorStatement : public BasicPriorStatement
974 {
975 public:
976   PriorStatement(string name_arg,
977                  string subsample_name_arg,
978                  PriorDistributions prior_shape_arg,
979                  expr_t variance_arg,
980                  OptionsList options_list_arg);
981   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
982   void writeJsonOutput(ostream &output) const override;
983 };
984 
985 class StdPriorStatement : public BasicPriorStatement
986 {
987 private:
988   const SymbolTable &symbol_table;
989 public:
990   StdPriorStatement(string name_arg,
991                     string subsample_name_arg,
992                     PriorDistributions prior_shape_arg,
993                     expr_t variance_arg,
994                     OptionsList options_list_arg,
995                     const SymbolTable &symbol_table_arg);
996   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
997   void writeJsonOutput(ostream &output) const override;
998 };
999 
1000 class CorrPriorStatement : public BasicPriorStatement
1001 {
1002 private:
1003   const string name1;
1004   const SymbolTable &symbol_table;
1005 public:
1006   CorrPriorStatement(string name_arg1,
1007                      string name_arg2,
1008                      string subsample_name_arg,
1009                      PriorDistributions prior_shape_arg,
1010                      expr_t variance_arg,
1011                      OptionsList options_list_arg,
1012                      const SymbolTable &symbol_table_arg);
1013   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
1014   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1015   void writeJsonOutput(ostream &output) const override;
1016 };
1017 
1018 class PriorEqualStatement : public Statement
1019 {
1020 private:
1021   const string to_declaration_type, to_name1, to_name2, to_subsample_name;
1022   const string from_declaration_type, from_name1, from_name2, from_subsample_name;
1023   const SymbolTable &symbol_table;
1024 public:
1025   PriorEqualStatement(string to_declaration_type_arg,
1026                       string to_name1_arg,
1027                       string to_name2_arg,
1028                       string to_subsample_name_arg,
1029                       string from_declaration_type_arg,
1030                       string from_name1_arg,
1031                       string from_name2_arg,
1032                       string from_subsample_name_arg,
1033                       const SymbolTable &symbol_table_arg);
1034   void get_base_name(const SymbolType symb_type, string &lhs_field) const;
1035   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
1036   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1037   void writeJsonOutput(ostream &output) const override;
1038 };
1039 
1040 class BasicOptionsStatement : public Statement
1041 {
1042 protected:
1043   const string name, subsample_name;
1044   const OptionsList options_list;
1045   BasicOptionsStatement(string name_arg,
1046                         string subsample_name_arg,
1047                         OptionsList options_list_arg);
1048   void get_base_name(const SymbolType symb_type, string &lhs_field) const;
1049   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
1050   void writeOptionsOutput(ostream &output, string &lhs_field, const string &name2) const;
1051   void writeCommonOutput(ostream &output, const string &lhs_field) const;
1052   void writeCommonOutputHelper(ostream &output, const string &field, const string &lhs_field) const;
1053   bool is_structural_innovation(const SymbolType symb_type) const;
1054   void writeOptionsIndex(ostream &output, const string &lhs_field) const;
1055   void writeOutputHelper(ostream &output, const string &field, const string &lhs_field) const;
1056   void writeJsonOptionsOutput(ostream &output) const;
1057 };
1058 
1059 class OptionsStatement : public BasicOptionsStatement
1060 {
1061 public:
1062   OptionsStatement(string name_arg, string subsample_name_arg, OptionsList options_list_arg);
1063   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1064   void writeJsonOutput(ostream &output) const override;
1065 };
1066 
1067 class StdOptionsStatement : public BasicOptionsStatement
1068 {
1069 private:
1070   const SymbolTable &symbol_table;
1071 public:
1072   StdOptionsStatement(string name_arg,
1073                       string subsample_name_arg,
1074                       OptionsList options_list_arg,
1075                       const SymbolTable &symbol_table_arg);
1076   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1077   void writeJsonOutput(ostream &output) const override;
1078 };
1079 
1080 class CorrOptionsStatement : public BasicOptionsStatement
1081 {
1082 private:
1083   const string name1;
1084   const SymbolTable &symbol_table;
1085 public:
1086   CorrOptionsStatement(string name_arg1, string name_arg2,
1087                        string subsample_name_arg,
1088                        OptionsList options_list_arg,
1089                        const SymbolTable &symbol_table_arg);
1090   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
1091   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1092   void writeJsonOutput(ostream &output) const override;
1093 };
1094 
1095 class OptionsEqualStatement : public Statement
1096 {
1097 private:
1098   const string to_declaration_type, to_name1, to_name2, to_subsample_name;
1099   const string from_declaration_type, from_name1, from_name2, from_subsample_name;
1100   const SymbolTable &symbol_table;
1101 public:
1102   OptionsEqualStatement(string to_declaration_type_arg,
1103                         string to_name1_arg,
1104                         string to_name2_arg,
1105                         string to_subsample_name_arg,
1106                         string from_declaration_type_arg,
1107                         string from_name1_arg,
1108                         string from_name2_arg,
1109                         string from_subsample_name_arg,
1110                         const SymbolTable &symbol_table_arg);
1111   void get_base_name(const SymbolType symb_type, string &lhs_field) const;
1112   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
1113   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1114   void writeJsonOutput(ostream &output) const override;
1115 };
1116 
1117 class ModelDiagnosticsStatement : public Statement
1118 {
1119 public:
1120   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1121   void writeJsonOutput(ostream &output) const override;
1122 };
1123 
1124 class Smoother2histvalStatement : public Statement
1125 {
1126 private:
1127   const OptionsList options_list;
1128 public:
1129   explicit Smoother2histvalStatement(OptionsList options_list_arg);
1130   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1131   void writeJsonOutput(ostream &output) const override;
1132 };
1133 
1134 class GMMEstimationStatement : public Statement
1135 {
1136 private:
1137   const SymbolList symbol_list;
1138   const OptionsList options_list;
1139 public:
1140   GMMEstimationStatement(SymbolList symbol_list_arg, OptionsList options_list_arg);
1141   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
1142   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1143   void writeJsonOutput(ostream &output) const override;
1144 };
1145 
1146 class SMMEstimationStatement : public Statement
1147 {
1148 private:
1149   const SymbolList symbol_list;
1150   const OptionsList options_list;
1151 public:
1152   SMMEstimationStatement(SymbolList symbol_list_arg, OptionsList options_list_arg);
1153   void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
1154   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1155   void writeJsonOutput(ostream &output) const override;
1156 };
1157 
1158 class GenerateIRFsStatement : public Statement
1159 {
1160 public:
1161 private:
1162   const OptionsList options_list;
1163   const vector<string> generate_irf_names;
1164   const vector<map<string, double>> generate_irf_elements;
1165 public:
1166   GenerateIRFsStatement(OptionsList options_list_arg,
1167                         vector<string> generate_irf_names_arg,
1168                         vector<map<string, double>> generate_irf_elements_arg);
1169   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1170   void writeJsonOutput(ostream &output) const override;
1171 };
1172 
1173 class VarExpectationModelStatement : public Statement
1174 {
1175 public:
1176   const string model_name;
1177 private:
1178   expr_t expression;
1179 public:
1180   const string aux_model_name, horizon;
1181   const expr_t discount;
1182   const SymbolTable &symbol_table;
1183   // List of generated auxiliary param ids, in variable-major order
1184   vector<int> aux_params_ids; // TODO: move this to some new VarModelTable object
1185 private:
1186   vector<tuple<int, int, double>> vars_params_constants;
1187 public:
1188   VarExpectationModelStatement(string model_name_arg, expr_t expression_arg, string aux_model_name_arg,
1189                                string horizon_arg, expr_t discount_arg, const SymbolTable &symbol_table_arg);
1190   void substituteUnaryOpNodes(const lag_equivalence_table_t &nodes, ExprNode::subst_table_t &subst_table);
1191   void substituteDiff(const lag_equivalence_table_t &diff_table, ExprNode::subst_table_t &subst_table);
1192   // Analyzes the linear combination contained in the 'expression' option
1193   /* Must be called after substituteUnaryOpNodes() and substituteDiff() (in
1194      that order) */
1195   void matchExpression();
1196   void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
1197   void writeJsonOutput(ostream &output) const override;
1198 };
1199 
1200 #endif
1201