Home | Documentation | Download | Platforms | Projects | Mailing Lists | Version History
Public Types | |
typedef int | side_type |
typedef short int | fix_type |
typedef list< edge > ::const_iterator | cut_edges_iterator |
typedef list< node > ::const_iterator | nodes_of_one_side_iterator |
Public Member Functions | |
ratio_cut_partition () | |
virtual | ~ratio_cut_partition () |
void | set_vars (const graph &G, const node_map< int > &node_weight, const edge_map< int > &edge_weight) |
void | set_vars (const graph &G, const node_map< int > &node_weight, const edge_map< int > &edge_weight, const node source_node, const node target_node) |
void | set_vars (const graph &G, const node_map< int > &node_weight, const edge_map< int > &edge_weight, const node source_node, const node target_node, const node_map< side_type > &init_side) |
void | set_vars (const graph &G, const node_map< int > &node_weight, const edge_map< int > &edge_weight, const node source_node, const node target_node, const node_map< fix_type > &fixed) |
void | set_vars (const graph &G, const node_map< int > &node_weight, const edge_map< int > &edge_weight, const node source_node, const node target_node, const node_map< side_type > &init_side, const node_map< fix_type > &fixed) |
void | store_cut_edges (const bool set) |
void | store_nodesAB (const bool set) |
virtual int | check (graph &G) |
int | run (graph &G) |
int | get_cutsize () |
double | get_cutratio () |
side_type | get_side_of_node (const node &n) const |
side_type | operator[] (const node &n) const |
int | get_weight_on_sideA (const graph &G) const |
int | get_weight_on_sideB (const graph &G) const |
cut_edges_iterator | cut_edges_begin () const |
cut_edges_iterator | cut_edges_end () const |
nodes_of_one_side_iterator | nodes_of_sideA_begin () const |
nodes_of_one_side_iterator | nodes_of_sideA_end () const |
nodes_of_one_side_iterator | nodes_of_sideB_begin () const |
nodes_of_one_side_iterator | nodes_of_sideB_end () const |
virtual void | reset () |
Static Public Attributes | |
static const side_type | A |
static const side_type | B |
static const fix_type | FIXA |
static const fix_type | FIXB |
static const fix_type | UNFIXED |
This class implements a heuristic graph bi-partitioning algorithm using the ratio cut method proposed by Y. C. Wei and C. K. Cheng in 1991.
In the case E is the set of edges of the graph, the algorithm needs O(|E|)
time to proceed.
typedef int ratio_cut_partition::side_type |
Return type of ratio_cut_partition::get_side_of_node.
typedef short int ratio_cut_partition::fix_type |
Fix type of each node (needed with ratio_cut_partition::set_vars).
typedef list<edge>::const_iterator ratio_cut_partition::cut_edges_iterator |
Iterator type for edges which belong to the cut.
typedef list<node>::const_iterator ratio_cut_partition::nodes_of_one_side_iterator |
Iterator type for nodes of a side.
ratio_cut_partition::ratio_cut_partition | ( | ) |
virtual ratio_cut_partition::~ratio_cut_partition | ( | ) | [virtual] |
void ratio_cut_partition::set_vars | ( | const graph & | G, | |
const node_map< int > & | node_weight, | |||
const edge_map< int > & | edge_weight | |||
) |
Sets variables. Must be executed before ratio_cut_partition::check! source_node
and target_node
will be determined automatically.
void ratio_cut_partition::set_vars | ( | const graph & | G, | |
const node_map< int > & | node_weight, | |||
const edge_map< int > & | edge_weight, | |||
const node | source_node, | |||
const node | target_node | |||
) |
Sets variables. Must be executed before ratio_cut_partition::check! In order to get good results, you should take two graph theoretically far away nodes as source and target.
G | undirected graph | |
node_weight | weight of each node | |
edge_weight | weight of each edge | |
source_node | start-node, remains on side A | |
target_node | end-node, remains on side B |
void ratio_cut_partition::set_vars | ( | const graph & | G, | |
const node_map< int > & | node_weight, | |||
const edge_map< int > & | edge_weight, | |||
const node | source_node, | |||
const node | target_node, | |||
const node_map< side_type > & | init_side | |||
) |
Sets variables. Must be executed before ratio_cut_partition::check! In order to get good results, you should take two graph theoretically far away nodes as source and target. Additionally init_side
should nearly be in balance. source_node
must be on side A
in init_side
and target_node
on side B
respectively.
G | undirected graph | |
node_weight | weight of each node | |
edge_weight | weight of each edge | |
source_node | start-node, remains on side A | |
target_node | end-node, remains on side B | |
init_side | initial bi-partitioning |
void ratio_cut_partition::set_vars | ( | const graph & | G, | |
const node_map< int > & | node_weight, | |||
const edge_map< int > & | edge_weight, | |||
const node | source_node, | |||
const node | target_node, | |||
const node_map< fix_type > & | fixed | |||
) |
Sets variables. Must be executed before ratio_cut_partition::check! In order to get good results, you should take two graph theoretically far away nodes as source and target. source_node
must not be fixed on side B
. target_node
must not be fixed on side A
.
G | undirected graph | |
node_weight | weight of each node | |
edge_weight | weight of each edge | |
source_node | start-node, remains on side A | |
target_node | end-node, remains on side B | |
fixed | fixed nodes |
void ratio_cut_partition::set_vars | ( | const graph & | G, | |
const node_map< int > & | node_weight, | |||
const edge_map< int > & | edge_weight, | |||
const node | source_node, | |||
const node | target_node, | |||
const node_map< side_type > & | init_side, | |||
const node_map< fix_type > & | fixed | |||
) |
Sets variables. Must be executed before ratio_cut_partition::check! In order to get good results, you should take two graph theoretically far away nodes as source and target. Additionally init_side
should nearly be in balance. Fixed nodes are on their fix side, their initial side is overwritten then. source_node
must be on side A in init_side
and target_node
on side B respectively. source_node
must not be fixed on side B
. target_node
must not be fixed on side A
.
G | undirected graph | |
node_weight | weight of each node | |
edge_weight | weight of each edge | |
source_node | start-node, remains on side A | |
target_node | end-node, remains on side B | |
init_side | initial bi-partitioning | |
fixed | fixed nodes |
void ratio_cut_partition::store_cut_edges | ( | const bool | set | ) |
Enables the storing of cut-edges. If enabled the list of cut-edges can be traversed using ratio_cut_partition::cut_edges_iterator.
set | if true cut_edges will be stored |
void ratio_cut_partition::store_nodesAB | ( | const bool | set | ) |
Enables the storing of nodes on their side. If enabled the nodes of each side can be traversed using ratio_cut_partition::nodes_of_one_side_iterator.
set | if true nodes on their side will be stored |
virtual int ratio_cut_partition::check | ( | graph & | G | ) | [virtual] |
Checks whether following preconditions are satisfied:
G
is undirected. source_node
and target_node
are 2 distinct nodes with node weights > 0. G
has more than 2 nodes, then at least two of them have a weight > 0. fixed[source_node]
is FIXA
. fixed[target_node]
is FIXB
.
G | graph |
algorithm::GTL_OK
on success, algorithm::GTL_ERROR
otherwise Implements algorithm.
int ratio_cut_partition::run | ( | graph & | G | ) | [virtual] |
Computes a partitioning of G
, that means a division of its vertices in two sides ratio_cut_partition::A
and ratio_cut_partition::B
.
G | graph |
algorithm::GTL_OK
on success, algorithm::GTL_ERROR
otherwise Implements algorithm.
int ratio_cut_partition::get_cutsize | ( | ) |
Gets the size of the cut after bi-partitioning.
double ratio_cut_partition::get_cutratio | ( | ) |
Gets the ratio of the cut after bi-partitioning as defined in [WeiChe91].
Gets side of the node after bi-partitioning.
ratio_cut_partition::A
if n
lies on side A
, ratio_cut_partition::B
otherwise Gets side of the node after bi-partitioning.
ratio_cut_partition::A
if n
lies on side A
, ratio_cut_partition::B
otherwise int ratio_cut_partition::get_weight_on_sideA | ( | const graph & | G | ) | const |
int ratio_cut_partition::get_weight_on_sideB | ( | const graph & | G | ) | const |
cut_edges_iterator ratio_cut_partition::cut_edges_begin | ( | ) | const |
Iterate through all edges which belong to the cut, that means all edges with end-nodes on different sides. It is only valid if enabled with ratio_cut_partition::store_cut_edges before.
cut_edges_iterator ratio_cut_partition::cut_edges_end | ( | ) | const |
End-Iterator for iteration through all edges which belong to the cut. It is only valid if enabled with ratio_cut_partition::store_cut_edges before.
nodes_of_one_side_iterator ratio_cut_partition::nodes_of_sideA_begin | ( | ) | const |
Iterate through all nodes which belong to side A
, It is only valid if enabled with ratio_cut_partition::store_nodesAB before.
A
nodes_of_one_side_iterator ratio_cut_partition::nodes_of_sideA_end | ( | ) | const |
End-Iterator for iteration through all nodes which belong to side A
, It is only valid if enabled with ratio_cut_partition::store_nodesAB before.
A
nodes_of_one_side_iterator ratio_cut_partition::nodes_of_sideB_begin | ( | ) | const |
Iterate through all nodes which belong to side B
, It is only valid if enabled with ratio_cut_partition::store_nodesAB before.
B
nodes_of_one_side_iterator ratio_cut_partition::nodes_of_sideB_end | ( | ) | const |
End-Iterator for iteration through all nodes which belong to side B
, It is only valid if enabled with ratio_cut_partition::store_nodesAB before.
B
virtual void ratio_cut_partition::reset | ( | ) | [virtual] |
Resets ratio_cut_partition, i.e. prepares the algorithm to be applied to another graph.
Implements algorithm.
const side_type ratio_cut_partition::A [static] |
const side_type ratio_cut_partition::B [static] |
const fix_type ratio_cut_partition::FIXA [static] |
const fix_type ratio_cut_partition::FIXB [static] |
const fix_type ratio_cut_partition::UNFIXED [static] |
University of Passau - FMI - Theoretical Computer Science