Commit fbfff183 authored by Sébastien Villemot's avatar Sébastien Villemot

Preprocessor: various refactorings of block decomposition

Adapt bytecode MEX accordingly.
parent ac8bc512
Pipeline #3394 passed with stages
in 95 minutes and 58 seconds
/*
* Copyright © 2007-2017 Dynare Team
* Copyright © 2007-2020 Dynare Team
*
* This file is part of Dynare.
*
......@@ -87,9 +87,9 @@ Interpreter::evaluate_a_block(bool initialization)
{
it_code_type begining;
switch (type)
switch (static_cast<BlockSimulationType>(type))
{
case EVALUATE_FORWARD:
case BlockSimulationType::evaluateForward:
if (steady_state)
{
compute_block_time(0, true, /*block_num, size, steady_state, */ false);
......@@ -117,7 +117,7 @@ Interpreter::evaluate_a_block(bool initialization)
}
}
break;
case SOLVE_FORWARD_SIMPLE:
case BlockSimulationType::solveForwardSimple:
g1 = static_cast<double *>(mxMalloc(size*size*sizeof(double)));
test_mxMalloc(g1, __LINE__, __FILE__, __func__, size*size*sizeof(double));
r = static_cast<double *>(mxMalloc(size*sizeof(double)));
......@@ -151,14 +151,14 @@ Interpreter::evaluate_a_block(bool initialization)
mxFree(g1);
mxFree(r);
break;
case SOLVE_FORWARD_COMPLETE:
case BlockSimulationType::solveForwardComplete:
if (initialization)
{
fixe_u(&u, u_count_int, u_count_int);
Read_SparseMatrix(bin_base_name, size, 1, 0, 0, false, stack_solve_algo, solve_algo);
}
#ifdef DEBUG
mexPrintf("in SOLVE_FORWARD_COMPLETE r = mxMalloc(%d*sizeof(double))\n", size);
mexPrintf("in SOLVE FORWARD COMPLETE r = mxMalloc(%d*sizeof(double))\n", size);
#endif
r = static_cast<double *>(mxMalloc(size*sizeof(double)));
test_mxMalloc(r, __LINE__, __FILE__, __func__, size*sizeof(double));
......@@ -190,7 +190,7 @@ Interpreter::evaluate_a_block(bool initialization)
}
mxFree(r);
break;
case EVALUATE_BACKWARD:
case BlockSimulationType::evaluateBackward:
if (steady_state)
{
compute_block_time(0, true, /*block_num, size, steady_state,*/ false);
......@@ -218,7 +218,7 @@ Interpreter::evaluate_a_block(bool initialization)
}
}
break;
case SOLVE_BACKWARD_SIMPLE:
case BlockSimulationType::solveBackwardSimple:
g1 = static_cast<double *>(mxMalloc(size*size*sizeof(double)));
test_mxMalloc(g1, __LINE__, __FILE__, __func__, size*size*sizeof(double));
r = static_cast<double *>(mxMalloc(size*sizeof(double)));
......@@ -252,7 +252,7 @@ Interpreter::evaluate_a_block(bool initialization)
mxFree(g1);
mxFree(r);
break;
case SOLVE_BACKWARD_COMPLETE:
case BlockSimulationType::solveBackwardComplete:
if (initialization)
{
fixe_u(&u, u_count_int, u_count_int);
......@@ -288,8 +288,8 @@ Interpreter::evaluate_a_block(bool initialization)
}
mxFree(r);
break;
case SOLVE_TWO_BOUNDARIES_SIMPLE:
case SOLVE_TWO_BOUNDARIES_COMPLETE:
case BlockSimulationType::solveTwoBoundariesSimple:
case BlockSimulationType::solveTwoBoundariesComplete:
if (initialization)
{
fixe_u(&u, u_count_int, u_count_int);
......@@ -314,6 +314,8 @@ Interpreter::evaluate_a_block(bool initialization)
}
mxFree(r);
break;
case BlockSimulationType::unknown:
throw FatalExceptionHandling("UNKNOWN block simulation type: impossible case");
}
}
......@@ -329,39 +331,39 @@ Interpreter::simulate_a_block(vector_table_conditional_local_type vector_table_c
mexPrintf("simulate_a_block type = %d, periods=%d, y_kmin=%d, y_kmax=%d\n", type, periods, y_kmin, y_kmax);
mexEvalString("drawnow;");
#endif
switch (type)
switch (static_cast<BlockSimulationType>(type))
{
case EVALUATE_FORWARD:
case BlockSimulationType::evaluateForward:
#ifdef DEBUG
mexPrintf("EVALUATE_FORWARD\n");
mexPrintf("EVALUATE FORWARD\n");
mexEvalString("drawnow;");
#endif
evaluate_over_periods(true);
break;
case EVALUATE_BACKWARD:
case BlockSimulationType::evaluateBackward:
#ifdef DEBUG
mexPrintf("EVALUATE_BACKWARD\n");
mexPrintf("EVALUATE BACKWARD\n");
mexEvalString("drawnow;");
#endif
evaluate_over_periods(false);
break;
case SOLVE_FORWARD_SIMPLE:
case BlockSimulationType::solveForwardSimple:
#ifdef DEBUG
mexPrintf("SOLVE_FORWARD_SIMPLE size=%d\n", size);
mexPrintf("SOLVE FORWARD SIMPLE size=%d\n", size);
mexEvalString("drawnow;");
#endif
solve_simple_over_periods(true);
break;
case SOLVE_BACKWARD_SIMPLE:
case BlockSimulationType::solveBackwardSimple:
#ifdef DEBUG
mexPrintf("SOLVE_BACKWARD_SIMPLE\n");
mexPrintf("SOLVE BACKWARD SIMPLE\n");
mexEvalString("drawnow;");
#endif
solve_simple_over_periods(false);
break;
case SOLVE_FORWARD_COMPLETE:
case BlockSimulationType::solveForwardComplete:
#ifdef DEBUG
mexPrintf("SOLVE_FORWARD_COMPLETE\n");
mexPrintf("SOLVE FORWARD COMPLETE\n");
mexEvalString("drawnow;");
#endif
if (vector_table_conditional_local.size())
......@@ -386,9 +388,9 @@ Interpreter::simulate_a_block(vector_table_conditional_local_type vector_table_c
memset(direction, 0, size_of_direction);
End_Solver();
break;
case SOLVE_BACKWARD_COMPLETE:
case BlockSimulationType::solveBackwardComplete:
#ifdef DEBUG
mexPrintf("SOLVE_BACKWARD_COMPLETE\n");
mexPrintf("SOLVE BACKWARD COMPLETE\n");
mexEvalString("drawnow;");
#endif
if (vector_table_conditional_local.size())
......@@ -413,15 +415,15 @@ Interpreter::simulate_a_block(vector_table_conditional_local_type vector_table_c
mxFree(u);
End_Solver();
break;
case SOLVE_TWO_BOUNDARIES_SIMPLE:
case SOLVE_TWO_BOUNDARIES_COMPLETE:
case BlockSimulationType::solveTwoBoundariesSimple:
case BlockSimulationType::solveTwoBoundariesComplete:
#ifdef DEBUG
mexPrintf("SOLVE_TWO_BOUNDARIES\n");
mexPrintf("SOLVE TWO BOUNDARIES\n");
mexEvalString("drawnow;");
#endif
if (steady_state)
{
mexPrintf("SOLVE_TWO_BOUNDARIES in a steady state model: impossible case\n");
mexPrintf("SOLVE TWO BOUNDARIES in a steady state model: impossible case\n");
return ERROR_ON_EXIT;
}
if (vector_table_conditional_local.size())
......@@ -612,7 +614,7 @@ Interpreter::check_for_controlled_exo_validity(FBEGINBLOCK_ *fb, vector<s_plan>
tmp << "\n the conditional forecast involving as constrained variable " << get_variable(SymbolType::endogenous, it->exo_num) << " and as endogenized exogenous " << get_variable(SymbolType::exogenous, it->var_num) << " that do not appear in block=" << Block_Count+1 << ")\n You should not use block in model options\n";
throw FatalExceptionHandling(tmp.str());
}
else if ((find(endogenous.begin(), endogenous.end(), it->exo_num) != endogenous.end()) && (find(exogenous.begin(), exogenous.end(), it->var_num) != exogenous.end()) && ((fb->get_type() == EVALUATE_FORWARD) || (fb->get_type() != EVALUATE_BACKWARD)))
else if ((find(endogenous.begin(), endogenous.end(), it->exo_num) != endogenous.end()) && (find(exogenous.begin(), exogenous.end(), it->var_num) != exogenous.end()) && ((fb->get_type() == static_cast<uint8_t>(BlockSimulationType::evaluateForward)) || (fb->get_type() != static_cast<uint8_t>(BlockSimulationType::evaluateBackward))))
{
ostringstream tmp;
tmp << "\n the conditional forecast cannot be implemented for the block=" << Block_Count+1 << ") that has to be evaluated instead to be solved\n You should not use block in model options\n";
......
Subproject commit bd6eee93dfa3f07d9c0ebca7f7aa21dfbad111f7
Subproject commit 5d6e6338f43ffb563c28af490e2544dbfbe7626b
Markdown is supported
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