DGraphSolverDFP.cpp
Go to the documentation of this file.00001
00016 #include "DGraphSolverDFP.hpp"
00017 #include <Utils/Util.hpp>
00018
00019 #include <iostream>
00020
00021 #include <queue>
00022
00023 namespace OA {
00024 namespace DataFlow {
00025
00026 static bool debug = false;
00027
00028
00029
00030
00031
00032 DGraphSolverDFP::DGraphSolverDFP()
00033 {
00034 OA_DEBUG_CTRL_MACRO("DEBUG_DGraphIterativeDFP:ALL", debug);
00035 numIter = 0;
00036 }
00037
00038
00039 DGraphSolverDFP::~DGraphSolverDFP()
00040 {
00041 }
00042
00043
00044
00045
00046
00047 void DGraphSolverDFP::solve(OA_ptr<DGraph::DGraphInterface> dg,
00048 DGraph::DGraphEdgeDirection alongFlow,
00049 DFPImplement algorithm)
00050 {
00051 if(algorithm == ITERATIVE) {
00052 Iterative_Solve(dg,alongFlow);
00053 } else {
00054 WorkList_Solve(dg,alongFlow,algorithm);
00055 }
00056 }
00057
00058 void DGraphSolverDFP::Iterative_Solve(OA_ptr<DGraph::DGraphInterface> dg,
00059 DGraph::DGraphEdgeDirection alongFlow)
00060 {
00061 int numNodeAccess=0;
00062
00063
00064
00065 initialize(dg);
00066
00067
00068
00069
00070 unsigned int changed;
00071
00072 OA_ptr<DGraph::NodeInterface> node;
00073
00074 OA_ptr<DGraph::NodesIteratorInterface> nodeIterPtr
00075 = dg->getReversePostDFSIterator(alongFlow);
00076
00077
00078 int iterCnt = 0;
00079
00080 do {
00081 changed = 0;
00082 iterCnt++;
00083 if (debug) {
00084 std::cout << "DGraphIterativeDFP (in loop), iterCnt = " << iterCnt << std::endl;
00085 }
00086 for (; nodeIterPtr->isValid(); ++(*nodeIterPtr)) {
00087 node = nodeIterPtr->current();
00088
00089 numNodeAccess++;
00090 if (debug) {
00091 std::cout << "node: Id = " << node->getId();
00092 std::cout << ", num_outgoing = " << node->num_outgoing();
00093 std::cout << ", OA_ptr::dump = ";
00094 node.dump(std::cout);
00095 std::cout << std::endl;
00096 }
00097
00098
00099
00100
00101
00102
00103
00104 changed |= atDGraphNode(node, alongFlow);
00105
00106
00107
00108
00109
00110
00111 OA_ptr<DGraph::EdgesIteratorInterface> edgeIterPtr;
00112 if (alongFlow==DGraph::DEdgeOrg) {
00113 OA_ptr<DGraph::EdgesIteratorInterface> it =
00114 node->getOutgoingEdgesIterator();
00115 edgeIterPtr = it;
00116 } else {
00117 OA_ptr<DGraph::EdgesIteratorInterface> it =
00118 node->getIncomingEdgesIterator();
00119 edgeIterPtr = it;
00120 }
00121 for (; edgeIterPtr->isValid(); ++(*edgeIterPtr)) {
00122 changed |= atDGraphEdge(edgeIterPtr->current(), alongFlow);
00123 }
00124
00125 }
00126
00127 nodeIterPtr->reset();
00128
00129 } while (changed);
00130
00131
00132
00133
00134
00135 for (; nodeIterPtr->isValid(); ++(*nodeIterPtr)) {
00136 node = nodeIterPtr->current();
00137 finalizeNode(node);
00138
00139 OA::OA_ptr<DGraph::EdgesIteratorInterface> edgeIterPtr;
00140 if (alongFlow==DGraph::DEdgeOrg) {
00141
00142 OA::OA_ptr<DGraph::EdgesIteratorInterface> it =
00143 node->getOutgoingEdgesIterator();
00144 edgeIterPtr = it;
00145 } else {
00146
00147 OA_ptr<DGraph::EdgesIteratorInterface> it =
00148 node->getIncomingEdgesIterator();
00149 edgeIterPtr = it;
00150 }
00151 for (; edgeIterPtr->isValid(); ++(*edgeIterPtr)) {
00152 finalizeEdge(edgeIterPtr->current());
00153 }
00154
00155 }
00156
00157 numIter = iterCnt;
00158
00159 if (debug) {
00160 std::cout << "DGraphIterativeDFP: iterCnt = " << iterCnt << std::endl;
00161 }
00162
00163 return;
00164
00165 }
00166
00167
00168 void DGraphSolverDFP::WorkList_Solve(OA_ptr<DGraph::DGraphInterface> dg,
00169 DGraph::DGraphEdgeDirection alongFlow,
00170 DFPImplement algorithm)
00171 {
00172
00173 int numNodesAccessed=0;
00174
00175
00176
00177 initialize(dg);
00178
00179
00180
00181
00182 unsigned int changed;
00183
00184 OA_ptr<DGraph::NodeInterface> node;
00185
00186
00187 OA_ptr<DGraph::NodesIteratorInterface> nodeIterPtr
00188 = dg->getReversePostDFSIterator(alongFlow);
00189
00190 OA_ptr<WorkList> wlist;
00191
00192 if( algorithm == WORKLIST_PRIORITY_QUEUE) {
00193
00194 wlist = new Worklist_PQueue(dg,alongFlow);
00195
00196 } else if( algorithm == WORKLIST_QUEUE ) {
00197
00198 wlist = new Worklist_Queue(dg,alongFlow);
00199
00200 }
00201
00202
00203 int iterCnt = 0;
00204 while (!wlist->isEmpty()) {
00205 node = wlist->getNext();
00206
00207 if (debug) {
00208 std::cout << "node: Id = " << node->getId();
00209 std::cout << ", num_outgoing = " << node->num_outgoing();
00210 std::cout << ", OA_ptr::dump = ";
00211 node.dump(std::cout);
00212 std::cout << std::endl;
00213 }
00214
00215
00216
00217
00218
00219
00220 changed = atDGraphNode(node, alongFlow);
00221
00222
00223
00224
00225
00226 OA_ptr<DGraph::EdgesIteratorInterface> edgeIterPtr;
00227 if (alongFlow==DGraph::DEdgeOrg) {
00228 OA_ptr<DGraph::EdgesIteratorInterface> it =
00229 node->getOutgoingEdgesIterator();
00230 edgeIterPtr = it;
00231 } else {
00232 OA_ptr<DGraph::EdgesIteratorInterface> it =
00233 node->getIncomingEdgesIterator();
00234 edgeIterPtr = it;
00235 }
00236 for (; edgeIterPtr->isValid(); ++(*edgeIterPtr)) {
00237 changed |= atDGraphEdge(edgeIterPtr->current(), alongFlow);
00238 }
00239
00240 OA_ptr<DGraph::NodesIteratorInterface> neighIter;
00241 if (alongFlow==DGraph::DEdgeOrg) {
00242 neighIter = node->getSinkNodesIterator();
00243 } else {
00244 neighIter = node->getSourceNodesIterator();
00245 }
00246
00247 if (changed) {
00248 if (debug) {
00249 std::cout << "DGraphIterativeDFP::solve: adding: ";
00250 }
00251 for (; neighIter->isValid(); ++(*neighIter)) {
00252 OA_ptr<DGraph::NodeInterface> n;
00253 n = neighIter->current();
00254 wlist->add(n);
00255 if (debug) {
00256 std::cout << n->getId() << " ";
00257 }
00258 }
00259 }
00260
00261 }
00262
00263 nodeIterPtr->reset();
00264
00265
00266
00267 for (; nodeIterPtr->isValid(); ++(*nodeIterPtr)) {
00268 node = nodeIterPtr->current();
00269 finalizeNode(node);
00270
00271 OA::OA_ptr<DGraph::EdgesIteratorInterface> edgeIterPtr;
00272 if (alongFlow==DGraph::DEdgeOrg) {
00273 OA::OA_ptr<DGraph::EdgesIteratorInterface> it =
00274 node->getOutgoingEdgesIterator();
00275 edgeIterPtr = it;
00276 } else {
00277 OA_ptr<DGraph::EdgesIteratorInterface> it =
00278 node->getIncomingEdgesIterator();
00279 edgeIterPtr = it;
00280 }
00281 for (; edgeIterPtr->isValid(); ++(*edgeIterPtr)) {
00282 finalizeEdge(edgeIterPtr->current());
00283 }
00284
00285 }
00286
00287 }
00288
00289
00290
00291
00292
00293 bool DGraphSolverDFP::atDGraphNode
00294 (OA_ptr<DGraph::NodeInterface>, DGraph::DGraphEdgeDirection)
00295 {
00296
00297 return false;
00298 }
00299
00300
00301 bool DGraphSolverDFP::atDGraphEdge
00302 (OA_ptr<DGraph::EdgeInterface>, DGraph::DGraphEdgeDirection)
00303 {
00304 return false;
00305 }
00306
00307
00308
00309
00310
00311
00312
00313
00314 void DGraphSolverDFP::finalizeEdge(OA_ptr<DGraph::EdgeInterface>)
00315 {
00316 }
00317
00318
00319 void DGraphSolverDFP::finalizeNode(OA_ptr<DGraph::NodeInterface>)
00320 {
00321 }
00322
00323 }
00324 }
00325