k-order DLL: in ‘use_dll’ mode, compute # of temp. terms. using M_.dynamic_tmp_nbr

The preprocessor no longer exports the ‘ntt’ symbol in the MEX.

Ref #217
time-shift
Sébastien Villemot 2019-04-12 18:16:42 +02:00
parent d7dd7214c7
commit c31ba8bebf
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
6 changed files with 19 additions and 12 deletions

View File

@ -26,7 +26,10 @@
class DynamicModelAC class DynamicModelAC
{ {
protected:
int ntt; // Size of vector of temporary terms
public: public:
DynamicModelAC(int ntt_arg) : ntt{ntt_arg} {};
virtual ~DynamicModelAC() = default; virtual ~DynamicModelAC() = default;
virtual void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady, virtual void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady,
Vector &residual, std::vector<TwoDMatrix> &md) = 0; Vector &residual, std::vector<TwoDMatrix> &md) = 0;

View File

@ -23,7 +23,8 @@
#include <iostream> #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; std::string fName;
#if !defined(__CYGWIN32__) && !defined(_WIN32) #if !defined(__CYGWIN32__) && !defined(_WIN32)
@ -35,7 +36,6 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false)
dynamicHinstance = LoadLibrary(fName.c_str()); dynamicHinstance = LoadLibrary(fName.c_str());
if (!dynamicHinstance) if (!dynamicHinstance)
throw DynareException(__FILE__, __LINE__, "Error when loading " + fName + ": can't dynamically load the file"); 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_tt = reinterpret_cast<dynamic_tt_fct>(GetProcAddress(dynamicHinstance, "dynamic_resid_tt"));
dynamic_resid = reinterpret_cast<dynamic_resid_fct>(GetProcAddress(dynamicHinstance, "dynamic_resid")); dynamic_resid = reinterpret_cast<dynamic_resid_fct>(GetProcAddress(dynamicHinstance, "dynamic_resid"));
dynamic_g1_tt = reinterpret_cast<dynamic_tt_fct>(GetProcAddress(dynamicHinstance, "dynamic_g1_tt")); 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_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_tt = reinterpret_cast<dynamic_tt_fct>(GetProcAddress(dynamicHinstance, "dynamic_g3_tt"));
dynamic_g3 = reinterpret_cast<dynamic_g3_fct>(GetProcAddress(dynamicHinstance, "dynamic_g3")); 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_g1_tt || !dynamic_g1
|| !dynamic_g2_tt || !dynamic_g2 || !dynamic_g2_tt || !dynamic_g2
|| !dynamic_g3_tt || !dynamic_g3) || !dynamic_g3_tt || !dynamic_g3)
@ -56,7 +56,6 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false)
dynamicHinstance = dlopen(fName.c_str(), RTLD_NOW); dynamicHinstance = dlopen(fName.c_str(), RTLD_NOW);
if (!dynamicHinstance) if (!dynamicHinstance)
throw DynareException(__FILE__, __LINE__, "Error when loading " + fName + ": " + dlerror()); 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_tt = reinterpret_cast<dynamic_tt_fct>(dlsym(dynamicHinstance, "dynamic_resid_tt"));
dynamic_resid = reinterpret_cast<dynamic_resid_fct>(dlsym(dynamicHinstance, "dynamic_resid")); dynamic_resid = reinterpret_cast<dynamic_resid_fct>(dlsym(dynamicHinstance, "dynamic_resid"));
dynamic_g1_tt = reinterpret_cast<dynamic_tt_fct>(dlsym(dynamicHinstance, "dynamic_g1_tt")); 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_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_tt = reinterpret_cast<dynamic_tt_fct>(dlsym(dynamicHinstance, "dynamic_g3_tt"));
dynamic_g3 = reinterpret_cast<dynamic_g3_fct>(dlsym(dynamicHinstance, "dynamic_g3")); 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_g1_tt || !dynamic_g1
|| !dynamic_g2_tt || !dynamic_g2 || !dynamic_g2_tt || !dynamic_g2
|| !dynamic_g3_tt || !dynamic_g3) || !dynamic_g3_tt || !dynamic_g3)
@ -75,7 +74,7 @@ DynamicModelDLL::DynamicModelDLL(const std::string &modName) noexcept(false)
} }
#endif #endif
tt = std::make_unique<double[]>(*ntt); tt = std::make_unique<double[]>(ntt);
} }
DynamicModelDLL::~DynamicModelDLL() DynamicModelDLL::~DynamicModelDLL()

View File

@ -47,7 +47,6 @@ using dynamic_g3_fct = void (*)(const double *y, const double *x, int nb_row_x,
class DynamicModelDLL : public DynamicModelAC class DynamicModelDLL : public DynamicModelAC
{ {
private: private:
int *ntt;
dynamic_tt_fct dynamic_resid_tt, dynamic_g1_tt, dynamic_g2_tt, dynamic_g3_tt; dynamic_tt_fct dynamic_resid_tt, dynamic_g1_tt, dynamic_g2_tt, dynamic_g3_tt;
dynamic_resid_fct dynamic_resid; dynamic_resid_fct dynamic_resid;
dynamic_g1_fct dynamic_g1; dynamic_g1_fct dynamic_g1;
@ -62,7 +61,7 @@ private:
public: public:
// construct and load Dynamic model DLL // construct and load Dynamic model DLL
explicit DynamicModelDLL(const std::string &fname); explicit DynamicModelDLL(const std::string &fname, int ntt_arg);
virtual ~DynamicModelDLL(); virtual ~DynamicModelDLL();
void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady, void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady,

View File

@ -24,7 +24,8 @@
#include "dynamic_m.hh" #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"} DynamicMFilename{modName + ".dynamic"}
{ {
} }

View File

@ -35,7 +35,7 @@ private:
const std::string DynamicMFilename; const std::string DynamicMFilename;
static void unpackSparseMatrixAndCopyIntoTwoDMatData(mxArray *sparseMat, TwoDMatrix &tdm); static void unpackSparseMatrixAndCopyIntoTwoDMatData(mxArray *sparseMat, TwoDMatrix &tdm);
public: public:
explicit DynamicModelMFile(const std::string &modName); explicit DynamicModelMFile(const std::string &modName, int ntt_arg);
virtual ~DynamicModelMFile() = default; virtual ~DynamicModelMFile() = default;
void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady, void eval(const Vector &y, const Vector &x, const Vector &params, const Vector &ySteady,
Vector &residual, std::vector<TwoDMatrix> &md) override; Vector &residual, std::vector<TwoDMatrix> &md) override;

View File

@ -163,6 +163,11 @@ extern "C" {
if (nEndo != static_cast<int>(endoNames.size()) || nExog != static_cast<int>(exoNames.size())) 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"); 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 const int nSteps = 0; // Dynare++ solving steps, for time being default to 0 = deterministic steady state
try try
@ -171,9 +176,9 @@ extern "C" {
std::unique_ptr<DynamicModelAC> dynamicModelFile; std::unique_ptr<DynamicModelAC> dynamicModelFile;
if (use_dll) if (use_dll)
dynamicModelFile = std::make_unique<DynamicModelDLL>(fName); dynamicModelFile = std::make_unique<DynamicModelDLL>(fName, ntt);
else else
dynamicModelFile = std::make_unique<DynamicModelMFile>(fName); dynamicModelFile = std::make_unique<DynamicModelMFile>(fName, ntt);
// intiate tensor library // intiate tensor library
TLStatic::init(kOrder, nStat+2*nPred+3*nBoth+2*nForw+nExog); TLStatic::init(kOrder, nStat+2*nPred+3*nBoth+2*nForw+nExog);