2009-04-14 16:39:53 +02:00
|
|
|
/*
|
|
|
|
* 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
|
2009-04-20 17:54:19 +02:00
|
|
|
/*! Derivation IDs are allocated only for endogenous, and are equal to symbol ID in that case */
|
2009-04-14 16:39:53 +02:00
|
|
|
class StaticModel : public ModelTree
|
|
|
|
{
|
|
|
|
private:
|
2009-07-07 16:20:48 +02:00
|
|
|
//! Are we in block decomposition + min. feedback set mode ?
|
|
|
|
bool block_mfs;
|
|
|
|
|
|
|
|
//! 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;
|
|
|
|
|
2009-07-10 16:22:40 +02:00
|
|
|
//! 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;
|
|
|
|
|
2009-07-07 16:20:48 +02:00
|
|
|
//! Jacobian for matrix restricted to MFS
|
2009-07-07 17:58:17 +02:00
|
|
|
/*! Maps a pair (equation ID, endogenous type specific ID) to the derivative expression. Stores only non-null derivatives. */
|
2009-07-07 16:20:48 +02:00
|
|
|
map<pair<int, int>, NodeID> blocksMFSJacobian;
|
|
|
|
|
2009-07-07 17:58:17 +02:00
|
|
|
//! Writes static model file (standard Matlab version)
|
2009-07-07 16:20:48 +02:00
|
|
|
void writeStaticMFile(ostream &output, const string &func_name) const;
|
2009-04-14 16:39:53 +02:00
|
|
|
|
2009-07-07 17:58:17 +02:00
|
|
|
//! Writes static model file (block+MFS version)
|
|
|
|
void writeStaticBlockMFSFile(ostream &output, const string &func_name) const;
|
|
|
|
|
2009-04-17 18:26:23 +02:00
|
|
|
virtual int computeDerivID(int symb_id, int lag);
|
|
|
|
|
2009-04-27 19:15:14 +02:00
|
|
|
//! Computes normalization of the static model
|
2009-07-07 16:20:48 +02:00
|
|
|
void computeNormalization();
|
2009-06-30 17:07:09 +02:00
|
|
|
|
|
|
|
//! Computes blocks of the static model, sorted in topological order
|
2009-07-07 16:20:48 +02:00
|
|
|
/*! Must be called after computeNormalization() */
|
|
|
|
void computeSortedBlockDecomposition();
|
2009-06-30 17:07:09 +02:00
|
|
|
|
|
|
|
//! For each block of the static model, computes minimum feedback set (MFS)
|
2009-07-07 16:20:48 +02:00
|
|
|
/*! Must be called after computeSortedBlockDecomposition() */
|
|
|
|
void computeMFS();
|
|
|
|
|
2009-07-10 16:22:40 +02:00
|
|
|
//! For each block of the static model, computes resursive variables (those not in minimum feedback set), and sort them in topological order
|
2009-07-07 16:20:48 +02:00
|
|
|
/*! Must be called after computeMFS() */
|
2009-07-10 16:22:40 +02:00
|
|
|
void computeSortedRecursive();
|
|
|
|
|
|
|
|
//! Computes derivatives of each MFS
|
|
|
|
/*! Must be called after computeSortedRecursive() */
|
2009-07-07 16:20:48 +02:00
|
|
|
void computeBlockMFSJacobian();
|
2009-04-28 19:11:48 +02:00
|
|
|
|
|
|
|
//! 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 */
|
2009-06-30 17:07:09 +02:00
|
|
|
void computeNormalizedEquations(multimap<int, int> &endo2eqs) const;
|
2009-04-27 19:15:14 +02:00
|
|
|
|
2009-04-14 16:39:53 +02:00
|
|
|
public:
|
|
|
|
StaticModel(SymbolTable &symbol_table_arg, NumericalConstants &num_constants);
|
|
|
|
//! Execute computations (derivation)
|
2009-06-30 17:07:09 +02:00
|
|
|
/*!
|
|
|
|
\param block_mfs whether block decomposition and minimum feedback set should be computed
|
2009-04-20 12:48:54 +02:00
|
|
|
\param hessian whether Hessian (w.r. to endogenous only) should be computed
|
2009-04-14 16:39:53 +02:00
|
|
|
\param no_tmp_terms if true, no temporary terms will be computed in the static and dynamic files */
|
2009-07-07 16:20:48 +02:00
|
|
|
void computingPass(bool block_mfs_arg, bool hessian, bool no_tmp_terms);
|
|
|
|
|
|
|
|
//! Writes information on block decomposition when relevant
|
|
|
|
void writeOutput(ostream &output) const;
|
|
|
|
|
2009-04-14 16:39:53 +02:00
|
|
|
//! Writes static model file
|
|
|
|
void writeStaticFile(const string &basename) const;
|
2009-04-17 18:26:23 +02:00
|
|
|
|
2009-04-30 15:14:33 +02:00
|
|
|
//! Writes LaTeX file with the equations of the static model
|
|
|
|
void writeLatexFile(const string &basename) const;
|
|
|
|
|
2009-04-17 18:26:23 +02:00
|
|
|
virtual int getDerivID(int symb_id, int lag) const throw (UnknownDerivIDException);
|
2009-04-14 16:39:53 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|