PeriDyno 1.0.0
Loading...
Searching...
No Matches
DirectedAcyclicGraph.cpp
Go to the documentation of this file.
2#include <iostream>
3
4namespace dyno {
5
7 {
8 for(auto edge : mEdges)
9 {
10 edge.second.clear();
11 }
12 mEdges.clear();
13
14 for(auto edge : mReverseEdges)
15 {
16 edge.second.clear();
17 }
18 mReverseEdges.clear();
19
20 mVertices.clear();
21 mOrderVertices.clear();
22 }
23
25 {
26 mVertices.insert(v);
27 mVertices.insert(w);
28
29 // Add an edge (v, w).
30 mEdges[v].insert(w);
31
32 //Add a reverse edge (w, v)
33 mReverseEdges[w].insert(v);
34 }
35
37 {
38 mOrderVertices.clear();
39
40 int num = sizeOfVertex();
41 // Mark all the vertices as not visited
42 std::map<ObjectId, bool> visited;
43 for(auto id : mVertices)
44 {
45 visited[id] = false;
46 }
47
48 topologicalSortUtil(v, visited);
49
50 visited.clear();
51
52 return mOrderVertices;
53 }
54
56 {
57 mOrderVertices.clear();
58
59 std::stack<ObjectId> stack;
60
61 int num = sizeOfVertex();
62 // Mark all the vertices as not visited
63 std::map<ObjectId, bool> visited;
64 for(auto id : mVertices)
65 {
66 visited[id] = false;
67 }
68
69 for(auto id : mVertices)
70 if (visited[id] == false)
71 topologicalSortUtil(id, visited, stack);
72
73 // Output contents of stack
74 while (stack.empty() == false) {
75 mOrderVertices.push_back(stack.top());
76 stack.pop();
77 }
78
79 visited.clear();
80
81 return mOrderVertices;
82 }
83
85 {
86 return mVertices.size();
87 }
88
89 std::set<dyno::ObjectId>& DirectedAcyclicGraph::vertices()
90 {
91 return mVertices;
92 }
93
94 std::map<dyno::ObjectId, std::unordered_set<dyno::ObjectId>>& DirectedAcyclicGraph::edges()
95 {
96 return mEdges;
97 }
98
99 std::map<dyno::ObjectId, std::unordered_set<dyno::ObjectId>>& DirectedAcyclicGraph::reverseEdges()
100 {
101 return mReverseEdges;
102 }
103
104 void DirectedAcyclicGraph::topologicalSortUtil(ObjectId v, std::map<ObjectId, bool>& visited, std::stack<ObjectId>& stack)
105 {
106 // Mark the current node as visited.
107 visited[v] = true;
108
109 std::list<ObjectId>::iterator i;
110
111 std::stack<ObjectId> reverseId;
112 for(auto id : mEdges[v])
113 reverseId.push(id);
114
115 while ((reverseId.empty() == false)) {
116 ObjectId id = reverseId.top();
117 if (!visited[id])
118 topologicalSortUtil(id, visited, stack);
119
120 reverseId.pop();
121 }
122
123 // Push current vertex to stack
124 stack.push(v);
125 }
126
127 void DirectedAcyclicGraph::topologicalSortUtil(ObjectId v, std::map<ObjectId, bool>& visited)
128 {
129 // Mark the current node as visited and
130 visited[v] = true;
131 mOrderVertices.push_back(v);
132
133 // Recur for all the vertices adjacent
134 std::list<ObjectId>::iterator i;
135 for(auto id : mEdges[v])
136 if (!visited[id])
137 topologicalSortUtil(id, visited);
138 }
139
141 {
142 OtherVertices.insert(v);
143
144 }
145
150
152 {
155
156 std::set<ObjectId>::iterator itList;
157
158 for (itList = RemoveList.begin(); itList != RemoveList.end();)
159 {
160 auto temp = *itList;
161
162 if (OtherVertices.count(*itList))
163 {
164 OtherVertices.erase(temp);
165 }
166 itList++;
167 }
168
169
170
171 }
172
173}
std::set< ObjectId > RemoveList
void removeID(ObjectId v=-1, ObjectId w=-1)
std::set< ObjectId > OtherVertices
std::map< ObjectId, std::unordered_set< ObjectId > > mEdges
void addEdge(ObjectId v, ObjectId w)
std::vector< ObjectId > mOrderVertices
std::map< ObjectId, std::unordered_set< ObjectId > > & edges()
std::map< ObjectId, std::unordered_set< ObjectId > > & reverseEdges()
std::map< ObjectId, std::unordered_set< ObjectId > > mReverseEdges
std::vector< ObjectId > & topologicalSort()
void topologicalSortUtil(ObjectId v, std::map< ObjectId, bool > &visited, std::stack< ObjectId > &stack)
std::set< ObjectId > & vertices()
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
uint32_t ObjectId
Definition Object.h:110