ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/hypergraphlib_filaments.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_Filaments.cpp
File size: 4292 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_Graph.h"
6 #include "HypergraphLib_Node.h"
7 #include "HypergraphLib_Arc.h"
8
9 #include <set>
10 #include <vector>
11 #include <map>
12
13
14 /**
15 * Algorithme de décomposition d'un graphe en filaments
16 */
17
18 namespace HypergraphLib {
19
20 HYPERGRAPHLIB_ITEM void
21 Filaments ( Graph * G, std::vector < std::vector < int > > & __filaments )
22 {
23 std::set <int> visited;
24 std::set <int> next;
25 std::vector <int> filament;
26 std::set <int> unvisited;
27 std::set <int> adjacentNodes;
28
29 // Initialize the set of unvisited nodes
30 for (Graph::MapNodesById::const_iterator itNodes = G->GetNodes().begin();
31 itNodes != G->GetNodes().end();
32 itNodes++ )
33 {
34 unvisited.insert (itNodes->first);
35 }
36
37 while (unvisited.size() > 0)
38 {
39 Node * N = G->GetNode(*(unvisited.begin()));
40 for (std::set<int>::const_iterator itAN = unvisited.begin();
41 itAN != unvisited.end();
42 itAN++ )
43 {
44 Node * N2 = G->GetNode(*itAN);
45 if (N2->IncidentArcs().size() == 1)
46 {
47 N = N2;
48 break;
49 }
50 }
51
52 visited.insert(N->Id());
53 unvisited.erase(unvisited.find(N->Id()));
54 next.clear();
55 adjacentNodes.clear();
56 N->AdjacentNodes(adjacentNodes);
57 for (std::set<int>::const_iterator itAN = adjacentNodes.begin();
58 itAN != adjacentNodes.end();
59 itAN++ )
60 {
61 if ( visited.find (*itAN) == visited.end() )
62 {
63 next.insert (*itAN);
64 break;
65 }
66 }
67 filament.clear();
68 filament.push_back (N->Id());
69
70 while (next.size() > 0)
71 {
72 N = G->GetNode(*(next.begin()));
73 visited.insert(N->Id());
74 unvisited.erase(unvisited.find(N->Id()));
75 adjacentNodes.clear();
76 next.clear();
77 filament.push_back (N->Id());
78
79 N->AdjacentNodes(adjacentNodes);
80 for (std::set<int>::const_iterator itAN = adjacentNodes.begin();
81 itAN != adjacentNodes.end();
82 itAN++ )
83 {
84 // printf("Candidate node %d\n",*itAN);
85 if ( visited.find (*itAN) == visited.end() )
86 {
87 int count_filament_adjacency = 0;
88 std::vector<int>::const_iterator it_fil = filament.begin();
89 bool is_adjacent_to_start=false;
90 bool is_adjacent_to_end=false;
91 Node * fN=NULL;
92
93 it_fil = filament.begin();
94 fN = G->GetNode (*it_fil);
95 is_adjacent_to_start = fN->IsAdjacentToNode(*itAN);
96
97
98 it_fil = filament.end();it_fil--;
99 fN = G->GetNode (*it_fil);
100 is_adjacent_to_end = fN->IsAdjacentToNode(*itAN);
101
102 for ( it_fil = filament.begin();
103 it_fil != filament.end(); it_fil++)
104 {
105 fN = G->GetNode (*it_fil);
106 if (fN->IsAdjacentToNode(*itAN))
107 count_filament_adjacency++;
108 }
109 it_fil = filament.end();it_fil--;
110 // printf("count_filament_adjacency = %d, is_adjacent_to_(%d)=%d\n", count_filament_adjacency,*it_fil,is_adjacent_to_end);
111 it_fil = filament.begin();
112 // printf("is_adjacent_to_(%d)=%d\n",*it_fil,is_adjacent_to_start);
113
114 bool is_not_T = true;
115 if ( is_adjacent_to_end && is_adjacent_to_start)
116 {
117
118 for ( it_fil = filament.begin();
119 it_fil != filament.end(); it_fil++)
120 {
121 fN = G->GetNode (*it_fil);
122 for ( Node::MultimapArcsById::const_iterator itArcs = fN->IncidentArcs().begin();
123 itArcs != fN->IncidentArcs().end();
124 itArcs++ )
125 {
126 Arc * arc = itArcs->second;
127
128 if ( arc->Nodes().find(*itAN) != arc->Nodes().end()
129 && arc->Nodes().find(filament[0]) != arc->Nodes().end()
130 && arc->Nodes().find(filament[filament.size()-1]) != arc->Nodes().end() )
131 {
132 is_not_T = false;
133 }
134 }
135 }
136
137 }
138
139 if (count_filament_adjacency == 1 || ( is_adjacent_to_end && is_adjacent_to_start && is_not_T) )
140 {
141 next.insert (*itAN);
142 // printf("Candidate Node %d choosen!\n", *itAN);
143 break;
144 }
145 }
146 }
147 }
148 __filaments.push_back(filament);
149 }
150
151 }
152 }
153 #endif
154