Commit d9b9360a authored by Sébastien Villemot's avatar Sébastien Villemot

Preprocessor: no longer use boost::graph::GraphvizDigraph class, removed in...

Preprocessor: no longer use boost::graph::GraphvizDigraph class, removed in Boost 1.44 (closes #155)
parent 2e45c8d4
/* /*
* Copyright (C) 2009 Dynare Team * Copyright (C) 2009-2010 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
...@@ -135,65 +135,32 @@ namespace MFS ...@@ -135,65 +135,32 @@ namespace MFS
return G; return G;
} }
void
Print(GraphvizDigraph &G)
{
GraphvizDigraph::vertex_iterator it, it_end;
property_map<GraphvizDigraph, vertex_index_t>::type v_index = get(vertex_index, G);
cout << "Graph\n";
cout << "-----\n";
for (tie(it, it_end) = vertices(G); it != it_end; ++it)
{
cout << "vertex[" << v_index[*it] + 1 << "] ->";
GraphvizDigraph::out_edge_iterator it_out, out_end;
for (tie(it_out, out_end) = out_edges(*it, G); it_out != out_end; ++it_out)
cout << v_index[target(*it_out, G)] + 1 << " ";
cout << "\n";
}
}
GraphvizDigraph
AM_2_GraphvizDigraph(bool *AM, unsigned int n)
{
GraphvizDigraph G(n);
property_map<GraphvizDigraph, vertex_index_t>::type v_index = get(vertex_index, G);
/*for (unsigned int i = 0;i < n;i++)
cout << "v_index[" << i << "] = " << v_index[i] << "\n";*/
//put(v_index, vertex(i, G), i);
//v_index[/*vertex(i,G)*/i]["v_index"]=i;
for (unsigned int i = 0; i < n; i++)
for (unsigned int j = 0; j < n; j++)
if (AM[i*n+j])
add_edge(vertex(j, G), vertex(i, G), G);
return G;
}
AdjacencyList_t AdjacencyList_t
GraphvizDigraph_2_AdjacencyList(GraphvizDigraph &G1, set<int> select_index) extract_subgraph(AdjacencyList_t &G1, set<int> select_index)
{ {
unsigned int n = select_index.size(); unsigned int n = select_index.size();
AdjacencyList_t G(n); AdjacencyList_t G(n);
property_map<AdjacencyList_t, vertex_index_t>::type v_index = get(vertex_index, G); property_map<AdjacencyList_t, vertex_index_t>::type v_index = get(vertex_index, G);
property_map<AdjacencyList_t, vertex_index1_t>::type v_index1 = get(vertex_index1, G); property_map<AdjacencyList_t, vertex_index1_t>::type v_index1 = get(vertex_index1, G);
property_map<GraphvizDigraph, vertex_index_t>::type v1_index = get(vertex_index, G1); property_map<AdjacencyList_t, vertex_index_t>::type v1_index = get(vertex_index, G1);
set<int>::iterator it = select_index.begin();
map<int, int> reverse_index; map<int, int> reverse_index;
for (unsigned int i = 0; i < n; i++, ++it) set<int>::iterator it;
unsigned int i;
for (it = select_index.begin(), i = 0; i < n; i++, ++it)
{ {
reverse_index[v1_index[*it]] = i; reverse_index[get(v1_index, vertex(*it, G1))] = i;
put(v_index, vertex(i, G), v1_index[*it]); put(v_index, vertex(i, G), get(v1_index, vertex(*it, G1)));
put(v_index1, vertex(i, G), i); put(v_index1, vertex(i, G), i);
} }
unsigned int i;
for (it = select_index.begin(), i = 0; i < n; i++, ++it) for (it = select_index.begin(), i = 0; i < n; i++, ++it)
{ {
GraphvizDigraph::out_edge_iterator it_out, out_end; AdjacencyList_t::out_edge_iterator it_out, out_end;
GraphvizDigraph::vertex_descriptor vi = vertex(*it, G1); AdjacencyList_t::vertex_descriptor vi = vertex(*it, G1);
for (tie(it_out, out_end) = out_edges(vi, G1); it_out != out_end; ++it_out) for (tie(it_out, out_end) = out_edges(vi, G1); it_out != out_end; ++it_out)
{ {
int ii = target(*it_out, G1); int ii = v1_index[target(*it_out, G1)];
if (select_index.find(ii) != select_index.end()) if (select_index.find(ii) != select_index.end())
add_edge(vertex(reverse_index[source(*it_out, G1)], G), vertex(reverse_index[target(*it_out, G1)], G), G); add_edge(vertex(reverse_index[get(v1_index, source(*it_out, G1))], G), vertex(reverse_index[get(v1_index, target(*it_out, G1))], G), G);
} }
} }
return G; return G;
......
/* /*
* Copyright (C) 2009 Dynare Team * Copyright (C) 2009-2010 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#include <map> #include <map>
#include <vector> #include <vector>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/adjacency_list.hpp> #include <boost/graph/adjacency_list.hpp>
using namespace std; using namespace std;
...@@ -55,14 +54,20 @@ namespace MFS ...@@ -55,14 +54,20 @@ namespace MFS
/*! We have to suppress this vertex and store it into the feedback set.*/ /*! We have to suppress this vertex and store it into the feedback set.*/
bool Suppression_of_Vertex_X_if_it_loops_store_in_set_of_feedback_vertex_Step(set<int> &feed_back_vertices, AdjacencyList_t &G1); bool Suppression_of_Vertex_X_if_it_loops_store_in_set_of_feedback_vertex_Step(set<int> &feed_back_vertices, AdjacencyList_t &G1);
//! Print the Graph //! Print the Graph
void Print(GraphvizDigraph &G);
void Print(AdjacencyList_t &G); void Print(AdjacencyList_t &G);
//! Create a GraphvizDigraph from a Adjacency Matrix (an incidence Matrix without the diagonal terms)
GraphvizDigraph AM_2_GraphvizDigraph(bool *AM, unsigned int n);
//! Create an adjacency graph from a Adjacency Matrix (an incidence Matrix without the diagonal terms) //! Create an adjacency graph from a Adjacency Matrix (an incidence Matrix without the diagonal terms)
AdjacencyList_t AM_2_AdjacencyList(bool *AMp, unsigned int n); AdjacencyList_t AM_2_AdjacencyList(bool *AMp, unsigned int n);
//! Create an adjacency graph from a GraphvizDigraph //! Extracts a subgraph
AdjacencyList_t GraphvizDigraph_2_AdjacencyList(GraphvizDigraph &G1, set<int> select_index); /*!
\param[in] G1 The original graph
\param[in] select_index The vertex indices to select
\return The subgraph
The property vertex_index of the subgraph contains indices of the original
graph, the property vertex_index1 contains new contiguous indices specific
to the subgraph.
*/
AdjacencyList_t extract_subgraph(AdjacencyList_t &G1, set<int> select_index);
//! Check if the graph contains any cycle (true if the model contains at least one cycle, false otherwise) //! Check if the graph contains any cycle (true if the model contains at least one cycle, false otherwise)
bool has_cycle(vector<int> &circuit_stack, AdjacencyList_t &g); bool has_cycle(vector<int> &circuit_stack, AdjacencyList_t &g);
bool has_cycle_dfs(AdjacencyList_t &g, AdjacencyList_t::vertex_descriptor u, color_t &color, vector<int> &circuit_stack); bool has_cycle_dfs(AdjacencyList_t &g, AdjacencyList_t::vertex_descriptor u, color_t &color, vector<int> &circuit_stack);
......
...@@ -512,9 +512,13 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob ...@@ -512,9 +512,13 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
{ {
int nb_var = variable_reordered.size(); int nb_var = variable_reordered.size();
int n = nb_var - prologue - epilogue; int n = nb_var - prologue - epilogue;
typedef adjacency_list<vecS, vecS, directedS> DirectedGraph;
GraphvizDigraph G2(n); AdjacencyList_t G2(n);
// It is necessary to manually initialize vertex_index property since this graph uses listS and not vecS as underlying vertex container
property_map<AdjacencyList_t, vertex_index_t>::type v_index = get(vertex_index, G2);
for (int i = 0; i < n; i++)
put(v_index, vertex(i, G2), i);
vector<int> reverse_equation_reordered(nb_var), reverse_variable_reordered(nb_var); vector<int> reverse_equation_reordered(nb_var), reverse_variable_reordered(nb_var);
...@@ -528,12 +532,15 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob ...@@ -528,12 +532,15 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
if (reverse_equation_reordered[it->first.first] >= prologue && reverse_equation_reordered[it->first.first] < nb_var - epilogue if (reverse_equation_reordered[it->first.first] >= prologue && reverse_equation_reordered[it->first.first] < nb_var - epilogue
&& reverse_variable_reordered[it->first.second] >= prologue && reverse_variable_reordered[it->first.second] < nb_var - epilogue && reverse_variable_reordered[it->first.second] >= prologue && reverse_variable_reordered[it->first.second] < nb_var - epilogue
&& it->first.first != endo2eq[it->first.second]) && it->first.first != endo2eq[it->first.second])
add_edge(reverse_equation_reordered[endo2eq[it->first.second]]-prologue, reverse_equation_reordered[it->first.first]-prologue, G2); add_edge(vertex(reverse_equation_reordered[endo2eq[it->first.second]]-prologue, G2),
vertex(reverse_equation_reordered[it->first.first]-prologue, G2),
G2);
vector<int> endo2block(num_vertices(G2)), discover_time(num_vertices(G2)); vector<int> endo2block(num_vertices(G2)), discover_time(num_vertices(G2));
iterator_property_map<int*, property_map<AdjacencyList_t, vertex_index_t>::type, int, int&> endo2block_map(&endo2block[0], get(vertex_index, G2));
// Compute strongly connected components // Compute strongly connected components
int num = strong_components(G2, &endo2block[0]); int num = strong_components(G2, endo2block_map);
blocks = vector<pair<int, int> >(num, make_pair(0, 0)); blocks = vector<pair<int, int> >(num, make_pair(0, 0));
...@@ -543,12 +550,12 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob ...@@ -543,12 +550,12 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
for (unsigned int i = 0; i < num_vertices(G2); i++) for (unsigned int i = 0; i < num_vertices(G2); i++)
{ {
GraphvizDigraph::out_edge_iterator it_out, out_end; AdjacencyList_t::out_edge_iterator it_out, out_end;
GraphvizDigraph::vertex_descriptor vi = vertex(i, G2); AdjacencyList_t::vertex_descriptor vi = vertex(i, G2);
for (tie(it_out, out_end) = out_edges(vi, G2); it_out != out_end; ++it_out) for (tie(it_out, out_end) = out_edges(vi, G2); it_out != out_end; ++it_out)
{ {
int t_b = endo2block[target(*it_out, G2)]; int t_b = endo2block_map[target(*it_out, G2)];
int s_b = endo2block[source(*it_out, G2)]; int s_b = endo2block_map[source(*it_out, G2)];
if (s_b != t_b) if (s_b != t_b)
add_edge(s_b, t_b, dag); add_edge(s_b, t_b, dag);
} }
...@@ -589,13 +596,13 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob ...@@ -589,13 +596,13 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
|| equation_lag_lead[equation_reordered[i+prologue]].second > 0 || equation_lag_lead[equation_reordered[i+prologue]].second > 0
|| equation_lag_lead[equation_reordered[i+prologue]].first > 0 || equation_lag_lead[equation_reordered[i+prologue]].first > 0
|| mfs == 0) || mfs == 0)
add_edge(i, i, G2); add_edge(vertex(i, G2), vertex(i, G2), G2);
} }
else else
{ {
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)
if (Equation_Type[equation_reordered[i+prologue]].first == E_SOLVE || mfs == 0) if (Equation_Type[equation_reordered[i+prologue]].first == E_SOLVE || mfs == 0)
add_edge(i, i, G2); add_edge(vertex(i, G2), vertex(i, G2), G2);
} }
//Determines the dynamic structure of each equation //Determines the dynamic structure of each equation
n_static = vector<unsigned int>(prologue+num+epilogue, 0); n_static = vector<unsigned int>(prologue+num+epilogue, 0);
...@@ -620,7 +627,7 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob ...@@ -620,7 +627,7 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
for (int i = 0; i < num; i++) for (int i = 0; i < num; i++)
{ {
AdjacencyList_t G = GraphvizDigraph_2_AdjacencyList(G2, components_set[i].first); AdjacencyList_t G = extract_subgraph(G2, components_set[i].first);
set<int> feed_back_vertices; set<int> feed_back_vertices;
//Print(G); //Print(G);
AdjacencyList_t G1 = Minimal_set_of_feedback_vertex(feed_back_vertices, G); AdjacencyList_t G1 = Minimal_set_of_feedback_vertex(feed_back_vertices, G);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment