ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/hypergraphlib_findcycles.cpp
Revision: 113
Committed: Wed Jun 25 18:44:12 2008 UTC (16 years, 10 months ago) by francois
Original Path: magic/lib/outil/outil/src/HypergraphLib_FindCycles.cpp
File size: 5020 byte(s)
Error occurred while calculating annotation data.
Log Message:
pb de compatibilite windows apres le passage linux de hypergraph

File Contents

# Content
1 #include "gestionversion.h"
2 #ifdef WINDOWS_VERSION
3 #include "HypergraphLib_platform.h"
4
5 #include "HypergraphLib_FindCycles.h"
6 #include "HypergraphLib_Node.h"
7 #include "HypergraphLib_Arc.h"
8 #include "HypergraphLib_Graph.h"
9 #include <algorithm>
10 #include <iostream>
11
12 #undef DEBUG
13
14 namespace HypergraphLib {
15
16 int find_n( std::vector < Node * > & __depthFirstSearchNodes, Node *__n)
17 {
18 for (unsigned i=0; i<__depthFirstSearchNodes.size(); i++)
19 if (__depthFirstSearchNodes[i] == __n)
20 return i;
21 return -1;
22 }
23
24 int find_n( std::vector < Arc * > & __depthFirstSearchArcs, Arc *__a)
25 {
26 for (unsigned i=0; i<__depthFirstSearchArcs.size(); i++)
27 if (__depthFirstSearchArcs[i] == __a)
28 return i;
29 return -1;
30 }
31
32 /**
33 * returns :
34 * -2 if the cycle does not exist
35 * -1 if the cycle exist
36 * j if the cycle at index j is longer than the new one
37 */
38
39 int does_cycle_already_exist( const std::vector < std::vector < Node * > > & cycles, const std::vector < Node * > & cycle)
40 {
41 for (unsigned i = 0; i < cycles.size(); i++)
42 {
43 for (unsigned j=0; j<cycles[i].size(); j++)
44 {
45 std::vector < Node * >::const_iterator it = std::find(cycle.begin(), cycle.end(), cycles[i][j]);
46 if (it == cycle.end())
47 goto not_equal_cycles;
48 }
49 if (cycles[i].size() == cycle.size())
50 {
51 #ifdef DEBUG
52 std::cout << "Cycle \"";
53 for (int j=0; j<cycle.size(); j++)
54 std::cout << cycle[j]->Id() << ", ";
55 std::cout << "\" matches cycle ";
56 for (int j=0; j<cycles[i].size(); j++)
57 std::cout << cycles[i][j]->Id() << ", ";
58 std::cout << std::endl;
59 #endif
60 }
61 else if (cycles[i].size() > cycle.size())
62 {
63 #ifdef DEBUG
64 std::cout << "the candidate cycle \"";
65 for (int j=0; j<cycle.size(); j++)
66 std::cout << cycle[j]->Id() << ", ";
67 std::cout << "\" is shorter than the cycle \"";
68 for (int j=0; j<cycles[i].size(); j++)
69 std::cout << cycles[i][j]->Id() << ", ";
70 std::cout << "\"";
71 std::cout << std::endl;
72 #endif
73 return i;
74 }
75 else
76 {
77 #ifdef DEBUG
78 std::cout << "the candidate cycle \"";
79 for (int j=0; j<cycle.size(); j++)
80 std::cout << cycle[j]->Id() << ", ";
81 std::cout << "\" is longer than the cycle \"";
82 for (int j=0; j<cycles[i].size(); j++)
83 std::cout << cycles[i][j]->Id() << ", ";
84 std::cout << "\"";
85 std::cout << std::endl;
86 #endif
87 }
88 return -1;
89 not_equal_cycles:
90 continue;
91 }
92 #ifdef DEBUG
93 std::cout << "Cycle \"";
94 for (int j=0; j<cycle.size(); j++)
95 std::cout << cycle[j]->Id() << ", ";
96 std::cout << "\" is a new cycle "<< std::endl;
97 #endif
98
99 return -2;
100 }
101
102 void
103 dfsCycle(Node *__n, std::vector < Node * > & __depthFirstSearchNodes, std::vector< Arc * > & __depthFirstSearchArcs, std::vector < std::vector < Node * > > & cycles )
104 {
105 std::set < Node * > adj;
106 __n->AdjacentNodes( adj );
107 std::vector<Node*>::iterator it3;
108
109 //int pos_n;
110 if (__depthFirstSearchNodes.size() == 0)
111 __depthFirstSearchNodes.push_back(__n);
112
113 for ( Node::MultimapArcsById::iterator itIncidentArcs = __n->IncidentArcs().begin();
114 itIncidentArcs != __n->IncidentArcs().end();
115 itIncidentArcs++ )
116 {
117 Arc * incidentArc = itIncidentArcs->second;
118 for ( Arc::MultimapNodesById::iterator itAdjNodes = incidentArc->Nodes().begin();
119 itAdjNodes != incidentArc->Nodes().end();
120 itAdjNodes++)
121 {
122 Node * adjNode = itAdjNodes->second;
123 std::vector < Node * > tempPath = __depthFirstSearchNodes;
124 std::vector < Arc * > tempPathArcs = __depthFirstSearchArcs;
125
126 if (__n->Owner()->IsCycle(tempPath))
127 {
128 //std::vector < Node * > cycle;
129 //for (int i=0; i<tempPath.size(); i++)
130 // cycle.push_back(tempPath[i]);
131 int is_cycle_exists = does_cycle_already_exist(cycles, tempPath);
132 // if the cycle does not exists
133 if (is_cycle_exists == -2)
134 cycles.push_back(tempPath);
135 // if a shorter cycle exists : replace the long cycle with the short cycle
136 if (is_cycle_exists > 0)
137 {
138 cycles [is_cycle_exists] = tempPath;
139 }
140 //tempPath = __depthFirstSearchNodes;
141 }
142 else if ( find_n(__depthFirstSearchNodes, adjNode) == -1 && find_n(__depthFirstSearchArcs, incidentArc) == -1)
143 {
144 tempPath.push_back(adjNode);
145 tempPathArcs.push_back(incidentArc);
146 dfsCycle (adjNode, tempPath, tempPathArcs, cycles);
147 }
148 }
149 }
150 }
151
152
153 void
154 FindCycles(Graph * __G, std::vector < std::vector < Node * > > & cycles)
155 {
156 std::vector < Node * > depthFirstSearchNodes;
157 std::vector < Arc * > depthFirstSearchArcs;
158
159 GRAPH_FOR_EACH_NODE_CONST(__G, startNode)
160 {
161 depthFirstSearchNodes.clear();
162 dfsCycle (startNode->second, depthFirstSearchNodes, depthFirstSearchArcs, cycles);
163 }
164 }
165 }
166 #endif
167