Improvement of the floating point error messages (the equation and the location of the error are displayed)
parent
cea26af06e
commit
6d958b6e8d
File diff suppressed because it is too large
Load Diff
|
@ -51,12 +51,17 @@ private:
|
||||||
unsigned int EQN_equation, EQN_block, EQN_block_number;
|
unsigned int EQN_equation, EQN_block, EQN_block_number;
|
||||||
unsigned int EQN_dvar1, EQN_dvar2, EQN_dvar3;
|
unsigned int EQN_dvar1, EQN_dvar2, EQN_dvar3;
|
||||||
int EQN_lag1, EQN_lag2, EQN_lag3;
|
int EQN_lag1, EQN_lag2, EQN_lag3;
|
||||||
|
it_code_type it_code_expr;
|
||||||
protected:
|
protected:
|
||||||
double pow1(double a, double b);
|
double pow1(double a, double b, bool evaluate);
|
||||||
double log1(double a);
|
double log1(double a, bool evaluate);
|
||||||
double log10_1(double a);
|
double log10_1(double a, bool evaluate);
|
||||||
string error_location();
|
string remove_white(string str);
|
||||||
|
string add_underscore_to_fpe(string str);
|
||||||
|
string get_variable(SymbolType variable_type, int variable_num);
|
||||||
|
string error_location(bool evaluate);
|
||||||
void compute_block_time(int Per_u_, bool evaluate, int block_num);
|
void compute_block_time(int Per_u_, bool evaluate, int block_num);
|
||||||
|
string print_expression(it_code_type it_code, bool evaluate);
|
||||||
void evaluate_a_block(const int size, const int type, string bin_basename, bool steady_state, int block_num,
|
void evaluate_a_block(const int size, const int type, string bin_basename, bool steady_state, int block_num,
|
||||||
const bool is_linear = false, const int symbol_table_endo_nbr = 0, const int Block_List_Max_Lag = 0, const int Block_List_Max_Lead = 0, const int u_count_int = 0);
|
const bool is_linear = false, const int symbol_table_endo_nbr = 0, const int Block_List_Max_Lag = 0, const int Block_List_Max_Lead = 0, const int u_count_int = 0);
|
||||||
bool simulate_a_block(const int size, const int type, string file_name, string bin_basename, bool Gaussian_Elimination, bool steady_state, int block_num,
|
bool simulate_a_block(const int size, const int type, string file_name, string bin_basename, bool Gaussian_Elimination, bool steady_state, int block_num,
|
||||||
|
|
|
@ -1012,7 +1012,7 @@ SparseMatrix::simulate_NG(int blck, int y_size, int it_, int y_kmin, int y_kmax,
|
||||||
NR = (int *) mxMalloc(Size*sizeof(int));
|
NR = (int *) mxMalloc(Size*sizeof(int));
|
||||||
error_not_printed = true;
|
error_not_printed = true;
|
||||||
u_count_alloc_save = u_count_alloc;
|
u_count_alloc_save = u_count_alloc;
|
||||||
if (isnan(res1) || isinf(res1) || (res2 > 8*g0 && iter>0))
|
if (isnan(res1) || isinf(res1) || (res2 > 12*g0 && iter>0))
|
||||||
{
|
{
|
||||||
if (iter == 0)
|
if (iter == 0)
|
||||||
{
|
{
|
||||||
|
@ -1205,7 +1205,6 @@ SparseMatrix::simulate_NG(int blck, int y_size, int it_, int y_kmin, int y_kmax,
|
||||||
}
|
}
|
||||||
double markovitz = 0, markovitz_max = -9e70;
|
double markovitz = 0, markovitz_max = -9e70;
|
||||||
int NR_max = 0;
|
int NR_max = 0;
|
||||||
//mexPrintf("l=%d\n",l);
|
|
||||||
if (!one)
|
if (!one)
|
||||||
{
|
{
|
||||||
for (j = 0; j < l; j++)
|
for (j = 0; j < l; j++)
|
||||||
|
@ -1224,18 +1223,6 @@ SparseMatrix::simulate_NG(int blck, int y_size, int it_, int y_kmin, int y_kmax,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
markovitz = fabs(piv_v[j])/piv_abs;
|
markovitz = fabs(piv_v[j])/piv_abs;
|
||||||
/*if (fetestexcept(FE_DIVBYZERO))
|
|
||||||
{
|
|
||||||
if (error_not_printed)
|
|
||||||
{
|
|
||||||
mexPrintf("--------------------------------------\n Error: Divide by zero in simul_NG(1) piv_abs=%f and N_max=%d \n--------------------------------------\n", piv_abs, N_max);
|
|
||||||
error_not_printed = false;
|
|
||||||
markovitz = 1e70;
|
|
||||||
}
|
|
||||||
feclearexcept (FE_ALL_EXCEPT);
|
|
||||||
res1 = NAN;
|
|
||||||
}*/
|
|
||||||
//mexPrintf("piv_v[j]=%f NR[j]=%d markovitz=%f markovitz_max=%f\n", piv_v[j], NR[j], markovitz, markovitz_max);
|
|
||||||
if (markovitz > markovitz_max)
|
if (markovitz > markovitz_max)
|
||||||
{
|
{
|
||||||
piv = piv_v[j];
|
piv = piv_v[j];
|
||||||
|
@ -1264,32 +1251,20 @@ SparseMatrix::simulate_NG(int blck, int y_size, int it_, int y_kmin, int y_kmax,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
markovitz = fabs(piv_v[j])/piv_abs;
|
markovitz = fabs(piv_v[j])/piv_abs;
|
||||||
/*if (fetestexcept(FE_DIVBYZERO))
|
if (NR[j] == 1)
|
||||||
{
|
|
||||||
if (error_not_printed)
|
|
||||||
{
|
|
||||||
mexPrintf("--------------------------------------\n Error: Divide by zero in simul_NG(2) piv_abs=%f and N_max=%d \n--------------------------------------\n", piv_abs, N_max);
|
|
||||||
error_not_printed = false;
|
|
||||||
markovitz = 1e70;
|
|
||||||
}
|
|
||||||
feclearexcept (FE_ALL_EXCEPT);
|
|
||||||
res1 = NAN;
|
|
||||||
}*/
|
|
||||||
if (/*markovitz > markovitz_max &&*/ NR[j] == 1)
|
|
||||||
{
|
{
|
||||||
piv = piv_v[j];
|
piv = piv_v[j];
|
||||||
pivj = pivj_v[j]; //Line number
|
pivj = pivj_v[j]; //Line number
|
||||||
pivk = pivk_v[j]; //positi
|
pivk = pivk_v[j]; //positi
|
||||||
markovitz_max = markovitz;
|
markovitz_max = markovitz;
|
||||||
NR_max = NR[j];
|
NR_max = NR[j];
|
||||||
//mexPrintf("forced piv = %f NR_max =%d\n",piv, NR_max);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fabs(piv) < eps)
|
/*if (fabs(piv) < eps)
|
||||||
mexPrintf("==> Error NR_max=%d, N_max=%d and piv=%f, piv_abs=%f, markovitz_max=%f\n",NR_max, N_max, piv, piv_abs, markovitz_max);
|
mexPrintf("==> Error NR_max=%d, N_max=%d and piv=%f, piv_abs=%f, markovitz_max=%f\n",NR_max, N_max, piv, piv_abs, markovitz_max);
|
||||||
if (NR_max == 0)
|
if (NR_max == 0)
|
||||||
mexPrintf("==> Error NR_max=0 and piv=%f, markovitz_max=%f\n",piv, markovitz_max);
|
mexPrintf("==> Error NR_max=0 and piv=%f, markovitz_max=%f\n",piv, markovitz_max);*/
|
||||||
pivot[i] = pivj;
|
pivot[i] = pivj;
|
||||||
pivotk[i] = pivk;
|
pivotk[i] = pivk;
|
||||||
pivotv[i] = piv;
|
pivotv[i] = piv;
|
||||||
|
@ -1544,7 +1519,84 @@ SparseMatrix::simulate_NG1(int blck, int y_size, int it_, int y_kmin, int y_kmax
|
||||||
mexEvalString("drawnow;");
|
mexEvalString("drawnow;");
|
||||||
time00 = clock();
|
time00 = clock();
|
||||||
}
|
}
|
||||||
if (isnan(res1) || isinf(res1))
|
if (isnan(res1) || isinf(res1) || (res2 > 12*g0 && iter>0))
|
||||||
|
{
|
||||||
|
if (iter == 0)
|
||||||
|
{
|
||||||
|
for (j = 0; j < y_size; j++)
|
||||||
|
{
|
||||||
|
bool select = false;
|
||||||
|
for (int i = 0; i < Size; i++)
|
||||||
|
if (j == index_vara[i])
|
||||||
|
{
|
||||||
|
select = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (select)
|
||||||
|
mexPrintf("-> variable %d at time %d = %f direction = %f\n", j+1, it_, y[j+it_*y_size], direction[j+it_*y_size]);
|
||||||
|
else
|
||||||
|
mexPrintf(" variable %d at time %d = %f direction = %f\n", j+1, it_, y[j+it_*y_size], direction[j+it_*y_size]);
|
||||||
|
}
|
||||||
|
mexPrintf("res1=%5.10f\n", res1);
|
||||||
|
mexPrintf("The initial values of endogenous variables are too far from the solution.\n");
|
||||||
|
mexPrintf("Change them!\n");
|
||||||
|
mexEvalString("drawnow;");
|
||||||
|
filename += " stopped";
|
||||||
|
mexErrMsgTxt(filename.c_str());
|
||||||
|
}
|
||||||
|
if (fabs(slowc_save) < 1e-8)
|
||||||
|
{
|
||||||
|
for (j = 0; j < y_size; j++)
|
||||||
|
{
|
||||||
|
bool select = false;
|
||||||
|
for (int i = 0; i < Size; i++)
|
||||||
|
if (j == index_vara[i])
|
||||||
|
{
|
||||||
|
select = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (select)
|
||||||
|
mexPrintf("-> variable %d at time %d = %f direction = %f\n", j+1, it_, y[j+it_*y_size], direction[j+it_*y_size]);
|
||||||
|
else
|
||||||
|
mexPrintf(" variable %d at time %d = %f direction = %f\n", j+1, it_, y[j+it_*y_size], direction[j+it_*y_size]);
|
||||||
|
}
|
||||||
|
mexPrintf("Dynare cannot improve the simulation in block %d at time %d (variable %d)\n", blck+1, it_+1, max_res_idx);
|
||||||
|
mexEvalString("drawnow;");
|
||||||
|
filename += " stopped";
|
||||||
|
mexErrMsgTxt(filename.c_str());
|
||||||
|
}
|
||||||
|
if(!(isnan(res1) || isinf(res1)) && !(isnan(g0) || isinf(g0)))
|
||||||
|
{
|
||||||
|
if (try_at_iteration == 0)
|
||||||
|
{
|
||||||
|
prev_slowc_save = slowc_save;
|
||||||
|
slowc_save = max( - gp0 / (2 * (res2 - g0 - gp0)) , 0.1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double t1 = res2 - gp0 * slowc_save - g0;
|
||||||
|
double t2 = glambda2 - gp0 * prev_slowc_save - g0;
|
||||||
|
double a = (1/(slowc_save * slowc_save) * t1 - 1/(prev_slowc_save * prev_slowc_save) * t2) / (slowc_save - prev_slowc_save);
|
||||||
|
double b = (-prev_slowc_save/(slowc_save * slowc_save) * t1 + slowc_save/(prev_slowc_save * prev_slowc_save) * t2) / (slowc_save - prev_slowc_save);
|
||||||
|
prev_slowc_save = slowc_save;
|
||||||
|
slowc_save = max(min( -b + sqrt(b*b - 3 * a * gp0) / (3 * a), 0.5 * slowc_save), 0.1 * slowc_save);
|
||||||
|
}
|
||||||
|
glambda2 = res2;
|
||||||
|
try_at_iteration ++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prev_slowc_save = slowc_save;
|
||||||
|
slowc_save /= 1.1;
|
||||||
|
}
|
||||||
|
if (print_it)
|
||||||
|
mexPrintf("Error: Simulation diverging, trying to correct it using slowc=%f\n", slowc_save);
|
||||||
|
for (i = 0; i < y_size*(periods+y_kmin); i++)
|
||||||
|
y[i] = ya[i]+slowc_save*direction[i];
|
||||||
|
iter--;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*if (isnan(res1) || isinf(res1))
|
||||||
{
|
{
|
||||||
if (iter == 0)
|
if (iter == 0)
|
||||||
{
|
{
|
||||||
|
@ -1577,7 +1629,7 @@ SparseMatrix::simulate_NG1(int blck, int y_size, int it_, int y_kmin, int y_kmax
|
||||||
y[i] = ya[i]+slowc_save*direction[i];
|
y[i] = ya[i]+slowc_save*direction[i];
|
||||||
iter--;
|
iter--;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}*/
|
||||||
u_count += u_count_init;
|
u_count += u_count_init;
|
||||||
if (alt_symbolic && alt_symbolic_count < alt_symbolic_count_max)
|
if (alt_symbolic && alt_symbolic_count < alt_symbolic_count_max)
|
||||||
{
|
{
|
||||||
|
@ -1699,7 +1751,6 @@ SparseMatrix::simulate_NG1(int blck, int y_size, int it_, int y_kmin, int y_kmax
|
||||||
}
|
}
|
||||||
double markovitz = 0, markovitz_max = -9e70;
|
double markovitz = 0, markovitz_max = -9e70;
|
||||||
int NR_max = 0;
|
int NR_max = 0;
|
||||||
//mexPrintf("l=%d\n",l);
|
|
||||||
if (!one)
|
if (!one)
|
||||||
{
|
{
|
||||||
for (j = 0; j < l; j++)
|
for (j = 0; j < l; j++)
|
||||||
|
@ -1718,18 +1769,6 @@ SparseMatrix::simulate_NG1(int blck, int y_size, int it_, int y_kmin, int y_kmax
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
markovitz = fabs(piv_v[j])/piv_abs;
|
markovitz = fabs(piv_v[j])/piv_abs;
|
||||||
/*if (fetestexcept(FE_DIVBYZERO))
|
|
||||||
{
|
|
||||||
if (error_not_printed)
|
|
||||||
{
|
|
||||||
mexPrintf("--------------------------------------\n Error: Divide by zero in simul_NG(1) piv_abs=%f and N_max=%d \n--------------------------------------\n", piv_abs, N_max);
|
|
||||||
error_not_printed = false;
|
|
||||||
markovitz = 1e70;
|
|
||||||
}
|
|
||||||
feclearexcept (FE_ALL_EXCEPT);
|
|
||||||
res1 = NAN;
|
|
||||||
}*/
|
|
||||||
//mexPrintf("piv_v[j]=%f NR[j]=%d markovitz=%f markovitz_max=%f\n", piv_v[j], NR[j], markovitz, markovitz_max);
|
|
||||||
if (markovitz > markovitz_max)
|
if (markovitz > markovitz_max)
|
||||||
{
|
{
|
||||||
piv = piv_v[j];
|
piv = piv_v[j];
|
||||||
|
@ -1758,25 +1797,13 @@ SparseMatrix::simulate_NG1(int blck, int y_size, int it_, int y_kmin, int y_kmax
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
markovitz = fabs(piv_v[j])/piv_abs;
|
markovitz = fabs(piv_v[j])/piv_abs;
|
||||||
/*if (fetestexcept(FE_DIVBYZERO))
|
if (NR[j] == 1)
|
||||||
{
|
|
||||||
if (error_not_printed)
|
|
||||||
{
|
|
||||||
mexPrintf("--------------------------------------\n Error: Divide by zero in simul_NG(2) piv_abs=%f and N_max=%d \n--------------------------------------\n", piv_abs, N_max);
|
|
||||||
error_not_printed = false;
|
|
||||||
markovitz = 1e70;
|
|
||||||
}
|
|
||||||
feclearexcept (FE_ALL_EXCEPT);
|
|
||||||
res1 = NAN;
|
|
||||||
}*/
|
|
||||||
if (/*markovitz > markovitz_max &&*/ NR[j] == 1)
|
|
||||||
{
|
{
|
||||||
piv = piv_v[j];
|
piv = piv_v[j];
|
||||||
pivj = pivj_v[j]; //Line number
|
pivj = pivj_v[j]; //Line number
|
||||||
pivk = pivk_v[j]; //positi
|
pivk = pivk_v[j]; //positi
|
||||||
markovitz_max = markovitz;
|
markovitz_max = markovitz;
|
||||||
NR_max = NR[j];
|
NR_max = NR[j];
|
||||||
//mexPrintf("forced piv = %f NR_max =%d\n",piv, NR_max);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue