15 #ifndef INCLUDED_core_pack_interaction_graph_AdditionalBackgroundNodesInteractionGraph_HH
16 #define INCLUDED_core_pack_interaction_graph_AdditionalBackgroundNodesInteractionGraph_HH
26 #include <utility/vector1_bool.hh>
31 namespace interaction_graph {
57 template <
typename V,
typename E,
typename G >
135 template <
typename V,
typename E,
typename G >
173 template <
typename V,
typename E,
typename G >
174 class BackgroundNode {
192 virtual void print()
const = 0;
265 template <
typename V,
typename E,
typename G >
291 bool same_edge(
int fc_node_index,
int bg_node_index )
const;
342 template <
typename V,
typename E,
typename G >
428 template <
typename V,
typename E,
typename G >
430 V( owner, node_id, num_states ),
431 num_edges_to_bg_nodes_(0),
432 bg_edge_vector_up_to_date_(false)
440 template <
typename V,
typename E,
typename G >
456 template <
typename V,
typename E,
typename G >
457 typename std::list< BackgroundToFirstClassEdge< V, E, G >* >::iterator
459 ++num_edges_to_bg_nodes_;
460 bg_edge_vector_up_to_date_ =
false;
461 return bg_edge_list_.insert( bg_edge_list_.end(), edge_ptr );
479 template <
typename V,
typename E,
typename G >
481 --num_edges_to_bg_nodes_;
482 bg_edge_list_.erase( edge );
483 bg_edge_vector_up_to_date_ =
false;
500 template <
typename V,
typename E,
typename G >
504 unsigned int total_memory = V::count_dynamic_memory();
508 total_memory += adjacent_bg_node_indices_.size() *
sizeof(
int );
527 template <
typename V,
typename E,
typename G >
530 bg_edge_vector_.resize( num_edges_to_bg_nodes_ + 1 );
531 adjacent_bg_node_indices_.resize( num_edges_to_bg_nodes_ + 1 );
532 bg_node_vector_.resize( num_edges_to_bg_nodes_ + 1 );
537 std::copy( bg_edge_list_.begin(), bg_edge_list_.end(), position1 );
539 for (
int ii = 1; ii <= num_edges_to_bg_nodes_; ++ii) {
544 bg_edge_vector_[ii]->set_pos_in_node_edgevector(
this, ii );
548 adjacent_bg_node_indices_[ii] = bg_edge_vector_[ii]->get_other_ind(
this );
549 bg_node_vector_[ii] = bg_edge_vector_[ii]->get_other_node(
this );
552 bg_edge_vector_up_to_date_ =
true;
580 template <
typename V,
typename E,
typename G >
582 E ( owner, first_node_ind, second_node_ind ) {}
590 template <
typename V,
typename E,
typename G >
617 template <
typename V,
typename E,
typename G >
619 node_index_( node_index ),
620 num_incident_edges_( 0 ),
621 edge_vector_up_to_date_( false ),
631 template <
typename V,
typename E,
typename G >
646 template <
typename V,
typename E,
typename G >
647 typename std::list< BackgroundToFirstClassEdge< V, E, G >* >::iterator
649 ++num_incident_edges_;
650 edge_vector_up_to_date_ =
false;
651 return edge_list_.insert( edge_list_.end(), edge_ptr );
666 template <
typename V,
typename E,
typename G >
668 --num_incident_edges_;
669 edge_vector_up_to_date_ =
false;
670 edge_list_.erase( edge );
686 template <
typename V,
typename E,
typename G >
689 edge_vector_.resize( num_incident_edges_ + 1);
690 adjacent_first_class_node_indices_.resize( num_incident_edges_ + 1);
691 adjacent_nodes_.resize(num_incident_edges_ + 1);
696 std::copy( edge_list_.begin(), edge_list_.end(), position1 );
698 for (
int ii = 1; ii <= num_incident_edges_; ++ii) {
702 edge_vector_[ii]->set_pos_in_node_edgevector(
this, ii );
704 adjacent_first_class_node_indices_[ ii ] = edge_vector_[ii]->get_other_ind(
this );
705 adjacent_nodes_[ ii ] = edge_vector_[ii]->get_other_node(
this );
708 edge_vector_up_to_date_ =
true;
720 template <
typename V,
typename E,
typename G >
724 if ( (*iter)->same_edge( fc_node_index, node_index_ ) )
744 template <
typename V,
typename E,
typename G >
747 unsigned int total_memory = 0;
748 total_memory += adjacent_first_class_node_indices_.size() *
sizeof(
int );
778 template <
typename V,
typename E,
typename G >
781 first_class_node_index_( fc_node_index ),
782 background_node_index_( bg_node_index),
786 background_node_ = owner_->get_background_node( background_node_index_);
788 pos_in_fc_nodes_edge_list_ = first_class_node_->add_background_edge(
this);
789 pos_in_bg_nodes_edge_list_ = background_node_->add_edge(
this);
800 template <
typename V,
typename E,
typename G >
802 first_class_node_->drop_background_edge( pos_in_fc_nodes_edge_list_ );
803 background_node_->drop_edge( pos_in_bg_nodes_edge_list_ );
804 owner_->drop_background_edge( pos_in_owners_edge_list_ );
822 template <
typename V,
typename E,
typename G >
824 return background_node_index_;
842 template <
typename V,
typename E,
typename G >
844 return first_class_node_index_;
858 template <
typename V,
typename E,
typename G >
860 return background_node_;
874 template <
typename V,
typename E,
typename G >
876 return first_class_node_;
888 template <
typename V,
typename E,
typename G >
891 pos_in_owners_edge_list_ = iter;
908 template <
typename V,
typename E,
typename G >
910 pos_in_fc_edge_vector_ = pos;
927 template <
typename V,
typename E,
typename G >
929 pos_in_bg_edge_vector_ = pos;
948 template <
typename V,
typename E,
typename G >
950 return ( (first_class_node_index_ == fc_node_index) && (background_node_index_ == bg_node_index) );
962 template <
typename V,
typename E,
typename G >
981 template <
typename V,
typename E,
typename G >
985 focused_bg_edge_( 0 )
999 template <
typename V,
typename E,
typename G >
1011 for (
int ii = 1; ii <= num_bg_nodes_; ++ii) {
1012 delete bg_nodes_[ ii ];
1027 template <
typename V,
typename E,
typename G >
1029 bg_to_fc_edge_list_.erase( iter );
1043 template <
typename V,
typename E,
typename G >
1046 assert( num_bg_nodes_ == -1 && num_bg_nodes >= 0);
1047 num_bg_nodes_ = num_bg_nodes;
1049 if ( num_bg_nodes_ == 0 )
1052 bg_nodes_.resize( num_bg_nodes_ + 1 );
1053 for (
int ii = 1; ii <= num_bg_nodes_; ++ii ) {
1054 bg_nodes_[ii] = create_background_node(ii);
1068 template <
typename V,
typename E,
typename G >
1072 bg_to_fc_edge_list_.push_front( new_edge );
1074 focused_bg_edge_ = new_edge;
1093 template <
typename V,
typename E,
typename G >
1097 if ( (focused_bg_edge_ != 0) && !( focused_bg_edge_->same_edge(first_class_node_index, bg_node_index) ) ) {
1098 focused_bg_edge_ = bg_nodes_[ bg_node_index ]->find_edge( first_class_node_index );
1100 return focused_bg_edge_;
1118 template <
typename V,
typename E,
typename G >
1130 (*iter)->prepare_for_simulated_annealing();
1134 for (
int ii = 1; ii <= num_bg_nodes_; ++ii) {
1136 bg_nodes_[ ii ]->prepare_for_simulated_annealing();
1148 template <
typename V,
typename E,
typename G >
1151 unsigned int total_memory = G::getTotalMemoryUsage();
1153 for (
int ii = 1; ii <= get_num_background_nodes(); ++ii) {
1154 total_memory += bg_nodes_[ii]->count_dynamic_memory();
1155 total_memory += bg_nodes_[ii]->count_static_memory();
1159 total_memory += (*iter)->count_dynamic_memory();
1160 total_memory += (*iter)->count_static_memory();
1163 return total_memory;
1172 template <
typename V,
typename E,
typename G >
1175 unsigned int total_memory = G::count_dynamic_memory();
1180 return total_memory;