Preprocessor: no longer use boost::graph::GraphvizDigraph class, removed in Boost 1.44 (closes #155)
parent
2e45c8d4b0
commit
d9b9360a81
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2009 Dynare Team
|
||||
* Copyright (C) 2009-2010 Dynare Team
|
||||
*
|
||||
* This file is part of Dynare.
|
||||
*
|
||||
|
@ -135,65 +135,32 @@ namespace MFS
|
|||
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
|
||||
GraphvizDigraph_2_AdjacencyList(GraphvizDigraph &G1, set<int> select_index)
|
||||
extract_subgraph(AdjacencyList_t &G1, set<int> select_index)
|
||||
{
|
||||
unsigned int n = select_index.size();
|
||||
AdjacencyList_t G(n);
|
||||
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<GraphvizDigraph, vertex_index_t>::type v1_index = get(vertex_index, G1);
|
||||
set<int>::iterator it = select_index.begin();
|
||||
property_map<AdjacencyList_t, vertex_index_t>::type v1_index = get(vertex_index, G1);
|
||||
map<int, int> reverse_index;
|
||||
for (unsigned int i = 0; i < n; i++, ++it)
|
||||
{
|
||||
reverse_index[v1_index[*it]] = i;
|
||||
put(v_index, vertex(i, G), v1_index[*it]);
|
||||
put(v_index1, vertex(i, G), i);
|
||||
}
|
||||
set<int>::iterator it;
|
||||
unsigned int i;
|
||||
for (it = select_index.begin(), i = 0; i < n; i++, ++it)
|
||||
{
|
||||
GraphvizDigraph::out_edge_iterator it_out, out_end;
|
||||
GraphvizDigraph::vertex_descriptor vi = vertex(*it, G1);
|
||||
reverse_index[get(v1_index, vertex(*it, G1))] = i;
|
||||
put(v_index, vertex(i, G), get(v1_index, vertex(*it, G1)));
|
||||
put(v_index1, vertex(i, G), i);
|
||||
}
|
||||
for (it = select_index.begin(), i = 0; i < n; i++, ++it)
|
||||
{
|
||||
AdjacencyList_t::out_edge_iterator it_out, out_end;
|
||||
AdjacencyList_t::vertex_descriptor vi = vertex(*it, G1);
|
||||
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())
|
||||
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;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2009 Dynare Team
|
||||
* Copyright (C) 2009-2010 Dynare Team
|
||||
*
|
||||
* This file is part of Dynare.
|
||||
*
|
||||
|
@ -22,7 +22,6 @@
|
|||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <boost/graph/graphviz.hpp>
|
||||
#include <boost/graph/adjacency_list.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
@ -55,14 +54,20 @@ namespace MFS
|
|||
/*! 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);
|
||||
//! Print the Graph
|
||||
void Print(GraphvizDigraph &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)
|
||||
AdjacencyList_t AM_2_AdjacencyList(bool *AMp, unsigned int n);
|
||||
//! Create an adjacency graph from a GraphvizDigraph
|
||||
AdjacencyList_t GraphvizDigraph_2_AdjacencyList(GraphvizDigraph &G1, set<int> select_index);
|
||||
//! Extracts a subgraph
|
||||
/*!
|
||||
\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)
|
||||
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);
|
||||
|
|
|
@ -512,9 +512,13 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
|
|||
{
|
||||
int nb_var = variable_reordered.size();
|
||||
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);
|
||||
|
||||
|
@ -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
|
||||
&& reverse_variable_reordered[it->first.second] >= prologue && reverse_variable_reordered[it->first.second] < nb_var - epilogue
|
||||
&& 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));
|
||||
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
|
||||
int num = strong_components(G2, &endo2block[0]);
|
||||
int num = strong_components(G2, endo2block_map);
|
||||
|
||||
blocks = vector<pair<int, int> >(num, make_pair(0, 0));
|
||||
|
||||
|
@ -543,12 +550,12 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
|
|||
|
||||
for (unsigned int i = 0; i < num_vertices(G2); i++)
|
||||
{
|
||||
GraphvizDigraph::out_edge_iterator it_out, out_end;
|
||||
GraphvizDigraph::vertex_descriptor vi = vertex(i, G2);
|
||||
AdjacencyList_t::out_edge_iterator it_out, out_end;
|
||||
AdjacencyList_t::vertex_descriptor vi = vertex(i, G2);
|
||||
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 s_b = endo2block[source(*it_out, G2)];
|
||||
int t_b = endo2block_map[target(*it_out, G2)];
|
||||
int s_b = endo2block_map[source(*it_out, G2)];
|
||||
if (s_b != t_b)
|
||||
add_edge(s_b, t_b, dag);
|
||||
}
|
||||
|
@ -589,13 +596,13 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
|
|||
|| equation_lag_lead[equation_reordered[i+prologue]].second > 0
|
||||
|| equation_lag_lead[equation_reordered[i+prologue]].first > 0
|
||||
|| mfs == 0)
|
||||
add_edge(i, i, G2);
|
||||
add_edge(vertex(i, G2), vertex(i, G2), G2);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < n; i++)
|
||||
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
|
||||
n_static = vector<unsigned int>(prologue+num+epilogue, 0);
|
||||
|
@ -620,7 +627,7 @@ ModelTree::computeBlockDecompositionAndFeedbackVariablesForEachBlock(const jacob
|
|||
|
||||
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;
|
||||
//Print(G);
|
||||
AdjacencyList_t G1 = Minimal_set_of_feedback_vertex(feed_back_vertices, G);
|
||||
|
|
Loading…
Reference in New Issue