From 18867465818631cddbc0e02843b59b114b0a3acb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Wed, 29 Apr 2020 18:46:15 +0200 Subject: [PATCH] VariableDependencyGraph::reorderRecursiveVariables now returns indices from vertex_index This is for consistency with other graph algorithms. Previously it would return an index from vertex_index1. See also 1d92adacf4a5eb8f95279221e5ba846e0c5141e0 (which this commit basically reverts). Also do some cosmetic changes in calling graph code. --- src/ModelTree.cc | 29 +++++++++++++++-------------- src/VariableDependencyGraph.cc | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/ModelTree.cc b/src/ModelTree.cc index c5fa0363..37ebf56c 100644 --- a/src/ModelTree.cc +++ b/src/ModelTree.cc @@ -754,30 +754,31 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock() auto subG = G.extractSubgraph(eqs_in_simblock[i]); auto feed_back_vertices = subG.minimalSetOfFeedbackVertices(); blocks[prologue+i].mfs_size = feed_back_vertices.size(); - auto reordered_vertices = subG.reorderRecursiveVariables(feed_back_vertices); + auto recursive_vertices = subG.reorderRecursiveVariables(feed_back_vertices); + auto v_index1 = get(boost::vertex_index1, subG); const vector<pair<int, int>> dynamic_order{ make_pair(0, 0), make_pair(1, 0), make_pair(1, 1), make_pair(0, 1) }; // First the recursive equations conditional on feedback variables for (auto max_lag_lead : dynamic_order) - for (int its : reordered_vertices) - if (variable_lag_lead[old_endo_idx_block2orig[its+prologue]] == max_lag_lead) - { - eq_idx_block2orig[ordidx] = old_eq_idx_block2orig[its+prologue]; - endo_idx_block2orig[ordidx] = old_endo_idx_block2orig[its+prologue]; - ordidx++; - } + for (int vtx : recursive_vertices) + if (int simvar = v_index1[vertex(vtx, subG)]; + variable_lag_lead[old_endo_idx_block2orig[simvar+prologue]] == max_lag_lead) + { + eq_idx_block2orig[ordidx] = old_eq_idx_block2orig[simvar+prologue]; + endo_idx_block2orig[ordidx] = old_endo_idx_block2orig[simvar+prologue]; + ordidx++; + } // Then the equations related to the feedback variables - auto v_index1 = get(boost::vertex_index1, subG); for (auto max_lag_lead : dynamic_order) - for (int fbvertex : feed_back_vertices) - if (int idx = v_index1[vertex(fbvertex, subG)]; - variable_lag_lead[old_endo_idx_block2orig[idx+prologue]] == max_lag_lead) + for (int vtx : feed_back_vertices) + if (int simvar = v_index1[vertex(vtx, subG)]; + variable_lag_lead[old_endo_idx_block2orig[simvar+prologue]] == max_lag_lead) { - eq_idx_block2orig[ordidx] = old_eq_idx_block2orig[idx+prologue]; - endo_idx_block2orig[ordidx] = old_endo_idx_block2orig[idx+prologue]; + eq_idx_block2orig[ordidx] = old_eq_idx_block2orig[simvar+prologue]; + endo_idx_block2orig[ordidx] = old_endo_idx_block2orig[simvar+prologue]; ordidx++; } } diff --git a/src/VariableDependencyGraph.cc b/src/VariableDependencyGraph.cc index 8e34be4e..4bd91a27 100644 --- a/src/VariableDependencyGraph.cc +++ b/src/VariableDependencyGraph.cc @@ -318,7 +318,7 @@ VariableDependencyGraph::reorderRecursiveVariables(const set<int> &feedback_vert { vector<int> reordered_vertices; VariableDependencyGraph G(*this); - auto v_index = get(vertex_index1, G); + auto v_index = get(vertex_index, G); // Suppress feedback vertices, in decreasing order for (auto it = feedback_vertices.rbegin(); it != feedback_vertices.rend(); ++it) -- GitLab