depGraph.cpp
Go to the documentation of this file.
1 /* $Id: depGraph.cpp 549 2011-03-26 17:44:33Z pbelotti $
2  *
3  * Name: depGraph.cpp
4  * Author: Pietro Belotti
5  * Purpose: methods for manipulating dependencies between variables
6  *
7  * (C) Carnegie-Mellon University, 2007-11.
8  * This file is licensed under the Eclipse Public License (EPL)
9  */
10 
11 #include <cstdlib>
12 #include <cstdio>
13 
14 #include "CouenneDepGraph.hpp"
15 
16 using namespace Couenne;
17 
18 //#define DEBUG
19 
20 // Methods of the class DepNode ///////////////////////////////////////////////////////////
21 
23 bool DepNode::depends (int xi, bool recursive,
24  std::set <DepNode *, compNode> *already_visited) const {
25 
26  // check if any node of the forward star has index xi
27  for (std::set <DepNode *, compNode>::iterator i = depList_ -> begin ();
28  i != depList_ -> end (); ++i) {
29 
30 #ifdef DEBUG
31  printf ("checking dependence of %d on %d\n", (*i) -> Index (), xi);
32  // fflush (stdout);
33 #endif
34 
35  if (!already_visited ||
36  (already_visited -> find (*i) == already_visited -> end ())) {
37 
38  if (((*i) -> Index () == xi) || // check current node
39  (recursive &&
40  ((*i) -> depends (xi, recursive, already_visited)))) // check deplist recursively
41  {
42 #ifdef DEBUG
43  printf ("%d <- ", (*i) -> Index ());
44  fflush (stdout);
45 #endif
46  return true;
47  } else {
48  if (already_visited) {
49  already_visited -> insert (*i);
50  /*printf ("checked [%d]: ", (*i) -> Index ());
51  for (std::set <DepNode *, compNode>::iterator j = already_visited -> begin ();
52  j != already_visited -> end (); ++j)
53  printf ("%d ", (*j) -> Index ());
54  printf ("\n");*/
55  }
56  }
57  }
58  }
59 
60  return false;
61 }
62 
63 
66 
67  if (order_ != -1) return;
68 
69  if (order_ == -2) {
70 
71  printf ("detected cycle in creating order, exiting\n");
72  exit (-1);
73  }
74 
75  order_ = -2;
76 
77  for (std::set <DepNode *, compNode>::iterator i = depList_ -> begin();
78  i != depList_ -> end (); ++i)
79  if ((*i) -> Order () == -1)
80  (*i) -> createOrder (g);
81 
82  if (order_ == -2)
83  order_ = g -> Counter () ++;
84 }
85 
86 
88 void DepNode::print (int indent, bool descend) const {
89 
90  printf ("%d ", index_);
91  if (order_ >= 0) printf ("[%d]", order_);
92  fflush (stdout);
93 
94  if (depList_ -> size () > 0) {
95  printf ("("); fflush (stdout);
96 
97  for (std::set <DepNode *, compNode>::iterator i = depList_ -> begin();
98  i != depList_ -> end (); ++i)
99  if (descend)
100  (*i) -> print (indent + 1, descend);
101  else printf ("%d ", (*i) -> Index ());
102 
103  printf (") "); fflush (stdout);
104  }
105 }
106 
109 void DepNode::replaceIndex (DepNode *oldVarNode, DepNode *newVarNode) {
110 
111  for (std::set <DepNode *, compNode>::iterator i = depList_ -> begin();
112  i != depList_ -> end (); ++i)
113 
114  if ((*i) -> Index () == oldVarNode -> Index ()) {
115 
116  depList_ -> erase (i);
117 
118  if (depList_ -> find (newVarNode) == depList_ -> end ())
119  depList_ -> insert (newVarNode);
120 
121  break;
122  }
123 }
124 
125 // Methods of the class DepGraph ////////////////////////////////////////////////////////////
126 
127 
130 
131  DepNode *el = new DepNode (var -> Index ());
132  std::set <DepNode *, compNode>::iterator i = vertices_ . find (el);
133 
134  if (i == vertices_ . end ())
135  vertices_.insert (el);
136  else delete el;
137 }
138 
139 
142 
143  if (!aux) return;
144 
145  DepNode *el = new DepNode (aux -> Index ());
146  std::set <DepNode *, compNode>::iterator i = vertices_ . find (el);
147 
148  if (i == vertices_ . end ()) {
149  vertices_.insert (el);
150  aux -> Image () -> fillDepSet (el -> DepList (), this);
151  } else {
152  aux -> Image () -> fillDepSet ((*i) -> DepList (), this);
153  delete el;
154  }
155 }
156 
157 
160 
161  DepNode *el = new DepNode (var -> Index ());
162  std::set <DepNode *, compNode>::iterator i = vertices_ . find (el);
163 
164  if (i != vertices_ . end ())
165  vertices_.erase (i);
166  delete el;
167 }
168 
170 bool DepGraph::depends (int wi, int xi, bool recursive) {
171 
172  DepNode *el = new DepNode (wi);
173  std::set <DepNode *, compNode>::iterator i = vertices_. find (el);
174  delete el;
175 
176  if (i != vertices_. end ()) { // if such element is in the set
177  std::set <DepNode *, compNode> already_visited;
178  return (*i) -> depends (xi, recursive, &already_visited); // then search it
179  }
180  else return false;
181 }
182 
183 
186 
187  for (std::set <DepNode *, compNode>::iterator i = vertices_. begin();
188  i != vertices_. end (); ++i)
189  (*i) -> createOrder (this);
190 }
191 
192 
194 void DepGraph::print (bool descend) {
195 
196  printf ("Dependence graph: \n");
197  for (std::set <DepNode *, compNode>::iterator i = vertices_. begin();
198  i != vertices_. end (); ++i) {
199  (*i) -> print (0, descend);
200  printf ("\n");
201  }
202 }
203 
204 
206 DepNode *DepGraph::lookup (int index) {
207 
208  DepNode *el = new DepNode (index), *ret;
209  std::set <DepNode *, compNode>::iterator i = vertices_ . find (el);
210 
211  ret = (i == vertices_.end ()) ? NULL : (*i);
212 
213  delete el;
214  return ret;
215 }
216 
220 void DepGraph::replaceIndex (int oldVar, int newVar) {
221 
222  DepNode
223  *copyOld = new DepNode (oldVar),
224  *copyNew = new DepNode (newVar);
225 
226  std::set <DepNode *, compNode>::iterator
227  oldNode = vertices_.find (copyOld),
228  newNode = vertices_.find (copyNew);
229 
230  for (std::set <DepNode *, compNode>::iterator i = vertices_. begin();
231  i != vertices_. end (); ++i)
232  (*i) -> replaceIndex (*oldNode, *newNode);
233 
234  delete copyOld;
235  delete copyNew;
236 }
std::set< DepNode *, compNode > vertices_
set of variable nodes
void erase(exprVar *)
delete element
Definition: depGraph.cpp:159
int order_
order in which this variable should be updated, evaluated, etc.
void createOrder(DepGraph *)
assign numbering to all nodes of graph
Definition: depGraph.cpp:65
vertex of a dependence graph.
void createOrder()
assign numbering to all nodes of graph
Definition: depGraph.cpp:185
DepNode * lookup(int index)
search for node in vertex set
Definition: depGraph.cpp:206
void insert(exprVar *)
insert new variable if new
Definition: depGraph.cpp:129
fint end
bool depends(int, int, bool=false)
does w depend on x?
Definition: depGraph.cpp:170
void replaceIndex(DepNode *oldVarNode, DepNode *newVarNode)
replace the index of a variable with another in the entire graph.
Definition: depGraph.cpp:109
Dependence graph.
Auxiliary variable.
void print(int=0, bool descend=false) const
debugging procedure
Definition: depGraph.cpp:88
variable-type operator
void fint fint fint real fint real real real real real real * g
bool depends(int xi, bool=false, std::set< DepNode *, compNode > *already_visited=NULL) const
does this variable depend on variable with index xi?
Definition: depGraph.cpp:23
int index_
index of variable associated with node
int Index() const
return index of this variable
int Order() const
return index of this variable
void replaceIndex(int oldVar, int newVar)
replace, throughout the whole graph, the index of a variable with another in the entire graph...
Definition: depGraph.cpp:220
std::set< DepNode *, compNode > * depList_
index nodes on which this one depends (forward star in dependence graph)
void print(bool descend=false)
debugging procedure
Definition: depGraph.cpp:194