Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MinimalistFlexbbInteractionGraph.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file protocols/flexpack/interaction_graph/MinimalistFlexbbInteractionGraph.cc
11 /// @brief Class implementation for minimimalist on-the-fly RPE calculating FlexbbInteractionGraph
12 /// @author Andrew Leaver-Fay (aleaverfay@gmail.com)
13 
14 // Unit headers
16 
17 /// Project headers
18 // AUTO-REMOVED #include <core/conformation/Residue.hh>
19 
20 /// C++ headers
21 #include <iostream>
22 
23 #include <utility/exit.hh>
24 #include <utility/vector1.hh>
25 
26 
27 namespace protocols {
28 namespace flexpack {
29 namespace interaction_graph {
30 
33  int node_id,
34  int num_states
35 ) :
36  parent( owner, node_id, num_states )
37 {}
38 
40 {}
41 
42 /// Virtual functions from NodeBase
43 void
45 {
46  set_current_state( 0 );
49  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
52  }
54 }
55 
56 void
58 {
60 }
61 
62 /*
63 void
64 MinimalistFlexbbNode::add_to_one_body_energy( int state, PackerEnergy energy );
65 
66 void
67 MinimalistFlexbbNode::update_one_body_energy( int state, PackerEnergy energy);
68 
69 void
70 MinimalistFlexbbNode::zero_one_body_energies();
71 */
72 
73 void
75 {
76  parent::print();
77 }
78 
79 //bool
80 //MinimalistFlexbbNode::state_unassigned() const
81 //{
82 // return current_state() == 0;
83 //}
84 
85 
88  int alternate_state,
89  PackerEnergy & prev_energy_for_node
90 )
91 {
92  assert( get_bb_for_state( current_state() ) == 0 || get_bb_for_state( alternate_state ) == get_bb_for_state( current_state() ));
94  set_alternate_state( alternate_state );
96 
98  prev_energy_for_node = curr_state_total_energy();
99 
100  /// for debugging -- make sure that curr_state_total_energy
101  /// has not accumulated too much numerical noise.
102  //Real curr_state_actual_total = curr_state_one_body_energy();
103  //PackerEnergy two_body_energy_sum( 0.0 );
104 
105  //std::cout << "\npdE: " << get_node_index() << " alt state: " << alternate_state << " amino acid " << rotamer( alternate_state ).aa() ;
106  //std::cout << " coord: " << rotamer( alternate_state ).xyz( rotamer( alternate_state ).nheavyatoms() ).x() <<
107  // " " << rotamer( alternate_state ).xyz( rotamer( alternate_state ).nheavyatoms() ).y() <<
108  // " " << rotamer( alternate_state ).xyz( rotamer( alternate_state ).nheavyatoms() ).z() << std::endl;
109  //std::cout << "alt state one body energy: " << one_body_energies()[ alternate_state ] << " vs curr: " << one_body_energies()[ current_state() ] << std::endl;
110 
111  for ( int ii = 1; ii <= get_num_edges_to_smaller_indexed_nodes(); ++ii ) {
113  get_node_index(), alternate_state, alternate_state_info() );
115  ii, get_incident_otfflexbb_edge( ii )->compute_samebbconf_alternate_state_energy_second_node());
117 
118  //std::cout << "\n" << get_index_of_adjacent_node( ii ) << " " << alternate_state_two_body_energies( ii );
119  /*
120  two_body_energy_sum += alternate_state_two_body_energies( ii );
121  if ( get_node_index() == 17 && alternate_state == 63 ) {
122  std::cout << "Two-Body Energy Predicted: " << get_node_index() << " " << get_index_of_adjacent_node( ii ) << " " << alternate_state_two_body_energies( ii ) << std::endl;
123  }
124  curr_state_actual_total += curr_state_two_body_energies()[ ii ];
125  if ( std::abs( curr_state_two_body_energies()[ ii ] - get_incident_otfflexbb_edge( ii )->cur_energy()) > 1e-6 ) {
126  std::cout << "CURRENT STATE ENERGY DISCREPANCY: " << get_node_index() << " " << get_index_of_adjacent_node( ii ) <<
127  " local: " << curr_state_two_body_energies()[ ii ] <<
128  " on edge: " << get_incident_otfflexbb_edge( ii )->cur_energy() <<
129  " diff: " << curr_state_two_body_energies()[ ii ] - get_incident_otfflexbb_edge( ii )->cur_energy() <<
130  std::endl;
131  }
132  */
133  }
134 
135  for ( int ii = get_num_edges_to_smaller_indexed_nodes() + 1; ii <= get_num_incident_edges(); ++ii ) {
137  get_node_index(), alternate_state, alternate_state_info() );
139  ii, get_incident_otfflexbb_edge( ii )->compute_samebbconf_alternate_state_energy_first_node() );
141  /*
142  if ( get_node_index() == 17 && alternate_state == 63 ) {
143  std::cout << "Two-Body Energy Predicted: " << get_node_index() << " " << get_index_of_adjacent_node( ii ) << " " << alternate_state_two_body_energies( ii ) << std::endl;
144  }
145  //std::cout << "\n" << get_index_of_adjacent_node( ii ) << " " << alternate_state_two_body_energies( ii );
146  two_body_energy_sum += alternate_state_two_body_energies( ii );
147  curr_state_actual_total += curr_state_two_body_energies()[ ii ];
148  if ( std::abs( curr_state_two_body_energies()[ ii ] - get_incident_otfflexbb_edge( ii )->cur_energy()) > 1e-6 ) {
149  std::cout << "CURRENT STATE ENERGY DISCREPANCY: " << get_node_index() << " " << get_index_of_adjacent_node( ii ) <<
150  " local: " << curr_state_two_body_energies()[ ii ] <<
151  " on edge: " << get_incident_otfflexbb_edge( ii )->cur_energy() <<
152  " diff: " << curr_state_two_body_energies()[ ii ] - get_incident_otfflexbb_edge( ii )->cur_energy() <<
153  std::endl;
154  }
155  */
156  }
157  //std::cout << "\n Two body energy total: " << two_body_energy_sum << std::endl;
158  //std::cout << "\n Alt state total energy: " << alternate_state_total_energy() << " vs curr: " << curr_state_total_energy() << std::endl;
159 
160 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
161  get_otfflexbbig_owner()->debug_note_considered_substitution( rotamer( alternate_state ), alternate_state - state_offsets_for_bb()[ alternate_state_info().get_bb() ] );
162  //get_otfflexbbig_owner()->debug_note_considered_substitution( rotamer( alternate_state ), alternate_state );
163 #endif
164 
165  /*if ( std::abs( curr_state_actual_total - curr_state_total_energy()) > 1e-6 ) {
166  std::cout << "Inaccurate current energy: " << get_node_index() << " " << alternate_state << " "
167  << curr_state_actual_total << " " << curr_state_total_energy() << std::endl;
168  }
169  if ( get_node_index() == 17 && alternate_state == 63 ) {
170  std::cout << "Alternate_state_total_energy: " << alternate_state_total_energy() << " " << two_body_energy_sum
171  << " " << alternate_state_one_body_energy() + two_body_energy_sum
172  << " " << alternate_state_total_energy() - curr_state_total_energy()
173  << " " << alternate_state_total_energy() - curr_state_actual_total
174  << std::endl;
175  }*/
176 
178 
179 }
180 
181 /*
182 MinimalistFlexbbNode::PackerEnergy
183 MinimalistFlexbbNode::project_deltaE_with_backbone_move(
184  int alternate_state,
185  PackerEnergy & prev_energy_for_flexseg,
186  bool & valid_motion
187 )
188 {
189  //std::cout << "project_deltaE_with_backbone_move: " << get_node_index() << " " << alternate_state << " " << curr_bb() << std::endl;
190  prev_energy_for_flexseg = 0;
191  register_contacted_node_for_bb_jump();
192 
193  if ( get_bb_for_state( alternate_state ) == get_bb_for_state( current_state() ) ) {
194  //std::cout << "project_deltaE_with_backbone_move: same backbone " << get_node_index() << " " << alternate_state << " " << curr_bb() << std::endl;
195  return project_deltaE_for_substitution( alternate_state, prev_energy_for_flexseg );
196  }
197 
198  set_alternate_state( alternate_state );
199 
200  int const alt_bb = alternate_state_info().get_bb();
201 
202  /// FlexbbNode base class call -- visit all nodes in this flexseg and their adjacent edges
203  /// in a DFS traversal. If any node in the flexseg has state 0, quit.
204  if ( ! prepare_for_bb_jump( alt_bb ) ) {
205  //std::cout << "INVALID MOTION" << std::endl;
206  valid_motion = false; return 0.0;
207  }
208 
209  PackerEnergy alt_energy_for_flexseg = get_altE_for_bb_move( prev_energy_for_flexseg );
210  //std::cout << "Finished flexseg energy calc: " << alt_energy_for_flexseg << " " << prev_energy_for_flexseg << std::endl;
211  return alt_energy_for_flexseg - prev_energy_for_flexseg;
212 
213 }
214 
215 
216 MinimalistFlexbbNode::PackerEnergy
217 MinimalistFlexbbNode::project_deltaE_for_backbone_move(
218  int alt_bb,
219  PackerEnergy & prev_energy_for_flexseg,
220  bool & valid_motion
221 )
222 {
223  //std::cout << "Considering bb move: " << get_node_index() << " " << alt_bb << " " << curr_bb() << std::endl;
224  if ( current_state() == 0 || alt_bb == curr_bb() ) { valid_motion = false; return 0.0; }
225  set_alternate_state( closest_state_on_alt_bb()( alt_bb, current_state() ) );
226  return project_deltaE_with_backbone_move( alternate_state(), prev_energy_for_flexseg, valid_motion );
227 }
228 */
229 
230 bool
232 {
233  if ( alt_state == 0 ) return false;
234  if ( alt_state > get_num_states() ) {
235  std::cerr << "CANNOT MOVE TO ALT_STATE " << alt_state << " WHEN THERE ARE ONLY " << get_num_states() << " STATES" << std::endl;
236  utility_exit();
237  return false;
238  }
239 
241  set_alternate_state( alt_state );
243 
244 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
246 #endif
247 
249 }
250 
251 bool
253 {
254  if ( current_state() == 0 ) return false;
255  if ( current_state() > get_num_states() ) { std::cerr << "Current state out-of-range: " << get_num_states() << " " << current_state() << std::endl; return false; }
256  if ( alt_bb == 0 || alt_bb > get_num_distinct_backbones() ) { std::cerr << "ALTERNATE BACKBONE OUT-OF-RANGE: " << get_num_distinct_backbones() << " " << alt_bb << std::endl; return false; }
257  if ( closest_state_on_alt_bb()( alt_bb, current_state() ) == 0 ) return false;
258 
259  if ( closest_state_on_alt_bb()( alt_bb, current_state() ) > get_num_states() ) {
260  std::cerr << "CANNOT2 MOVE TO ALT_STATE " << closest_state_on_alt_bb()( alt_bb, current_state() ) << " WHEN THERE ARE ONLY " << get_num_states() << " STATES; " << alt_bb << " " << current_state() << " " << curr_bb() << std::endl;
261  utility_exit();
262  return false;
263  }
265 }
266 
267 /// @details This function call will be parallelized with openMP.
268 /// The calculations performed by different nodes may be performed in
269 /// any order and in parallel without any data collision. After this function
270 /// completes, a second pass across the nodes in the graph must be
271 /// performed to compute the node alternate_state_total_energy --
272 /// but this second traversal is fast.
275 {
276  PackerEnergy alt_frag_etotal( alternate_state_one_body_energy() );
277  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
278  if ( edge_connects_flexsegmate()[ ii ] ) {
279  if ( get_index_of_adjacent_node( ii ) > get_node_index() ) {
281  get_incident_minimalistflexbb_edge( ii )->get_alt_stateE());
282 
283  alt_frag_etotal += alternate_state_two_body_energies()[ ii ];
284  }
285  } else {
287  alt_frag_etotal += alternate_state_two_body_energies()[ ii ];
288  }
289  }
290  return alt_frag_etotal;
291 }
292 
293 /// @details This method could be parallelized with openMP, but probably would
294 /// not be worth parallelizing. It is the second step of computing the deltaE
295 /// for a backbone move. The alternate_state_total_energy is computed here, as
296 /// well as the curr_frag_total_energy which is returned.
299 {
300  PackerEnergy curr_frag_etotal( curr_state_one_body_energy() );
302 
303  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
304  if ( edge_connects_flexsegmate()[ ii ] ) {
305  if ( get_index_of_adjacent_node( ii ) < get_node_index() ) {
306  /// this energy has already been computed
308  get_incident_minimalistflexbb_edge( ii )->get_alt_stateE());
309  } else {
310  curr_frag_etotal += curr_state_two_body_energies()[ ii ];
311  }
313  } else {
315  curr_frag_etotal += curr_state_two_body_energies()[ ii ];
316  }
317  }
318 
319  return curr_frag_etotal;
320 }
321 
322 
323 void
325 {
327 
330  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
332  }
333 }
334 
335 void
337  int which_edge,
338  PackerEnergy alternate_twobody_energy
339 )
340 {
341  inc_curr_state_total_energy( alternate_twobody_energy - curr_state_two_body_energies()[ which_edge ] );
342  set_curr_state_two_body_energies( which_edge, alternate_twobody_energy );
343  /// DEBUG:
344  //PackerEnergy true_curr_state_total_energy = curr_state_one_body_energy();
345  //for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
346  // true_curr_state_total_energy += curr_state_two_body_energies()[ ii ];
347  //}
348  //assert( std::abs( (true_curr_state_total_energy - curr_state_total_energy())/std::max( PackerEnergy(1.0), std::abs(curr_state_total_energy())) ) < 1e-5 );
349 }
350 
351 
352 void MinimalistFlexbbNode::commit_considered_substitution( ObjexxFCL::FArray1_int & state_on_node )
353 {
355  state_on_node( get_node_index() ) = current_state();
356  return;
357 }
358 
359 //// @details Cannot be parallelized since it's updating current_total_energy_ on other nodes.
360 void
361 MinimalistFlexbbNode::commit_alt_bb_substitution( ObjexxFCL::FArray1_int & state_on_node )
362 {
365  state_on_node( get_node_index() ) = alternate_state();
366  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
368  }
369 }
370 
371 void
373 {
374  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
376  }
378 }
379 
382 {
383  PackerEnergy prev_total = curr_state_total_energy();
384  partially_assign_state( new_state );
386  return curr_state_total_energy() - prev_total;
387 }
388 
389 void
391 {
392  //set_considering_alternate_state();
393  partial_state_assignment( new_state );
395 
396 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
398  //get_otfflexbbig_owner()->debug_note_considered_substitution( rotamer( new_state ), alternate_state() );
399 #endif
400 
401 }
402 
403 void
405 {
406  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
408  get_incident_minimalistflexbb_edge( ii )->get_alt_stateE());
410  }
412  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
414  }
416 }
417 
418 
419 unsigned int
421 {
422  return sizeof( MinimalistFlexbbNode );
423 }
424 
425 unsigned int
427 {
429 }
430 
431 /*
432 MinimalistFlexbbNode::PackerEnergy
433 MinimalistFlexbbNode::get_altE_for_bb_move( PackerEnergy & curr_frag_etotal )
434 {
435  if ( energies_already_projected() ) return 0.0;
436 
437  //std::cout << "get_altE_for_bb_move " << get_node_index() << std::endl;
438 
439  PackerEnergy alt_frag_etotal( 0.0 );
440 
441  set_alternate_state_one_body_energy( one_body_energies()[ alternate_state() ]);
442  //if ( get_node_index() == 17 && alternate_state() == 63 ) {
443  // std::cout << "SETTING ALT STATE 11 (63) ON NODE 17: " << alternate_state_one_body_energy() << std::endl;
444  //}
445 
446  set_alternate_state_total_energy( alternate_state_one_body_energy() );
447 
448  alt_frag_etotal += alternate_state_one_body_energy();
449  curr_frag_etotal += curr_state_one_body_energy();
450 
451  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
452  if ( edge_connects_flexsegmate()[ ii ] ) {
453  alt_frag_etotal +=
454  get_adjacent_minimalistflexbb_node( ii )->get_altE_for_bb_move( curr_frag_etotal );
455  //std::cerr << get_node_index() << " alt_frag_etotal( " << ii << ", " << alt_frag_etotal << ") " << std::endl;
456  //std::cerr << get_node_index() << " curr_frag_etotal( " << ii << ", " << curr_frag_etotal << ") " << std::endl;
457 
458  set_alternate_state_two_body_energies( ii,
459  get_incident_minimalistflexbb_edge( ii )->get_alt_stateE());
460  inc_alternate_state_total_energy( alternate_state_two_body_energies()[ ii ]);
461 
462  if ( count_energy_to_node_in_my_fragtotalE( ii ) ) {
463 
464  alt_frag_etotal += alternate_state_two_body_energies()[ ii ];
465  curr_frag_etotal += curr_state_two_body_energies()[ ii ];
466 
467  }
468  } else {
469 
470  //if ( ii < get_num_edges_to_smaller_indexed_nodes() ) {
471  // set_alternate_state_two_body_energies(
472  // ii, get_incident_otfflexbb_edge( ii )->compute_samebbconf_alternate_state_energy_second_node());
473  //} else {
474  // set_alternate_state_two_body_energies(
475  // ii, get_incident_otfflexbb_edge( ii )->compute_samebbconf_alternate_state_energy_first_node() );
476  //}
477 
478  set_alternate_state_two_body_energies( ii, get_incident_minimalistflexbb_edge( ii )->get_alt_stateE() );
479 
480  alt_frag_etotal += alternate_state_two_body_energies()[ ii ];
481  inc_alternate_state_total_energy( alternate_state_two_body_energies()[ ii ] );
482  curr_frag_etotal += curr_state_two_body_energies()[ii];
483 
484  }
485  }
486 
487 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
488  get_otfflexbbig_owner()->debug_note_considered_substitution( rotamer( alternate_state() ), alternate_state() - state_offsets_for_bb()[ alternate_state_info().get_bb() ] );
489  //get_otfflexbbig_owner()->debug_note_considered_substitution( rotamer( alternate_state() ), alternate_state() );
490 #endif
491 
492  return alt_frag_etotal;
493 }
494 */
495 
496 /// EDGE
497 
500  int node1,
501  int node2
502 ) :
503  parent( owner, node1, node2 )
504 {}
505 
507 {}
508 
510 {}
511 
513 {
514  //std::cout << "MinFlexbbEdge::prepare_for_simulated_annealing" << std::endl;
516 }
517 
519 {
520  /// This should also go and reweight energies already stored on the edges...
521  /// assert that SA hasn't yet begun for now.
522  assert( nodes_cur_state( 0 ) == 0 && nodes_cur_state( 1 ) == 0 );
523  /// EdgeBase class protected setter.
524  edge_weight( weight );
525 }
526 
527 
530 {
531  //std::cout << "get_alt_stateE: ";
532  if ( alt_e_up_to_date() ) {
533  //std::cout << "... done" << std::endl;
534  return alt_energy();
535  }
536 
538  //std::cout << ".. computed: " << alt_energy() << std::endl;
539  return alt_energy();
540 }
541 
542 void
544  int node_that_changed
545 )
546 {
547  int node_not_changing( ! which_node( node_that_changed ));
548  /// copy_alternate_to_current(); -- this call is handled by flexbb_node::have_edges_copy_alternate_to_current();
551  get_edges_position_in_nodes_edge_vector( node_not_changing ),
552  cur_energy() );
553 }
554 
555 void
557 {
559 }
560 
561 unsigned int
563 {
564  return sizeof( MinimalistFlexbbEdge );
565 }
566 
567 unsigned int
569 {
571 }
572 
573 
574 /// GRAPH
575 
577  parent( num_nodes )
578 {}
579 
581 
582 void
584 {
585  parent::initialize( rot_sets );
586 }
587 
590  int node,
591  int state
592 )
593 {
594  return get_minimalistflexbb_node( node )->get_one_body_energy( state );
595 }
596 
597 void
599 {
600  for ( int ii = 1; ii <= get_num_nodes(); ++ii ) {
602  }
606 }
607 
610 {
613  }
614 
616 
617  PackerEnergy deltaE = get_minimalistflexbb_node( node_ind )->assign_state( new_state );
620  //std::cout << "Accept: " << total_energy_current_state_assignment() << std::endl;
622 }
623 
625 MinimalistFlexbbInteractionGraph::set_network_state( ObjexxFCL::FArray1_int & node_states )
626 {
629  }
630 
631 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
633 #endif
634 
635  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
636  get_minimalistflexbb_node( ii )->partially_assign_state( node_states( ii ) );
637  }
638  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
640  }
642 
643 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
644  PackerEnergy current_total_energy = total_energy_current_state_assignment();
645  debug_note_projected_deltaE_of_considered_substitution( current_total_energy - last_total_energy, 1.0, false );
647 #endif
648  //std::cout << "Accept: " << total_energy_current_state_assignment() << std::endl;
649 
651 }
652 
653 void
655  int node_ind,
656  int new_state,
657  PackerEnergy & delta_energy,
658  PackerEnergy & prev_energy_for_node
659 )
660 {
663  }
665 
666  set_node_considering_alt_state( node_ind );
667  delta_energy = get_minimalistflexbb_node( node_ind )->
668  project_deltaE_for_substitution( new_state, prev_energy_for_node );
669 
671 
672 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
674  delta_energy, get_minimalistflexbb_node( node_ind )->alternate_state_total_energy() );
675 #endif
676 
677 }
678 
681 {
685 
686 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
688 #endif
689 
690  //std::cout << "Accept: " << total_energy_current_state_assignment() << std::endl;
691 
693 }
694 
697 {
699 }
700 
701 int
703 {
704  int sum = 0;
705  for (std::list< EdgeBase* >::const_iterator iter = get_edge_list_begin();
706  iter != get_edge_list_end(); ++iter) {
707  sum += cast_minimalist_flexbb_edge(*iter)->count_dynamic_memory(); // close enough...
708  }
709  return sum;
710 
711 }
712 
713 void
715 {
716  std::cerr << "Curr States: ";
717  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
718  std::cerr << "(" << ii << ", ";
719  std::cerr << get_minimalistflexbb_node(ii)->get_current_state() << ") ";
720  }
721  std::cerr << std::endl;
722 }
723 
724 /// @details noop. This IG does not allow for inaccuracies in its energy function.
725 void
727 {}
728 
729 
732 {
733  PackerEnergy esum = 0;
734  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
735  if ( get_vertex_member_of_energy_sum_group( ii, group_id ) ) {
737  }
738  }
739 
740  for ( std::list< EdgeBase* >::iterator edge_iter = get_edge_list_begin();
741  edge_iter != get_edge_list_end(); ++edge_iter) {
742  int first_node_ind = (*edge_iter)->get_first_node_ind();
743  int second_node_ind = (*edge_iter)->get_second_node_ind();
744 
745  if ( get_vertex_member_of_energy_sum_group( first_node_ind, group_id )
746  && get_vertex_member_of_energy_sum_group( second_node_ind, group_id )) {
747  esum += cast_minimalist_flexbb_edge(*edge_iter)->cur_energy();
748  }
749  }
750  return esum;
751 }
752 
753 /// Virtual functions from FlexbbInteractionGraph
754 void
756  int bb_id,
757  core::PackerEnergy & delta_energy,
758  core::PackerEnergy & prev_flexseg_energy,
759  bool & valid_motion,
760  int & num_nodes_changing_state
761 )
762 {
765  }
766 
768 
769  /// brace for an invalid move;
770  /// early return statements "return" these values to the calling function.
771  valid_motion = false;
772  delta_energy = 0.0;
773  prev_flexseg_energy = 0.0;
774 
776  int moving_flexseg = get_flexseg_for_bb( bb_id );
777  set_flexseg_considering_alt_bb( moving_flexseg );
778  int altbb_for_flexseg = bb_id - get_flexseg_bb_offset( moving_flexseg );
779 
780  int representative = flexseg_members( moving_flexseg )[ 1 ];
781 
782  if ( get_flexbb_node( representative )->get_backbone_for_current_state() == altbb_for_flexseg ) {
783  return;
784  }
785 
786  int const nflexseg_members = (int) flexseg_members( moving_flexseg ).size();
787  //std::cout << "bbmove: " << moving_flexseg << " " << bb_id << " " << nflexseg_members;
788  //std::cout << std::flush;
789  for ( int ii = 1; ii <= nflexseg_members; ++ii ) {
790  //std::cout << "." << std::flush;
791  int iinode = flexseg_members( moving_flexseg )[ ii ];
792  bool move_valid = get_minimalistflexbb_node( iinode )->
793  prepare_for_altbb_move_to_closest_state( altbb_for_flexseg );
794  if ( ! move_valid ) {
795  //std::cout << std::endl;
796  return;
797  }
798  }
799 
801  delta_energy, prev_flexseg_energy,
802  valid_motion, num_nodes_changing_state );
803  //std::cout << "...done" << std::endl;
804 }
805 
806 void
808  int node_ind,
809  int new_state,
810  core::PackerEnergy & delta_energy,
811  core::PackerEnergy & prev_flexseg_energy,
812  bool & valid_motion,
813  int & num_nodes_changing_state
814 )
815 {
818  }
820 
821  /// brace for an invalid move;
822  /// early return statements "return" these values to the calling function.
823  valid_motion = false;
824  delta_energy = 0.0;
825  prev_flexseg_energy = 0.0;
826 
827  if ( get_flexbb_node( node_ind )->current_state() == 0 ) {
828  return;
829  }
830 
831 
832  /// Decide: does this flexible-backbone substitution actually need to move the backbone?
833  if ( flexseg_for_moltenres( node_ind ) == 0 ||
834  get_flexbb_node( node_ind )->state_has_same_backbone_as_current( new_state )) {
835  valid_motion = true;
836  num_nodes_changing_state = 1;
837  consider_substitution( node_ind, new_state, delta_energy, prev_flexseg_energy );
838  return;
839  }
840 
841 
844  int moving_flexseg = flexseg_for_moltenres( node_ind );
845  set_flexseg_considering_alt_bb( moving_flexseg );
846  int altbb_for_flexseg = get_flexbb_node( node_ind )->state_info( new_state ).get_bb();
847 
848  //std::cout << "bbmove2: " << moving_flexseg << " " << altbb_for_flexseg << " " << flexseg_members(moving_flexseg).size();
849  //std::cout << std::flush;
850 
851  for ( Size ii = 1; ii <= flexseg_members( moving_flexseg ).size(); ++ii ) {
852  int iinode = flexseg_members( moving_flexseg )[ ii ];
853  if ( iinode == node_ind ) {
854  bool valid = get_minimalistflexbb_node( iinode )->prepare_for_altbb_move_to_state( new_state );
855  if ( ! valid ) { return; }
856  } else {
857  bool move_valid = get_minimalistflexbb_node( iinode )->
858  prepare_for_altbb_move_to_closest_state( altbb_for_flexseg );
859  if ( ! move_valid ) {
860  //std::cout << std::endl;
861  return;
862  }
863  }
864  }
866  delta_energy, prev_flexseg_energy,
867  valid_motion, num_nodes_changing_state );
868  //std::cout << std::endl;
869 
870 }
871 
872 void
874  core::PackerEnergy & delta_energy,
875  core::PackerEnergy & prev_flexseg_energy,
876  bool & valid_motion,
877  int & num_nodes_changing_state
878 )
879 {
880  int moving_flexseg = flexseg_considering_alt_bb();
881  int const nflexseg_members = (int) flexseg_members( moving_flexseg ).size();
882  Real total_frag_energy_alt( 0.0 );
883  for ( int ii = 1; ii <= nflexseg_members; ++ii ) {
884  int iinode = flexseg_members( moving_flexseg )[ ii ];
885  total_frag_energy_alt += get_minimalistflexbb_node( iinode )->
886  get_frag_energy_for_alt_bb_state();
887  }
888 
889  Real total_frag_energy_curr( 0.0 );
890  for ( int ii = 1; ii <= nflexseg_members; ++ii ) {
891  int iinode = flexseg_members( moving_flexseg )[ ii ];
892  total_frag_energy_curr += get_minimalistflexbb_node( iinode )->
893  get_frag_energy_for_curr_bb_state_and_finalize_alt_energy_total();
894  }
895 
896 
897  valid_motion = true;
898  delta_energy = total_frag_energy_alt - total_frag_energy_curr;
899  prev_flexseg_energy = total_frag_energy_curr;
900 
902 
904 
905  num_nodes_changing_state = get_num_nodes_changing_state();
906 
907 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
908  debug_note_projected_deltaE_of_considered_substitution( delta_energy, prev_flexseg_energy );
909 #endif
910 }
911 
912 
913 
916  ObjexxFCL::FArray1_int & rotamer_on_node
917 )
918 {
920  //get_minimalistflexbb_node( node_considering_alt_state() )->commit_alt_bb_substitution( rotamer_on_node );
921 
922 
924  int moving_flexseg = flexseg_considering_alt_bb();
925  for ( Size ii = 1; ii <= flexseg_members( moving_flexseg ).size(); ++ii ) {
926  int iinode = flexseg_members( moving_flexseg )[ ii ];
927  get_minimalistflexbb_node( iinode)->commit_alt_bb_substitution( rotamer_on_node );
928  }
929  } else {
931  }
932 
935 
936 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
938 #endif
939  //std::cout << "Accept BBMove: " << total_energy_current_state_assignment() << std::endl;
940 
941 
943 }
944 
945 
946 unsigned int
948 {
949  return sizeof( MinimalistFlexbbInteractionGraph );
950 }
951 
952 unsigned int
954 {
956 }
957 
960 {
961  return new MinimalistFlexbbNode( this, node_index, num_states );
962 }
963 
966 {
967  return new MinimalistFlexbbEdge( this, index1, index2 );
968 }
969 
970 
971 void
973 {
977  } else {
979  int moving_flexseg = flexseg_considering_alt_bb();
980  for ( Size ii = 1; ii <= flexseg_members( moving_flexseg ).size(); ++ii ) {
981  int iinode = flexseg_members( moving_flexseg )[ ii ];
983  }
984  }
986 
987 #ifdef DEBUG_OTF_FLEXBB_ENERGIES
989 #endif
990 }
991 
992 }
993 }
994 }
995 
996