k-order DLL: convert model derivatives from Dynare to Dynare++ format at an arbitrary order
Ref #217time-shift
parent
03ac8c8182
commit
d7dd7214c7
|
@ -116,48 +116,28 @@ KordpDynare::populateDerivativesContainer(int ord)
|
||||||
}
|
}
|
||||||
s[0]++;
|
s[0]++;
|
||||||
}
|
}
|
||||||
else if (ord == 2)
|
else // ord ≥ 2
|
||||||
{
|
for (int i = 0; i < g.nrows(); i++)
|
||||||
for (int i = 0; i < g.nrows(); i++)
|
{
|
||||||
{
|
int j = static_cast<int>(g.get(i, 0))-1;
|
||||||
int j = static_cast<int>(g.get(i, 0))-1; // hessian indices start with 1
|
int i1 = static_cast<int>(g.get(i, 1))-1;
|
||||||
int i1 = static_cast<int>(g.get(i, 1))-1;
|
if (j < 0 || i1 < 0)
|
||||||
if (j < 0 || i1 < 0)
|
continue; // Discard empty entries (see comment in DynamicModelAC::unpackSparseMatrix())
|
||||||
continue; // Discard empty entries (see comment in DynamicModelAC::unpackSparseMatrix())
|
|
||||||
int s0 = i1 / nJcols;
|
for (int k = 0; k < ord; k++)
|
||||||
int s1 = i1 % nJcols;
|
{
|
||||||
s[0] = dynToDynpp[s0];
|
s[k] = dynToDynpp[i1 % nJcols];
|
||||||
s[1] = dynToDynpp[s1];
|
i1 /= nJcols;
|
||||||
if (s[1] >= s[0])
|
}
|
||||||
{
|
|
||||||
double x = g.get(i, 2);
|
if ((ord == 2 || ord == 3) && !s.isSorted())
|
||||||
mdTi->insert(s, j, x);
|
continue; // Skip symmetric elements (only needed at order 2 and 3)
|
||||||
}
|
else if (ord > 3)
|
||||||
}
|
s.sort(); // For higher order, canonicalize the multi-index
|
||||||
}
|
|
||||||
else if (ord == 3)
|
double x = g.get(i, 2);
|
||||||
{
|
mdTi->insert(s, j, x);
|
||||||
int nJcols2 = nJcols*nJcols;
|
}
|
||||||
for (int i = 0; i < g.nrows(); i++)
|
|
||||||
{
|
|
||||||
int j = static_cast<int>(g.get(i, 0))-1;
|
|
||||||
int i1 = static_cast<int>(g.get(i, 1))-1;
|
|
||||||
if (j < 0 || i1 < 0)
|
|
||||||
continue; // Discard empty entries (see comment in DynamicModelAC::unpackSparseMatrix())
|
|
||||||
int s0 = i1 / nJcols2;
|
|
||||||
int i2 = i1 % nJcols2;
|
|
||||||
int s1 = i2 / nJcols;
|
|
||||||
int s2 = i2 % nJcols;
|
|
||||||
s[0] = dynToDynpp[s0];
|
|
||||||
s[1] = dynToDynpp[s1];
|
|
||||||
s[2] = dynToDynpp[s2];
|
|
||||||
if (s.isSorted())
|
|
||||||
{
|
|
||||||
double x = g.get(i, 2);
|
|
||||||
mdTi->insert(s, j, x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
md.insert(std::move(mdTi));
|
md.insert(std::move(mdTi));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue