Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SymmLinMemInteractionGraph.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 core/pack/interaction_graph/SymmLinMemInteractionGraph.cc
11 /// @brief
12 /// @author Andrew Leaver-Fay (aleaverfay@gmail.com)
13 
15 
16 /// Debugging headers
17 #include <core/pose/Pose.hh>
18 #include <core/scoring/Energies.hh>
21 // AUTO-REMOVED #include <basic/options/after_opts.hh>
22 // AUTO-REMOVED #include <basic/options/option.hh>
23 // AUTO-REMOVED #include <basic/options/keys/packing.OptionKeys.gen.hh>
24 #include <basic/Tracer.hh>
25 
26 // Utility headers
27 #include <utility/excn/Exceptions.hh>
28 
29 #include <iostream>
30 
31 #include <utility/vector1.hh>
32 #include <ObjexxFCL/FArray1A.hh>
33 
34 //Auto Headers
36 
37 namespace core {
38 namespace pack {
39 namespace interaction_graph {
40 
41 static basic::Tracer T("core.pack.interaction_graph.symmlinmem_ig", basic::t_error );
42 
43 /// @brief For testing the symmlinmemIG, you'll want to set this to true
44 bool const debug = { false };
45 
46 
47 /// @brief main constructor, no default or copy constructors
49  InteractionGraphBase * owner,
50  int node_id,
51  int num_states
52 ) :
53  SymmOnTheFlyNode( owner, node_id, num_states ),
54  current_state_( 0 ),
55  curr_state_one_body_energy_( 0.0f ),
56  curr_state_total_energy_( 0.0f ),
57  alternate_state_( 0 ),
58  alternate_state_one_body_energy_( 0 ),
59  alternate_state_total_energy_( 0 ),
60  alternate_state_is_being_considered_( false ),
61  already_prepped_for_simA_( false ),
62  accepted_rejected_substitution_history_( ACCEPTANCE_REJECTION_HISTORY_LENGTH, 0 ),
63  accepted_history_head_( 1 ),
64  num_recently_accepted_( 0 ),
65  filled_substitution_history_( false )
66 {
67  rhq_.num_elements( num_states );
68 }
69 
71 {}
72 
73 void
75 {
77  // mark out-of-date anything where coordinates have changed
78  for (int ii = 1; ii <= get_num_states(); ++ii)
79  {
80  if ( already_prepped_for_simA_ /*&& ! get_coordinates_current( ii )*/ )
81  {
82  for (int jj = 1; jj <= get_num_incident_edges(); ++jj)
83  {
86  ii,
87  rhq_.pos_in_history_queue( ii )
88  );
89  }
90  }
91  //mark_coordinates_current( ii );
92  }
94 
98 
99  return;
100 }
101 
102 void
104 {
105 
106  T << "SymmLinearMemNode " << get_node_index() << " with " << get_num_states() << " states" << std::endl;
107  T << "curr_state " << current_state_ << " ";
108  T << "Curr One Body Energy: " << curr_state_one_body_energy_ << std::endl;
109  T << "Curr Two Body Energies:";
110  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
111  {
112  T << " " << get_index_of_adjacent_node(ii) << ":" << curr_state_two_body_energies_[ ii ];
113  }
114  T << std::endl;
115 
116  if ( ! alternate_state_is_being_considered_ ) return;
117  T << "Alt One Body Energy: " << alternate_state_one_body_energy_ << std::endl;
118  T << "Alt Two Body Energies:";
119  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
120  {
122  }
123  T << std::endl << "-----------------" << std::endl;
124 
125 
126 }
127 
128 unsigned int
130 {
131  return sizeof( SymmLinearMemNode );
132 }
133 
134 unsigned int
136 {
137  unsigned int total_memory = SymmOnTheFlyNode::count_dynamic_memory();
138 
139  total_memory += rhq_.dynamic_memory_usage();
140  total_memory += neighbors_curr_state_.size() * sizeof( int );
141  total_memory += neighbors_state_recent_history_index_.size() * sizeof( int );
142 
143  total_memory += curr_state_two_body_energies_.size() * sizeof( core::PackerEnergy );
144  total_memory += alternate_state_two_body_energies_.size() * sizeof( core::PackerEnergy );
145 
146  return total_memory;
147 }
148 
149 
150 ///@brief puts the symmlinmemNode in the unassigned state
151 void
153 {
154  current_state_ = 0;
155  alternate_state_ = 0;
157 
159  std::fill(
162  0.0f);
164 
165  for (int ii = 1; ii <= get_num_incident_edges(); ++ii )
166  {
168  acknowledge_state_zeroed( get_node_index() );
169  }
170 
171  return;
172 }
173 
174 
175 ////@brief assigns a new state to the Node
176 void
178 {
179  assert( new_state >= 0 && new_state <= get_num_states());
180 
181  if (new_state == 0) {
183  } else {
184  //T << "assign_state: node - " << get_node_index() << " new state " << new_state << "...";
185  current_state_ = new_state;
189  int bumped_recent_history_index = update_recent_history( current_state_ );
190 
191  for (int ii = 1; ii <= get_num_incident_edges(); ++ii )
192  {
194  get_node_index(),
196  bumped_recent_history_index,
197  rhq_.head_of_queue(),
199  );
200 
202  }
203  //T<< "..done" << std::endl;
204  }
205  if ( debug ) {
206  //get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(current_state_,1).seqpos(), get_rotamer( current_state_,1 ), false );
207  //get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
208  }
209  return;
210 }
211 
212 
213 void
215 {
216  if (new_state == 0 )
217  {
219  return;
220  }
221 
222  current_state_ = new_state;
223  int bumped_recent_history_index = update_recent_history( current_state_ );
224 
225  for (int ii = 1; ii <= get_num_incident_edges(); ++ii )
226  {
228  get_node_index(),
230  bumped_recent_history_index,
231  rhq_.head_of_queue()
232  );
233  }
235 }
236 
237 
239 {
240  if ( current_state_ == 0 ) return;
241 
243  for (int ii = 1; ii <= get_num_incident_edges(); ++ii) {
246  get_energy_following_partial_state_assignment();
248  }
249 }
250 
251 
254 (
255  int alternate_state,
256  core::PackerEnergy & prev_node_energy
257 )
258 {
259  alternate_state_is_being_considered_ = true;
260  alternate_state_ = alternate_state;
261  int alternate_state_recent_history_index = rhq_.pos_in_history_queue( alternate_state_ );
262 
263  bool store_rpes = num_recently_accepted_ < THRESHOLD_ACCEPTANCE_RATE_FOR_RPE_STORAGE;
264 
265  alternate_state_one_body_energy_ = get_one_body_energy( alternate_state );
266  alternate_state_total_energy_ = alternate_state_one_body_energy_;
267  prev_node_energy = curr_state_total_energy_;
268 
269  for (int ii = 1; ii <= get_num_incident_edges(); ++ii )
270  {
271 
272  if ( neighbors_curr_state_[ ii ] != 0 ) {
273 
274  alternate_state_two_body_energies_[ ii ] =
275  get_incident_symmlinmem_edge( ii )->get_energy_for_alt_state(
276  store_rpes,
277  get_node_index(),
278  alternate_state_,
279  alternate_state_recent_history_index,
280  neighbors_curr_state_[ ii ],
281  neighbors_state_recent_history_index_[ ii ]
282  );
283 
284  } else {
285  alternate_state_two_body_energies_[ ii ] = 0;
286  }
287 
288  alternate_state_total_energy_ += alternate_state_two_body_energies_[ ii ];
289  }
290 
291  if ( debug && ! get_owner()->any_vertex_state_unassigned() ) {
292  //assert( get_rotamer(alternate_state_,1).seqpos() == get_rotamer(current_state_,1).seqpos() );
293  //get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(alternate_state_,1).seqpos(), get_rotamer( alternate_state_,1 ), false);
294  //Real score_after = get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
295  ///// Now handled automatically. get_on_the_fly_owner()->score_function().accumulate_residue_total_energies( get_on_the_fly_owner()->non_const_pose() );
296  //Real rep_after = get_on_the_fly_owner()->pose().energies().residue_total_energies( get_rotamer(alternate_state_,1).seqpos() )[ scoring::fa_rep ];
297  //
298  //get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(current_state_,1).seqpos(), get_rotamer( current_state_,1 ), false);
299  //Real score_before = get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
300  ///// Now handled automatically. get_on_the_fly_owner()->score_function().accumulate_residue_total_energies( get_on_the_fly_owner()->non_const_pose() );
301  //Real rep_before = get_on_the_fly_owner()->pose().energies().residue_total_energies( get_rotamer(alternate_state_,1).seqpos() )[ scoring::fa_rep ];
302  //
303  //Real actual_score_delta = score_after - score_before;
304  //Real projected_score_delta = alternate_state_total_energy_ - curr_state_total_energy_;
305  //Real delta_delta = actual_score_delta - projected_score_delta;
306  //
307  //if ( (std::abs( delta_delta ) > 0.001 && std::abs( delta_delta / score_after ) > 10E-5) &&
308  // (rep_after < 4 && rep_before < 4) ) {
309  //
310  // T << "Score before: " << score_before << " Score after " << score_after << " delta: " << actual_score_delta;
311  // T << " projected delta: " << projected_score_delta << " delta delta: " << delta_delta << " rep: " << rep_before << " " << rep_after << std::endl;
312  //
313  //
314  // /// LOOK AT CURRENT ENERGIES
315  // Size const seqpos( get_rotamer(alternate_state_).seqpos() );
316  // T << "Problem rotamer substitution at " << seqpos << ": from " << get_rotamer( current_state_).name() << " to " << get_rotamer(alternate_state_).name() << std::endl;
317  // T << "CURR One body energies: ";
318  // T << get_on_the_fly_owner()->score_function().weights().dot( get_on_the_fly_owner()->pose().energies().onebody_energies( get_rotamer(alternate_state_).seqpos() ) ) << std::endl;
319  // T << "internal one body energies: " << curr_state_one_body_energy_ << std::endl;
320  // T << "location: curr_state_one_body_energy_ " << & curr_state_one_body_energy_ << std::endl;
321  //
322  // { //scope
323  // scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
324  // for ( core::graph::Graph::EdgeListConstIter
325  // iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
326  // iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
327  // iter != iter_end; ++iter ) {
328  // bool corresponding_edge_found_in_ig( false );
329  // scoring::EnergyMap const tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->fill_energy_map() );
330  // Size const other_node_index = (*iter)->get_other_ind( seqpos );
331  // Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
332  // for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
333  // if ( (Size) get_index_of_adjacent_node( ii ) != other_node_index ) continue;
334  // corresponding_edge_found_in_ig = true;
335  // if ( std::abs( real_energy - curr_state_two_body_energies_[ ii ]) > 0.001 ) {
336  // T << "Other residue: " << get_adjacent_symmlinmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]).name() << std::endl;
337  // T << "CURR Real score: edge to " << other_node_index << " energy: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
338  // T << "CURR Predicted score: edge to " << get_index_of_adjacent_node( ii ) << " energy: " << curr_state_two_body_energies_[ ii ] << std::endl;
339  // T << "CURR Real - Predicted: " << real_energy - curr_state_two_body_energies_[ ii ] << std::endl;
340  //
341  // tbemap.show_nonzero( T );
342  // T << std::endl;
343  //
344  // int const this_aa( curr_state_sparse_mat_info_.get_aa_type());
345  // int const other_aa( neighbors_curr_state_sparse_info_[ii].get_aa_type() );
346  // T << "Sparse matrix info: (this,other): " ;
347  // T << (int) get_incident_symmlinmem_edge( ii )->get_sparse_aa_neighbor_info()( this_aa, other_aa );
348  // T << " (other,this): ";
349  // T << (int) get_incident_symmlinmem_edge( ii )->get_sparse_aa_neighbor_info()( other_aa, this_aa ) << std::endl;
350  //
351  // core::PackerEnergy recomputed = compute_rotamer_pair_energy( ii, current_state_, neighbors_curr_state_[ ii ] );
352  // T << "Recomputed energy: " << recomputed << std::endl;
353  //
354  // scoring::EnergyMap tbemap;
355  // get_on_the_fly_owner()->score_function().eval_ci_2b(
356  // get_on_the_fly_owner()->pose().residue( get_node_index() ),
357  // get_on_the_fly_owner()->pose().residue( other_node_index ),
358  // get_on_the_fly_owner()->pose(),
359  // tbemap );
360  // get_on_the_fly_owner()->score_function().eval_cd_2b(
361  // get_on_the_fly_owner()->pose().residue( get_node_index() ),
362  // get_on_the_fly_owner()->pose().residue( other_node_index ),
363  // get_on_the_fly_owner()->pose(),
364  // tbemap );
365  // T << "Rescored from pose: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
366  //
367  // tbemap.zero();
368  // get_on_the_fly_owner()->score_function().eval_ci_2b(
369  // get_rotamer( current_state_ ),
370  // get_on_the_fly_owner()->pose().residue( other_node_index ),
371  // get_on_the_fly_owner()->pose(),
372  // tbemap );
373  // get_on_the_fly_owner()->score_function().eval_cd_2b(
374  // get_rotamer( current_state_ ),
375  // get_on_the_fly_owner()->pose().residue( other_node_index ),
376  // get_on_the_fly_owner()->pose(),
377  // tbemap );
378  // T << "Rescored combo: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
379  //
380  //
381  // tbemap.zero();
382  // get_on_the_fly_owner()->score_function().eval_ci_2b(
383  // get_adjacent_symmlinmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
384  // get_on_the_fly_owner()->pose().residue( get_node_index() ),
385  // get_on_the_fly_owner()->pose(),
386  // tbemap );
387  // get_on_the_fly_owner()->score_function().eval_cd_2b(
388  // get_adjacent_symmlinmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
389  // get_on_the_fly_owner()->pose().residue( get_node_index() ),
390  // get_on_the_fly_owner()->pose(),
391  // tbemap );
392  // T << "Rescored combo 2: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
393  //
394  //
395  // /// Check if order dependence is causing a bug -- res1 and res2 should not have to be ordered in the
396  // /// residue pair energy calls
397  // tbemap.zero();
398  // get_on_the_fly_owner()->score_function().eval_ci_2b(
399  // get_on_the_fly_owner()->pose().residue( other_node_index ),
400  // get_rotamer( current_state_ ),
401  // get_on_the_fly_owner()->pose(),
402  // tbemap );
403  // get_on_the_fly_owner()->score_function().eval_cd_2b(
404  // get_on_the_fly_owner()->pose().residue( other_node_index ),
405  // get_rotamer( current_state_ ),
406  // get_on_the_fly_owner()->pose(),
407  // tbemap );
408  // T << "Rescored combo swapped: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
409  //
410  // /// Check if order dependence is causing a bug -- res1 and res2 should not have to be ordered in the
411  // /// residue pair energy calls
412  // tbemap.zero();
413  // get_on_the_fly_owner()->score_function().eval_ci_2b(
414  // get_on_the_fly_owner()->pose().residue( get_node_index() ),
415  // get_adjacent_symmlinmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
416  // get_on_the_fly_owner()->pose(),
417  // tbemap );
418  // get_on_the_fly_owner()->score_function().eval_cd_2b(
419  // get_on_the_fly_owner()->pose().residue( get_node_index() ),
420  // get_adjacent_symmlinmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
421  // get_on_the_fly_owner()->pose(),
422  // tbemap );
423  // T << "Rescored combo 2 swapped: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
424  //
425  // //These references are useful in GDB if you need to debug.
426  // //
427  // //conformation::Residue const & res_in_pose = get_on_the_fly_owner()->pose().residue( get_node_index() );
428  // //conformation::Residue const & res_on_node = get_rotamer( current_state_ );
429  // //conformation::Residue const & other_res_in_pose = get_on_the_fly_owner()->pose().residue( other_node_index );
430  // //conformation::Residue const & other_res_on_node = get_adjacent_symmlinmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]);
431  // //SymmLinearMemNode * neighbor = get_adjacent_symmlinmem_node( ii );
432  //
433  // break;
434  // }
435  // if ( !corresponding_edge_found_in_ig ) {
436  // T << "Did not find edge in energy map to " << other_node_index << " with energy " << real_energy << " in the interaction graph!" << std::endl;
437  // }
438  // }
439  // }
440  // }// end scope
441  //
442  // /// Look at interaction graph edges that are absent from the energy graph
443  // { //scope
444  // scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
445  // for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
446  // Size const other_node_index = (Size) get_index_of_adjacent_node( ii );
447  // if ( curr_state_two_body_energies_[ ii ] == 0 ) continue;
448  // bool found_similar_edge( false );
449  //
450  // for ( core::graph::Graph::EdgeListConstIter
451  // iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
452  // iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
453  // iter != iter_end; ++iter ) {
454  // if ( other_node_index != (Size) (*iter)->get_other_ind( seqpos ) ) continue;
455  // found_similar_edge = true;
456  //
457  // //scoring::EnergyMap const & tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->energy_map() );
458  // //Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
459  //
460  // }
461  // if ( ! found_similar_edge ) {
462  // T << "Edge in lmig CUR to node " << other_node_index << " with energy: " << curr_state_two_body_energies_[ ii ] << " absent from energy graph!" << std::endl;
463  // }
464  // }
465  // } // end scope
466  //
467  // /// Place the alternate rotamer on the pose and rescore.
468  // get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(alternate_state_).seqpos(), get_rotamer( alternate_state_ ), false);
469  // get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
470  //
471  // T << "ALT One body energies: ";
472  // T << get_on_the_fly_owner()->score_function().weights().dot( get_on_the_fly_owner()->pose().energies().onebody_energies( get_rotamer(alternate_state_).seqpos() ) ) << std::endl;
473  // T << "internal one body energies: " << alternate_state_one_body_energy_ << std::endl;
474  // T << "location: alternate_state_one_body_energy_ " << & alternate_state_one_body_energy_ << std::endl;
475  //
476  //
477  // { //scope
478  // scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
479  // for ( core::graph::Graph::EdgeListConstIter
480  // iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
481  // iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
482  // iter != iter_end; ++iter ) {
483  // bool corresponding_edge_found_in_ig( false );
484  // scoring::EnergyMap const tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->fill_energy_map() );
485  // Size const other_node_index = (*iter)->get_other_ind( seqpos );
486  // Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
487  // for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
488  // if ( (Size) get_index_of_adjacent_node( ii ) != other_node_index ) continue;
489  // corresponding_edge_found_in_ig = true;
490  // if ( std::abs( real_energy - alternate_state_two_body_energies_[ ii ]) > 0.001 ) {
491  // T << "ALT Real score: edge to " << other_node_index << " energy: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
492  // T << "ALT Predicted score: edge to " << get_index_of_adjacent_node( ii ) << " energy: " << alternate_state_two_body_energies_[ ii ] << std::endl;
493  // T << "ALT Real - Predicted: " << real_energy - alternate_state_two_body_energies_[ ii ] << std::endl;
494  // tbemap.show_nonzero( T );
495  // T << std::endl;
496  //
497  // int const this_aa( alt_state_sparse_mat_info_.get_aa_type());
498  // int const other_aa( neighbors_curr_state_sparse_info_[ii].get_aa_type() );
499  // T << "Sparse matrix info: (this,other): " ;
500  // T << (int) get_incident_symmlinmem_edge( ii )->get_sparse_aa_neighbor_info()( this_aa, other_aa );
501  // T << " (other,this): ";
502  // T << (int) get_incident_symmlinmem_edge( ii )->get_sparse_aa_neighbor_info()( other_aa, this_aa ) << std::endl;
503  //
504  // core::PackerEnergy recomputed = compute_rotamer_pair_energy( ii, alternate_state_, neighbors_curr_state_[ ii ] );
505  // T << "Recomputed energy: " << recomputed << std::endl;
506  //
507  // break;
508  // }
509  // if ( !corresponding_edge_found_in_ig ) {
510  // T << "Did not find edge in energy map to " << other_node_index << " with energy " << real_energy << " in the interaction graph!" << std::endl;
511  // }
512  //
513  // }
514  // }
515  // }// end scope
516  // /// Look at interaction graph edges that are absent from the energy graph
517  // { //scope
518  // scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
519  // for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
520  // Size const other_node_index = (Size) get_index_of_adjacent_node( ii );
521  // if ( alternate_state_two_body_energies_[ ii ] == 0 ) continue;
522  // bool found_similar_edge( false );
523  //
524  // for ( core::graph::Graph::EdgeListConstIter
525  // iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
526  // iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
527  // iter != iter_end; ++iter ) {
528  // if ( other_node_index != (Size) (*iter)->get_other_ind( seqpos ) ) continue;
529  // found_similar_edge = true;
530  //
531  // //scoring::EnergyMap const & tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->energy_map() );
532  // //Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
533  //
534  // }
535  // if ( ! found_similar_edge ) {
536  // T << "Edge in lmig ALT to node " << other_node_index << " with energy: " << alternate_state_two_body_energies_[ ii ] << " absent from energy graph!" << std::endl;
537  // }
538  // }
539  // } // end scope
540  //
541  //
542  // get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(alternate_state_).seqpos(), get_rotamer( current_state_ ), false);
543  // get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
544  //}
545  } // end debug
546 
547  return alternate_state_total_energy_ - curr_state_total_energy_;
548 
549 }
550 
551 
552 ///@brief commits the last substitution that was considered by this Node
553 void
555 {
557 
561 
562  //copies from [1] to end
563  //utility::vector1< core::PackerEnergy >::iterator alt_position1 = alternate_state_two_body_energies_.begin();
564  //utility::vector1< core::PackerEnergy >::iterator curr_position1 = curr_state_two_body_energies_.begin();
565 
566  std::copy( alternate_state_two_body_energies_.begin(),
569 
570  int bumped_recent_history_index = update_recent_history( current_state_ );
571 
572  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
574  get_node_index(),
577  bumped_recent_history_index,
578  rhq_.head_of_queue(),
580  );
581  }
582 
584 
589  }
593  }
595 
596  if ( debug ) {
597  //get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(current_state_).seqpos(), get_rotamer( current_state_ ), false );
598  //get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
599  }
600 
601  return;
602 }
603 
604 void
606 {
612  }
616  }
618 }
619 
622  int edge_making_energy_request
623 )
624 {
626  edge_making_energy_request,
628  neighbors_curr_state_[ edge_making_energy_request ] );
629 }
630 
633  int edge_making_energy_request
634 )
635 {
637  edge_making_energy_request,
639  neighbors_curr_state_[ edge_making_energy_request ] );
640 }
641 
642 
643 void
645  int edge_to_altered_neighbor,
646  int other_node_new_state,
647  int other_state_recent_history_index
648 )
649 {
651  curr_state_two_body_energies_[ edge_to_altered_neighbor ] = 0;
652  neighbors_curr_state_[ edge_to_altered_neighbor ] = other_node_new_state;
653  neighbors_state_recent_history_index_[ edge_to_altered_neighbor ] =
654  other_state_recent_history_index;
655 }
656 
657 
658 
660  int num_states_to_maintain_in_recent_history
661 )
662 {
663  rhq_.history_size( num_states_to_maintain_in_recent_history );
664 }
665 
666 int
668 {
669  return rhq_.history_size();
670 }
671 
672 
673 void
675 {
676  T << "curr_state " << current_state_ << " ";
677  T << "curr_state_one_body_energy_ ";
678  T << curr_state_one_body_energy_ << " ";
679  T << "curr_state_total_energy_" << curr_state_total_energy_ << " ";
680  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
681  {
682  T << "(" << get_index_of_adjacent_node(ii) << ":" << curr_state_two_body_energies_[ ii ] << ") ";
683  }
684  T << std::endl;
685 }
686 
687 
688 void
690 {
691  assert( get_edge_vector_up_to_date() );
693  for (int ii = 1; ii <= get_num_incident_edges(); ++ii) {
696  }
698  return;
699 }
700 
701 
702 
704 {
707 
709  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
710  neighbors_curr_state_[ ii ] = 0;
712  }
713 
716 }
717 
718 int
720 {
721  return rhq_.push_to_front_of_history_queue( state );
722 }
723 
724 
725 //-----------------------------------------------------------------//
726 
728 
730  InteractionGraphBase* owner,
731  int first_node_ind,
732  int second_node_ind
733 ):
734  SymmOnTheFlyEdge( owner, first_node_ind, second_node_ind),
735  curr_state_energy_( 0.0f ),
736  partial_state_assignment_( false ),
737  preped_for_sim_annealing_( false )
738 {
739  store_rpes_[ 0 ] = store_rpes_[ 1 ] = true;
740 }
741 
743 {}
744 
746 {
747  throw utility::excn::EXCN_Msg_Exception( "Method unimplemented: SymmLinearMemEdge::get_two_body_energy" );
748  return 0.0;
749 }
750 
751 void
753 {}
754 
755 void
757 {
758  for (int ii = 0; ii < 2; ++ii ) {
759  if ( ! store_rpes_[ ii ] ) wipe( ii );
760  store_rpes_[ ii ] = true;
761  }
762 
763  if ( preped_for_sim_annealing_ ) return;
764 
765  for (int ii = 0; ii < 2; ++ii) {
766  int const other = ! ii;
767  stored_rpes_[ ii ].dimension( get_num_states_for_node( other ),
768  get_symmlinmem_node( ii )->get_recent_history_size() );
770  }
771 
773 }
774 
775 unsigned int
777 {
778  return sizeof( SymmLinearMemEdge );
779 }
780 
781 
782 unsigned int
784 {
785  unsigned int total_memory = SymmOnTheFlyEdge::count_dynamic_memory();
786  total_memory += stored_rpes_[ 0 ].size() * sizeof( core::PackerEnergy );
787  total_memory += stored_rpes_[ 1 ].size() * sizeof( core::PackerEnergy );
788 
789  return total_memory;
790 }
791 
792 /// @details DANGER: this will not update the cached energies on the nodes this edge is incident upon.
793 void
795 {
796  Real const reweight_factor = weight / edge_weight();
797  for (int ii = 0; ii < 2; ++ii) {
798  for ( Size jj = 1; jj <= stored_rpes_[ ii ].size(); ++jj ) {
799  if ( stored_rpes_[ ii ][ jj ] != NOT_YET_COMPUTED_ENERGY ) {
800  stored_rpes_[ ii ][ jj ] *= reweight_factor;
801  }
802  }
803  }
804  edge_weight( weight );
805 }
806 
807 
810 {
811  return curr_state_energy_;
812 }
813 
814 
815 void
817  int node_ind,
818  int new_state,
819  int bumped_recent_history_index,
820  int new_state_recent_history_index,
821  core::PackerEnergy & new_energy
822 )
823 {
824  int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
825  int node_not_substituted = ! node_substituted;
826 
828  node_substituted,
829  node_not_substituted,
830  bumped_recent_history_index );
831 
833  compute_pair_energy_for_current_state(
835 
837 
838  new_energy = curr_state_energy_;
839 
840  get_symmlinmem_node( node_not_substituted )->
841  acknowledge_neighbors_state_substitution
842  (
843  get_edges_position_in_nodes_edge_vector( node_not_substituted ),
845  new_state,
846  new_state_recent_history_index
847  );
848 
849  return;
850 }
851 
852 
853 void
855 {
856  int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
857  int node_not_substituted = ! node_substituted;
858 
859  curr_state_energy_ = 0;
860  get_symmlinmem_node( node_not_substituted )->
861  acknowledge_neighbors_state_substitution(
862  get_edges_position_in_nodes_edge_vector( node_not_substituted ),
863  curr_state_energy_, 0, 0 );
864  return;
865 }
866 
867 
869  int node_ind,
870  int new_state,
871  int bumped_recent_history_index,
872  int new_state_recent_history_index
873 )
874 {
875  int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
876  int node_not_substituted = ! node_substituted;
877 
879  node_substituted,
880  node_not_substituted,
881  bumped_recent_history_index );
882 
883  curr_state_energy_ = 0;
884 
885  get_symmlinmem_node( node_not_substituted )->
886  acknowledge_neighbors_partial_state_substitution
887  (
888  get_edges_position_in_nodes_edge_vector( node_not_substituted ),
889  new_state,
890  new_state_recent_history_index
891  );
893  return;
894 }
895 
896 
899 {
901  && get_symmlinmem_node(0)->get_current_state() != 0
902  && get_symmlinmem_node(1)->get_current_state() != 0) {
903 
905  compute_pair_energy_for_current_state(
909  }
910  return curr_state_energy_;
911 }
912 
913 void
915  int node_index,
916  int state,
917  int recent_history_id
918 )
919 {
920  int node_with_reset_state = node_index == get_node_index( 0 ) ? 0 : 1;
921  int other = ! node_with_reset_state;
922 
923  if ( recent_history_id != 0 ) {
924  ObjexxFCL::FArray1A< core::PackerEnergy > row_to_wipe(
925  stored_rpes_[ node_with_reset_state ]( 1, recent_history_id ),
926  get_num_states_for_node( other ) );
927  row_to_wipe = NOT_YET_COMPUTED_ENERGY;
928  }
929 
930  for (unsigned int ii = 1; ii <= stored_rpes_[ other ].size2(); ++ii) {
931  stored_rpes_[ other ]( state, ii ) = NOT_YET_COMPUTED_ENERGY;
932  }
933 
934 }
935 
938 (
939  bool store_rpes,
940  int changing_node_index,
941  int alternate_state,
942  int alternate_state_recent_history_index,
943  int other_node_curr_state,
944  int other_node_state_recent_history_index
945 )
946 {
947  assert( other_node_curr_state != 0 );
948 
949  //T << "get_energy_for_alt_state: " << get_node_index( 0 ) << " " << get_node_index( 1 ) << " srpe: " << store_rpes;
950  //T << " chID " << changing_node_index << " alt: " << alternate_state << " altHI: " << alternate_state_recent_history_index;
951  //T << " oncurr: " << other_node_curr_state << " oncurrHI: " << other_node_state_recent_history_index << std::endl;
952 
953  bool assignment_of_interest = debug && false; //get_node_index(0) == 67 && get_node_index(1) == 68;
954 
955  ///if ( false ) {
956  if ( assignment_of_interest ){
957  T << "get_energy_for_alt_state: " << get_node_index( 0 ) << " " << get_node_index( 1 ) << " srpe: " << store_rpes;
958  T << " chID " << changing_node_index << " alt: " << alternate_state << " altHI: " << alternate_state_recent_history_index;
959  T << " oncurr: " << other_node_curr_state << " oncurrHI: " << other_node_state_recent_history_index << std::endl;
960  T << "store_rpes_[ 0 ] " << store_rpes_[ 0 ] << "store_rpes_[ 1 ] " << store_rpes_[ 1 ] << std::endl;
961  }
962 
963  int const node_changing = changing_node_index == get_node_index( 0 ) ? 0 : 1;
964  int const node_not_changing = ! node_changing;
965 
966  if ( store_rpes && ! store_rpes_[ node_changing ] ) {
967  wipe( node_changing );
968  }
969  store_rpes_[ node_changing ] = store_rpes;
970 
971  if ( store_rpes_[ node_changing ] && alternate_state_recent_history_index != 0 ) {
972  alt_state_energy_ = stored_rpes_[ node_changing ]( other_node_curr_state, alternate_state_recent_history_index );
973  if (alt_state_energy_ != NOT_YET_COMPUTED_ENERGY ) {
974 
975  if ( assignment_of_interest ) {
976  T << "retrieving from stored_rpes_[ " << node_changing << " ] " << alt_state_energy_ << std::endl;
977  T << "stored at location: " << & ( stored_rpes_[ node_changing ]( other_node_curr_state, alternate_state_recent_history_index ) ) << std::endl;
978  }
979 
980  return alt_state_energy_;
981  }
982  }
983 
984  if ( store_rpes_[ node_not_changing ] ) {
985  alt_state_energy_ = stored_rpes_[ node_not_changing ]( alternate_state, other_node_state_recent_history_index );
986  if ( alt_state_energy_ != NOT_YET_COMPUTED_ENERGY ) {
987 
988  if ( assignment_of_interest ) {
989  T << "retrieving from stored_rpes_[ " << node_not_changing << " ] " << alt_state_energy_ << std::endl;
990  T << "stored at location: " << & ( stored_rpes_[ node_not_changing ]( alternate_state, other_node_state_recent_history_index ) ) << std::endl;
991  }
992  return alt_state_energy_;
993  }
994  }
995 
996  alt_state_energy_ = get_symmlinmem_node( node_changing )->
997  compute_pair_energy_for_alternate_state(
998  get_edges_position_in_nodes_edge_vector( node_changing ));
999 
1000  //if ( false ) {
1001  if ( assignment_of_interest ) {
1002  T << "get_energy_for_alt_state: computing energy: " << alt_state_energy_ << std::endl;
1003  }
1004 
1005  if ( store_rpes_[ node_changing ] && alternate_state_recent_history_index != 0 ) {
1006  stored_rpes_[ node_changing ]( other_node_curr_state, alternate_state_recent_history_index ) = alt_state_energy_;
1007  }
1008  if ( store_rpes_[ node_not_changing ] ) {
1009  assert( other_node_state_recent_history_index );
1010  if ( assignment_of_interest ) {
1011  T << "about to write alt_state_energy_ to location: " << & ( stored_rpes_[ node_not_changing ]( alternate_state, other_node_state_recent_history_index ) ) << std::endl;
1012  }
1013 
1014  stored_rpes_[ node_not_changing ]( alternate_state, other_node_state_recent_history_index ) = alt_state_energy_;
1015  }
1016 
1017  return alt_state_energy_;
1018 }
1019 
1021 {
1022  return ( stored_rpes_[ 0 ].size() + stored_rpes_[ 1 ].size() );
1023 }
1024 
1025 void
1027 {
1028  T << "SymmLinearMemEdge: " << get_node_index( 0 ) << "/" << get_node_index( 1 );
1029  T << " energy= " << curr_state_energy_ << std::endl;
1030 }
1031 
1032 
1033 void
1036  int node_substituted,
1037  int node_not_substituted,
1038  int bumped_recent_history_index
1039 )
1040 {
1041  if ( ! store_rpes_[ node_substituted ] || bumped_recent_history_index == 0 ) return;
1042 
1043  ObjexxFCL::FArray1A< core::PackerEnergy > row_to_reset(
1044  stored_rpes_[ node_substituted ](1, bumped_recent_history_index ),
1045  get_num_states_for_node( node_not_substituted ) );
1046  row_to_reset = NOT_YET_COMPUTED_ENERGY;
1047 }
1048 
1049 void
1051 {
1052  int curr_states[ 2 ];
1053  int recent_history_ids[ 2 ];
1054  for (int ii = 0; ii < 2; ++ii) {
1055  curr_states[ ii ] = get_symmlinmem_node( ii )->get_current_state();
1056  recent_history_ids[ ii ] = get_symmlinmem_node( ii )->get_curr_state_recent_state_id();
1057  if ( curr_states[ ii ] == 0 ) return;
1058  }
1059 
1060  for (int ii = 0; ii < 2; ++ii ) {
1061  int const other = ! ii;
1062  if ( store_rpes_[ ii ] ) {
1063  stored_rpes_[ ii ]( curr_states[ other ], recent_history_ids[ ii ] ) = curr_state_energy_;
1064  }
1065  }
1066 
1067 }
1068 
1069 void
1071 {
1073 }
1074 
1075 //-------------------------------------------------------------------//
1076 
1078  int numNodes
1079 ) : SymmOnTheFlyInteractionGraph( numNodes ),
1080  first_time_prepping_for_simA_( true ),
1081  num_commits_since_last_update_( 0 ),
1082  total_energy_current_state_assignment_( 0.0 ),
1083  total_energy_alternate_state_assignment_( 0.0 ),
1084  node_considering_alt_state_( 0 ),
1085  have_not_committed_last_substitution_( false )
1086 {
1087 }
1088 
1089 
1091 {}
1092 
1093 void
1095 {
1097  for (int ii = 1; ii <= get_num_nodes(); ++ii ) {
1099  }
1101 }
1102 
1103 
1106 {
1108  get_symmlinmem_node( node_ind )->assign_state( new_state );
1111 }
1112 
1113 
1116  ObjexxFCL::FArray1_int & node_states
1117 )
1118 {
1120  for (int ii = 1; ii <= get_num_nodes(); ++ii ) {
1121  get_symmlinmem_node( ii )->partial_assign_state( node_states( ii ) );
1122  }
1123  for (int ii = 1; ii <= get_num_nodes(); ++ii ) {
1125  }
1127  //T << "Set Network State Finished" << std::endl;
1128  //print_current_state_assignment();
1130 }
1131 
1132 
1133 void
1135  int node_ind,
1136  int new_state,
1137  core::PackerEnergy & delta_energy,
1138  core::PackerEnergy & prev_energy_for_node
1139 )
1140 {
1143  acknowledge_last_substititon_not_committed();
1144  }
1145 
1146  node_considering_alt_state_ = node_ind;
1147 
1148  delta_energy = get_symmlinmem_node( node_ind )->
1149  project_deltaE_for_substitution( new_state, prev_energy_for_node );
1150 
1154 }
1155 
1158 {
1161 
1164 
1168  }
1169 
1171 }
1172 
1173 
1176 {
1177  //T << "Num rotamer pair energy calculations performed: " << SymmLinearMemNode::num_rpe_calcs << std::endl;
1180 }
1181 
1182 ///@brief O(1) total energy report. Protected read access for derived classes.
1185 {
1187 }
1188 
1189 int
1191 {
1192  int sum = 0;
1193  for (std::list< EdgeBase* >::const_iterator iter = get_edge_list_begin();
1194  iter != get_edge_list_end(); ++iter)
1195  {
1196  sum += ((SymmLinearMemEdge*) *iter)->get_two_body_table_size();
1197  }
1198  return sum;
1199 }
1200 
1201 void
1203 {
1204  T << "State Assignment: " << std::endl;
1205  for ( int ii = 1; ii <= get_num_nodes(); ++ii ) {
1206  T << "Node " << ii << " state " << get_symmlinmem_node(ii)->get_current_state() << std::endl;
1207  get_symmlinmem_node(ii)->print();
1208  }
1209 
1210  for ( std::list< EdgeBase* >::const_iterator iter = get_edge_list_begin();
1211  iter != get_edge_list_end(); ++iter ) {
1212  ((SymmLinearMemEdge*) (*iter))->print_current_energy();
1213  }
1214  T << "Energy: " << total_energy_current_state_assignment_ << std::endl;
1215 }
1216 
1217 
1218 void
1220 {}
1221 
1224 {
1225  core::PackerEnergy esum = 0;
1226  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
1227  if ( get_vertex_member_of_energy_sum_group( ii, group_id ) ) {
1229  }
1230  }
1231 
1232  for ( std::list< EdgeBase* >::iterator edge_iter = get_edge_list_begin();
1233  edge_iter != get_edge_list_end(); ++edge_iter) {
1234  int first_node_ind = (*edge_iter)->get_first_node_ind();
1235  int second_node_ind = (*edge_iter)->get_second_node_ind();
1236 
1237  if ( get_vertex_member_of_energy_sum_group( first_node_ind, group_id )
1238  && get_vertex_member_of_energy_sum_group( second_node_ind, group_id )) {
1239  esum += ((SymmLinearMemEdge*) (*edge_iter))->get_current_two_body_energy();
1240  }
1241  }
1242 
1243  return esum;
1244 }
1245 
1246 void
1248 {
1252  }
1254 
1255 }
1256 
1257 unsigned int
1259 {
1260  return sizeof( SymmLinearMemoryInteractionGraph );
1261 }
1262 
1263 unsigned int
1265 {
1266  unsigned int total_memory = SymmOnTheFlyInteractionGraph::count_dynamic_memory();
1267  return total_memory;
1268 }
1269 
1270 
1271 NodeBase*
1273 {
1274  return new SymmLinearMemNode( this, node_index, num_states );
1275 }
1276 
1277 
1278 EdgeBase*
1280 {
1281  return new SymmLinearMemEdge( this, index1, index2 );
1282 }
1283 
1284 void
1286 {
1288 
1289  for ( int ii = 1; ii <= get_num_nodes(); ++ii ) {
1291  get_one_body_energy_current_state();
1292  }
1293 
1294  for ( std::list<EdgeBase*>::iterator iter = get_edge_list_begin();
1295  iter != get_edge_list_end(); ++iter ) {
1297  ((SymmLinearMemEdge*) *iter)->get_current_two_body_energy();
1298  }
1299 
1301  return;
1302 }
1303 
1304 void
1306 {
1307  static int const symmlinmemIG_history_size( 10 ); //get_cmdline_history_size() -- put into packer task...
1308 
1309  for (int ii = 1; ii <= get_num_nodes(); ++ii ) {
1310  get_symmlinmem_node( ii )->set_recent_history_size( symmlinmemIG_history_size );
1311  }
1312 }
1313 
1314 } // namespace interaction_graph
1315 } // namespace pack
1316 } // namespace core