File: StrongComponent.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 (126 lines) | stat: -rwxr-xr-x 3,421 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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
 *
 * 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 <cmath>
#include "StrongComponent.h"
#include <tulip/DoubleProperty.h>

DOUBLEPLUGINOFGROUP(StrongComponent,"Strongly Connected Component","David Auber","12/06/2001","Alpha","1.0","Component");

using namespace std;
using namespace tlp;

int StrongComponent::attachNumerotation(tlp::node n,
                                        TLP_HASH_MAP<tlp::node,bool> &visited,
                                        TLP_HASH_MAP<tlp::node,bool> &finished,
                                        TLP_HASH_MAP<tlp::node,int> &minAttach,
                                        int &id,
                                        std::stack<tlp::node> &renum,
                                        int &curComponent
                                       ) {
  if (visited[n]) return minAttach[n];

  visited[n]=true;
  int myId=id;
  id++;
  minAttach[n]=myId;
  renum.push(n);
  int result=myId;
  Iterator<node> *itN=graph->getOutNodes(n);

  for (; itN->hasNext();) {
    node tmpN=itN->next();

    if (!finished[tmpN]) {
      int tmp=attachNumerotation(tmpN,visited,finished,minAttach,id,renum,curComponent);

      if (result>tmp) result=tmp;
    }
  }

  delete itN;
  minAttach[n]=result;

  if (result==myId) {
    while (renum.top()!=n) {
      node tmp=renum.top();
      renum.pop();
      finished[tmp]=true;
      minAttach[tmp]=result;
      doubleResult->setNodeValue(tmp,curComponent);
    }

    finished[n]=true;
    doubleResult->setNodeValue(n,curComponent);
    curComponent++;
    renum.pop();
  }

  return result;
}

StrongComponent::StrongComponent(const tlp::PropertyContext &context):DoubleAlgorithm(context) {}

StrongComponent::~StrongComponent() {}

bool StrongComponent::run() {
  TLP_HASH_MAP<node,bool> visited(graph->numberOfNodes());
  TLP_HASH_MAP<node,bool> finished(graph->numberOfNodes());
  stack<node> renum;
  TLP_HASH_MAP<node,int> cachedValues(graph->numberOfNodes());
  int id=1;
  int curComponent=0;
  Iterator<node> *itN=graph->getNodes();

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

    if (!visited[itn]) {
      attachNumerotation(itn,visited,finished,cachedValues,id,renum,curComponent);
    }
  }

  delete itN;


  Iterator<edge> *itE=graph->getEdges();

  while (itE->hasNext()) {
    edge ite=itE->next();
    node source= graph->source(ite);
    node target= graph->target(ite);

    if (doubleResult->getNodeValue(source)==doubleResult->getNodeValue(target))
      doubleResult->setEdgeValue(ite,doubleResult->getNodeValue(source));
    else
      doubleResult->setEdgeValue(ite,curComponent);
  }

  delete itE;


  return true;
}

bool StrongComponent::check(std::string &erreurMsg) {
  erreurMsg="";
  return true;
}

void StrongComponent::reset() {
}