Пример #1
0
bool MeshImplData::vertex_is_fixed( size_t index, MsqError& err ) const
{
  if (!is_vertex_valid( index ))
  {
    MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
    return false;
  }
  
  return vertexList[index].fixed;
}
Пример #2
0
const std::vector<size_t>& MeshImplData::vertex_adjacencies( size_t index, MsqError& err ) const
{
  if (!is_vertex_valid( index ))
  {
    MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
    return dummy_list;
  }
  
  return vertexList[index].adjacencies;
}
Пример #3
0
const Vector3D& MeshImplData::get_vertex_coords( size_t index, MsqError& err ) const
{
  if (!is_vertex_valid( index ))
  {
    MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
    return dummy_vtx;
  }
  
  return vertexList[index].coords;
}
Пример #4
0
void MeshImplData::set_vertex_byte( size_t index, unsigned char value, MsqError& err )
{
  if (!is_vertex_valid( index ))
  {
    MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
    return;
  }
  
  vertexList[index].byte = value;
}
Пример #5
0
unsigned char MeshImplData::get_vertex_byte( size_t index, MsqError& err ) const
{
  if (!is_vertex_valid( index ))
  {
    MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
    return 0;
  }
  
  return vertexList[index].byte;
}
Пример #6
0
void MeshImplData::fix_vertex( size_t index, bool flag, MsqError& err )
{
  if (!is_vertex_valid( index ))
  {
    MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
    return;
  }
  
  vertexList[index].fixed = flag;
}
Пример #7
0
void MeshImplData::delete_vertex( size_t index, MsqError& err )
{
  if (!is_vertex_valid( index ))
  {
    MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
    return;
  }
  
  vertexList[index].valid = false;
  deletedVertexList.push_back( index );
}
Пример #8
0
void MeshImplData::set_vertex_coords( size_t index, 
                                      const Vector3D& coords,
                                      MsqError& err )
{
  if (!is_vertex_valid( index ))
  {
    MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
    return;
  }
  
  vertexList[index].coords = coords;
}
Пример #9
0
bool MeshImplData::vertex_is_slaved( size_t index, MsqError& err ) const
{
  if (!is_vertex_valid( index ))
  {
    MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
    return false;
  }
  if (!have_slaved_flags())
  {
    MSQ_SETERR(err)("Slave flags not set", MsqError::INVALID_STATE);
    return false;
  }
  
  return vertexList[index].slaved;
}
Пример #10
0
void MeshImplData::get_adjacent_elements( 
                        std::vector<size_t>::const_iterator node_iter,
                        std::vector<size_t>::const_iterator node_end,
                        std::vector<size_t>& elems, MsqError& err )
{
  if (node_iter == node_end || !is_vertex_valid( *node_iter ))
  {
    MSQ_SETERR(err)(MsqError::INVALID_ARG);
    return;
  }
  
    // Get list of elements adjacent to first node
  elems = vertexList[*node_iter].adjacencies;
  
    // For each aditional node, intersect elems with elements adjacent to node
  for (++node_iter; node_iter != node_end; ++node_iter)
  {
    std::vector<size_t>::iterator elem_iter = elems.begin();
    while (elem_iter != elems.end())
    {
      std::vector<size_t>::const_iterator adj_iter = vertexList[*node_iter].adjacencies.begin();
      const std::vector<size_t>::const_iterator adj_end = vertexList[*node_iter].adjacencies.end();
      for (; adj_iter != adj_end; ++adj_iter)
        if (*elem_iter == *adj_iter)
          break;
      
      if (adj_iter == adj_end)
      {
        *elem_iter = elems[elems.size()-1];
        elems.pop_back();
      }
      else
      {
        ++elem_iter;
      }
    }
  }
}
Пример #11
0
void MeshImplData::set_element( size_t index,
                                const std::vector<size_t>& vertices,
                                EntityTopology topology,
                                MsqError& err )
{
  if (index >= elementList.size())
  {
    MSQ_SETERR(err)("Invalid element handle", MsqError::INVALID_ARG);
    return;
  }

  elementList[index].connectivity = vertices;
  elementList[index].topology = topology;
  
  for (std::vector<size_t>::const_iterator iter = vertices.begin();
       iter != vertices.end(); ++iter)
  {
    if (!is_vertex_valid( *iter ))
    {
      MSQ_SETERR(err)("Invalid vertex handle", MsqError::INVALID_ARG);
      return;
    }
    
    std::vector<size_t>& adj = vertexList[*iter].adjacencies;
    for (std::vector<size_t>::iterator iter2 = adj.begin();
         iter2 != adj.end(); ++iter2)
      if (*iter2 == index)
        return;
    
    adj.push_back( index );
  }
  
  unsigned numvert = TopologyInfo::corners( elementList[index].topology );
  if (numvert) 
    for (unsigned i = numvert; i < elementList[index].connectivity.size(); ++i)
      ++vertexList[elementList[index].connectivity[i]].midcount;
}
Пример #12
0
bool MeshImplData::is_corner_node( size_t index ) const
{
  return is_vertex_valid(index) && vertexList[index].midcount < vertexList[index].adjacencies.size();
}
Пример #13
0
bool MeshImplData::is_mid_node( size_t index ) const
{
  return is_vertex_valid(index) && vertexList[index].midcount > 0;
}
Пример #14
0
void MeshImplData::copy_higher_order( std::vector<size_t>& mid_nodes,
                                      std::vector<size_t>& vertices,
                                      std::vector<size_t>& vertex_indices,
                                      std::vector<size_t>& index_offsets,
                                      MsqError& err )
{
  mid_nodes.clear();
  vertices.clear();
  vertex_indices.clear();
  index_offsets.clear();
 
    // Create a map of from vertex handle to index in "vertices"
    // Use vertexList.size() to mean uninitialized.
  size_t v;
  std::vector<size_t> vert_map( vertexList.size() );
  for (v = 0; v < vertexList.size(); ++v)
    vert_map[v] = vertexList.size();

    // Loop over all mid-side vertices
  for (v = 0; v < vertexList.size(); ++v)
  {
    const Vertex& vert = vertexList[v];
    
      // Not a mid-side vertex, skip it
    if (!vert.valid || !vert.midcount)
      continue;
      
      // Populate "verts" with the handles of all adjacent corner vertices
    assert( vert.adjacencies.size() ); // shouldn't be able to fail if vert.midcount > 0
    int elem_indx = vert.adjacencies[0];
    Element& elem = elementList[elem_indx];
    
      // Find index of node in elem's connectivity list
    unsigned index;
    for (index = 0; index < elem.connectivity.size(); ++index)
      if (elem.connectivity[index] == v)
        break;
    if (index == elem.connectivity.size())
    {
      MSQ_SETERR(err)("Inconsistent data.", MsqError::INTERNAL_ERROR);
      return;
    }

      // Given the index in the element's connectivity list,
      // get the side of the element containing the mid-node.
    unsigned side_dim, side_num;
    TopologyInfo::side_number( elem.topology, elem.connectivity.size(),
                          index, side_dim, side_num, err ); MSQ_ERRRTN(err);

    if (!side_dim) // Not a mid-side node
    {
      MSQ_SETERR(err)(MsqError::INVALID_STATE,"Improperly connected mesh.");
      return;
    }

      // Get the adjacent corner vertices from the element side.
    unsigned num_corners;
    const unsigned* corner_indices = TopologyInfo::side_vertices( 
      elem.topology, side_dim, side_num, num_corners, err ); MSQ_ERRRTN(err);

      // Add the mid-side node to the output list
    mid_nodes.push_back( v );
      // Store offset at which the indices of the corner
      // vertices adjacent to this mid-side node will be 
      // stored in "vertex_indices".
    index_offsets.push_back( vertex_indices.size() );
      // For each adjacent corner vertex, if the vertex is not
      // already in "vertices" add it, and add the index to
      // the adjacency list for this mid-side node.
    for (unsigned i = 0; i < num_corners; ++i)
    {
      size_t vert_idx = elem.connectivity[corner_indices[i]];
      assert( is_vertex_valid(vert_idx) );
      
      if (vert_map[vert_idx] == vertexList.size())
      {
        vert_map[vert_idx] = vertices.size();
        vertices.push_back( vert_idx );
      }
      vertex_indices.push_back( vert_map[vert_idx] );
    }
  }
  index_offsets.push_back( vertex_indices.size() );
}
Пример #15
0
BOOST_AUTO_TEST_CASE_TEMPLATE( intint_bgl_mutable_graph_test, Graph, intint_graphtest_types )
{
  typedef typename boost::graph_traits<Graph>::vertex_descriptor Vertex;
  typedef typename boost::graph_traits<Graph>::vertex_iterator VertexIter;
  typedef typename boost::graph_traits<Graph>::edge_descriptor Edge;
  typedef typename boost::graph_traits<Graph>::edge_iterator EdgeIter;
  typedef typename boost::graph_traits<Graph>::out_edge_iterator OutEdgeIter;
  typedef typename boost::graph_traits<Graph>::in_edge_iterator InEdgeIter;
  
  Graph g;
  
  Vertex v_root = Vertex();
  BOOST_CHECK_NO_THROW( v_root = add_vertex(g) );
  BOOST_CHECK_EQUAL( num_vertices(g), 1);
  BOOST_CHECK_NO_THROW( remove_vertex(v_root,g) );
  BOOST_CHECK_EQUAL( num_vertices(g), 0);
  
  BOOST_CHECK_NO_THROW( v_root = add_vertex(1, g) );
  g[v_root] = 1;
  BOOST_CHECK_EQUAL( g[v_root], 1 );
  
  int vp_rc[] = {2,3,4,5};
  int ep_rc[] = {1002,1003,1004,1005};
  Vertex v_rc[4];
  Edge e_rc[4];
  for(int i = 0; i < 4; ++i) {
    BOOST_CHECK_NO_THROW( v_rc[i] = add_vertex(g) );
    g[ v_rc[i] ] = vp_rc[i];
    BOOST_CHECK_EQUAL( g[ v_rc[i] ], vp_rc[i] );
    bool edge_added_success = false;
    BOOST_CHECK_NO_THROW( boost::tie(e_rc[i],edge_added_success) = add_edge(v_root, v_rc[i], g) );
    BOOST_CHECK( edge_added_success );
    g[ e_rc[i] ] = ep_rc[i];
    BOOST_CHECK_EQUAL( g[ e_rc[i] ], ep_rc[i] );
  };
  BOOST_CHECK_EQUAL( num_vertices(g), 5 );
  
  int vp_rc1c[] = {6,7,8,9};
  int ep_rc1c[] = {2006,2007,2008,2009};
  Vertex v_rc1c[4];
  Edge e_rc1c[4];
  for(std::size_t i = 0; i < 4; ++i) {
    BOOST_CHECK_NO_THROW( v_rc1c[i] = add_vertex(vp_rc1c[i], g) );
    BOOST_CHECK_EQUAL( g[ v_rc1c[i] ], vp_rc1c[i] );
    bool edge_added_success = false;
    BOOST_CHECK_NO_THROW( boost::tie(e_rc1c[i],edge_added_success) = add_edge(v_rc[0], v_rc1c[i], ep_rc1c[i], g) );
    BOOST_CHECK( edge_added_success );
    BOOST_CHECK_EQUAL( g[ e_rc1c[i] ], ep_rc1c[i] );
  };
  BOOST_CHECK_EQUAL( num_vertices(g), 9 );
  
  
  BOOST_CHECK_EQUAL( g[v_root], 1 );
  {
    OutEdgeIter ei, ei_end;
    BOOST_CHECK_NO_THROW( boost::tie(ei,ei_end) = out_edges(v_root,g) );
    std::vector<int> e_list;
    for(; ei != ei_end; ++ei) {
      if(is_edge_valid(*ei,g)) {
        BOOST_CHECK_EQUAL( g[*ei], (g[source(*ei,g)] * 1000 + g[target(*ei,g)]) );
        e_list.push_back(g[*ei]);
      };
    };
    std::sort(e_list.begin(), e_list.end());
    BOOST_CHECK_EQUAL( e_list[0], 1002);
    BOOST_CHECK_EQUAL( e_list[1], 1003);
    BOOST_CHECK_EQUAL( e_list[2], 1004);
    BOOST_CHECK_EQUAL( e_list[3], 1005);
    
    
    InEdgeIter iei, iei_end;
    BOOST_CHECK_NO_THROW( boost::tie(iei, iei_end) = in_edges(v_rc[0], g) );
    BOOST_CHECK( iei != iei_end );
    BOOST_CHECK_EQUAL( g[*iei], 1002);
    ++iei;
    BOOST_CHECK( iei == iei_end );
    
    
    BOOST_CHECK_NO_THROW( boost::tie(ei,ei_end) = out_edges(v_rc[0],g) );
    std::vector<int> e_list2;
    for(; ei != ei_end; ++ei) {
      if(is_edge_valid(*ei,g)) {
        BOOST_CHECK_EQUAL( g[*ei], (g[source(*ei,g)] * 1000 + g[target(*ei,g)]) );
        e_list2.push_back(g[*ei]);
      };
    };
    std::sort(e_list2.begin(), e_list2.end());
    BOOST_CHECK_EQUAL( e_list2[0], 2006);
    BOOST_CHECK_EQUAL( e_list2[1], 2007);
    BOOST_CHECK_EQUAL( e_list2[2], 2008);
    BOOST_CHECK_EQUAL( e_list2[3], 2009);

  };
  
  int vp_rc2c[] = {10,11,12,13};
  int ep_rc2c[] = {3010,3011,3012,3013};
  Vertex v_rc2c[4];
  Edge e_rc2c[4];
  for(std::size_t i = 0; i < 4; ++i) {
#ifdef RK_ENABLE_CXX0X_FEATURES
    BOOST_CHECK_NO_THROW( v_rc2c[i] = add_vertex(std::move(vp_rc2c[i]), g) );
#else
    BOOST_CHECK_NO_THROW( v_rc2c[i] = add_vertex(vp_rc2c[i], g) );
#endif
    bool edge_added_success = false;
#ifdef RK_ENABLE_CXX0X_FEATURES
    BOOST_CHECK_NO_THROW( boost::tie(e_rc2c[i],edge_added_success) = add_edge(v_rc[1], v_rc2c[i], ep_rc2c[i], g) );
#else
    BOOST_CHECK_NO_THROW( boost::tie(e_rc2c[i],edge_added_success) = add_edge(v_rc[1], v_rc2c[i], ep_rc2c[i], g) );
#endif
    BOOST_CHECK( edge_added_success );
  };
  BOOST_CHECK_EQUAL( num_vertices(g), 13 );
  
  {
    OutEdgeIter ei, ei_end;
    BOOST_CHECK_NO_THROW( boost::tie(ei,ei_end) = out_edges(v_rc[1],g) );
    std::vector<int> e_list;
    std::vector<int> vp_list;
    for(; ei != ei_end; ++ei) {
      if(is_edge_valid(*ei,g)) {
        BOOST_CHECK_EQUAL( g[*ei], (g[source(*ei,g)] * 1000 + g[target(*ei,g)]) );
        e_list.push_back(g[*ei]);
        vp_list.push_back(g[target(*ei,g)]);
      };
    };
    std::sort(e_list.begin(), e_list.end());
    BOOST_CHECK_EQUAL( e_list[0], 3010);
    BOOST_CHECK_EQUAL( e_list[1], 3011);
    BOOST_CHECK_EQUAL( e_list[2], 3012);
    BOOST_CHECK_EQUAL( e_list[3], 3013);
    
    std::sort(vp_list.begin(), vp_list.end());
    BOOST_CHECK_EQUAL( vp_list[0], 10);
    BOOST_CHECK_EQUAL( vp_list[1], 11);
    BOOST_CHECK_EQUAL( vp_list[2], 12);
    BOOST_CHECK_EQUAL( vp_list[3], 13);
  };
  
  BOOST_CHECK_NO_THROW( clear_vertex(v_rc[0],g) );
  
  BOOST_CHECK_EQUAL( out_degree(v_rc[0], g), 0 );
  BOOST_CHECK_EQUAL( in_degree(v_rc[0], g), 0 );
  BOOST_CHECK_EQUAL( out_degree(v_root, g), 3 );
  BOOST_CHECK_EQUAL( in_degree(v_rc1c[0], g), 0 );
  BOOST_CHECK_EQUAL( in_degree(v_rc1c[1], g), 0 );
  BOOST_CHECK_EQUAL( in_degree(v_rc1c[2], g), 0 );
  BOOST_CHECK_EQUAL( in_degree(v_rc1c[3], g), 0 );
  
  BOOST_CHECK_EQUAL( num_vertices(g), 13 );
  {
    VertexIter vi, vi_end;
    BOOST_CHECK_NO_THROW( boost::tie(vi, vi_end) = vertices(g) );
    std::vector<int> vp_list;
    for(; vi != vi_end; ++vi)
      if( is_vertex_valid(*vi, g) )
        vp_list.push_back( g[*vi] );
    std::sort(vp_list.begin(), vp_list.end());
    BOOST_CHECK_EQUAL( vp_list[0], 1 );
    BOOST_CHECK_EQUAL( vp_list[1], 2 );
    BOOST_CHECK_EQUAL( vp_list[2], 3 );
    BOOST_CHECK_EQUAL( vp_list[3], 4 );
    BOOST_CHECK_EQUAL( vp_list[4], 5 );
    BOOST_CHECK_EQUAL( vp_list[5], 6 );
    BOOST_CHECK_EQUAL( vp_list[6], 7 );
    BOOST_CHECK_EQUAL( vp_list[7], 8 );
    BOOST_CHECK_EQUAL( vp_list[8], 9 );
    BOOST_CHECK_EQUAL( vp_list[9], 10 );
    BOOST_CHECK_EQUAL( vp_list[10], 11 );
    BOOST_CHECK_EQUAL( vp_list[11], 12 );
    BOOST_CHECK_EQUAL( vp_list[12], 13 );
  };
  
  BOOST_CHECK_EQUAL( num_edges(g), 7 );
  {
    EdgeIter ei, ei_end;
    BOOST_CHECK_NO_THROW( boost::tie(ei, ei_end) = edges(g) );
    std::vector<int> ep_list;
    for(; ei != ei_end; ++ei)
      if( is_edge_valid(*ei, g) )
        ep_list.push_back( g[*ei] );
    std::sort(ep_list.begin(), ep_list.end());
    BOOST_CHECK_EQUAL( ep_list[0], 1003 );
    BOOST_CHECK_EQUAL( ep_list[1], 1004 );
    BOOST_CHECK_EQUAL( ep_list[2], 1005 );
    BOOST_CHECK_EQUAL( ep_list[3], 3010 );
    BOOST_CHECK_EQUAL( ep_list[4], 3011 );
    BOOST_CHECK_EQUAL( ep_list[5], 3012 );
    BOOST_CHECK_EQUAL( ep_list[6], 3013 );
  };
  
  
  
  BOOST_CHECK_NO_THROW( remove_edge(v_rc[1], v_rc2c[2], g) );
  
  BOOST_CHECK_EQUAL( num_vertices(g), 13 );
  {
    VertexIter vi, vi_end;
    BOOST_CHECK_NO_THROW( boost::tie(vi, vi_end) = vertices(g) );
    std::vector<int> vp_list;
    for(; vi != vi_end; ++vi) {
      if( is_vertex_valid(*vi, g) ) {
        vp_list.push_back( g[*vi] );
      };
    };
    std::sort(vp_list.begin(), vp_list.end());
    BOOST_CHECK_EQUAL( vp_list[0], 1 );
    BOOST_CHECK_EQUAL( vp_list[1], 2 );
    BOOST_CHECK_EQUAL( vp_list[2], 3 );
    BOOST_CHECK_EQUAL( vp_list[3], 4 );
    BOOST_CHECK_EQUAL( vp_list[4], 5 );
    BOOST_CHECK_EQUAL( vp_list[5], 6 );
    BOOST_CHECK_EQUAL( vp_list[6], 7 );
    BOOST_CHECK_EQUAL( vp_list[7], 8 );
    BOOST_CHECK_EQUAL( vp_list[8], 9 );
    BOOST_CHECK_EQUAL( vp_list[9], 10 );
    BOOST_CHECK_EQUAL( vp_list[10], 11 );
    BOOST_CHECK_EQUAL( vp_list[11], 12 );
    BOOST_CHECK_EQUAL( vp_list[12], 13 );
  };
  
  BOOST_CHECK_EQUAL( num_edges(g), 6 );
  {
    EdgeIter ei, ei_end;
    BOOST_CHECK_NO_THROW( boost::tie(ei, ei_end) = edges(g) );
    std::vector<int> ep_list;
    for(; ei != ei_end; ++ei) {
      if( is_edge_valid(*ei, g) ) {
        ep_list.push_back( g[*ei] );
      };
    };
    std::sort(ep_list.begin(), ep_list.end());
    BOOST_CHECK_EQUAL( ep_list[0], 1003 );
    BOOST_CHECK_EQUAL( ep_list[1], 1004 );
    BOOST_CHECK_EQUAL( ep_list[2], 1005 );
    BOOST_CHECK_EQUAL( ep_list[3], 3010 );
    BOOST_CHECK_EQUAL( ep_list[4], 3011 );
    BOOST_CHECK_EQUAL( ep_list[5], 3013 );
  };
  
  
  
  BOOST_CHECK_NO_THROW( remove_edge(e_rc2c[3], g) );
  
  BOOST_CHECK_EQUAL( num_vertices(g), 13 );
  {
    VertexIter vi, vi_end;
    BOOST_CHECK_NO_THROW( boost::tie(vi, vi_end) = vertices(g) );
    std::vector<int> vp_list;
    for(; vi != vi_end; ++vi) {
      if( is_vertex_valid(*vi, g) ) {
        vp_list.push_back( g[*vi] );
      };
    };
    std::sort(vp_list.begin(), vp_list.end());
    BOOST_CHECK_EQUAL( vp_list[0], 1 );
    BOOST_CHECK_EQUAL( vp_list[1], 2 );
    BOOST_CHECK_EQUAL( vp_list[2], 3 );
    BOOST_CHECK_EQUAL( vp_list[3], 4 );
    BOOST_CHECK_EQUAL( vp_list[4], 5 );
    BOOST_CHECK_EQUAL( vp_list[5], 6 );
    BOOST_CHECK_EQUAL( vp_list[6], 7 );
    BOOST_CHECK_EQUAL( vp_list[7], 8 );
    BOOST_CHECK_EQUAL( vp_list[8], 9 );
    BOOST_CHECK_EQUAL( vp_list[9], 10 );
    BOOST_CHECK_EQUAL( vp_list[10], 11 );
    BOOST_CHECK_EQUAL( vp_list[11], 12 );
    BOOST_CHECK_EQUAL( vp_list[12], 13 );
  };
  
  BOOST_CHECK_EQUAL( num_edges(g), 5 );
  {
    EdgeIter ei, ei_end;
    BOOST_CHECK_NO_THROW( boost::tie(ei, ei_end) = edges(g) );
    std::vector<int> ep_list;
    for(; ei != ei_end; ++ei) {
      if( is_edge_valid(*ei, g) ) {
        ep_list.push_back( g[*ei] );
      };
    };
    std::sort(ep_list.begin(), ep_list.end());
    BOOST_CHECK_EQUAL( ep_list[0], 1003 );
    BOOST_CHECK_EQUAL( ep_list[1], 1004 );
    BOOST_CHECK_EQUAL( ep_list[2], 1005 );
    BOOST_CHECK_EQUAL( ep_list[3], 3010 );
    BOOST_CHECK_EQUAL( ep_list[4], 3011 );
  };
  
  
  
  BOOST_CHECK_NO_THROW( clear_vertex(v_rc2c[0], g) );
  BOOST_CHECK_NO_THROW( remove_vertex(v_rc2c[0], g) );
  
  BOOST_CHECK_EQUAL( num_vertices(g), 12 );
  {
    VertexIter vi, vi_end;
    BOOST_CHECK_NO_THROW( boost::tie(vi, vi_end) = vertices(g) );
    std::vector<int> vp_list;
    for(; vi != vi_end; ++vi) {
      if( is_vertex_valid(*vi, g) ) {
        vp_list.push_back( g[*vi] );
      };
    };
    std::sort(vp_list.begin(), vp_list.end());
    BOOST_CHECK_EQUAL( vp_list[0], 1 );
    BOOST_CHECK_EQUAL( vp_list[1], 2 );
    BOOST_CHECK_EQUAL( vp_list[2], 3 );
    BOOST_CHECK_EQUAL( vp_list[3], 4 );
    BOOST_CHECK_EQUAL( vp_list[4], 5 );
    BOOST_CHECK_EQUAL( vp_list[5], 6 );
    BOOST_CHECK_EQUAL( vp_list[6], 7 );
    BOOST_CHECK_EQUAL( vp_list[7], 8 );
    BOOST_CHECK_EQUAL( vp_list[8], 9 );
    BOOST_CHECK_EQUAL( vp_list[9], 11 );
    BOOST_CHECK_EQUAL( vp_list[10], 12 );
    BOOST_CHECK_EQUAL( vp_list[11], 13 );
  };
  
  BOOST_CHECK_EQUAL( num_edges(g), 4 );
  {
    EdgeIter ei, ei_end;
    BOOST_CHECK_NO_THROW( boost::tie(ei, ei_end) = edges(g) );
    std::vector<int> ep_list;
    for(; ei != ei_end; ++ei) {
      if( is_edge_valid(*ei, g) ) {
        ep_list.push_back( g[*ei] );
      };
    };
    std::sort(ep_list.begin(), ep_list.end());
    BOOST_CHECK_EQUAL( ep_list[0], 1003 );
    BOOST_CHECK_EQUAL( ep_list[1], 1004 );
    BOOST_CHECK_EQUAL( ep_list[2], 1005 );
    BOOST_CHECK_EQUAL( ep_list[3], 3011 );
  };
  
  
};