StaticModel.hh 4.35 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 57
  virtual int computeDerivID(int symb_id, int lag);

58
  //! Computes normalization of the static model
59
  void computeNormalization();
60 61

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

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

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

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

  //! 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 */
79
  void computeNormalizedEquations(multimap<int, int> &endo2eqs) const;
80

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

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

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

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

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

#endif