dominator_tree_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 298 行

CPP
298
字号
//=======================================================================// Copyright (C) 2005 Jong Soo Park <jongsoo.park -at- gmail.com>//// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//=======================================================================#include <boost/test/minimal.hpp>#include <iostream>#include <algorithm>#include <boost/graph/adjacency_list.hpp>#include <boost/graph/dominator_tree.hpp>using namespace std;struct DominatorCorrectnessTestSet{  typedef pair<int, int> edge;  int numOfVertices;  vector<edge> edges;  vector<int> correctIdoms;};using namespace boost;typedef adjacency_list<    listS,    listS,    bidirectionalS,    property<vertex_index_t, std::size_t>, no_property> G;int test_main(int, char*[]){  typedef DominatorCorrectnessTestSet::edge edge;  DominatorCorrectnessTestSet testSet[7];  // Tarjan's paper  testSet[0].numOfVertices = 13;  testSet[0].edges.push_back(edge(0, 1));  testSet[0].edges.push_back(edge(0, 2));  testSet[0].edges.push_back(edge(0, 3));  testSet[0].edges.push_back(edge(1, 4));  testSet[0].edges.push_back(edge(2, 1));  testSet[0].edges.push_back(edge(2, 4));  testSet[0].edges.push_back(edge(2, 5));  testSet[0].edges.push_back(edge(3, 6));  testSet[0].edges.push_back(edge(3, 7));  testSet[0].edges.push_back(edge(4, 12));  testSet[0].edges.push_back(edge(5, 8));  testSet[0].edges.push_back(edge(6, 9));  testSet[0].edges.push_back(edge(7, 9));  testSet[0].edges.push_back(edge(7, 10));  testSet[0].edges.push_back(edge(8, 5));  testSet[0].edges.push_back(edge(8, 11));  testSet[0].edges.push_back(edge(9, 11));  testSet[0].edges.push_back(edge(10, 9));  testSet[0].edges.push_back(edge(11, 0));  testSet[0].edges.push_back(edge(11, 9));  testSet[0].edges.push_back(edge(12, 8));  testSet[0].correctIdoms.push_back((numeric_limits<int>::max)());  testSet[0].correctIdoms.push_back(0);  testSet[0].correctIdoms.push_back(0);  testSet[0].correctIdoms.push_back(0);  testSet[0].correctIdoms.push_back(0);  testSet[0].correctIdoms.push_back(0);  testSet[0].correctIdoms.push_back(3);  testSet[0].correctIdoms.push_back(3);  testSet[0].correctIdoms.push_back(0);  testSet[0].correctIdoms.push_back(0);  testSet[0].correctIdoms.push_back(7);  testSet[0].correctIdoms.push_back(0);  testSet[0].correctIdoms.push_back(4);  // Appel. p441. figure 19.4  testSet[1].numOfVertices = 7;  testSet[1].edges.push_back(edge(0, 1));  testSet[1].edges.push_back(edge(1, 2));  testSet[1].edges.push_back(edge(1, 3));  testSet[1].edges.push_back(edge(2, 4));  testSet[1].edges.push_back(edge(2, 5));  testSet[1].edges.push_back(edge(4, 6));  testSet[1].edges.push_back(edge(5, 6));  testSet[1].edges.push_back(edge(6, 1));  testSet[1].correctIdoms.push_back((numeric_limits<int>::max)());  testSet[1].correctIdoms.push_back(0);  testSet[1].correctIdoms.push_back(1);  testSet[1].correctIdoms.push_back(1);  testSet[1].correctIdoms.push_back(2);  testSet[1].correctIdoms.push_back(2);  testSet[1].correctIdoms.push_back(2);  // Appel. p449. figure 19.8  testSet[2].numOfVertices = 13,  testSet[2].edges.push_back(edge(0, 1));  testSet[2].edges.push_back(edge(0, 2));  testSet[2].edges.push_back(edge(1, 3));  testSet[2].edges.push_back(edge(1, 6));  testSet[2].edges.push_back(edge(2, 4));  testSet[2].edges.push_back(edge(2, 7));  testSet[2].edges.push_back(edge(3, 5));  testSet[2].edges.push_back(edge(3, 6));  testSet[2].edges.push_back(edge(4, 7));  testSet[2].edges.push_back(edge(4, 2));  testSet[2].edges.push_back(edge(5, 8));  testSet[2].edges.push_back(edge(5, 10));  testSet[2].edges.push_back(edge(6, 9));  testSet[2].edges.push_back(edge(7, 12));  testSet[2].edges.push_back(edge(8, 11));  testSet[2].edges.push_back(edge(9, 8));  testSet[2].edges.push_back(edge(10, 11));  testSet[2].edges.push_back(edge(11, 1));  testSet[2].edges.push_back(edge(11, 12));  testSet[2].correctIdoms.push_back((numeric_limits<int>::max)());  testSet[2].correctIdoms.push_back(0);  testSet[2].correctIdoms.push_back(0);  testSet[2].correctIdoms.push_back(1);  testSet[2].correctIdoms.push_back(2);  testSet[2].correctIdoms.push_back(3);  testSet[2].correctIdoms.push_back(1);  testSet[2].correctIdoms.push_back(2);  testSet[2].correctIdoms.push_back(1);  testSet[2].correctIdoms.push_back(6);  testSet[2].correctIdoms.push_back(5);  testSet[2].correctIdoms.push_back(1);  testSet[2].correctIdoms.push_back(0);  testSet[3].numOfVertices = 8,  testSet[3].edges.push_back(edge(0, 1));  testSet[3].edges.push_back(edge(1, 2));  testSet[3].edges.push_back(edge(1, 3));  testSet[3].edges.push_back(edge(2, 7));  testSet[3].edges.push_back(edge(3, 4));  testSet[3].edges.push_back(edge(4, 5));  testSet[3].edges.push_back(edge(4, 6));  testSet[3].edges.push_back(edge(5, 7));  testSet[3].edges.push_back(edge(6, 4));  testSet[3].correctIdoms.push_back((numeric_limits<int>::max)());  testSet[3].correctIdoms.push_back(0);  testSet[3].correctIdoms.push_back(1);  testSet[3].correctIdoms.push_back(1);  testSet[3].correctIdoms.push_back(3);  testSet[3].correctIdoms.push_back(4);  testSet[3].correctIdoms.push_back(4);  testSet[3].correctIdoms.push_back(1);    // Muchnick. p256. figure 8.21  testSet[4].numOfVertices = 8,  testSet[4].edges.push_back(edge(0, 1));  testSet[4].edges.push_back(edge(1, 2));  testSet[4].edges.push_back(edge(2, 3));  testSet[4].edges.push_back(edge(2, 4));  testSet[4].edges.push_back(edge(3, 2));  testSet[4].edges.push_back(edge(4, 5));  testSet[4].edges.push_back(edge(4, 6));  testSet[4].edges.push_back(edge(5, 7));  testSet[4].edges.push_back(edge(6, 7));  testSet[4].correctIdoms.push_back((numeric_limits<int>::max)());  testSet[4].correctIdoms.push_back(0);  testSet[4].correctIdoms.push_back(1);  testSet[4].correctIdoms.push_back(2);  testSet[4].correctIdoms.push_back(2);  testSet[4].correctIdoms.push_back(4);  testSet[4].correctIdoms.push_back(4);  testSet[4].correctIdoms.push_back(4);  // Muchnick. p253. figure 8.18  testSet[5].numOfVertices = 8,  testSet[5].edges.push_back(edge(0, 1));  testSet[5].edges.push_back(edge(0, 2));  testSet[5].edges.push_back(edge(1, 6));  testSet[5].edges.push_back(edge(2, 3));  testSet[5].edges.push_back(edge(2, 4));  testSet[5].edges.push_back(edge(3, 7));  testSet[5].edges.push_back(edge(5, 7));  testSet[5].edges.push_back(edge(6, 7));  testSet[5].correctIdoms.push_back((numeric_limits<int>::max)());  testSet[5].correctIdoms.push_back(0);  testSet[5].correctIdoms.push_back(0);  testSet[5].correctIdoms.push_back(2);  testSet[5].correctIdoms.push_back(2);  testSet[5].correctIdoms.push_back((numeric_limits<int>::max)());  testSet[5].correctIdoms.push_back(1);  testSet[5].correctIdoms.push_back(0);  // Cytron's paper, fig. 9  testSet[6].numOfVertices = 14,  testSet[6].edges.push_back(edge(0, 1));  testSet[6].edges.push_back(edge(0, 13));  testSet[6].edges.push_back(edge(1, 2));  testSet[6].edges.push_back(edge(2, 3));  testSet[6].edges.push_back(edge(2, 7));  testSet[6].edges.push_back(edge(3, 4));  testSet[6].edges.push_back(edge(3, 5));  testSet[6].edges.push_back(edge(4, 6));  testSet[6].edges.push_back(edge(5, 6));  testSet[6].edges.push_back(edge(6, 8));  testSet[6].edges.push_back(edge(7, 8));  testSet[6].edges.push_back(edge(8, 9));  testSet[6].edges.push_back(edge(9, 10));  testSet[6].edges.push_back(edge(9, 11));  testSet[6].edges.push_back(edge(10, 11));  testSet[6].edges.push_back(edge(11, 9));  testSet[6].edges.push_back(edge(11, 12));  testSet[6].edges.push_back(edge(12, 2));  testSet[6].edges.push_back(edge(12, 13));  testSet[6].correctIdoms.push_back((numeric_limits<int>::max)());  testSet[6].correctIdoms.push_back(0);  testSet[6].correctIdoms.push_back(1);  testSet[6].correctIdoms.push_back(2);  testSet[6].correctIdoms.push_back(3);  testSet[6].correctIdoms.push_back(3);  testSet[6].correctIdoms.push_back(3);  testSet[6].correctIdoms.push_back(2);  testSet[6].correctIdoms.push_back(2);  testSet[6].correctIdoms.push_back(8);  testSet[6].correctIdoms.push_back(9);  testSet[6].correctIdoms.push_back(9);  testSet[6].correctIdoms.push_back(11);  testSet[6].correctIdoms.push_back(0);  for (size_t i = 0; i < sizeof(testSet)/sizeof(testSet[0]); ++i)  {    const int numOfVertices = testSet[i].numOfVertices;    G g(      testSet[i].edges.begin(), testSet[i].edges.end(),      numOfVertices);    typedef graph_traits<G>::vertex_descriptor Vertex;    typedef property_map<G, vertex_index_t>::type IndexMap;    typedef      iterator_property_map<vector<Vertex>::iterator, IndexMap>      PredMap;    vector<Vertex> domTreePredVector, domTreePredVector2;    IndexMap indexMap(get(vertex_index, g));    graph_traits<G>::vertex_iterator uItr, uEnd;    int j = 0;    for (tie(uItr, uEnd) = vertices(g); uItr != uEnd; ++uItr, ++j)    {      put(indexMap, *uItr, j);    }    // Lengauer-Tarjan dominator tree algorithm    domTreePredVector =      vector<Vertex>(num_vertices(g), graph_traits<G>::null_vertex());    PredMap domTreePredMap =      make_iterator_property_map(domTreePredVector.begin(), indexMap);    lengauer_tarjan_dominator_tree(g, vertex(0, g), domTreePredMap);    vector<int> idom(num_vertices(g));    for (tie(uItr, uEnd) = vertices(g); uItr != uEnd; ++uItr)    {      if (get(domTreePredMap, *uItr) != graph_traits<G>::null_vertex())        idom[get(indexMap, *uItr)] =          get(indexMap, get(domTreePredMap, *uItr));      else        idom[get(indexMap, *uItr)] = (numeric_limits<int>::max)();    }    copy(idom.begin(), idom.end(), ostream_iterator<int>(cout, " "));    cout << endl;    // dominator tree correctness test    BOOST_CHECK(equal(idom.begin(), idom.end(), testSet[i].correctIdoms.begin()));    // compare results of fast version and slow version of dominator tree    domTreePredVector2 =      vector<Vertex>(num_vertices(g), graph_traits<G>::null_vertex());    domTreePredMap =      make_iterator_property_map(domTreePredVector2.begin(), indexMap);    iterative_bit_vector_dominator_tree(g, vertex(0, g), domTreePredMap);    vector<int> idom2(num_vertices(g));    for (tie(uItr, uEnd) = vertices(g); uItr != uEnd; ++uItr)    {      if (get(domTreePredMap, *uItr) != graph_traits<G>::null_vertex())        idom2[get(indexMap, *uItr)] =          get(indexMap, get(domTreePredMap, *uItr));      else        idom2[get(indexMap, *uItr)] = (numeric_limits<int>::max)();    }    copy(idom2.begin(), idom2.end(), ostream_iterator<int>(cout, " "));    cout << endl;    size_t k;    for (k = 0; k < num_vertices(g); ++k)      BOOST_CHECK(domTreePredVector[k] == domTreePredVector2[k]);  }  return 0;};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?