From ced586febf5775297f19adc75303d73840a9e574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= Date: Mon, 6 Dec 2021 12:53:35 +0100 Subject: [PATCH] Symbolic detrending engine: correctly handle equations marked [static] Incidentally, this also fixes a detrending bug in the Occbin engine (since the latter internally generates a [static] equation). Ref. dynare#1827 By the way, perform a small code simplification. (cherry picked from commit 7b8fc8edb79376678f2bb2722ece237ce244b329) --- src/DynamicModel.cc | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 0b7cc063..2c034b55 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -5888,18 +5888,28 @@ DynamicModel::detrendEquations() // We go backwards in the list of trend_vars, to deal correctly with I(2) processes for (auto it = nonstationary_symbols_map.crbegin(); it != nonstationary_symbols_map.crend(); ++it) - for (auto &equation : equations) - { - auto substeq = dynamic_cast(equation->detrend(it->first, it->second.first, it->second.second)); - assert(substeq); - equation = dynamic_cast(substeq); - } + { + for (auto &equation : equations) + { + equation = dynamic_cast(equation->detrend(it->first, it->second.first, it->second.second)); + assert(equation); + } + for (auto &equation : static_only_equations) + { + equation = dynamic_cast(equation->detrend(it->first, it->second.first, it->second.second)); + assert(equation); + } + } for (auto &equation : equations) { - auto substeq = dynamic_cast(equation->removeTrendLeadLag(trend_symbols_map)); - assert(substeq); - equation = dynamic_cast(substeq); + equation = dynamic_cast(equation->removeTrendLeadLag(trend_symbols_map)); + assert(equation); + } + for (auto &equation : static_only_equations) + { + equation = dynamic_cast(equation->removeTrendLeadLag(trend_symbols_map)); + assert(equation); } } @@ -5908,9 +5918,13 @@ DynamicModel::removeTrendVariableFromEquations() { for (auto &equation : equations) { - auto substeq = dynamic_cast(equation->replaceTrendVar()); - assert(substeq); - equation = dynamic_cast(substeq); + equation = dynamic_cast(equation->replaceTrendVar()); + assert(equation); + } + for (auto &equation : static_only_equations) + { + equation = dynamic_cast(equation->replaceTrendVar()); + assert(equation); } }