ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/hypergraphlib_filaments.cpp
Revision: 27
Committed: Thu Jul 5 15:26:40 2007 UTC (17 years, 10 months ago) by foucault
Original Path: magic/lib/outil/outil/src/HypergraphLib_Filaments.cpp
File size: 4232 byte(s)
Log Message:

File Contents

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