preprocessor: params_derivs_file: by default, compute second order derivs wrt params; simplify code; #1187

issue#70
Houtan Bastani 2016-05-13 10:48:49 +02:00
parent c3dcc0e121
commit 9202c1e6c2
2 changed files with 39 additions and 36 deletions

View File

@ -490,10 +490,11 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output, bool compute_xr
const bool static_hessian = mod_file_struct.identification_present const bool static_hessian = mod_file_struct.identification_present
|| mod_file_struct.estimation_analytic_derivation; || mod_file_struct.estimation_analytic_derivation;
FileOutputType paramsDerivatives = none; FileOutputType paramsDerivatives = none;
if (mod_file_struct.estimation_analytic_derivation) if (mod_file_struct.identification_present || mod_file_struct.estimation_analytic_derivation)
paramsDerivatives = third; if (!sec_order_param_deriv)
if (mod_file_struct.identification_present || !sec_order_param_deriv) paramsDerivatives = first;
paramsDerivatives = first; else
paramsDerivatives = second;
static_model.computingPass(global_eval_context, no_tmp_terms, static_hessian, static_model.computingPass(global_eval_context, no_tmp_terms, static_hessian,
false, paramsDerivatives, block, byte_code); false, paramsDerivatives, block, byte_code);
} }
@ -527,10 +528,11 @@ ModFile::computingPass(bool no_tmp_terms, FileOutputType output, bool compute_xr
|| mod_file_struct.estimation_analytic_derivation || mod_file_struct.estimation_analytic_derivation
|| output == third; || output == third;
FileOutputType paramsDerivatives = none; FileOutputType paramsDerivatives = none;
if (mod_file_struct.estimation_analytic_derivation) if (mod_file_struct.identification_present || mod_file_struct.estimation_analytic_derivation)
paramsDerivatives = third; if (!sec_order_param_deriv)
if (mod_file_struct.identification_present || !sec_order_param_deriv) paramsDerivatives = first;
paramsDerivatives = first; else
paramsDerivatives = second;
dynamic_model.computingPass(true, hessian, thirdDerivatives, paramsDerivatives, global_eval_context, no_tmp_terms, block, use_dll, byte_code, compute_xrefs); dynamic_model.computingPass(true, hessian, thirdDerivatives, paramsDerivatives, global_eval_context, no_tmp_terms, block, use_dll, byte_code, compute_xrefs);
} }
} }

View File

@ -1659,7 +1659,7 @@ ModelTree::sparseHelper(int order, ostream &output, int row_nb, int col_nb, Expr
void void
ModelTree::computeParamsDerivatives(FileOutputType paramsDerivatives) ModelTree::computeParamsDerivatives(FileOutputType paramsDerivatives)
{ {
if (!(paramsDerivatives == first || paramsDerivatives == second || paramsDerivatives == third)) if (!(paramsDerivatives == first || paramsDerivatives == second))
return; return;
set<int> deriv_id_set; set<int> deriv_id_set;
addAllParamDerivId(deriv_id_set); addAllParamDerivId(deriv_id_set);
@ -1677,7 +1677,7 @@ ModelTree::computeParamsDerivatives(FileOutputType paramsDerivatives)
residuals_params_derivatives[make_pair(eq, param)] = d1; residuals_params_derivatives[make_pair(eq, param)] = d1;
} }
if (paramsDerivatives == second || paramsDerivatives == third) if (paramsDerivatives == second)
for (first_derivatives_t::const_iterator it2 = residuals_params_derivatives.begin(); for (first_derivatives_t::const_iterator it2 = residuals_params_derivatives.begin();
it2 != residuals_params_derivatives.end(); it2++) it2 != residuals_params_derivatives.end(); it2++)
{ {
@ -1704,35 +1704,36 @@ ModelTree::computeParamsDerivatives(FileOutputType paramsDerivatives)
jacobian_params_derivatives[make_pair(eq, make_pair(var, param))] = d2; jacobian_params_derivatives[make_pair(eq, make_pair(var, param))] = d2;
} }
if (paramsDerivatives == second || paramsDerivatives == third) if (paramsDerivatives == second)
for (second_derivatives_t::const_iterator it2 = jacobian_params_derivatives.begin(); {
it2 != jacobian_params_derivatives.end(); it2++) for (second_derivatives_t::const_iterator it2 = jacobian_params_derivatives.begin();
{ it2 != jacobian_params_derivatives.end(); it2++)
int eq = it2->first.first; {
int var = it2->first.second.first; int eq = it2->first.first;
int param1 = it2->first.second.second; int var = it2->first.second.first;
expr_t d1 = it2->second; int param1 = it2->first.second.second;
expr_t d1 = it2->second;
expr_t d2 = d1->getDerivative(param); expr_t d2 = d1->getDerivative(param);
if (d2 == Zero) if (d2 == Zero)
continue; continue;
jacobian_params_second_derivatives[make_pair(eq, make_pair(var, make_pair(param1, param)))] = d2; jacobian_params_second_derivatives[make_pair(eq, make_pair(var, make_pair(param1, param)))] = d2;
} }
if (paramsDerivatives == third) for (second_derivatives_t::const_iterator it2 = second_derivatives.begin();
for (second_derivatives_t::const_iterator it2 = second_derivatives.begin(); it2 != second_derivatives.end(); it2++)
it2 != second_derivatives.end(); it2++) {
{ int eq = it2->first.first;
int eq = it2->first.first; int var1 = it2->first.second.first;
int var1 = it2->first.second.first; int var2 = it2->first.second.second;
int var2 = it2->first.second.second; expr_t d1 = it2->second;
expr_t d1 = it2->second;
expr_t d2 = d1->getDerivative(param); expr_t d2 = d1->getDerivative(param);
if (d2 == Zero) if (d2 == Zero)
continue; continue;
hessian_params_derivatives[make_pair(eq, make_pair(var1, make_pair(var2, param)))] = d2; hessian_params_derivatives[make_pair(eq, make_pair(var1, make_pair(var2, param)))] = d2;
} }
}
} }
} }