30 #include <platform/types.hh>
33 #include <utility/down_cast.hh>
34 #include <utility/vector1_bool.hh>
35 #include <utility/pointer/ReferenceCount.fwd.hh>
36 #include <utility/pointer/ReferenceCount.hh>
37 #include <utility/pointer/owning_ptr.functions.hh>
38 #include <utility/pointer/owning_ptr.fwd.hh>
39 #include <utility/pointer/owning_ptr.hh>
40 #include <ObjexxFCL/Dimension.fwd.hh>
41 #include <ObjexxFCL/Dimension.hh>
42 #include <ObjexxFCL/DimensionExpression.hh>
43 #include <ObjexxFCL/DynamicIndexRange.fwd.hh>
44 #include <ObjexxFCL/DynamicIndexRange.hh>
45 #include <ObjexxFCL/FArray.fwd.hh>
46 #include <ObjexxFCL/FArray.hh>
47 #include <ObjexxFCL/FArray2.fwd.hh>
48 #include <ObjexxFCL/FArray2.hh>
49 #include <ObjexxFCL/FArray2D.fwd.hh>
50 #include <ObjexxFCL/FArray2D.hh>
51 #include <ObjexxFCL/FArrayInitializer.fwd.hh>
52 #include <ObjexxFCL/FArrayInitializer.hh>
53 #include <ObjexxFCL/FArraySection.fwd.hh>
54 #include <ObjexxFCL/FArraySection.hh>
55 #include <ObjexxFCL/FArrayTraits.fwd.hh>
56 #include <ObjexxFCL/FArrayTraits.hh>
57 #include <ObjexxFCL/IndexRange.fwd.hh>
58 #include <ObjexxFCL/IndexRange.hh>
59 #include <ObjexxFCL/InitializerSentinel.hh>
60 #include <ObjexxFCL/Observer.fwd.hh>
61 #include <ObjexxFCL/Observer.hh>
62 #include <ObjexxFCL/ObserverMulti.hh>
63 #include <ObjexxFCL/ObserverSingle.hh>
64 #include <ObjexxFCL/ProxySentinel.hh>
65 #include <ObjexxFCL/SetWrapper.fwd.hh>
66 #include <ObjexxFCL/Star.fwd.hh>
67 #include <ObjexxFCL/Star.hh>
68 #include <ObjexxFCL/proxy_const_assert.hh>
73 #include <boost/pool/pool.hpp>
74 #include <boost/pool/poolfwd.hpp>
77 using namespace ObjexxFCL;
86 edge_list_element_pool_( edge_list_element_pool ),
97 eiter != eiter_end; ) {
142 assert( element_to_insert_before.
owner_ ==
this );
151 prev_node->
next_ = new_node;
157 assert( to_erase.
owner_ ==
this );
170 prev_node->
next_ = next_node;
181 eiter != eiter_end; ++eiter ) {
204 node_index_(node_id), num_incident_edges_(0),
205 num_neighbors_counting_self_static_(1),
206 loop_incident_( false ),
207 num_edges_to_smaller_indexed_nodes_(0),
208 num_edges_to_larger_indexed_nodes_(0),
209 incident_edge_list_( owner->edge_list_element_pool() ),
210 first_upper_edge_( incident_edge_list_.
end() ),
268 if ( ! (*eiter)->is_loop() )
348 if ( (*iter)->same_edge(
node_index_, other_node) )
358 std::cout <<
"Node " <<
get_node_index() <<
" attached to edges: " << std::endl;
362 iter != iter_end; ++iter ) {
363 std::cout <<
" Edge( " << (*iter)->get_first_node_ind() <<
", ";
364 std::cout << (*iter)->get_second_node_ind() <<
")" << std::endl;
373 return sizeof(
Node );
422 assert( first_node_ind <= second_node_ind );
423 node_indices_[0] = first_node_ind;
424 node_indices_[1] = second_node_ind;
425 nodes_[0] = owner->
nodes_[ node_indices_[0] ];
426 nodes_[1] = owner->
nodes_[ node_indices_[1] ];
428 nodes_[0]->add_edge(
this, pos_in_nodes_edge_list_[0] );
429 nodes_[1]->add_edge(
this, pos_in_nodes_edge_list_[1] );
463 assert(
this == *iter );
489 return sizeof(
Edge );
521 edge_list_element_pool_( new boost::unordered_object_pool<
EdgeListElement > ( 256 ) ),
522 edge_list_( *edge_list_element_pool_ ),
523 edge_pool_( new boost::unordered_object_pool<
Edge > ( 256 ) ),
534 num_nodes_(num_nodes),
535 nodes_(num_nodes, (
Node*) 0),
537 edge_list_element_pool_( new boost::unordered_object_pool<
EdgeListElement > ( 256 ) ),
538 edge_list_( *edge_list_element_pool_ ),
539 edge_pool_( new boost::unordered_object_pool<
Edge > ( 256 ) ),
557 num_nodes_( source.num_nodes_ ),
558 nodes_( num_nodes_, (
Node *) 0 ),
560 edge_list_element_pool_( new boost::unordered_object_pool<
EdgeListElement > ( 256 ) ),
561 edge_list_( *edge_list_element_pool_ ),
562 edge_pool_( new boost::unordered_object_pool<
Edge > ( 256 ) ),
573 iter != iter_end; ++iter ) {
574 platform::Size const n1((*iter)->get_first_node_ind()), n2((*iter)->get_second_node_ind());
590 if (
this == &source )
return *
this;
602 iter != iter_end; ++iter ) {
619 iter != iter_end; ++iter ) {
620 platform::Size const n1((*iter)->get_first_node_ind()), n2((*iter)->get_second_node_ind());
641 index2 = index1 < index2 ? index2 : index1;
691 return (edge != NULL);
707 iter != iter_end; ) {
733 os <<
"edge " << counter <<
" between " << (*iter)->get_first_node_ind()
734 <<
" " << (*iter)->get_second_node_ind() << std::endl;
747 os <<
"DIMACS: " <<
"p edges " <<
num_nodes_ <<
" " ;
748 os << num_edges << std::endl;
750 os <<
"DIMACS: " <<
"e " << (*iter)->get_first_node_ind();
751 os <<
" " << (*iter)->get_second_node_ind() << std::endl;
775 if (! (*iter)->is_loop() ) {
776 distance_table( n2, n1 ) = 1;
777 distance_table( n1, n2 ) = 1;
788 int const jj_2_kk = distance_table( jj, kk );
789 int const jj_2_ii = distance_table( jj, ii );
790 int const ii_2_kk = distance_table( ii, kk );
792 int const jj_2_ii_2_kk = jj_2_ii + ii_2_kk;
794 if ( jj_2_kk > jj_2_ii_2_kk ) {
795 distance_table( jj, kk ) = jj_2_ii_2_kk;
796 distance_table( kk, jj ) = jj_2_ii_2_kk;
802 return distance_table;
889 total_memory +=
nodes_[ ii ]->count_dynamic_memory();
890 total_memory +=
nodes_[ ii ]->count_static_memory();
894 total_memory += (*iter)->count_dynamic_memory();
895 total_memory += (*iter)->count_static_memory();
906 return sizeof(
Graph );
924 return new Node(
this, index );
931 return edge_pool_->construct(
this, index1, index2 );