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