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
{
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 &params, const Vector &ySteady,
Vector &residual, std::vector<TwoDMatrix> &md) = 0;

View File

@ -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()

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
{
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 &params, const Vector &ySteady,

View File

@ -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"}
{
}

View File

@ -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 &params, const Vector &ySteady,
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()))
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);