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> 55 Face() : edges(0), dual_nodes(0) {};
57 std::list<Edge*> edges;
63 Edge(
Node* tail_,
Node* head_, DataType weight_) : tail(tail_), head(head_),
weight(weight_), left_face(NULL), right_face(NULL), in_cut(false) {};
80 std::list<DualEdge*>
adj;
86 tail(tail_), head(head_),
weight(weight_), original_cross_edge(original_cross_edge_), in_matching(false) {};
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) {};
159 Node* add_node(IDType id_, DataType weight_);
160 Edge* add_edge(
Node* tail_,
Node* head_, DataType weight_);
162 DualNode* add_dual_node(IDType id_);
169 void construct_dual();
172 void assign_labels();
174 template<
class VEC>
void read_labels(VEC& sol)
const;
175 std::vector<int> read_labels();
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 " 261 << num_edges() <<
" edges. It has " << num_faces() <<
" faces.\n";
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;
305 gp_InitGraph(g, num_nodes());
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)
428 std::cout<<num_nodes()<<
" "<<num_edges()<<
" "<<num_faces()<<std::endl;
430 if(num_nodes()-num_edges()+num_faces() != 2)
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)
456 DualNode* u = add_dual_node(cnt_dual_nodes);
457 DualNode* v = add_dual_node(cnt_dual_nodes + 1);
462 Face* lf = (*it)->left_face;
465 add_dual_edge(u, *jt, 0.0, NULL);
471 Face* rf = (*it)->right_face;
474 add_dual_edge(v, *jt, 0.0, NULL);
479 add_dual_edge(u, v, (-1.)*(*it)->weight, *it);
497 PerfectMatching PM(num_dual_nodes(), num_dual_edges());
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)
591 if(sol.size()<num_nodes())
592 sol.resize(num_nodes(), -1);
593 for(std::list<Node*>::const_iterator it = nodes.begin(); it!=nodes.end(); ++it){
594 sol[(*it)->id] = (*it)->label;
605 std::vector<int> sol(num_nodes(), -1);
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
Edge * get_following_edge(Edge *e, Node *v)
std::list< DualNode * > dual_nodes
Edge * find_edge(Node *v1, Node *v2)
std::list< DualEdge * > adj
size_t num_dual_nodes() const
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_)
size_t num_dual_edges() const
DualEdge(DualNode *tail_, DualNode *head_, DataType weight_, Edge *original_cross_edge_)