From 673bf79a5e6a22064fb0815d8ebaec28e53216c7 Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Thu, 11 Mar 2010 16:46:19 +0100 Subject: [PATCH] derivative of hessian w.r.t. params. --- DynamicModel.cc | 40 +++++++++++++++++++++++++++++++++++++++- DynamicModel.hh | 7 +++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/DynamicModel.cc b/DynamicModel.cc index c82fbac5..c8cea732 100644 --- a/DynamicModel.cc +++ b/DynamicModel.cc @@ -2656,6 +2656,20 @@ DynamicModel::computeParamsDerivatives() continue; jacobian_params_derivatives[make_pair(eq, make_pair(var, param))] = d2; } + + for (second_derivatives_type::const_iterator it2 = second_derivatives.begin(); + it2 != second_derivatives.end(); it2++) + { + int eq = it2->first.first; + int var1 = it2->first.second.first; + int var2 = it2->first.second.second; + NodeID d1 = it2->second; + + NodeID d2 = d1->getDerivative(param); + if (d2 == Zero) + continue; + hessian_params_derivatives[make_pair(eq, make_pair(var1, make_pair(var2, param)))] = d2; + } } } @@ -2678,7 +2692,8 @@ void DynamicModel::writeParamsDerivativesFile(const string &basename) const { if (!residuals_params_derivatives.size() - && !jacobian_params_derivatives.size()) + && !jacobian_params_derivatives.size() + && !hessian_params_derivatives.size()) return; string filename = basename + "_params_derivs.m"; @@ -2735,6 +2750,29 @@ DynamicModel::writeParamsDerivativesFile(const string &basename) const paramsDerivsFile << ";" << endl; } + + // Write hessian derivatives + paramsDerivsFile << "gp = zeros(" << equation_number() << ", " << dynJacobianColsNbr << ", " + << dynJacobianColsNbr << ", " << symbol_table.param_nbr() << ");" << endl; + + for (third_derivatives_type::const_iterator it = hessian_params_derivatives.begin(); + it != hessian_params_derivatives.end(); it++) + { + int eq = it->first.first; + int var1 = it->first.second.first; + int var2 = it->first.second.second.first; + int param = it->first.second.second.second; + NodeID d2 = it->second; + + int var1_col = getDynJacobianCol(var1) + 1; + int var2_col = getDynJacobianCol(var2) + 1; + int param_col = symbol_table.getTypeSpecificID(getSymbIDByDerivID(param)) + 1; + + paramsDerivsFile << "hp(" << eq+1 << ", " << var1_col << ", " << var2_col << ", " << param_col << ") = "; + d2->writeOutput(paramsDerivsFile, oMatlabDynamicModel, params_derivs_temporary_terms); + paramsDerivsFile << ";" << endl; + } + paramsDerivsFile.close(); } diff --git a/DynamicModel.hh b/DynamicModel.hh index 2bfa52c4..a06bff18 100644 --- a/DynamicModel.hh +++ b/DynamicModel.hh @@ -71,6 +71,13 @@ private: */ second_derivatives_type jacobian_params_derivatives; + //! Derivatives of the hessian w.r. to parameters + /*! First index is equation number, first and second are endo/exo/exo_det variable, and third is parameter. + Only non-null derivatives are stored in the map. + Variable and parameter indices are those of the getDerivID() method. + */ + third_derivatives_type hessian_params_derivatives; + //! Temporary terms for the file containing parameters dervicatives temporary_terms_type params_derivs_temporary_terms;