diff --git a/src/ModelTree.cc b/src/ModelTree.cc index c5fa0363844db02dee6e46440d1ec991102906d9..37ebf56c2ac3d1adb2f58eda86355aef3172fc33 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 8e34be4e061892bdf66c84ba17f72dd65cc747a9..4bd91a2740f2c450eb3af370ab8348b7167cdc2d 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)