StaticModel.hh 4.42 KB
Newer Older
sebastien's avatar
sebastien committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 * Copyright (C) 2003-2009 Dynare Team
 *
 * This file is part of Dynare.
 *
 * Dynare is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Dynare is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Dynare.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef _STATICMODEL_HH
#define _STATICMODEL_HH

#include "ModelTree.hh"

//! Stores a static model
26
/*! Derivation IDs are allocated only for endogenous, and are equal to symbol ID in that case */
sebastien's avatar
sebastien committed
27 28 29
class StaticModel : public ModelTree
{
private:
30 31 32 33 34 35 36 37 38 39 40 41
  //! Normalization of equations
  /*! Maps endogenous type specific IDs to equation numbers */
  vector<int> endo2eq;

  //! Block decomposition of the model
  /*! List of blocks in topological order. Lists the set of endogenous type specific IDs for each block. */
  vector<set<int> > blocks;

  //! Minimum feedback set for each block
  /*! Elements of blocksMFS are subset of elements of blocks */
  vector<set<int> > blocksMFS;

42 43 44 45
  //! Variables not in minimum feedback set for each block, sorted in topological order
  /*! This is the set difference blocks - blocksMFS. The variables are sorted in topological order. */
  vector<vector<int> > blocksRecursive;

46
  //! Jacobian for matrix restricted to MFS
47
  /*! Maps a pair (equation ID, endogenous type specific ID) to the derivative expression. Stores only non-null derivatives. */
48 49
  map<pair<int, int>, NodeID> blocksMFSJacobian;

50
  //! Writes static model file (standard Matlab version)
51
  void writeStaticMFile(ostream &output, const string &func_name) const;
sebastien's avatar
sebastien committed
52

53 54 55
  //! Writes static model file (block+MFS version)
  void writeStaticBlockMFSFile(ostream &output, const string &func_name) const;

56
  //! Computes normalization of the static model
57
  void computeNormalization();
58 59

  //! Computes blocks of the static model, sorted in topological order
60 61
  /*! Must be called after computeNormalization() */
  void computeSortedBlockDecomposition();
62 63

  //! For each block of the static model, computes minimum feedback set (MFS)
64 65 66
  /*! Must be called after computeSortedBlockDecomposition() */
  void computeMFS();

67
  //! For each block of the static model, computes resursive variables (those not in minimum feedback set), and sort them in topological order
68
  /*! Must be called after computeMFS() */
69 70 71 72
  void computeSortedRecursive();

  //! Computes derivatives of each MFS
  /*! Must be called after computeSortedRecursive() */
73
  void computeBlockMFSJacobian();
sebastien's avatar
sebastien committed
74 75 76

  //! Computes the list of equations which are already in normalized form
  /*! Returns a multimap mapping endogenous which are normalized (represented by their type specific ID) to the equation(s) which define it */
77
  void computeNormalizedEquations(multimap<int, int> &endo2eqs) const;
78

79 80 81 82 83 84 85
  //! Helper for writing model local variables in block+MFS mode
  /*!
    Write the definition of model local variables which are used in expr, except those in local_var_written.
    Add these variables to local_var_written at the end.
  */
  void writeLocalVars(ostream &output, NodeID expr, set<int> &local_var_written) const;

sebastien's avatar
sebastien committed
86 87 88
public:
  StaticModel(SymbolTable &symbol_table_arg, NumericalConstants &num_constants);
  //! Execute computations (derivation)
89
  /*!
90
    \param block whether block decomposition and minimum feedback set should be computed
91
    \param hessian whether Hessian (w.r. to endogenous only) should be computed
sebastien's avatar
sebastien committed
92
    \param no_tmp_terms if true, no temporary terms will be computed in the static and dynamic files */
93
  void computingPass(bool block, bool hessian, bool no_tmp_terms);
94 95

  //! Writes information on block decomposition when relevant
96
  void writeOutput(ostream &output, bool block) const;
97

sebastien's avatar
sebastien committed
98
  //! Writes static model file
99
  void writeStaticFile(const string &basename, bool block) const;
100

101 102 103
  //! Writes LaTeX file with the equations of the static model
  void writeLatexFile(const string &basename) const;

sebastien's avatar
sebastien committed
104 105 106
  //! Writes initializations in oo_.steady_state for the auxiliary variables
  void writeAuxVarInitval(ostream &output) const;

107
  virtual int getDerivID(int symb_id, int lag) const throw (UnknownDerivIDException);
sebastien's avatar
sebastien committed
108 109 110
};

#endif