File: CanonicalOrder.cpp

package info (click to toggle)
tulip 3.7.0dfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 39,428 kB
  • sloc: cpp: 231,403; php: 11,023; python: 1,128; sh: 671; yacc: 522; makefile: 315; xml: 63; lex: 55
file content (93 lines) | stat: -rwxr-xr-x 2,858 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/**
 *
 * This file is part of Tulip (www.tulip-software.org)
 *
 * Authors: David Auber and the Tulip development Team
 * from LaBRI, University of Bordeaux 1 and Inria Bordeaux - Sud Ouest
 *
 * Tulip is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation, either version 3
 * of the License, or (at your option) any later version.
 *
 * Tulip 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.
 *
 */
#include <tulip/SuperGraph.h>
#include <tulip/MapIterator.h>
#include <tulip/TlpTools.h>

using namespace std;

//==========================================================================
namespace {
bool haveChoords(SuperGraph *graph, const node n, const set<node> &outerface) {
  assert(graph->isElement(n));
  Iterator<node> *it = graph->getInOutNodes(n);
  unsigned int count =0;

  while (count < 3 && it->hasNext()) {
    if (outerface.find(it->next())!=outerface.end())
      ++count;
  }

  delete it;
  return count > 2;
}
}
//==========================================================================
namespace tlp {
void canonicalOrdering(SuperGraph *graph, vector<node> &order) {
  //input embed graph planar maximum
  unsigned int nbNodes = graph->numberOfNodes();
  order.resize(nbNodes);
  //choose V0,V1, Vn-1
  edge e = graph->getOneEdge();
  order[0] = graph->source(e);
  order[1] = graph->target(e);
  edge e2 = tlp::nextFaceEdge(graph, e, order[1]);
  order[nbNodes-1] = graph->opposite(e2, order[1]);
  SuperGraph *subgraph = graph->addCloneSubGraph();
  cerr << subgraph->numberOfNodes() << "," << subgraph->numberOfEdges() << endl;
  //  cerr << subgraph << endl;
  set<node> candidates;
  candidates.insert(order[nbNodes -1]);
  candidates.insert(order[0]);
  candidates.insert(order[1]);
  unsigned int k = nbNodes - 1;

  while (k>2) {
    set<node>::iterator it = candidates.begin();

    for (; it!=candidates.end(); ++it) {
      if (*it!=order[0] && *it!= order[1] && !haveChoords(subgraph, *it, candidates)) {
        order[k] = *it;
        --k;
        Iterator<node> *itN = subgraph->getInOutNodes(*it);

        while (itN->hasNext()) {
          node n = itN->next();

          if ( n!=order[0] && n!=order[1] )
            candidates.insert(n);
        }

        delete itN;
        subgraph->delNode(*it);
        candidates.erase(it);
        break;
      }
    }
  }

  subgraph->delNode(order[0]);
  subgraph->delNode(order[1]);
  assert(subgraph->numberOfNodes()==1);
  order[2] = subgraph->getOneNode();
  graph->delSubGraph(subgraph);
}
}
//==========================================================================