diff --git a/BlockTriangular.cc b/BlockTriangular.cc index 49f4b03c343f31dead0f6f4ce5fc06f41285f1e3..cae8455f67364dd11ca43039c975ad6a70740af6 100644 --- a/BlockTriangular.cc +++ b/BlockTriangular.cc @@ -270,8 +270,6 @@ BlockTriangular::Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n { modifie = 1; 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)++; } } @@ -298,8 +296,6 @@ BlockTriangular::Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n { modifie = 1; 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)++; } } @@ -308,7 +304,7 @@ BlockTriangular::Prologue_Epilogue(bool* IM, int* prologue, int* epilogue, int n 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 *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 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_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)) ModelBlock->Block_List[*count_Block].Simulation_Type = SOLVE_TWO_BOUNDARIES_SIMPLE; else if((Lead > 0) && (Lag == 0)) @@ -473,7 +468,6 @@ BlockTriangular::Allocate_Block(int size, int *count_Equ, int *count_Block, int nb_lead_lag_endo = 0; 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].Variable[i] = Index_Var_IM[*count_Equ].index; ModelBlock->Block_List[*count_Block].Variable_Sorted[i] = -1; @@ -913,13 +907,11 @@ BlockTriangular::Normalize_and_BlockDecompose_Static_0_Model(const jacob_map &j_ for(i = 0;i < endo_nbr;i++) { Index_Equ_IM[i].index = i; - Index_Equ_IM[i].available = 1; } Index_Var_IM = (simple*)malloc(endo_nbr * sizeof(*Index_Var_IM)); for(i = 0;i < endo_nbr;i++) { Index_Var_IM[i].index = i; - Index_Var_IM[i].available = 1; } if(ModelBlock != NULL) Free_Block(ModelBlock); @@ -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); free(SIM_0); 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"; } diff --git a/include/BlockTriangular.hh b/include/BlockTriangular.hh index 3d31c7485318230c0851e0edebab82405b55066b..6e28602ac49ab87366d967d8631746d8c54181d0 100644 --- a/include/BlockTriangular.hh +++ b/include/BlockTriangular.hh @@ -26,13 +26,9 @@ #include "ModelNormalization.hh" #include "ModelBlocks.hh" -/*! - \class BlockTriangular - \brief Creat the incidence matrice and reorder the model's equations. -*/ - #include "ExprNode.hh" +//! List of incidence matrix (one matrix per lead/lag) struct List_IM { List_IM* pNext; @@ -40,13 +36,14 @@ struct List_IM bool* IM; }; +//! Matrix of doubles for representing jacobian 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 { public: BlockTriangular(const SymbolTable &symbol_table_arg); - /*! The incidence matrix for each lead and lags */ const SymbolTable &symbol_table; Blocks blocks; Normalization normalization; @@ -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); 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 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; List_IM *First_IM ; List_IM *Last_IM ; @@ -131,5 +128,4 @@ public: } }; }; -//------------------------------------------------------------------------------ #endif diff --git a/include/CodeInterpreter.hh b/include/CodeInterpreter.hh index cfc78b2df64ca41531d8afdeca665feefd1decc8..b6d0e528f213c9d1e3c5d008668ca7ed7d0d2ffe 100644 --- a/include/CodeInterpreter.hh +++ b/include/CodeInterpreter.hh @@ -41,21 +41,28 @@ const char FEND=17; const char FOK=18; const char FENDEQU=19; -const int SIMULTANS=0; -const int PROLOGUE=1; -const int EPILOGUE=2; -const int SIMULTAN=3; -const int UNKNOWN=-1; -const int EVALUATE_FOREWARD=0; -const int EVALUATE_BACKWARD=1; -const int SOLVE_FOREWARD_SIMPLE=2; -const int SOLVE_BACKWARD_SIMPLE=3; -const int SOLVE_TWO_BOUNDARIES_SIMPLE=4; -const int SOLVE_FOREWARD_COMPLETE=5; -const int SOLVE_BACKWARD_COMPLETE=6; -const int SOLVE_TWO_BOUNDARIES_COMPLETE=7; -const int EVALUATE_FOREWARD_R=8; -const int EVALUATE_BACKWARD_R=9; +enum BlockType + { + SIMULTANS = 0, //<! Simultaneous time separable block + PROLOGUE = 1, //<! Prologue block (one equation at the beginning, later merged) + EPILOGUE = 2, //<! Epilogue block (one equation at the beginning, later merged) + SIMULTAN = 3 //<! Simultaneous time unseparable block + }; + +enum BlockSimulationType + { + UNKNOWN = -1, //!< Unknown simulation type + EVALUATE_FOREWARD = 0, //!< Simple evaluation, normalized variable on left-hand side, forward + EVALUATE_BACKWARD = 1, //!< Simple evaluation, normalized variable on left-hand side, backward + SOLVE_FOREWARD_SIMPLE = 2, //!< Block of one equation, newton solver needed, forward + 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 /*! 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 eUnknownFunction = 12 //!< Function unknown to the preprocessor }; - enum UnaryOpcode { oUminus, @@ -92,6 +98,7 @@ enum UnaryOpcode oAtanh, oSqrt }; + enum BinaryOpcode { oPlus, @@ -110,6 +117,4 @@ enum BinaryOpcode oDifferent }; - - #endif diff --git a/include/ExprNode.hh b/include/ExprNode.hh index cb74b35e3a703d4e139d37840f82c88c9c926c2e..2f877821917b54376d15744871f2735f19e8aca2 100644 --- a/include/ExprNode.hh +++ b/include/ExprNode.hh @@ -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; }; +//! For one lead/lag of one block, stores mapping of information between original model and block-decomposed model struct IM_compact { int size, u_init, u_finish, nb_endo; int *u, *us, *Var, *Equ, *Var_Index, *Equ_Index, *Var_dyn_Index; }; +//! One block of the model 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; int *Equation, *Own_Derivative; int *Variable, *Variable_Sorted, *dVariable; @@ -329,6 +334,7 @@ struct Block int Code_Start, Code_Length; }; +//! The set of all blocks of the model struct Model_Block { int Size, Periods; diff --git a/include/ModelBlocks.hh b/include/ModelBlocks.hh index c6362814225c5ca4318b515f435b070395ca6e96..cb3557b4ef76b3bbb7525f411d3e08f9730b0b04 100644 --- a/include/ModelBlocks.hh +++ b/include/ModelBlocks.hh @@ -21,7 +21,7 @@ #define MODELBLOCKS #include "ModelNormalization.hh" - +//! Sparse form of the graph, with strongly connected components typedef struct block_result { int size, n_sets; @@ -32,7 +32,7 @@ typedef struct block_result block_result_t; - +//! Implements Tarjan algorithm class Blocks { public: @@ -42,6 +42,7 @@ public: void block_result_free(block_result_t *r); void block_result_print(block_result_t *r); 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); Equation_vertex *vertices; int *block_vertices, *sets_s, *sets_f; diff --git a/include/ModelNormalization.hh b/include/ModelNormalization.hh index 47460b94a38fbacf7fbf562dba03364037e47a6d..5ee55e76899a9c7a66e07ad625689d5622d4e25a 100644 --- a/include/ModelNormalization.hh +++ b/include/ModelNormalization.hh @@ -43,10 +43,11 @@ struct Equation_set int edges; }; +//! Stores result of block decomposition for ONE equation or ONE variable struct simple { - int index, block; - bool available; + //! New {variable, equation} index after reordering + int index; }; class Normalization