/**
* @file tests/boost_graph/graph_partitioning.hpp
* @author The PARADEVS Development Team
* See the AUTHORS or Authors.txt file
*/
/*
* PARADEVS - the multimodeling and simulation environment
* This file is a part of the PARADEVS environment
*
* Copyright (C) 2013 ULCO http://www.univ-litoral.fr
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef __TESTS_BOOST_GRAPH_GRAPH_PARTITIONING_HPP
#define __TESTS_BOOST_GRAPH_GRAPH_PARTITIONING_HPP 1
#include
#include
#include
#include
namespace paradevs { namespace tests { namespace boost_graph {
class PartitioningGraphBuilder
{
public:
PartitioningGraphBuilder(int cn, std::string pmn, int cc, bool ccf) :
cluster_number(cn), partitioning_method_name(pmn),
contraction_coef(cc), contraction_coef_flag(ccf)
{ }
void build(OrientedGraphs& graphs,
InputEdgeList& input_edges,
OutputEdgeList& output_edges,
Connections& parent_connections)
{
UnorientedGraph* g = new UnorientedGraph();
OrientedGraph go;
UnorientedGraph graph_origin;
// internal examples
// {
// build_graph(*g, go);
// boost::copy_graph(*g, graph_origin);
// }
// corsen examples
{
build_corsen_graph(go);
make_unoriented_graph(go, *g);
boost::copy_graph(*g, graph_origin);
}
Edges edge_partie;
Connections connections;
output_edges = OutputEdgeList(cluster_number);
if (contraction_coef_flag) {
graphs = Multiniveau(num_vertices(*g) / contraction_coef,
g, &graph_origin, &go,
cluster_number, "HEM",
partitioning_method_name,
"cut_norm", "norm", edge_partie ,
output_edges, input_edges,
parent_connections);
} else {
graphs = Multiniveau(contraction_coef, g, &graph_origin, &go,
cluster_number, "HEM",
partitioning_method_name,
"cut_norm", "norm", edge_partie ,
output_edges, input_edges,
parent_connections);
}
// std::cout << "*********************************" << std::endl;
// std::cout << "Graphs:" << std::endl;
// for (unsigned int i = 0; i < graphs.size(); ++i) {
// std::cout << "graph[" << i << "]:" << std::endl;
// const OrientedGraph& og = graphs[i];
// OrientedGraph::vertex_iterator it_og, end_og;
// tie(it_og, end_og) = vertices(og);
// for (; it_og != end_og; ++it_og) {
// OrientedGraph::adjacency_iterator neighbour_it, neighbour_end;
// std::cout << og[*it_og]._index << " -> { ";
// tie(neighbour_it, neighbour_end) = adjacent_vertices(*it_og,
// og);
// for (; neighbour_it != neighbour_end; ++neighbour_it) {
// std::cout << og[*neighbour_it]._index << " ";
// }
// std::cout << "}" << std::endl;
// }
// }
// {
// unsigned int i = 0;
// std::cout << "Input edges:" << std::endl;
// for (InputEdgeList::const_iterator it = input_edges.begin();
// it != input_edges.end(); ++it, ++i) {
// std::cout << "S" << i << " = {";
// for (InputEdges::const_iterator it2 = it->begin();
// it2 != it->end(); ++it2) {
// std::cout << " ( " << it2->first << " -> " << it2->second
// << " )";
// }
// std::cout << " }" << std::endl;;
// }
// }
// {
// unsigned int i = 0;
// std::cout << "Output edges:" << std::endl;
// for (OutputEdgeList::const_iterator it = output_edges.begin();
// it != output_edges.end(); ++it, ++i) {
// std::cout << "S" << i << " = {";
// for (OutputEdges::const_iterator it2 = it->begin();
// it2 != it->end(); ++it2) {
// std::cout << " ( " << it2->first << " -> " << it2->second
// << " )";
// }
// std::cout << " }" << std::endl;;
// }
// }
// std::cout << "*********************************" << std::endl;
}
private:
int cluster_number;
std::string partitioning_method_name;
int contraction_coef;
bool contraction_coef_flag;
};
class CorsenFlatGraphBuilder
{
public:
CorsenFlatGraphBuilder()
{ }
void build(OrientedGraphs& graphs, InputEdgeList& /* input_edges */,
OutputEdgeList& /* output_edges */,
Connections& /* parent_connections */)
{
OrientedGraph graph;
build_corsen_graph(graph);
graphs.push_back(graph);
}
};
} } } // namespace paradevs tests boost_graph
#endif