C++ DecisionRules: support models with no static variables

time-shift
Sébastien Villemot 2013-02-07 16:03:11 +01:00
parent fac7319284
commit 6fc94a12d0
1 changed files with 26 additions and 20 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2010-2011 Dynare Team * Copyright (C) 2010-2013 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -95,11 +95,14 @@ DecisionRules::compute(const Matrix &jacobian, Matrix &g_y, Matrix &g_u) throw (
assert(g_u.getRows() == n && g_u.getCols() == p); assert(g_u.getRows() == n && g_u.getCols() == p);
// Construct S, perform QR decomposition and get A = Q*jacobian // Construct S, perform QR decomposition and get A = Q*jacobian
for (size_t i = 0; i < n_static; i++)
mat::col_copy(jacobian, n_back_mixed+zeta_static[i], S, i);
A = MatrixConstView(jacobian, 0, 0, n, n_back_mixed + n + n_fwrd_mixed); A = MatrixConstView(jacobian, 0, 0, n, n_back_mixed + n + n_fwrd_mixed);
QR.computeAndLeftMultByQ(S, "T", A); if (n_static > 0)
{
for (size_t i = 0; i < n_static; i++)
mat::col_copy(jacobian, n_back_mixed+zeta_static[i], S, i);
QR.computeAndLeftMultByQ(S, "T", A);
}
// Construct matrix D // Construct matrix D
D.setAll(0.0); D.setAll(0.0);
@ -166,23 +169,26 @@ DecisionRules::compute(const Matrix &jacobian, Matrix &g_y, Matrix &g_u) throw (
mat::row_copy(g_y_back, i, g_y, zeta_back_mixed[i]); mat::row_copy(g_y_back, i, g_y, zeta_back_mixed[i]);
// Compute DR for static variables w.r. to endogenous // Compute DR for static variables w.r. to endogenous
g_y_static = MatrixView(A, 0, 0, n_static, n_back_mixed); if (n_static > 0)
for (size_t i = 0; i < n_dynamic; i++)
{ {
mat::row_copy(g_y, zeta_dynamic[i], g_y_dynamic, i); g_y_static = MatrixView(A, 0, 0, n_static, n_back_mixed);
mat::col_copy(A, n_back_mixed + zeta_dynamic[i], 0, n_static, A0d, i, 0); for (size_t i = 0; i < n_dynamic; i++)
} {
blas::gemm("N", "N", 1.0, A0d, g_y_dynamic, 1.0, g_y_static); mat::row_copy(g_y, zeta_dynamic[i], g_y_dynamic, i);
blas::gemm("N", "N", 1.0, g_y_fwrd, g_y_back, 0.0, g_y_static_tmp); mat::col_copy(A, n_back_mixed + zeta_dynamic[i], 0, n_static, A0d, i, 0);
blas::gemm("N", "N", 1.0, MatrixView(A, 0, n_back_mixed + n, n_static, n_fwrd_mixed), }
g_y_static_tmp, 1.0, g_y_static); blas::gemm("N", "N", 1.0, A0d, g_y_dynamic, 1.0, g_y_static);
for (size_t i = 0; i < n_static; i++) blas::gemm("N", "N", 1.0, g_y_fwrd, g_y_back, 0.0, g_y_static_tmp);
mat::col_copy(A, n_back_mixed + zeta_static[i], 0, n_static, A0s, i, 0); blas::gemm("N", "N", 1.0, MatrixView(A, 0, n_back_mixed + n, n_static, n_fwrd_mixed),
LU3.invMult("N", A0s, g_y_static); g_y_static_tmp, 1.0, g_y_static);
mat::negate(g_y_static); for (size_t i = 0; i < n_static; i++)
mat::col_copy(A, n_back_mixed + zeta_static[i], 0, n_static, A0s, i, 0);
LU3.invMult("N", A0s, g_y_static);
mat::negate(g_y_static);
for (size_t i = 0; i < n_static; i++) for (size_t i = 0; i < n_static; i++)
mat::row_copy(g_y_static, i, g_y, zeta_static[i]); mat::row_copy(g_y_static, i, g_y, zeta_static[i]);
}
// Compute DR for all endogenous w.r. to shocks // Compute DR for all endogenous w.r. to shocks
blas::gemm("N", "N", 1.0, MatrixConstView(jacobian, 0, n_back_mixed + n, n, n_fwrd_mixed), g_y_fwrd, 0.0, g_u_tmp1); blas::gemm("N", "N", 1.0, MatrixConstView(jacobian, 0, n_back_mixed + n, n, n_fwrd_mixed), g_y_fwrd, 0.0, g_u_tmp1);