Commit 1f515ea5 authored by sebastien's avatar sebastien
Browse files

trunk preprocessor:

* added some comments
* created enumerations for block type and block simulation type


git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@2165 ac1d8469-bf42-47a9-8791-bf33cf982152
parent 8b899ad8
...@@ -270,8 +270,6 @@ BlockTriangular::Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n ...@@ -270,8 +270,6 @@ BlockTriangular::Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n
{ {
modifie = 1; modifie = 1;
swap_IM_c(IM, *prologue, i, l, Index_Var_IM, Index_Equ_IM, n); swap_IM_c(IM, *prologue, i, l, Index_Var_IM, Index_Equ_IM, n);
Index_Equ_IM[*prologue].available = 0;
Index_Var_IM[*prologue].available = 0;
(*prologue)++; (*prologue)++;
} }
} }
...@@ -298,8 +296,6 @@ BlockTriangular::Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n ...@@ -298,8 +296,6 @@ BlockTriangular::Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n
{ {
modifie = 1; modifie = 1;
swap_IM_c(IM, n - (1 + *epilogue), l, i, Index_Var_IM, Index_Equ_IM, n); swap_IM_c(IM, n - (1 + *epilogue), l, i, Index_Var_IM, Index_Equ_IM, n);
Index_Equ_IM[n - (1 + *epilogue)].available = 0;
Index_Var_IM[n - (1 + *epilogue)].available = 0;
(*epilogue)++; (*epilogue)++;
} }
} }
...@@ -308,7 +304,7 @@ BlockTriangular::Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n ...@@ -308,7 +304,7 @@ BlockTriangular::Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n
void void
BlockTriangular::Allocate_Block(int size, int *count_Equ, int *count_Block, int type, Model_Block * ModelBlock) BlockTriangular::Allocate_Block(int size, int *count_Equ, int *count_Block, BlockType type, Model_Block * ModelBlock)
{ {
int i, j, k, l, ls, m, i_1, Lead, Lag, size_list_lead_var, first_count_equ, i1; int i, j, k, l, ls, m, i_1, Lead, Lag, size_list_lead_var, first_count_equ, i1;
int *list_lead_var, *tmp_size, *tmp_var, *tmp_endo, nb_lead_lag_endo; int *list_lead_var, *tmp_size, *tmp_var, *tmp_endo, nb_lead_lag_endo;
...@@ -380,7 +376,6 @@ BlockTriangular::Allocate_Block(int size, int *count_Equ, int *count_Block, int ...@@ -380,7 +376,6 @@ BlockTriangular::Allocate_Block(int size, int *count_Equ, int *count_Block, int
ModelBlock->in_Block_Equ[Index_Equ_IM[*count_Equ].index] = *count_Block; ModelBlock->in_Block_Equ[Index_Equ_IM[*count_Equ].index] = *count_Block;
ModelBlock->in_Block_Var[Index_Var_IM[*count_Equ].index] = *count_Block; ModelBlock->in_Block_Var[Index_Var_IM[*count_Equ].index] = *count_Block;
ModelBlock->in_Equ_of_Block[Index_Equ_IM[*count_Equ].index] = ModelBlock->in_Var_of_Block[Index_Var_IM[*count_Equ].index] = 0; ModelBlock->in_Equ_of_Block[Index_Equ_IM[*count_Equ].index] = ModelBlock->in_Var_of_Block[Index_Var_IM[*count_Equ].index] = 0;
Index_Equ_IM[*count_Equ].block = *count_Block;
if ((Lead > 0) && (Lag > 0)) if ((Lead > 0) && (Lag > 0))
ModelBlock->Block_List[*count_Block].Simulation_Type = SOLVE_TWO_BOUNDARIES_SIMPLE; ModelBlock->Block_List[*count_Block].Simulation_Type = SOLVE_TWO_BOUNDARIES_SIMPLE;
else if((Lead > 0) && (Lag == 0)) else if((Lead > 0) && (Lag == 0))
...@@ -473,7 +468,6 @@ BlockTriangular::Allocate_Block(int size, int *count_Equ, int *count_Block, int ...@@ -473,7 +468,6 @@ BlockTriangular::Allocate_Block(int size, int *count_Equ, int *count_Block, int
nb_lead_lag_endo = 0; nb_lead_lag_endo = 0;
for(i = 0;i < size;i++) for(i = 0;i < size;i++)
{ {
Index_Equ_IM[*count_Equ].block = *count_Block;
ModelBlock->Block_List[*count_Block].Equation[i] = Index_Equ_IM[*count_Equ].index; ModelBlock->Block_List[*count_Block].Equation[i] = Index_Equ_IM[*count_Equ].index;
ModelBlock->Block_List[*count_Block].Variable[i] = Index_Var_IM[*count_Equ].index; ModelBlock->Block_List[*count_Block].Variable[i] = Index_Var_IM[*count_Equ].index;
ModelBlock->Block_List[*count_Block].Variable_Sorted[i] = -1; ModelBlock->Block_List[*count_Block].Variable_Sorted[i] = -1;
...@@ -913,13 +907,11 @@ BlockTriangular::Normalize_and_BlockDecompose_Static_0_Model(const jacob_map &j_ ...@@ -913,13 +907,11 @@ BlockTriangular::Normalize_and_BlockDecompose_Static_0_Model(const jacob_map &j_
for(i = 0;i < endo_nbr;i++) for(i = 0;i < endo_nbr;i++)
{ {
Index_Equ_IM[i].index = i; Index_Equ_IM[i].index = i;
Index_Equ_IM[i].available = 1;
} }
Index_Var_IM = (simple*)malloc(endo_nbr * sizeof(*Index_Var_IM)); Index_Var_IM = (simple*)malloc(endo_nbr * sizeof(*Index_Var_IM));
for(i = 0;i < endo_nbr;i++) for(i = 0;i < endo_nbr;i++)
{ {
Index_Var_IM[i].index = i; Index_Var_IM[i].index = i;
Index_Var_IM[i].available = 1;
} }
if(ModelBlock != NULL) if(ModelBlock != NULL)
Free_Block(ModelBlock); Free_Block(ModelBlock);
...@@ -931,7 +923,4 @@ BlockTriangular::Normalize_and_BlockDecompose_Static_0_Model(const jacob_map &j_ ...@@ -931,7 +923,4 @@ BlockTriangular::Normalize_and_BlockDecompose_Static_0_Model(const jacob_map &j_
Normalize_and_BlockDecompose(SIM, ModelBlock, endo_nbr, &prologue, &epilogue, Index_Var_IM, Index_Equ_IM, 1, 1, SIM_0, j_m); Normalize_and_BlockDecompose(SIM, ModelBlock, endo_nbr, &prologue, &epilogue, Index_Var_IM, Index_Equ_IM, 1, 1, SIM_0, j_m);
free(SIM_0); free(SIM_0);
free(SIM); free(SIM);
if(bt_verbose)
for(i = 0;i < endo_nbr;i++)
cout << "Block=" << Index_Equ_IM[i].block << " Equ=" << Index_Equ_IM[i].index << " Var= " << Index_Var_IM[i].index << " " << symbol_table.getNameByID(eEndogenous, Index_Var_IM[i].index) << "\n";
} }
...@@ -26,13 +26,9 @@ ...@@ -26,13 +26,9 @@
#include "ModelNormalization.hh" #include "ModelNormalization.hh"
#include "ModelBlocks.hh" #include "ModelBlocks.hh"
/*!
\class BlockTriangular
\brief Creat the incidence matrice and reorder the model's equations.
*/
#include "ExprNode.hh" #include "ExprNode.hh"
//! List of incidence matrix (one matrix per lead/lag)
struct List_IM struct List_IM
{ {
List_IM* pNext; List_IM* pNext;
...@@ -40,13 +36,14 @@ struct List_IM ...@@ -40,13 +36,14 @@ struct List_IM
bool* IM; bool* IM;
}; };
//! Matrix of doubles for representing jacobian
typedef map<pair<int ,int >,double> jacob_map; typedef map<pair<int ,int >,double> jacob_map;
//! Create the incidence matrix, computes prologue & epilogue, normalizes the model and computes the block decomposition
class BlockTriangular class BlockTriangular
{ {
public: public:
BlockTriangular(const SymbolTable &symbol_table_arg); BlockTriangular(const SymbolTable &symbol_table_arg);
/*! The incidence matrix for each lead and lags */
const SymbolTable &symbol_table; const SymbolTable &symbol_table;
Blocks blocks; Blocks blocks;
Normalization normalization; Normalization normalization;
...@@ -63,7 +60,7 @@ public: ...@@ -63,7 +60,7 @@ public:
bool Normalize_and_BlockDecompose(bool* IM, Model_Block* ModelBlock, int n, int* prologue, int* epilogue, simple* Index_Var_IM, simple* Index_Equ_IM, bool Do_Normalization, bool mixing, bool* IM_0 , jacob_map j_m); bool Normalize_and_BlockDecompose(bool* IM, Model_Block* ModelBlock, int n, int* prologue, int* epilogue, simple* Index_Var_IM, simple* Index_Equ_IM, bool Do_Normalization, bool mixing, bool* IM_0 , jacob_map j_m);
void Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n, simple* Index_Var_IM, simple* Index_Equ_IM, bool* IM0); void Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n, simple* Index_Var_IM, simple* Index_Equ_IM, bool* IM0);
void swap_IM_c(bool *SIM, int pos1, int pos2, int pos3, simple* Index_Var_IM, simple* Index_Equ_IM, int n); void swap_IM_c(bool *SIM, int pos1, int pos2, int pos3, simple* Index_Var_IM, simple* Index_Equ_IM, int n);
void Allocate_Block(int size, int *count_Equ, int *count_Block, int type, Model_Block * ModelBlock); void Allocate_Block(int size, int *count_Equ, int *count_Block, BlockType type, Model_Block * ModelBlock);
void Free_Block(Model_Block* ModelBlock) const; void Free_Block(Model_Block* ModelBlock) const;
List_IM *First_IM ; List_IM *First_IM ;
List_IM *Last_IM ; List_IM *Last_IM ;
...@@ -131,5 +128,4 @@ public: ...@@ -131,5 +128,4 @@ public:
} }
}; };
}; };
//------------------------------------------------------------------------------
#endif #endif
...@@ -41,21 +41,28 @@ const char FEND=17; ...@@ -41,21 +41,28 @@ const char FEND=17;
const char FOK=18; const char FOK=18;
const char FENDEQU=19; const char FENDEQU=19;
const int SIMULTANS=0; enum BlockType
const int PROLOGUE=1; {
const int EPILOGUE=2; SIMULTANS = 0, //<! Simultaneous time separable block
const int SIMULTAN=3; PROLOGUE = 1, //<! Prologue block (one equation at the beginning, later merged)
const int UNKNOWN=-1; EPILOGUE = 2, //<! Epilogue block (one equation at the beginning, later merged)
const int EVALUATE_FOREWARD=0; SIMULTAN = 3 //<! Simultaneous time unseparable block
const int EVALUATE_BACKWARD=1; };
const int SOLVE_FOREWARD_SIMPLE=2;
const int SOLVE_BACKWARD_SIMPLE=3; enum BlockSimulationType
const int SOLVE_TWO_BOUNDARIES_SIMPLE=4; {
const int SOLVE_FOREWARD_COMPLETE=5; UNKNOWN = -1, //!< Unknown simulation type
const int SOLVE_BACKWARD_COMPLETE=6; EVALUATE_FOREWARD = 0, //!< Simple evaluation, normalized variable on left-hand side, forward
const int SOLVE_TWO_BOUNDARIES_COMPLETE=7; EVALUATE_BACKWARD = 1, //!< Simple evaluation, normalized variable on left-hand side, backward
const int EVALUATE_FOREWARD_R=8; SOLVE_FOREWARD_SIMPLE = 2, //!< Block of one equation, newton solver needed, forward
const int EVALUATE_BACKWARD_R=9; SOLVE_BACKWARD_SIMPLE = 3, //!< Block of one equation, newton solver needed, backward
SOLVE_TWO_BOUNDARIES_SIMPLE = 4, //!< Block of one equation, newton solver needed, forward & ackward
SOLVE_FOREWARD_COMPLETE = 5, //!< Block of several equations, newton solver needed, forward
SOLVE_BACKWARD_COMPLETE = 6, //!< Block of several equations, newton solver needed, backward
SOLVE_TWO_BOUNDARIES_COMPLETE = 7, //!< Block of several equations, newton solver needed, forward and backwar
EVALUATE_FOREWARD_R = 8, //!< Simple evaluation, normalized variable on right-hand side, forward
EVALUATE_BACKWARD_R = 9 //!< Simple evaluation, normalized variable on right-hand side, backward
};
//! Enumeration of possible symbol types //! Enumeration of possible symbol types
/*! Warning: do not to change existing values: the order matters for VariableTable (at least for endogenous and exogenous types), and the values matter for homotopy_setup command */ /*! Warning: do not to change existing values: the order matters for VariableTable (at least for endogenous and exogenous types), and the values matter for homotopy_setup command */
...@@ -71,7 +78,6 @@ enum Type ...@@ -71,7 +78,6 @@ enum Type
eUnknownFunction = 12 //!< Function unknown to the preprocessor eUnknownFunction = 12 //!< Function unknown to the preprocessor
}; };
enum UnaryOpcode enum UnaryOpcode
{ {
oUminus, oUminus,
...@@ -92,6 +98,7 @@ enum UnaryOpcode ...@@ -92,6 +98,7 @@ enum UnaryOpcode
oAtanh, oAtanh,
oSqrt oSqrt
}; };
enum BinaryOpcode enum BinaryOpcode
{ {
oPlus, oPlus,
...@@ -110,6 +117,4 @@ enum BinaryOpcode ...@@ -110,6 +117,4 @@ enum BinaryOpcode
oDifferent oDifferent
}; };
#endif #endif
...@@ -311,15 +311,20 @@ public: ...@@ -311,15 +311,20 @@ public:
virtual void compile(ofstream &CompileCode, bool lhs_rhs, ExprNodeOutputType output_type, const temporary_terms_type &temporary_terms, map_idx_type map_idx) const; virtual void compile(ofstream &CompileCode, bool lhs_rhs, ExprNodeOutputType output_type, const temporary_terms_type &temporary_terms, map_idx_type map_idx) const;
}; };
//! For one lead/lag of one block, stores mapping of information between original model and block-decomposed model
struct IM_compact struct IM_compact
{ {
int size, u_init, u_finish, nb_endo; int size, u_init, u_finish, nb_endo;
int *u, *us, *Var, *Equ, *Var_Index, *Equ_Index, *Var_dyn_Index; int *u, *us, *Var, *Equ, *Var_Index, *Equ_Index, *Var_dyn_Index;
}; };
//! One block of the model
struct Block struct Block
{ {
int Size, Sized, Type, Simulation_Type, Max_Lead, Max_Lag, Nb_Lead_Lag_Endo; int Size, Sized;
BlockType Type;
BlockSimulationType Simulation_Type;
int Max_Lead, Max_Lag, Nb_Lead_Lag_Endo;
bool is_linear; bool is_linear;
int *Equation, *Own_Derivative; int *Equation, *Own_Derivative;
int *Variable, *Variable_Sorted, *dVariable; int *Variable, *Variable_Sorted, *dVariable;
...@@ -329,6 +334,7 @@ struct Block ...@@ -329,6 +334,7 @@ struct Block
int Code_Start, Code_Length; int Code_Start, Code_Length;
}; };
//! The set of all blocks of the model
struct Model_Block struct Model_Block
{ {
int Size, Periods; int Size, Periods;
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#define MODELBLOCKS #define MODELBLOCKS
#include "ModelNormalization.hh" #include "ModelNormalization.hh"
//! Sparse form of the graph, with strongly connected components
typedef struct block_result typedef struct block_result
{ {
int size, n_sets; int size, n_sets;
...@@ -32,7 +32,7 @@ typedef struct block_result ...@@ -32,7 +32,7 @@ typedef struct block_result
block_result_t; block_result_t;
//! Implements Tarjan algorithm
class Blocks class Blocks
{ {
public: public:
...@@ -42,6 +42,7 @@ public: ...@@ -42,6 +42,7 @@ public:
void block_result_free(block_result_t *r); void block_result_free(block_result_t *r);
void block_result_print(block_result_t *r); void block_result_print(block_result_t *r);
void Print_Equation_gr(Equation_set* Equation); void Print_Equation_gr(Equation_set* Equation);
//! Converts the output of Tarjan algorithm into reordered incidence matrices
void block_result_to_IM(block_result_t *r,bool* IM,int prologue, int n,simple* Index_Equ_IM,simple* Index_Var_IM); void block_result_to_IM(block_result_t *r,bool* IM,int prologue, int n,simple* Index_Equ_IM,simple* Index_Var_IM);
Equation_vertex *vertices; Equation_vertex *vertices;
int *block_vertices, *sets_s, *sets_f; int *block_vertices, *sets_s, *sets_f;
......
...@@ -43,10 +43,11 @@ struct Equation_set ...@@ -43,10 +43,11 @@ struct Equation_set
int edges; int edges;
}; };
//! Stores result of block decomposition for ONE equation or ONE variable
struct simple struct simple
{ {
int index, block; //! New {variable, equation} index after reordering
bool available; int index;
}; };
class Normalization class Normalization
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment