K-order DLL: removed useless stuff
parent
3b1debf90b
commit
1b3bc4a825
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2008-2009 Dynare Team
|
* Copyright (C) 2008-2010 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -17,18 +17,8 @@
|
||||||
* along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
* along with Dynare. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// The following ifdef block is the standard way of creating macros which make exporting
|
|
||||||
// from a DLL simpler. All files within this DLL are compiled with the K_ORDER_PERTURBATION_EXPORTS
|
|
||||||
// symbol defined on the command line. this symbol should not be defined on any project
|
|
||||||
// that uses this DLL. This way any other project whose source files include this file see
|
|
||||||
// K_ORDER_PERTURBATION_API functions as being imported from a DLL, wheras this DLL sees symbols
|
|
||||||
// defined with this macro as being exported.
|
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(__CYGWIN32__)
|
#if defined(_WIN32) || defined(__CYGWIN32__)
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
# ifdef _MSC_VER
|
|
||||||
# define K_ORDER_PERTURBATION_API __declspec(dllexport)
|
|
||||||
# endif
|
|
||||||
#else
|
#else
|
||||||
# include <dlfcn.h> // unix/linux DLL (.so) handling routines
|
# include <dlfcn.h> // unix/linux DLL (.so) handling routines
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,10 +34,10 @@
|
||||||
/**************************************************************************************/
|
/**************************************************************************************/
|
||||||
|
|
||||||
KordpDynare::KordpDynare(const char **endo, int num_endo,
|
KordpDynare::KordpDynare(const char **endo, int num_endo,
|
||||||
const char **exo, int nexog, int npar, //const char** par,
|
const char **exo, int nexog, int npar,
|
||||||
Vector *ysteady, TwoDMatrix *vcov, Vector *inParams, int nstat,
|
Vector *ysteady, TwoDMatrix *vcov, Vector *inParams, int nstat,
|
||||||
int npred, int nforw, int nboth, const int jcols, const Vector *nnzd,
|
int npred, int nforw, int nboth, const int jcols, const Vector *nnzd,
|
||||||
const int nsteps, int norder, //const char* modName,
|
const int nsteps, int norder,
|
||||||
Journal &jr, DynamicModelDLL &dynamicDLL, double sstol,
|
Journal &jr, DynamicModelDLL &dynamicDLL, double sstol,
|
||||||
const vector<int> *var_order, const TwoDMatrix *llincidence, double criterium) throw (TLException) :
|
const vector<int> *var_order, const TwoDMatrix *llincidence, double criterium) throw (TLException) :
|
||||||
nStat(nstat), nBoth(nboth), nPred(npred), nForw(nforw), nExog(nexog), nPar(npar),
|
nStat(nstat), nBoth(nboth), nPred(npred), nForw(nforw), nExog(nexog), nPar(npar),
|
||||||
|
@ -58,25 +58,7 @@ KordpDynare::KordpDynare(const char **endo, int num_endo,
|
||||||
FSSparseTensor *t = new FSSparseTensor(iord, nY+nYs+nYss+nExog, nY);
|
FSSparseTensor *t = new FSSparseTensor(iord, nY+nYs+nYss+nExog, nY);
|
||||||
md.insert(t);
|
md.insert(t);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
KordpDynare::KordpDynare(const KordpDynare &dynare) :
|
|
||||||
nStat(dynare.nStat), nBoth(dynare.nBoth), nPred(dynare.nPred),
|
|
||||||
nForw(dynare.nForw), nExog(dynare.nExog), nPar(dynare.nPar),
|
|
||||||
nYs(dynare.nYs), nYss(dynare.nYss), nY(dynare.nY), nJcols(dynare.nJcols),
|
|
||||||
NNZD(dynare.NNZD), nSteps(dynare.nSteps), nOrder(dynare.nOrder),
|
|
||||||
journal(dynare.journal), dynamicDLL(dynare.dynamicDLL),
|
|
||||||
ySteady(NULL), params(NULL), vCov(NULL), md(dynare.md),
|
|
||||||
dnl(NULL), denl(NULL), dsnl(NULL), ss_tol(dynare.ss_tol),
|
|
||||||
varOrder(dynare.varOrder), ll_Incidence(dynare.ll_Incidence),
|
|
||||||
JacobianIndices(dynare.JacobianIndices), qz_criterium(dynare.qz_criterium)
|
|
||||||
{
|
|
||||||
ySteady = new Vector(*(dynare.ySteady));
|
|
||||||
params = new Vector(*(dynare.params));
|
|
||||||
vCov = new TwoDMatrix(*(dynare.vCov));
|
|
||||||
dnl = new DynareNameList(dynare);
|
|
||||||
denl = new DynareExogNameList(dynare);
|
|
||||||
dsnl = new DynareStateNameList(*this, *dnl, *denl);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
KordpDynare::~KordpDynare()
|
KordpDynare::~KordpDynare()
|
||||||
|
@ -103,19 +85,6 @@ KordpDynare::~KordpDynare()
|
||||||
delete NNZD;
|
delete NNZD;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This clears the container of model derivatives and initializes it
|
|
||||||
* inserting empty sparse tensors up to the given order. */
|
|
||||||
ModelDerivativeContainer::ModelDerivativeContainer(const KordpDynare &model,
|
|
||||||
TensorContainer<FSSparseTensor> &mod_ders, int order) : md(mod_ders)
|
|
||||||
{
|
|
||||||
md.clear();
|
|
||||||
for (int iord = 1; iord <= order; iord++)
|
|
||||||
{
|
|
||||||
FSSparseTensor *t = new FSSparseTensor(iord, model.ny()+model.nys()+model.nyss()+model.nexog(), model.ny());
|
|
||||||
md.insert(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
KordpDynare::solveDeterministicSteady()
|
KordpDynare::solveDeterministicSteady()
|
||||||
{
|
{
|
||||||
|
@ -296,26 +265,6 @@ KordpDynare::populateDerivativesContainer(TwoDMatrix *g, int ord, const vector<i
|
||||||
md.insert(mdTi);
|
md.insert(mdTi);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
KordpDynare::writeModelInfo(Journal &jr) const
|
|
||||||
{
|
|
||||||
// write info on variables
|
|
||||||
JournalRecordPair rp(journal);
|
|
||||||
rp << "Information on variables" << endrec;
|
|
||||||
JournalRecord rec1(journal);
|
|
||||||
rec1 << "Number of endogenous: " << ny() << endrec;
|
|
||||||
JournalRecord rec2(journal);
|
|
||||||
rec2 << "Number of exogenous: " << nexog() << endrec;
|
|
||||||
JournalRecord rec3(journal);
|
|
||||||
rec3 << "Number of static: " << nstat() << endrec;
|
|
||||||
JournalRecord rec4(journal);
|
|
||||||
rec4 << "Number of predetermined: " << npred()+nboth() << endrec;
|
|
||||||
JournalRecord rec5(journal);
|
|
||||||
rec5 << "Number of forward looking: " << nforw()+nboth() << endrec;
|
|
||||||
JournalRecord rec6(journal);
|
|
||||||
rec6 << "Number of both: " << nboth() << endrec;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************
|
/*********************************************************
|
||||||
* LLxSteady()
|
* LLxSteady()
|
||||||
* returns ySteady extended with leads and lags suitable for
|
* returns ySteady extended with leads and lags suitable for
|
||||||
|
@ -402,96 +351,6 @@ KordpDynare::ReorderDynareJacobianIndices(const vector<int> *varOrder) throw (TL
|
||||||
return JacobianIndices;
|
return JacobianIndices;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************
|
|
||||||
* Reorder first set of columns of variables in a (jacobian) matrix
|
|
||||||
* according to order given in varsOrder together with the extras
|
|
||||||
* assuming tdx ncols() - nExog is eaqual or less than length of varOrder and
|
|
||||||
* of any of its elements too.
|
|
||||||
************************************/
|
|
||||||
|
|
||||||
void
|
|
||||||
KordpDynare::ReorderCols(TwoDMatrix *tdx, const vector<int> *vOrder) throw (DynareException, TLException)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (tdx->ncols() > vOrder->size())
|
|
||||||
throw DynareException(__FILE__, __LINE__, "Size of order var is too small");
|
|
||||||
|
|
||||||
TwoDMatrix tmp(*tdx); // temporary 2D matrix
|
|
||||||
TwoDMatrix &tmpR = tmp;
|
|
||||||
tdx->zeros(); // empty original matrix
|
|
||||||
// reorder the columns
|
|
||||||
|
|
||||||
for (int i = 0; i < tdx->ncols(); i++)
|
|
||||||
tdx->copyColumn(tmpR, (*vOrder)[i], i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
KordpDynare::ReorderCols(TwoDMatrix *tdx, const int *vOrder) throw (TLException)
|
|
||||||
{
|
|
||||||
|
|
||||||
TwoDMatrix tmp(*tdx); // temporary 2D matrix
|
|
||||||
TwoDMatrix &tmpR = tmp;
|
|
||||||
tdx->zeros(); // empty original matrix
|
|
||||||
// reorder the columns
|
|
||||||
for (int i = 0; i < tdx->ncols(); i++)
|
|
||||||
tdx->copyColumn(tmpR, vOrder[i], i);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* Recursive hierarchical block reordering of the higher order, input model
|
|
||||||
* derivatives inc. Hessian
|
|
||||||
* This is now obsolete but kept in in case it is needed
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
void
|
|
||||||
KordpDynare::ReorderBlocks(TwoDMatrix *tdx, const vector<int> *vOrder) throw (DynareException, TLException)
|
|
||||||
{
|
|
||||||
// determine order of the matrix
|
|
||||||
|
|
||||||
double dbOrder = log((double) tdx->ncols())/log((double) nJcols);
|
|
||||||
int ibOrder = (int) dbOrder;
|
|
||||||
if ((double) ibOrder != dbOrder || ibOrder > nOrder)
|
|
||||||
{
|
|
||||||
ostringstream msg;
|
|
||||||
msg << "Wrong order " << dbOrder;
|
|
||||||
throw DynareException(__FILE__, __LINE__, msg.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
TwoDMatrix tmp(*tdx); // temporary 2D matrix
|
|
||||||
TwoDMatrix &tmpR = tmp;
|
|
||||||
tdx->zeros(); // empty original matrix
|
|
||||||
|
|
||||||
if (ibOrder > 1)
|
|
||||||
{
|
|
||||||
int nBlocks = tmp.ncols()/ nJcols;
|
|
||||||
int bSize = tmp.ncols()/nBlocks;
|
|
||||||
for (int j = 0; j < nBlocks; ++j)
|
|
||||||
{
|
|
||||||
TwoDMatrix subtdx(tmpR, bSize*((*vOrder)[j]), bSize);
|
|
||||||
ReorderBlocks(&subtdx, vOrder);
|
|
||||||
tdx->place(subtdx, 0, bSize*j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (tdx->ncols() > vOrder->size())
|
|
||||||
throw DynareException(__FILE__, __LINE__, "Size of order var is too small");
|
|
||||||
|
|
||||||
// reorder the columns
|
|
||||||
for (int i = 0; i < tdx->ncols(); i++)
|
|
||||||
tdx->copyColumn(tmpR, (*vOrder)[i], i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
KordpVectorFunction::eval(const ConstVector &in, Vector &out) throw (DynareException)
|
|
||||||
{
|
|
||||||
check_for_eval(in, out);
|
|
||||||
Vector xx(d.nexog());
|
|
||||||
xx.zeros();
|
|
||||||
d.evaluateSystem(out, in, xx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************************/
|
/**************************************************************************************/
|
||||||
/* DynareNameList class */
|
/* DynareNameList class */
|
||||||
/**************************************************************************************/
|
/**************************************************************************************/
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2005 Ondra Kamenik
|
* Copyright (C) 2005 Ondra Kamenik
|
||||||
* Copyright (C) 2008-2009 Dynare Team
|
* Copyright (C) 2008-2010 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -110,7 +110,6 @@ class KordpDynare : public DynamicModel
|
||||||
friend class DynareNameList;
|
friend class DynareNameList;
|
||||||
friend class DynareExogNameList;
|
friend class DynareExogNameList;
|
||||||
friend class DynareStateNameList;
|
friend class DynareStateNameList;
|
||||||
friend class KordpDynareJacobian;
|
|
||||||
friend class DynamicModelDLL;
|
friend class DynamicModelDLL;
|
||||||
|
|
||||||
const int nStat;
|
const int nStat;
|
||||||
|
@ -150,8 +149,6 @@ public:
|
||||||
const vector<int> *varOrder, const TwoDMatrix *ll_Incidence,
|
const vector<int> *varOrder, const TwoDMatrix *ll_Incidence,
|
||||||
double qz_criterium) throw (TLException);
|
double qz_criterium) throw (TLException);
|
||||||
|
|
||||||
/** Makes a deep copy of the object. */
|
|
||||||
KordpDynare(const KordpDynare &dyn);
|
|
||||||
virtual ~KordpDynare();
|
virtual ~KordpDynare();
|
||||||
int
|
int
|
||||||
nstat() const
|
nstat() const
|
||||||
|
@ -257,58 +254,11 @@ public:
|
||||||
{
|
{
|
||||||
return new KordpDynare(*this);
|
return new KordpDynare(*this);
|
||||||
}
|
}
|
||||||
void ReorderCols(TwoDMatrix *tdx, const int *varOrder) throw (TLException);
|
|
||||||
void ReorderCols(TwoDMatrix *tdx, const vector<int> *varOrder) throw (DynareException, TLException);
|
|
||||||
Vector *LLxSteady(const Vector &yS) throw (DynareException, TLException); // returns ySteady extended with leads and lags
|
Vector *LLxSteady(const Vector &yS) throw (DynareException, TLException); // returns ySteady extended with leads and lags
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void writeModelInfo(Journal &jr) const;
|
|
||||||
vector<int> *ReorderDynareJacobianIndices(const vector<int> *varOrder) throw (TLException);
|
vector<int> *ReorderDynareJacobianIndices(const vector<int> *varOrder) throw (TLException);
|
||||||
void ReorderBlocks(TwoDMatrix *tdx, const vector<int> *vOrder) throw (DynareException, TLException);
|
|
||||||
void populateDerivativesContainer(TwoDMatrix *g, int ord, const vector<int> *vOrder);
|
void populateDerivativesContainer(TwoDMatrix *g, int ord, const vector<int> *vOrder);
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************
|
|
||||||
* ModelDerivativeContainer manages derivatives container
|
|
||||||
************************************/
|
|
||||||
|
|
||||||
class ModelDerivativeContainer
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
TensorContainer<FSSparseTensor> &md;
|
|
||||||
public:
|
|
||||||
ModelDerivativeContainer(const KordpDynare &model, TensorContainer<FSSparseTensor> &mod_ders,
|
|
||||||
int order);
|
|
||||||
void load(int i, int iord, const int *vars, double res);
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************
|
|
||||||
* K-Order Perturbation instance of VectorFunction:
|
|
||||||
************************************/
|
|
||||||
|
|
||||||
class KordpVectorFunction : public ogu::VectorFunction
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
KordpDynare &d;
|
|
||||||
public:
|
|
||||||
KordpVectorFunction(KordpDynare &dyn) :
|
|
||||||
d(dyn)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
virtual ~KordpVectorFunction()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
int
|
|
||||||
inDim() const
|
|
||||||
{
|
|
||||||
return d.ny();
|
|
||||||
}
|
|
||||||
int
|
|
||||||
outDim() const
|
|
||||||
{
|
|
||||||
return d.ny();
|
|
||||||
}
|
|
||||||
void eval(const ConstVector &in, Vector &out) throw (DynareException);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2008-2009 Dynare Team
|
* Copyright (C) 2008-2010 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -46,38 +46,6 @@
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
|
|
||||||
BOOL APIENTRY
|
|
||||||
DllMain(HANDLE hModule,
|
|
||||||
DWORD ul_reason_for_call,
|
|
||||||
LPVOID lpReserved
|
|
||||||
)
|
|
||||||
{
|
|
||||||
switch (ul_reason_for_call)
|
|
||||||
{
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Some MS Windows preambles
|
|
||||||
// This is an example of an exported variable
|
|
||||||
K_ORDER_PERTURBATION_API int nK_order_perturbation = 0;
|
|
||||||
|
|
||||||
// This is an example of an exported function.
|
|
||||||
K_ORDER_PERTURBATION_API int
|
|
||||||
fnK_order_perturbation(void)
|
|
||||||
{
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _MSC_VER
|
|
||||||
|
|
||||||
#if defined(MATLAB_MEX_FILE) || defined(OCTAVE_MEX_FILE) // exclude mexFunction for other applications
|
#if defined(MATLAB_MEX_FILE) || defined(OCTAVE_MEX_FILE) // exclude mexFunction for other applications
|
||||||
|
|
||||||
const char **
|
const char **
|
||||||
|
@ -235,7 +203,7 @@ extern "C" {
|
||||||
const int widthExog = (int) mxGetN(mxFldp);
|
const int widthExog = (int) mxGetN(mxFldp);
|
||||||
const char **exoNamesMX = DynareMxArrayToString(mxFldp, nexo, widthExog);
|
const char **exoNamesMX = DynareMxArrayToString(mxFldp, nexo, widthExog);
|
||||||
|
|
||||||
if ((nEndo != nendo) || (nExog != nexo)) //(nPar != npar)
|
if ((nEndo != nendo) || (nExog != nexo))
|
||||||
mexErrMsgTxt("Incorrect number of input parameters.");
|
mexErrMsgTxt("Incorrect number of input parameters.");
|
||||||
|
|
||||||
/* Fetch time index */
|
/* Fetch time index */
|
||||||
|
@ -290,14 +258,8 @@ extern "C" {
|
||||||
app.getFoldDecisionRule().writeMMap(mm, string());
|
app.getFoldDecisionRule().writeMMap(mm, string());
|
||||||
|
|
||||||
// get latest ysteady
|
// get latest ysteady
|
||||||
double *dYsteady = (dynare.getSteady().base());
|
|
||||||
ySteady = (Vector *)(&dynare.getSteady());
|
ySteady = (Vector *)(&dynare.getSteady());
|
||||||
|
|
||||||
// developement of the output.
|
|
||||||
double *dgy, *dgu, *ysteady;
|
|
||||||
int nb_row_x;
|
|
||||||
|
|
||||||
ysteady = NULL;
|
|
||||||
if (kOrder == 1)
|
if (kOrder == 1)
|
||||||
{
|
{
|
||||||
/* Set the output pointer to the output matrix ysteady. */
|
/* Set the output pointer to the output matrix ysteady. */
|
||||||
|
|
Loading…
Reference in New Issue