diff --git a/mex/sources/bytecode/Interpreter.cc b/mex/sources/bytecode/Interpreter.cc index 0c70dd94978360f895d1ff5653f073adb843981b..ed71bbe0ac52170d44a94c43a545e17411c03f91 100644 --- a/mex/sources/bytecode/Interpreter.cc +++ b/mex/sources/bytecode/Interpreter.cc @@ -32,7 +32,8 @@ Interpreter::Interpreter(double *params_arg, double *y_arg, double *ya_arg, doub 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, int minimal_solving_periods_arg, int stack_solve_algo_arg, int solve_algo_arg) + string &filename_arg, int minimal_solving_periods_arg, int stack_solve_algo_arg, int solve_algo_arg, + bool global_temporary_terms_arg, bool print_arg) { params = params_arg; y = y_arg; @@ -60,6 +61,8 @@ Interpreter::Interpreter(double *params_arg, double *y_arg, double *ya_arg, doub minimal_solving_periods = minimal_solving_periods_arg; stack_solve_algo = stack_solve_algo_arg; solve_algo = solve_algo_arg; + global_temporary_terms = global_temporary_terms_arg; + print = print_arg; } double @@ -129,6 +132,8 @@ Interpreter::compute_block_time(int Per_u_, bool evaluate, int block_num, int si double *jacob = NULL, *jacob_other_endo = NULL, *jacob_exo = NULL, *jacob_exo_det = NULL; EQN_block = block_num; stack<double> Stack; + external_function_type function_type; + #ifdef DEBUG mexPrintf("compute_block_time\n"); #endif @@ -1139,7 +1144,7 @@ Interpreter::compute_block_time(int Per_u_, bool evaluate, int block_num, int si mexPrintf("arg_func_name.c_str() = %s\n",arg_func_name.c_str()); #endif unsigned int nb_add_input_arguments = fc->get_nb_add_input_arguments(); - external_function_type function_type = fc->get_function_type(); + function_type = fc->get_function_type(); #ifdef DEBUG mexPrintf("function_type=%d ExternalFunctionWithoutDerivative=%d\n",function_type, ExternalFunctionWithoutDerivative); mexEvalString("drawnow;"); @@ -1251,16 +1256,20 @@ Interpreter::compute_block_time(int Per_u_, bool evaluate, int block_num, int si for (unsigned int i = 0; i < nb_add_input_arguments; i++) { double rr = Stack.top(); +#ifdef DEBUG mexPrintf("i=%d rr = %f\n",i, rr); +#endif mxSetCell(vv, (nb_add_input_arguments - 1) - i, mxCreateDoubleScalar(rr)); Stack.pop(); } input_arguments[nb_input_arguments+nb_add_input_arguments] = vv; +#ifdef DEBUG mexCallMATLAB(0, NULL, 1, & input_arguments[0], "disp"); mexCallMATLAB(0, NULL, 1, & input_arguments[1], "disp"); mexCallMATLAB(0, NULL, 1, & input_arguments[2], "celldisp"); mexPrintf("OK\n"); mexEvalString("drawnow;"); +#endif nb_input_arguments = 3; mexCallMATLAB(nb_output_arguments, output_arguments, nb_input_arguments, input_arguments, function_name.c_str()); double *rr = mxGetPr(output_arguments[0]); @@ -1288,72 +1297,6 @@ Interpreter::compute_block_time(int Per_u_, bool evaluate, int block_num, int si } break; } - /*if (f) - { - input_arguments = (mxArray**)mxMalloc((nb_input_arguments+1+nb_add_input_arguments) * sizeof(mxArray*)); - //the called function is jacob_element or hess_element - mxArray *vv = mxCreateString(arg_func_name.c_str()); - input_arguments[0] = vv; - vv = mxCreateDoubleScalar(fc->get_indx()); - input_arguments[1] = vv; - start_input_arg += 2; - } - else - input_arguments = (mxArray**)mxMalloc(nb_input_arguments * sizeof(mxArray*)); - for (unsigned int i = start_input_arg; i < nb_input_arguments + start_input_arg; i++) - { - mxArray *vv = mxCreateDoubleScalar(Stack.top()); - input_arguments[i] = vv; - Stack.pop(); - } - mexPrintf("nb_add_input_arguments=%d Stack.size()=%d\n",nb_add_input_arguments, Stack.size());mexEvalString("drawnow;"); - if (arg_func_name.length() > 0) - { - mxArray *vv = mxCreateCellArray(1, &nb_add_input_arguments); - for (unsigned int i = 0; i < nb_add_input_arguments; i++) - { - double rr = Stack.top(); - mexPrintf("i=%d rr = %f\n",i, rr); - mxSetCell(vv, i, mxCreateDoubleScalar(rr)); - Stack.pop(); - } - input_arguments[nb_input_arguments+nb_add_input_arguments] = vv; - mexCallMATLAB(0, NULL, 1, & input_arguments[0], "disp"); - mexCallMATLAB(0, NULL, 1, & input_arguments[1], "disp"); - mexCallMATLAB(0, NULL, 1, & input_arguments[2], "celldisp"); - mexPrintf("OK\n"); - mexEvalString("drawnow;"); - nb_input_arguments = 3; - } - - mexCallMATLAB(nb_output_arguments, output_arguments, nb_input_arguments, input_arguments, function_name.c_str()); - double *rr = mxGetPr(output_arguments[0]); - Stack.push(*rr); - if (nb_output_arguments >= 2) //its the return of a TEF - { - unsigned int indx = fc->get_indx(); - double *FD1 = mxGetPr(output_arguments[1]); - unsigned int rows = mxGetM(output_arguments[1]); - for(unsigned int i = 0; i < rows; i++) - TEFD[make_pair(indx, i)] = FD1[i]; - if (nb_output_arguments == 3) - { - double *FD2 = mxGetPr(output_arguments[2]); - unsigned int rows = mxGetM(output_arguments[2]); - unsigned int cols = mxGetN(output_arguments[2]); - unsigned int k = 0; - for (unsigned int j = 0; j < cols; j++) - for (unsigned int i = 0; i < rows; i++) - TEFDD[make_pair(indx, make_pair(i, j))] = FD2[k++]; - } - } - else*/ -/* -#ifdef DEBUG - mexPrintf("Stack.size()=%d, *rr=%f\n",Stack.size(), *rr); - mexPrintf("done\n"); - mexEvalString("drawnow;"); -#endif*/ } break; case FSTPTEF: @@ -1387,12 +1330,15 @@ Interpreter::compute_block_time(int Per_u_, bool evaluate, int block_num, int si mexPrintf("FSTPTEFD\n"); mexPrintf("indx=%d Stack.size()=%d\n",indx, Stack.size()); #endif - TEFD[make_pair(indx, row-1)] = Stack.top(); + if (function_type == ExternalFunctionNumericalFirstDerivative) + { + TEFD[make_pair(indx, row-1)] = Stack.top(); #ifdef DEBUG - mexPrintf("FSTP TEFD[make_pair(indx, row)]=%f done\n",TEFD[make_pair(indx, row-1)]); - mexEvalString("drawnow;"); + mexPrintf("FSTP TEFD[make_pair(indx, row)]=%f done\n",TEFD[make_pair(indx, row-1)]); + mexEvalString("drawnow;"); #endif - Stack.pop(); + Stack.pop(); + } } break; @@ -1418,12 +1364,15 @@ Interpreter::compute_block_time(int Per_u_, bool evaluate, int block_num, int si mexPrintf("FSTPTEFD\n"); mexPrintf("indx=%d Stack.size()=%d\n",indx, Stack.size()); #endif - TEFDD[make_pair(indx, make_pair(row-1, col-1))] = Stack.top(); + if (function_type == ExternalFunctionNumericalSecondDerivative) + { + TEFDD[make_pair(indx, make_pair(row-1, col-1))] = Stack.top(); #ifdef DEBUG - mexPrintf("FSTP TEFDD[make_pair(indx, make_pair(row, col))]=%f done\n",TEFDD[make_pair(indx, make_pair(row, col))]); - mexEvalString("drawnow;"); + mexPrintf("FSTP TEFDD[make_pair(indx, make_pair(row, col))]=%f done\n",TEFDD[make_pair(indx, make_pair(row, col))]); + mexEvalString("drawnow;"); #endif - Stack.pop(); + Stack.pop(); + } } break; @@ -2394,6 +2343,47 @@ Interpreter::simulate_a_block(const int size, const int type, string file_name, return NO_ERROR_ON_EXIT; } +void +Interpreter::print_a_block(const int size, const int type, string bin_basename, bool steady_state, int block_num, + const bool is_linear, const int symbol_table_endo_nbr, const int Block_List_Max_Lag, + const int Block_List_Max_Lead, const int u_count_int, int block) +{ + it_code_type begining; + mexPrintf("\nBlock %d\n",block_num+1); + mexPrintf("----------\n"); + if (steady_state) + residual = vector<double>(size); + else + residual = vector<double>(size*(periods+y_kmin)); + bool go_on = true; + bool space = false; + while (go_on) + { + if (it_code->first == FENDBLOCK) + { + go_on = false; + it_code++; + } + else + { + string s = print_expression(it_code, false, size, block_num, steady_state, Per_u_, it_, it_code, false); + if (s == "if (evaluate)" || s == "else") + space = false; + if (s.length()>0) + { + if (space) + mexPrintf(" %s\n",s.c_str()); + else + mexPrintf("%s\n",s.c_str()); + mexEvalString("drawnow;"); + } + if (s == "if (evaluate)" || s == "else") + space = true; + } + } +} + + bool Interpreter::compute_blocks(string file_name, string bin_basename, bool steady_state, bool evaluate, int block, int &nb_blocks) { @@ -2444,7 +2434,10 @@ Interpreter::compute_blocks(string file_name, string bin_basename, bool steady_s FBEGINBLOCK_ *fb = (FBEGINBLOCK_ *) it_code->second; Block_Contain = fb->get_Block_Contain(); it_code++; - if (evaluate) + if (print) + print_a_block(fb->get_size(), fb->get_type(), bin_basename, steady_state, Block_Count, + fb->get_is_linear(), fb->get_endo_nbr(), fb->get_Max_Lag(), fb->get_Max_Lead(), fb->get_u_count_int(), block); + else if (evaluate) { #ifdef DEBUG mexPrintf("jacobian_block=mxCreateDoubleMatrix(%d, %d, mxREAL)\n",fb->get_size(),fb->get_nb_col_jacob()); @@ -2511,7 +2504,19 @@ Interpreter::compute_blocks(string file_name, string bin_basename, bool steady_s var = ((FDIMST_ *) it_code->second)->get_size(); if (T) mxFree(T); - T = (double *) mxMalloc(var*sizeof(double)); + if (global_temporary_terms) + { + GlobalTemporaryTerms = mexGetVariable("caller", "temporary_terms"); + if (GlobalTemporaryTerms == NULL) + { + mexPrintf("GlobalTemporaryTerms is NULL\n");mexEvalString("drawnow;"); + } + if (var != (int)mxGetNumberOfElements(GlobalTemporaryTerms)) + GlobalTemporaryTerms = mxCreateDoubleMatrix(var, 1, mxREAL); + T = mxGetPr(GlobalTemporaryTerms); + } + else + T = (double *) mxMalloc(var*sizeof(double)); if (block >= 0) it_code = code_liste.begin() + code.get_begin_block(block); else @@ -2524,6 +2529,9 @@ Interpreter::compute_blocks(string file_name, string bin_basename, bool steady_s throw FatalExceptionHandling(tmp.str()); } } + if (global_temporary_terms) + mexPutVariable("caller", "temporary_terms", GlobalTemporaryTerms); + mxFree(Init_Code->second); nb_blocks = Block_Count+1; if (T)