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 // class DGraphIterativeDFP
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 // general default solver 
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   // initialize dataflow information at each of the nodes and edges
00064   //---------------------------------------------------------------
00065   initialize(dg);
00066   //---------------------------------------------------------------
00067   // Kildall style iterative solver: iterate until dataflow
00068   // information at each node and edge stabilizes
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   // loop until there are no changes
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       // compute dataflow information at node based on
00100       // what is coming into the node along the dataflow
00101       // direction
00102       //--------------------------------------------------
00103 
00104       changed |= atDGraphNode(node, alongFlow);
00105 
00106       //--------------------------------------------------
00107       // compute dataflow information going out of the node
00108       // along dataflow direction
00109       //--------------------------------------------------
00110 
00111       OA_ptr<DGraph::EdgesIteratorInterface> edgeIterPtr;
00112       if (alongFlow==DGraph::DEdgeOrg) {  // follows original orientation of edges
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     } // end for all nodes
00126 
00127     nodeIterPtr->reset();
00128 
00129   } while (changed);
00130 
00131   
00132    //---------------------------------------------------------------
00133   // finalize dataflow information at each of the nodes and edges
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) {  // follows original orientation of edges
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; // set value for retrieval
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   // initialize dataflow information at each of the nodes and edges
00176   //---------------------------------------------------------------
00177   initialize(dg);
00178   //---------------------------------------------------------------
00179   // Kildall style iterative solver: iterate until dataflow
00180   // information at each node and edge stabilizes
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   // loop until there are no changes
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     // compute dataflow information at node based on
00217     // what is coming into the node along the dataflow
00218     // direction
00219     //--------------------------------------------------
00220     changed = atDGraphNode(node, alongFlow);
00221 
00222     //--------------------------------------------------
00223     // compute dataflow information going out of the node
00224     // along dataflow direction
00225     //--------------------------------------------------
00226     OA_ptr<DGraph::EdgesIteratorInterface> edgeIterPtr;
00227     if (alongFlow==DGraph::DEdgeOrg) {  // follows original orientation of edges
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     } // end for all nodes
00262 
00263     nodeIterPtr->reset();
00264     //---------------------------------------------------------------
00265     // finalize dataflow information at each of the nodes and edges
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) {  // follows original orientation of edges
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 // solver callbacks
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 // finalization callbacks
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   } // end of DataFlow namespace
00324 }  // end of OA namespace
00325 

Generated on Sat Oct 31 05:21:21 2009 for OpenAnalysis by  doxygen 1.6.1