Commit 4dff75d7 authored by ferhat's avatar ferhat
Browse files

- the "steady_state" function is implemented with the "bytecode" option

git-svn-id: https://www.dynare.org/svn/dynare/trunk@2952 ac1d8469-bf42-47a9-8791-bf33cf982152
parent e6a59cd2
......@@ -24,7 +24,8 @@
//#define DEBUG
Interpreter::Interpreter(double *params_arg, double *y_arg, double *ya_arg, double *x_arg, double *direction_arg, int y_size_arg,
Interpreter::Interpreter(double *params_arg, double *y_arg, double *ya_arg, double *x_arg, double *steady_y_arg, double *steady_x_arg,
double *direction_arg, int y_size_arg,
int nb_row_x_arg, int nb_row_xd_arg, int periods_arg, int y_kmin_arg, int y_kmax_arg,
int maxit_arg_, double solve_tolf_arg, int size_of_direction_arg, double slowc_arg, int y_decal_arg, double markowitz_c_arg,
string &filename_arg)
......@@ -33,6 +34,8 @@ Interpreter::Interpreter(double *params_arg, double *y_arg, double *ya_arg, doub
y=y_arg;
ya=ya_arg;
x=x_arg;
steady_y = steady_y_arg;
steady_x = steady_x_arg;
direction=direction_arg;
y_size=y_size_arg;
nb_row_x=nb_row_x_arg;
......@@ -215,6 +218,42 @@ Interpreter::compute_block_time(int Per_u_, bool evaluate) /*throw(EvalException
mexPrintf("Unknown variable type\n");
}
break;
case FLDVS :
//load a variable in the processor
switch (get_code_char)
{
case eParameter :
var=get_code_int;
#ifdef DEBUG
mexPrintf("params[%d]=%f\n", var, params[var]);
#endif
Stack.push(params[var]);
break;
case eEndogenous :
var=get_code_int;
#ifdef DEBUG
mexPrintf(" steady_y[%d]=%f\n", var, steady_y[var]);
#endif
Stack.push(steady_y[var]);
break;
case eExogenous :
var=get_code_int;
#ifdef DEBUG
mexPrintf(" x[%d] = %f\n", var, x[var]);
#endif
Stack.push(x[var]);
break;
case eExogenousDet :
var=get_code_int;
#ifdef DEBUG
mexPrintf(" xd[%d] = %f\n", var, x[var]);
#endif
Stack.push(x[var]);
break;
default:
mexPrintf("Unknown variable type\n");
}
break;
case FLDT :
//load a temporary variable in the processor
var=get_code_int;
......@@ -832,7 +871,6 @@ Interpreter::simulate_a_block(int size,int type, string file_name, string bin_ba
int u_count_int;
bool result = true;
double *y_save;
switch (type)
{
case EVALUATE_FORWARD :
......
......@@ -83,6 +83,7 @@ class Interpreter : SparseMatrix
double solve_tolf;
bool GaussSeidel;
double *x, *params;
double *steady_y, *steady_x;
//double *y, *ya, *x, *direction;
map<pair<pair<int, int> ,int>, int> IM_i;
int equation, derivative_equation, derivative_variable;
......@@ -90,7 +91,8 @@ class Interpreter : SparseMatrix
public :
//ReadBinFile read_bin_file;
Interpreter(double *params_arg, double *y_arg, double *ya_arg, double *x_arg, double *direction_arg, int y_size_arg, int nb_row_x_arg,
Interpreter(double *params_arg, double *y_arg, double *ya_arg, double *x_arg, double *steady_y_arg, double *steady_x_arg,
double *direction_arg, int y_size_arg, int nb_row_x_arg,
int nb_row_xd_arg, int periods_arg, int y_kmin_arg, int y_kmax_arg, int maxit_arg_, double solve_tolf_arg, int size_o_direction_arg,
double slowc_arg, int y_decal_arg, double markowitz_c_arg, string &filename_arg);
bool compute_blocks(string file_name, string bin_basename, bool steady_state, bool evaluate);
......
......@@ -326,7 +326,7 @@ mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
for (int j = 0; j < y_size; j++)
mexPrintf(" variable %d at time %d and %d = %f\n", j+1, it_, it_+1, y[j+it_*y_size]);*/
clock_t t0= clock();
Interpreter interprete(params, y, ya, x, direction, y_size, nb_row_x, nb_row_xd, periods, y_kmin, y_kmax, maxit_, solve_tolf, size_of_direction, slowc, y_decal, markowitz_c, file_name);
Interpreter interprete(params, y, ya, x, steady_yd, steady_xd, direction, y_size, nb_row_x, nb_row_xd, periods, y_kmin, y_kmax, maxit_, solve_tolf, size_of_direction, slowc, y_decal, markowitz_c, file_name);
string f(fname);
bool result = interprete.compute_blocks(f, f, steady_state, evaluate);
clock_t t1= clock();
......
......@@ -41,13 +41,13 @@ const char FEND=17;
const char FOK=18;
const char FENDEQU=19;
const char FLDSV=20;
const char FSTPSV=21;
const char FLDSU=22;
const char FSTPSU=23;
const char FLDST=24;
const char FSTPST=25;
const char FDIMST=26;
const char FLDVS=21;
const char FSTPSV=22;
const char FLDSU=23;
const char FSTPSU=24;
const char FLDST=25;
const char FSTPST=26;
const char FDIMST=27;
enum BlockType
......
......@@ -60,7 +60,7 @@ DynamicModel::compileDerivative(ofstream &code_file, int eq, int symb_id, int la
//first_derivatives_type::const_iterator it = first_derivatives.find(make_pair(eq, getDerivID(symb_id, lag)));
first_derivatives_type::const_iterator it = first_derivatives.find(make_pair(eq, getDerivID(symbol_table.getID(eEndogenous, symb_id), lag)));
if (it != first_derivatives.end())
(it->second)->compile(code_file, false, temporary_terms, map_idx, true);
(it->second)->compile(code_file, false, temporary_terms, map_idx, true, false);
else
code_file.write(&FLDZ, sizeof(FLDZ));
}
......@@ -71,7 +71,7 @@ DynamicModel::compileChainRuleDerivative(ofstream &code_file, int eqr, int varr,
{
map<pair<int, pair<int, int> >, NodeID>::const_iterator it = first_chain_rule_derivatives.find(make_pair(eqr, make_pair(varr, lag)));
if (it != first_chain_rule_derivatives.end())
(it->second)->compile(code_file, false, temporary_terms, map_idx, true);
(it->second)->compile(code_file, false, temporary_terms, map_idx, true, false);
else
code_file.write(&FLDZ, sizeof(FLDZ));
}
......@@ -934,7 +934,7 @@ DynamicModel::writeModelEquationsCodeOrdered(const string file_name, const Model
for (temporary_terms_type::const_iterator it = ModelBlock->Block_List[j].Temporary_Terms_in_Equation[i]->begin();
it != ModelBlock->Block_List[j].Temporary_Terms_in_Equation[i]->end(); it++)
{
(*it)->compile(code_file, false, tt2, map_idx, true);
(*it)->compile(code_file, false, tt2, map_idx, true, false);
code_file.write(&FSTPT, sizeof(FSTPT));
map_idx_type::const_iterator ii=map_idx.find((*it)->idx);
v=(int)ii->second;
......@@ -967,16 +967,16 @@ evaluation:
eq_node = equations[ModelBlock->Block_List[j].Equation[i]];
lhs = eq_node->get_arg1();
rhs = eq_node->get_arg2();
rhs->compile(code_file, false, temporary_terms, map_idx, true);
lhs->compile(code_file, true, temporary_terms, map_idx, true);
rhs->compile(code_file, false, temporary_terms, map_idx, true, false);
lhs->compile(code_file, true, temporary_terms, map_idx, true, false);
}
else if (ModelBlock->Block_List[j].Equation_Type[i] == E_EVALUATE_S)
{
eq_node = (BinaryOpNode*)ModelBlock->Block_List[j].Equation_Normalized[i];
lhs = eq_node->get_arg1();
rhs = eq_node->get_arg2();
rhs->compile(code_file, false, temporary_terms, map_idx, true);
lhs->compile(code_file, true, temporary_terms, map_idx, true);
rhs->compile(code_file, false, temporary_terms, map_idx, true, false);
lhs->compile(code_file, true, temporary_terms, map_idx, true, false);
}
break;
case SOLVE_BACKWARD_COMPLETE:
......@@ -994,8 +994,8 @@ end:
eq_node = equations[ModelBlock->Block_List[j].Equation[i]];
lhs = eq_node->get_arg1();
rhs = eq_node->get_arg2();
lhs->compile(code_file, false, temporary_terms, map_idx, true);
rhs->compile(code_file, false, temporary_terms, map_idx, true);
lhs->compile(code_file, false, temporary_terms, map_idx, true, false);
rhs->compile(code_file, false, temporary_terms, map_idx, true, false);
code_file.write(&FBINARY, sizeof(FBINARY));
int v=oMinus;
code_file.write(reinterpret_cast<char *>(&v),sizeof(v));
......
......@@ -191,7 +191,7 @@ NumConstNode::eval(const eval_context_type &eval_context) const throw (EvalExcep
}
void
NumConstNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const
NumConstNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const
{
CompileCode.write(&FLDC, sizeof(FLDC));
double vard = datatree.num_constants.getDouble(id);
......@@ -379,9 +379,9 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
case oMatlabOutsideModel:
output << "oo_.steady_state(" << tsid + 1 << ")";
break;
case oMatlabDynamicSteadyStateOperator:
output << "oo_.steady_state(" << tsid + 1 << ")";
break;
case oMatlabDynamicSteadyStateOperator:
output << "oo_.steady_state(" << tsid + 1 << ")";
break;
default:
assert(false);
}
......@@ -416,9 +416,9 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
assert(lag == 0);
output << "oo_.exo_steady_state(" << i << ")";
break;
case oMatlabDynamicSteadyStateOperator:
output << "oo_.exo_steady_state(" << i << ")";
break;
case oMatlabDynamicSteadyStateOperator:
output << "oo_.exo_steady_state(" << i << ")";
break;
default:
assert(false);
}
......@@ -478,20 +478,34 @@ VariableNode::eval(const eval_context_type &eval_context) const throw (EvalExcep
}
void
VariableNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const
VariableNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const
{
int i, lagl;
if (!lhs_rhs)
{
if(dynamic)
CompileCode.write(&FLDV, sizeof(FLDV));
{
if(steady_dynamic) // steady state values in a dynamic model
CompileCode.write(&FLDVS, sizeof(FLDVS));
else
CompileCode.write(&FLDV, sizeof(FLDV));
}
else
CompileCode.write(&FLDSV, sizeof(FLDSV));
}
else
{
if(dynamic)
CompileCode.write(&FSTPV, sizeof(FSTPV));
{
if(steady_dynamic) // steady state values in a dynamic model
{
/*CompileCode.write(&FLDVS, sizeof(FLDVS));*/
cerr << "Impossible case: steady_state in rhs of equation" << endl;
exit(EXIT_FAILURE);
}
else
CompileCode.write(&FSTPV, sizeof(FSTPV));
}
else
CompileCode.write(&FSTPSV, sizeof(FSTPSV));
}
......@@ -509,7 +523,7 @@ VariableNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_
//cout << "Endogenous=" << symb_id << "\n";
i = tsid;//symb_id;
CompileCode.write(reinterpret_cast<char *>(&i), sizeof(i));
if(dynamic)
if(dynamic && !steady_dynamic)
{
lagl=lag;
CompileCode.write(reinterpret_cast<char *>(&lagl), sizeof(lagl));
......@@ -519,7 +533,7 @@ VariableNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_
//cout << "Exogenous=" << tsid << "\n";
i = tsid;
CompileCode.write(reinterpret_cast<char *>(&i), sizeof(i));
if(dynamic)
if(dynamic && !steady_dynamic)
{
lagl=lag;
CompileCode.write(reinterpret_cast<char *>(&lagl), sizeof(lagl));
......@@ -529,7 +543,7 @@ VariableNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_
i = tsid + datatree.symbol_table.exo_nbr();
//cout << "ExogenousDet=" << i << "\n";
CompileCode.write(reinterpret_cast<char *>(&i), sizeof(i));
if(dynamic)
if(dynamic && !steady_dynamic)
{
lagl=lag;
CompileCode.write(reinterpret_cast<char *>(&lagl), sizeof(lagl));
......@@ -538,7 +552,7 @@ VariableNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_
case eModelLocalVariable:
case eModFileLocalVariable:
//cout << "eModelLocalVariable=" << symb_id << "\n";
datatree.local_variables_table[symb_id]->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic);
datatree.local_variables_table[symb_id]->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic);
break;
case eUnknownFunction:
cerr << "Impossible case: eUnknownFuncion" << endl;
......@@ -886,7 +900,7 @@ UnaryOpNode::collectTemporary_terms(const temporary_terms_type &temporary_terms,
void
UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
const temporary_terms_type &temporary_terms) const
{
{
// If node is a temporary term
temporary_terms_type::const_iterator it = temporary_terms.find(const_cast<UnaryOpNode *>(this));
if (it != temporary_terms.end())
......@@ -958,28 +972,28 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
case oSqrt:
output << "sqrt";
break;
case oSteadyState:
ExprNodeOutputType new_output_type;
case oSteadyState:
ExprNodeOutputType new_output_type;
switch(output_type)
{
case oMatlabDynamicModel:
new_output_type = oMatlabDynamicSteadyStateOperator;
break;
case oLatexDynamicModel:
new_output_type = oLatexDynamicSteadyStateOperator;
break;
case oCDynamicModel:
cerr << "Steady State Operator not implemented for oCDynamicModel." << endl;
exit(EXIT_FAILURE);
case oMatlabDynamicModelSparse:
cerr << "Steady State Operator not implemented for oMatlabDynamicModelSparse." << endl;
exit(EXIT_FAILURE);
default:
new_output_type = output_type;
break;
}
arg->writeOutput(output, new_output_type, temporary_terms);
return;
{
case oMatlabDynamicModel:
new_output_type = oMatlabDynamicSteadyStateOperator;
break;
case oLatexDynamicModel:
new_output_type = oLatexDynamicSteadyStateOperator;
break;
case oCDynamicModel:
cerr << "Steady State Operator not implemented for oCDynamicModel." << endl;
exit(EXIT_FAILURE);
case oMatlabDynamicModelSparse:
cerr << "Steady State Operator not implemented for oMatlabDynamicModelSparse." << endl;
exit(EXIT_FAILURE);
default:
new_output_type = output_type;
break;
}
arg->writeOutput(output, new_output_type, temporary_terms);
return;
}
bool close_parenthesis = false;
......@@ -988,7 +1002,7 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
- current opcode is not uminus, or
- current opcode is uminus and argument has lowest precedence
*/
if (op_code != oUminus
if (op_code != oUminus
|| (op_code == oUminus
&& arg->precedence(output_type, temporary_terms) < precedence(output_type, temporary_terms)))
{
......@@ -1062,7 +1076,7 @@ UnaryOpNode::eval(const eval_context_type &eval_context) const throw (EvalExcept
}
void
UnaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const
UnaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const
{
temporary_terms_type::const_iterator it = temporary_terms.find(const_cast<UnaryOpNode *>(this));
if (it != temporary_terms.end())
......@@ -1075,10 +1089,15 @@ UnaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_t
CompileCode.write(reinterpret_cast<char *>(&var), sizeof(var));
return;
}
arg->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic);
CompileCode.write(&FUNARY, sizeof(FUNARY));
UnaryOpcode op_codel=op_code;
CompileCode.write(reinterpret_cast<char *>(&op_codel), sizeof(op_codel));
if (op_code == oSteadyState)
arg->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic, true);
else
{
arg->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic);
CompileCode.write(&FUNARY, sizeof(FUNARY));
UnaryOpcode op_codel=op_code;
CompileCode.write(reinterpret_cast<char *>(&op_codel), sizeof(op_codel));
}
}
void
......@@ -1557,7 +1576,7 @@ BinaryOpNode::eval(const eval_context_type &eval_context) const throw (EvalExcep
}
void
BinaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const
BinaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const
{
// If current node is a temporary term
temporary_terms_type::const_iterator it = temporary_terms.find(const_cast<BinaryOpNode *>(this));
......@@ -1571,8 +1590,8 @@ BinaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_
CompileCode.write(reinterpret_cast<char *>(&var), sizeof(var));
return;
}
arg1->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic);
arg2->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic);
arg1->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic);
arg2->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic);
CompileCode.write(&FBINARY, sizeof(FBINARY));
BinaryOpcode op_codel=op_code;
CompileCode.write(reinterpret_cast<char *>(&op_codel),sizeof(op_codel));
......@@ -2291,7 +2310,7 @@ TrinaryOpNode::eval(const eval_context_type &eval_context) const throw (EvalExce
}
void
TrinaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const
TrinaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const
{
// If current node is a temporary term
temporary_terms_type::const_iterator it = temporary_terms.find(const_cast<TrinaryOpNode *>(this));
......@@ -2305,9 +2324,9 @@ TrinaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms
CompileCode.write(reinterpret_cast<char *>(&var), sizeof(var));
return;
}
arg1->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic);
arg2->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic);
arg3->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic);
arg1->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic);
arg2->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic);
arg3->compile(CompileCode, lhs_rhs, temporary_terms, map_idx, dynamic, steady_dynamic);
CompileCode.write(&FBINARY, sizeof(FBINARY));
TrinaryOpcode op_codel=op_code;
CompileCode.write(reinterpret_cast<char *>(&op_codel),sizeof(op_codel));
......@@ -2497,7 +2516,7 @@ UnknownFunctionNode::eval(const eval_context_type &eval_context) const throw (Ev
}
void
UnknownFunctionNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const
UnknownFunctionNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const
{
cerr << "UnknownFunctionNode::compile: operation impossible!" << endl;
exit(EXIT_FAILURE);
......
......@@ -76,7 +76,7 @@ enum ExprNodeOutputType
#define IS_LATEX(output_type) ((output_type) == oLatexStaticModel \
|| (output_type) == oLatexDynamicModel \
|| (output_type) == oLatexDynamicSteadyStateOperator)
|| (output_type) == oLatexDynamicSteadyStateOperator)
/* Equal to 1 for Matlab langage, or to 0 for C language. Not defined for LaTeX.
In Matlab, array indexes begin at 1, while they begin at 0 in C */
......@@ -207,7 +207,7 @@ public:
};
virtual double eval(const eval_context_type &eval_context) const throw (EvalException) = 0;
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const = 0;
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const = 0;
//! Creates a static version of this node
/*!
This method duplicates the current node by creating a similar node from which all leads/lags have been stripped,
......@@ -241,7 +241,7 @@ public:
virtual void collectVariables(SymbolType type_arg, set<pair<int, int> > &result) const;
virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const;
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const;
virtual NodeID toStatic(DataTree &static_datatree) const;
virtual pair<int, NodeID> normalizeEquation(int symb_id_endo, vector<pair<int, pair<NodeID, NodeID> > > &List_of_Op_RHS) const;
virtual NodeID getChainRuleDerivative(int deriv_id, const map<int, NodeID> &recursive_variables);
......@@ -271,7 +271,7 @@ public:
map_idx_type &map_idx) const;
virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const;
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const;
virtual NodeID toStatic(DataTree &static_datatree) const;
int get_symb_id() const { return symb_id; };
virtual pair<int, NodeID> normalizeEquation(int symb_id_endo, vector<pair<int, pair<NodeID, NodeID> > > &List_of_Op_RHS) const;
......@@ -303,7 +303,7 @@ public:
virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
static double eval_opcode(UnaryOpcode op_code, double v) throw (EvalException);
virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const;
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const;
//! Returns operand
NodeID get_arg() const { return(arg); };
//! Returns op code
......@@ -340,7 +340,7 @@ public:
virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
static double eval_opcode(double v1, BinaryOpcode op_code, double v2) throw (EvalException);
virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const;
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const;
virtual NodeID Compute_RHS(NodeID arg1, NodeID arg2, int op, int op_type) const;
//! Returns first operand
NodeID get_arg1() const { return(arg1); };
......@@ -381,7 +381,7 @@ public:
virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
static double eval_opcode(double v1, TrinaryOpcode op_code, double v2, double v3) throw (EvalException);
virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const;
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const;
virtual NodeID toStatic(DataTree &static_datatree) const;
virtual pair<int, NodeID> normalizeEquation(int symb_id_endo, vector<pair<int, pair<NodeID, NodeID> > > &List_of_Op_RHS) const;
virtual NodeID getChainRuleDerivative(int deriv_id, const map<int, NodeID> &recursive_variables);
......@@ -409,7 +409,7 @@ public:
virtual void collectVariables(SymbolType type_arg, set<pair<int, int> > &result) const;
virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const;
virtual double eval(const eval_context_type &eval_context) const throw (EvalException);
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic) const;
virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx, bool dynamic, bool steady_dynamic) const;
virtual NodeID toStatic(DataTree &static_datatree) const;
virtual pair<int, NodeID> normalizeEquation(int symb_id_endo, vector<pair<int, pair<NodeID, NodeID> > > &List_of_Op_RHS) const;
virtual NodeID getChainRuleDerivative(int deriv_id, const map<int, NodeID> &recursive_variables);
......
......@@ -60,7 +60,7 @@ StaticDllModel::compileDerivative(ofstream &code_file, int eq, int symb_id, int
//first_derivatives_type::const_iterator it = first_derivatives.find(make_pair(eq, getDerivID(symb_id, lag)));
first_derivatives_type::const_iterator it = first_derivatives.find(make_pair(eq, getDerivID(symbol_table.getID(eEndogenous, symb_id), lag)));
if (it != first_derivatives.end())
(it->second)->compile(code_file, false, temporary_terms, map_idx, false);
(it->second)->compile(code_file, false, temporary_terms, map_idx, false, false);
else
code_file.write(&FLDZ, sizeof(FLDZ));
}
......@@ -71,7 +71,7 @@ StaticDllModel::compileChainRuleDerivative(ofstream &code_file, int eqr, int var
{
map<pair<int, pair<int, int> >, NodeID>::const_iterator it = first_chain_rule_derivatives.find(make_pair(eqr, make_pair(varr, lag)));
if (it != first_chain_rule_derivatives.end())
(it->second)->compile(code_file, false, temporary_terms, map_idx, false);
(it->second)->compile(code_file, false, temporary_terms, map_idx, false, false);
else
code_file.write(&FLDZ, sizeof(FLDZ));
}
......@@ -435,7 +435,7 @@ StaticDllModel::writeModelEquationsCodeOrdered(const string file_name, const Mod
for (temporary_terms_type::const_iterator it = ModelBlock->Block_List[j].Temporary_Terms_in_Equation[i]->begin();
it != ModelBlock->Block_List[j].Temporary_Terms_in_Equation[i]->end(); it++)
{
(*it)->compile(code_file, false, tt2, map_idx, false);
(*it)->compile(code_file, false, tt2, map_idx, false, false);
code_file.write(&FSTPST, sizeof(FSTPST));
map_idx_type::const_iterator ii=map_idx.find((*it)->idx);
v=(int)ii->second;
......@@ -453,16 +453,16 @@ evaluation:
eq_node = equations[ModelBlock->Block_List[j].Equation[i]];
lhs = eq_node->get_arg1();
rhs = eq_node->get_arg2();
rhs->compile(code_file, false, temporary_terms, map_idx, false);
lhs->compile(code_file, true, temporary_terms, map_idx, false);
rhs->compile(code_file, false, temporary_terms, map_idx, false, false);
lhs->compile(code_file, true, temporary_terms, map_idx, false, false);
}
else if (ModelBlock->Block_List[j].Equation_Type[i] == E_EVALUATE_S)
{
eq_node = (BinaryOpNode*)ModelBlock->Block_List[j].Equation_Normalized[i];
lhs = eq_node->get_arg1();
rhs = eq_node->get_arg2();
rhs->compile(code_file, false, temporary_terms, map_idx, false);
lhs->compile(code_file, true, temporary_terms, map_idx, false);
rhs->compile(code_file, false, temporary_terms, map_idx, false, false);
lhs->compile(code_file, true, temporary_terms, map_idx, false, false);
}
break;
case SOLVE_BACKWARD_COMPLETE:
......@@ -478,8 +478,8 @@ end:
eq_node = equations[ModelBlock->Block_List[j].Equation[i]];
lhs = eq_node->get_arg1();
rhs = eq_node->get_arg2();
lhs->compile(code_file, false, temporary_terms, map_idx, false);
rhs->compile(code_file, false, temporary_terms, map_idx, false);
lhs->compile(code_file, false, temporary_terms, map_idx, false, false);
rhs->compile(code_file, false, temporary_terms, map_idx, false, false);
code_file.write(&FBINARY, sizeof(FBINARY));
int v=oMinus;
code_file.write(reinterpret_cast<char *>(&v),sizeof(v));
......
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