2 #ifndef OPENGM_PLANAR_MAXCUT_GRAPH_HXX
3 #define OPENGM_PLANAR_MAXCUT_GRAPH_HXX
14 #include <planarity.src-patched/graph.h>
15 #include <planarity.src-patched/listcoll.h>
16 #include <planarity.src-patched/stack.h>
17 #include <planarity.src-patched/appconst.h>
19 #include <blossom5.src-patched/PerfectMatching.h>
20 #include <blossom5.src-patched/PMimplementation.h>
21 #include <blossom5.src-patched/MinCost/MinCost.h>
57 std::list<Edge*>
edges;
80 std::list<DualEdge*>
adj;
103 else if (v == e->
head)
114 else if (v == e->
head)
123 std::list<Edge*>::iterator it = v->
adj.begin();
124 while( (*it!=e) && (it!=v->
adj.end()) ) ++it;
134 return v->
adj.front();
148 Graph() : nodes(0), edges(0), faces(0), dual_nodes(0), dual_edges(0) {};
174 template<
class VEC>
void read_labels(VEC& sol)
const;
178 std::list<Node*> nodes;
179 std::list<Edge*> edges;
180 std::list<Face*> faces;
182 std::list<DualNode*> dual_nodes;
183 std::list<DualEdge*> dual_edges;
205 Edge* e =
new Edge(tail_, head_, weight_);
209 tail_->
adj.push_back(e);
210 head_->
adj.push_back(e);
220 dual_nodes.push_back(v);
230 dual_edges.push_back(e);
233 tail_->
adj.push_back(e);
234 head_->
adj.push_back(e);
244 for(std::list<Edge*>::iterator it=v1->
adj.begin(); it!=v1->
adj.end(); ++it)
246 if( (*it)->tail==v2 || (*it)->head==v2 )
260 std::cout <<
"Graph with " <<
num_nodes() <<
" nodes and "
264 for(std::list<Node*>::iterator it = nodes.begin(); it != nodes.end(); ++it)
267 std::cout << (*it)->id <<
"\t[weight "<< (*it)->weight <<
";\tlabel "
268 << (*it)->label <<
"]:\t";
271 for(std::list<Edge*>::iterator jt = (*it)->adj.begin(); jt != (*it)->adj.end(); ++jt)
276 std::cout << v->
id <<
" (" << (*jt)->weight <<
"), ";
297 std::vector<Node*> nodes_ptr (
num_nodes());
298 for(std::list<Node*>::iterator it=nodes.begin(); it!=nodes.end(); ++it)
300 nodes_ptr[(*it)->id] = *it;
306 for(std::list<Edge*>::iterator it=edges.begin(); it!=edges.end(); ++it)
308 Node* u = (*it)->tail;
309 Node* v = (*it)->head;
311 gp_AddEdge(g, u->
id, 0, v->
id, 0);
315 if (gp_Embed(g, EMBEDFLAGS_PLANAR) == OK)
318 std::cout <<
"Graph not planar\n";
321 for (
size_t i = 0; i < g->N; ++i)
323 Node* u = nodes_ptr[i];
325 size_t j = g->G[i].link[1];
332 Node* v = nodes_ptr[g->G[j].v];
333 std::list<Edge*>::iterator it = u->
adj.begin();
334 while( (*it)->tail!=v && (*it)->head!=v && it!=u->
adj.end())
349 while(!faces.empty())
356 for(std::list<Edge*>::iterator it=edges.begin(); it!=edges.end(); ++it)
358 (*it)->left_face = NULL;
359 (*it)->right_face = NULL;
363 for(std::list<Edge*>::iterator it=edges.begin(); it!=edges.end(); ++it)
375 f->
edges.push_back(e);
387 f->
edges.push_back(ee);
401 f->
edges.push_back(e);
413 f->
edges.push_back(ee);
421 for(std::list<Edge*>::iterator it=edges.begin(); it!=edges.end(); ++it)
431 std::cout <<
"Genus not equal to zero\n";
450 size_t cnt_dual_nodes = 0;
453 for(std::list<Edge*>::iterator it=edges.begin(); it!=edges.end(); ++it)
462 Face* lf = (*it)->left_face;
471 Face* rf = (*it)->right_face;
498 PerfectMatching::Options options;
499 options.verbose =
false;
500 for(std::list<DualEdge*>::iterator it=dual_edges.begin(); it!=dual_edges.end(); ++it)
508 PM.options = options;
513 for(std::list<DualEdge*>::iterator it=dual_edges.begin(); it!=dual_edges.end(); ++it)
517 if(PM.GetSolution(i)==1)
549 for(std::list<Node*>::iterator it = nodes.begin(); it!=nodes.end(); ++it)
556 Node* u = nodes.front();
568 for(std::list<Edge*>::iterator it = u->
adj.begin(); it!=u->
adj.end(); ++it)
593 for(std::list<Node*>::const_iterator it = nodes.begin(); it!=nodes.end(); ++it){
594 sol[(*it)->id] = (*it)->label;
607 for(std::list<Node*>::iterator it = nodes.begin(); it!=nodes.end(); ++it)
609 sol[(*it)->id] = (*it)->label;
619 #endif // #ifndef OPENGM_PLANAR_MAXCUT_GRAPH_HXX
DualNode * add_dual_node(IDType id_)
DualEdge * add_dual_edge(DualNode *tail_, DualNode *head_, DataType weight_, Edge *original_cross_edge_)
std::vector< int > read_labels()
#define OPENGM_ASSERT(expression)
Edge * original_cross_edge
size_t num_dual_nodes() const
Edge(Node *tail_, Node *head_, DataType weight_)
Edge * get_following_edge(Edge *e, Node *v)
std::list< DualNode * > dual_nodes
Edge * find_edge(Node *v1, Node *v2)
std::list< DualEdge * > adj
Node * add_node(IDType id_, DataType weight_)
Node * get_dest(Node *v, Edge *e)
std::list< Edge * > edges
Edge * add_edge(Node *tail_, Node *head_, DataType weight_)
Node(IDType id_, DataType weight_)
DualEdge(DualNode *tail_, DualNode *head_, DataType weight_, Edge *original_cross_edge_)
size_t num_dual_edges() const