diff --git a/mex/sources/k_order_perturbation/dynamic_abstract_class.hh b/mex/sources/k_order_perturbation/dynamic_abstract_class.hh index fc18e31d469e599fefdfe985a956e04d2d1a5d24..1bde8301935c3449ad4fe0526aac004cead1a8f5 100644 --- a/mex/sources/k_order_perturbation/dynamic_abstract_class.hh +++ b/mex/sources/k_order_perturbation/dynamic_abstract_class.hh @@ -26,7 +26,10 @@ class DynamicModelAC { +protected: + int ntt; // Size of vector of temporary terms public: + DynamicModelAC(int ntt_arg) : ntt{ntt_arg} {}; virtual ~DynamicModelAC() = default; virtual void eval(const Vector &y, const Vector &x, const Vector ¶ms, const Vector &ySteady, Vector &residual, std::vector<TwoDMatrix> &md) = 0; diff --git a/mex/sources/k_order_perturbation/dynamic_dll.cc b/mex/sources/k_order_perturbation/dynamic_dll.cc index 593e45a9ec348886c16993281578e7f30e63cdf1..287e87c73e8b5682da955143b585c8256ea9c2d0 100644 --- a/mex/sources/k_order_perturbation/dynamic_dll.cc +++ b/mex/sources/k_order_perturbation/dynamic_dll.cc @@ -23,7 +23,8 @@ #include <iostream> -DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false) +DynamicModelDLL::DynamicModelDLL(const std::string &modName, int ntt_arg) + : DynamicModelAC(ntt_arg) { std::string fName; #if !defined(__CYGWIN32__) && !defined(_WIN32) @@ -35,7 +36,6 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false) dynamicHinstance = LoadLibrary(fName.c_str()); if (!dynamicHinstance) throw DynareException(__FILE__, __LINE__, "Error when loading " + fName + ": can't dynamically load the file"); - ntt = reinterpret_cast<int *>(GetProcAddress(dynamicHinstance, "ntt")); dynamic_resid_tt = reinterpret_cast<dynamic_tt_fct>(GetProcAddress(dynamicHinstance, "dynamic_resid_tt")); dynamic_resid = reinterpret_cast<dynamic_resid_fct>(GetProcAddress(dynamicHinstance, "dynamic_resid")); dynamic_g1_tt = reinterpret_cast<dynamic_tt_fct>(GetProcAddress(dynamicHinstance, "dynamic_g1_tt")); @@ -44,7 +44,7 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false) dynamic_g2 = reinterpret_cast<dynamic_g2_fct>(GetProcAddress(dynamicHinstance, "dynamic_g2")); dynamic_g3_tt = reinterpret_cast<dynamic_tt_fct>(GetProcAddress(dynamicHinstance, "dynamic_g3_tt")); dynamic_g3 = reinterpret_cast<dynamic_g3_fct>(GetProcAddress(dynamicHinstance, "dynamic_g3")); - if (!ntt || !dynamic_resid_tt || !dynamic_resid + if (!dynamic_resid_tt || !dynamic_resid || !dynamic_g1_tt || !dynamic_g1 || !dynamic_g2_tt || !dynamic_g2 || !dynamic_g3_tt || !dynamic_g3) @@ -56,7 +56,6 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false) dynamicHinstance = dlopen(fName.c_str(), RTLD_NOW); if (!dynamicHinstance) throw DynareException(__FILE__, __LINE__, "Error when loading " + fName + ": " + dlerror()); - ntt = reinterpret_cast<int *>(dlsym(dynamicHinstance, "ntt")); dynamic_resid_tt = reinterpret_cast<dynamic_tt_fct>(dlsym(dynamicHinstance, "dynamic_resid_tt")); dynamic_resid = reinterpret_cast<dynamic_resid_fct>(dlsym(dynamicHinstance, "dynamic_resid")); dynamic_g1_tt = reinterpret_cast<dynamic_tt_fct>(dlsym(dynamicHinstance, "dynamic_g1_tt")); @@ -65,7 +64,7 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false) dynamic_g2 = reinterpret_cast<dynamic_g2_fct>(dlsym(dynamicHinstance, "dynamic_g2")); dynamic_g3_tt = reinterpret_cast<dynamic_tt_fct>(dlsym(dynamicHinstance, "dynamic_g3_tt")); dynamic_g3 = reinterpret_cast<dynamic_g3_fct>(dlsym(dynamicHinstance, "dynamic_g3")); - if (!ntt || !dynamic_resid_tt || !dynamic_resid + if (!dynamic_resid_tt || !dynamic_resid || !dynamic_g1_tt || !dynamic_g1 || !dynamic_g2_tt || !dynamic_g2 || !dynamic_g3_tt || !dynamic_g3) @@ -75,7 +74,7 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false) } #endif - tt = std::make_unique<double[]>(*ntt); + tt = std::make_unique<double[]>(ntt); } DynamicModelDLL::~DynamicModelDLL() diff --git a/mex/sources/k_order_perturbation/dynamic_dll.hh b/mex/sources/k_order_perturbation/dynamic_dll.hh index b29e5d66ea9aa037b8a12f8b170b0082ab92ad5e..ec04c797c00c09ca5a4acdf7aba2e9acf391e780 100644 --- a/mex/sources/k_order_perturbation/dynamic_dll.hh +++ b/mex/sources/k_order_perturbation/dynamic_dll.hh @@ -47,7 +47,6 @@ using dynamic_g3_fct = void (*)(const double *y, const double *x, int nb_row_x, class DynamicModelDLL : public DynamicModelAC { private: - int *ntt; dynamic_tt_fct dynamic_resid_tt, dynamic_g1_tt, dynamic_g2_tt, dynamic_g3_tt; dynamic_resid_fct dynamic_resid; dynamic_g1_fct dynamic_g1; @@ -62,7 +61,7 @@ private: public: // construct and load Dynamic model DLL - explicit DynamicModelDLL(const std::string &fname); + explicit DynamicModelDLL(const std::string &fname, int ntt_arg); virtual ~DynamicModelDLL(); void eval(const Vector &y, const Vector &x, const Vector ¶ms, const Vector &ySteady, diff --git a/mex/sources/k_order_perturbation/dynamic_m.cc b/mex/sources/k_order_perturbation/dynamic_m.cc index e129d169ebf5d98d76e9825bdaf1025f9c3cc09f..0818879966db97d829b8702117bf64d751fe1ecf 100644 --- a/mex/sources/k_order_perturbation/dynamic_m.cc +++ b/mex/sources/k_order_perturbation/dynamic_m.cc @@ -24,7 +24,8 @@ #include "dynamic_m.hh" -DynamicModelMFile::DynamicModelMFile(const std::string &modName) noexcept(false) : +DynamicModelMFile::DynamicModelMFile(const std::string &modName, int ntt_arg) : + DynamicModelAC(ntt_arg), DynamicMFilename{modName + ".dynamic"} { } diff --git a/mex/sources/k_order_perturbation/dynamic_m.hh b/mex/sources/k_order_perturbation/dynamic_m.hh index 0ae1e9aae3c6f9cc2feed523217e818141c7f932..0e170f3558f440b3781647af289ef39d5468d130 100644 --- a/mex/sources/k_order_perturbation/dynamic_m.hh +++ b/mex/sources/k_order_perturbation/dynamic_m.hh @@ -35,7 +35,7 @@ private: const std::string DynamicMFilename; static void unpackSparseMatrixAndCopyIntoTwoDMatData(mxArray *sparseMat, TwoDMatrix &tdm); public: - explicit DynamicModelMFile(const std::string &modName); + explicit DynamicModelMFile(const std::string &modName, int ntt_arg); virtual ~DynamicModelMFile() = default; void eval(const Vector &y, const Vector &x, const Vector ¶ms, const Vector &ySteady, Vector &residual, std::vector<TwoDMatrix> &md) override; diff --git a/mex/sources/k_order_perturbation/k_order_perturbation.cc b/mex/sources/k_order_perturbation/k_order_perturbation.cc index b050b9b9298ab12f37bace41c04b89a5c40c7dd1..66c50cefc909ce570797ec7d283ac1afbec9d861 100644 --- a/mex/sources/k_order_perturbation/k_order_perturbation.cc +++ b/mex/sources/k_order_perturbation/k_order_perturbation.cc @@ -163,6 +163,11 @@ extern "C" { if (nEndo != static_cast<int>(endoNames.size()) || nExog != static_cast<int>(exoNames.size())) DYN_MEX_FUNC_ERR_MSG_TXT("Incorrect size of M_.endo_names or M_.exo_names"); + mxFldp = mxGetField(M_, 0, "dynamic_tmp_nbr"); + if (static_cast<int>(mxGetM(mxFldp)) < kOrder+1 || mxGetN(mxFldp) != 1) + DYN_MEX_FUNC_ERR_MSG_TXT("Incorrect size of M_.dynamic_tmp_nbr"); + int ntt = std::accumulate(mxGetPr(mxFldp), mxGetPr(mxFldp)+kOrder+1, 0); + const int nSteps = 0; // Dynare++ solving steps, for time being default to 0 = deterministic steady state try @@ -171,9 +176,9 @@ extern "C" { std::unique_ptr<DynamicModelAC> dynamicModelFile; if (use_dll) - dynamicModelFile = std::make_unique<DynamicModelDLL>(fName); + dynamicModelFile = std::make_unique<DynamicModelDLL>(fName, ntt); else - dynamicModelFile = std::make_unique<DynamicModelMFile>(fName); + dynamicModelFile = std::make_unique<DynamicModelMFile>(fName, ntt); // intiate tensor library TLStatic::init(kOrder, nStat+2*nPred+3*nBoth+2*nForw+nExog);