Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SymmMinimalistInteractionGraph.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/SymmMinimalistInteractionGraph.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.symm_symmin_ig", basic::t_error );
42 
43 /// @brief For testing the symminIG, 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 {
63 }
64 
66 {}
67 
68 void
70 {
73  return;
74 }
75 
76 void
78 {
79 
80  T << "SymmMinimalistNode " << get_node_index() << " with " << get_num_states() << " states" << std::endl;
81  T << "curr_state " << current_state_ << " ";
82  T << "Curr One Body Energy: " << curr_state_one_body_energy_ << std::endl;
83  T << "Curr Two Body Energies:";
84  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
85  {
86  T << " " << get_index_of_adjacent_node(ii) << ":" << curr_state_two_body_energies_[ ii ];
87  }
88  T << std::endl;
89 
91  T << "Alt One Body Energy: " << alternate_state_one_body_energy_ << std::endl;
92  T << "Alt Two Body Energies:";
93  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
94  {
96  }
97  T << std::endl << "-----------------" << std::endl;
98 
99 
100 }
101 
102 unsigned int
104 {
105  return sizeof( SymmMinimalistNode );
106 }
107 
108 unsigned int
110 {
111  unsigned int total_memory = SymmOnTheFlyNode::count_dynamic_memory();
112 
113  total_memory += neighbors_curr_state_.size() * sizeof( int );
114  total_memory += curr_state_two_body_energies_.size() * sizeof( core::PackerEnergy );
115  total_memory += alternate_state_two_body_energies_.size() * sizeof( core::PackerEnergy );
116 
117  return total_memory;
118 }
119 
120 
121 ///@brief puts the symminNode in the unassigned state
122 void
124 {
125  current_state_ = 0;
126  alternate_state_ = 0;
128 
130  std::fill(
133  0.0f);
135 
136  for (int ii = 1; ii <= get_num_incident_edges(); ++ii )
137  {
139  acknowledge_state_zeroed( get_node_index() );
140  }
141 
142  return;
143 }
144 
145 
146 ////@brief assigns a new state to the Node
147 void
149 {
150  assert( new_state >= 0 && new_state <= get_num_states());
151 
152  if (new_state == 0) assign_zero_state();
153  else {
154  //T << "assign_state: node - " << get_node_index() << " new state " << new_state << "...";
155  current_state_ = new_state;
159 
160  for (int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
162  get_node_index(),
165  );
166 
168  }
169  //T<< "..done" << std::endl;
170  }
171 
172  //if ( debug ) {
173  // get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(current_state_).seqpos(), get_rotamer( current_state_ ), false );
174  // get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
175  //}
176 }
177 
178 
179 void
181 {
182  if (new_state == 0 ) {
184  return;
185  }
186 
187  current_state_ = new_state;
188 
189  for (int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
191  get_node_index(),
193  );
194  }
196 }
197 
198 
200 {
201  if ( current_state_ == 0 ) return;
202 
205  for (int ii = 1; ii <= get_num_incident_edges(); ++ii) {
208  get_energy_following_partial_state_assignment();
210  }
211 }
212 
213 
216 (
217  int alternate_state,
218  core::PackerEnergy & prev_node_energy
219 )
220 {
221  alternate_state_is_being_considered_ = true;
222 
223  alternate_state_ = alternate_state;
224 
225  alternate_state_one_body_energy_ = get_one_body_energy( alternate_state );
226  alternate_state_total_energy_ = alternate_state_one_body_energy_;
227  prev_node_energy = curr_state_total_energy_;
228 
229 
230  for (int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
231  if ( neighbors_curr_state_[ ii ] != 0 ) {
232  alternate_state_two_body_energies_[ ii ] = get_incident_symmin_edge( ii )->get_energy_for_alt_state( get_node_index() );
233  } else {
234  alternate_state_two_body_energies_[ ii ] = 0;
235  }
236 
237  alternate_state_total_energy_ += alternate_state_two_body_energies_[ ii ];
238  }
239 
240 // if ( debug && ! get_owner()->any_vertex_state_unassigned() ) {
241 // assert( get_rotamer(alternate_state_).seqpos() == get_rotamer(current_state_).seqpos() );
242 // get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(alternate_state_).seqpos(), get_rotamer( alternate_state_ ), false);
243 // Real score_after = get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
244 // /// Now handled automatically. get_on_the_fly_owner()->score_function().accumulate_residue_total_energies( get_on_the_fly_owner()->non_const_pose() );
245 // Real rep_after = get_on_the_fly_owner()->pose().energies().residue_total_energies( get_rotamer(alternate_state_).seqpos() )[ scoring::fa_rep ];
246 //
247 // get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(current_state_).seqpos(), get_rotamer( current_state_ ), false);
248 // Real score_before = get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
249 // /// Now handled automatically. get_on_the_fly_owner()->score_function().accumulate_residue_total_energies( get_on_the_fly_owner()->non_const_pose() );
250 // Real rep_before = get_on_the_fly_owner()->pose().energies().residue_total_energies( get_rotamer(alternate_state_).seqpos() )[ scoring::fa_rep ];
251 //
252 // Real actual_score_delta = score_after - score_before;
253 // Real projected_score_delta = alternate_state_total_energy_ - curr_state_total_energy_;
254 // Real delta_delta = actual_score_delta - projected_score_delta;
255 //
256 // if ( (std::abs( delta_delta ) > 0.001 && std::abs( delta_delta / score_after ) > 10E-5) &&
257 // (rep_after < 4 && rep_before < 4) ) {
258 //
259 // T << "Score before: " << score_before << " Score after " << score_after << " delta: " << actual_score_delta;
260 // T << " projected delta: " << projected_score_delta << " delta delta: " << delta_delta << " rep: " << rep_before << " " << rep_after << std::endl;
261 //
262 //
263 // /// LOOK AT CURRENT ENERGIES
264 // Size const seqpos( get_rotamer(alternate_state_).seqpos() );
265 // T << "Problem rotamer substitution at " << seqpos << ": from " << get_rotamer( current_state_).name() << " to " << get_rotamer(alternate_state_).name() << std::endl;
266 // T << "CURR One body energies: ";
267 // 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;
268 // T << "internal one body energies: " << curr_state_one_body_energy_ << std::endl;
269 // T << "location: curr_state_one_body_energy_ " << & curr_state_one_body_energy_ << std::endl;
270 //
271 // { //scope
272 // scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
273 // for ( core::graph::Graph::EdgeListConstIter
274 // iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
275 // iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
276 // iter != iter_end; ++iter ) {
277 // bool corresponding_edge_found_in_ig( false );
278 // scoring::EnergyMap const tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->fill_energy_map() );
279 // Size const other_node_index = (*iter)->get_other_ind( seqpos );
280 // Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
281 // for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
282 // if ( (Size) get_index_of_adjacent_node( ii ) != other_node_index ) continue;
283 // corresponding_edge_found_in_ig = true;
284 // if ( std::abs( real_energy - curr_state_two_body_energies_[ ii ]) > 0.001 ) {
285 // T << "Other residue: " << get_adjacent_symmin_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]).name() << std::endl;
286 // T << "CURR Real score: edge to " << other_node_index << " energy: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
287 // T << "CURR Predicted score: edge to " << get_index_of_adjacent_node( ii ) << " energy: " << curr_state_two_body_energies_[ ii ] << std::endl;
288 // T << "CURR Real - Predicted: " << real_energy - curr_state_two_body_energies_[ ii ] << std::endl;
289 //
290 // tbemap.show_nonzero( T );
291 // T << std::endl;
292 //
293 // int const this_aa( curr_state_sparse_mat_info_.get_aa_type());
294 // int const other_aa( neighbors_curr_state_sparse_info_[ii].get_aa_type() );
295 // T << "Sparse matrix info: (this,other): " ;
296 // T << (int) get_incident_symmin_edge( ii )->get_sparse_aa_neighbor_info()( this_aa, other_aa );
297 // T << " (other,this): ";
298 // T << (int) get_incident_symmin_edge( ii )->get_sparse_aa_neighbor_info()( other_aa, this_aa ) << std::endl;
299 //
300 // core::PackerEnergy recomputed = compute_rotamer_pair_energy( ii, current_state_, neighbors_curr_state_[ ii ] );
301 // T << "Recomputed energy: " << recomputed << std::endl;
302 //
303 // scoring::EnergyMap tbemap;
304 // get_on_the_fly_owner()->score_function().eval_ci_2b(
305 // get_on_the_fly_owner()->pose().residue( get_node_index() ),
306 // get_on_the_fly_owner()->pose().residue( other_node_index ),
307 // get_on_the_fly_owner()->pose(),
308 // tbemap );
309 // get_on_the_fly_owner()->score_function().eval_cd_2b(
310 // get_on_the_fly_owner()->pose().residue( get_node_index() ),
311 // get_on_the_fly_owner()->pose().residue( other_node_index ),
312 // get_on_the_fly_owner()->pose(),
313 // tbemap );
314 // T << "Rescored from pose: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
315 //
316 // tbemap.zero();
317 // get_on_the_fly_owner()->score_function().eval_ci_2b(
318 // get_rotamer( current_state_ ),
319 // get_on_the_fly_owner()->pose().residue( other_node_index ),
320 // get_on_the_fly_owner()->pose(),
321 // tbemap );
322 // get_on_the_fly_owner()->score_function().eval_cd_2b(
323 // get_rotamer( current_state_ ),
324 // get_on_the_fly_owner()->pose().residue( other_node_index ),
325 // get_on_the_fly_owner()->pose(),
326 // tbemap );
327 // T << "Rescored combo: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
328 //
329 //
330 // tbemap.zero();
331 // get_on_the_fly_owner()->score_function().eval_ci_2b(
332 // get_adjacent_symmin_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
333 // get_on_the_fly_owner()->pose().residue( get_node_index() ),
334 // get_on_the_fly_owner()->pose(),
335 // tbemap );
336 // get_on_the_fly_owner()->score_function().eval_cd_2b(
337 // get_adjacent_symmin_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
338 // get_on_the_fly_owner()->pose().residue( get_node_index() ),
339 // get_on_the_fly_owner()->pose(),
340 // tbemap );
341 // T << "Rescored combo 2: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
342 //
343 //
344 // /// Check if order dependence is causing a bug -- res1 and res2 should not have to be ordered in the
345 // /// residue pair energy calls
346 // tbemap.zero();
347 // get_on_the_fly_owner()->score_function().eval_ci_2b(
348 // get_on_the_fly_owner()->pose().residue( other_node_index ),
349 // get_rotamer( current_state_ ),
350 // get_on_the_fly_owner()->pose(),
351 // tbemap );
352 // get_on_the_fly_owner()->score_function().eval_cd_2b(
353 // get_on_the_fly_owner()->pose().residue( other_node_index ),
354 // get_rotamer( current_state_ ),
355 // get_on_the_fly_owner()->pose(),
356 // tbemap );
357 // T << "Rescored combo swapped: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
358 //
359 // /// Check if order dependence is causing a bug -- res1 and res2 should not have to be ordered in the
360 // /// residue pair energy calls
361 // tbemap.zero();
362 // get_on_the_fly_owner()->score_function().eval_ci_2b(
363 // get_on_the_fly_owner()->pose().residue( get_node_index() ),
364 // get_adjacent_symmin_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
365 // get_on_the_fly_owner()->pose(),
366 // tbemap );
367 // get_on_the_fly_owner()->score_function().eval_cd_2b(
368 // get_on_the_fly_owner()->pose().residue( get_node_index() ),
369 // get_adjacent_symmin_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
370 // get_on_the_fly_owner()->pose(),
371 // tbemap );
372 // T << "Rescored combo 2 swapped: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
373 //
374 // //These references are useful in GDB if you need to debug.
375 // //
376 // //conformation::Residue const & res_in_pose = get_on_the_fly_owner()->pose().residue( get_node_index() );
377 // //conformation::Residue const & res_on_node = get_rotamer( current_state_ );
378 // //conformation::Residue const & other_res_in_pose = get_on_the_fly_owner()->pose().residue( other_node_index );
379 // //conformation::Residue const & other_res_on_node = get_adjacent_symmin_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]);
380 // //SymmMinimalistNode * neighbor = get_adjacent_symmin_node( ii );
381 //
382 // break;
383 // }
384 // if ( !corresponding_edge_found_in_ig ) {
385 // T << "Did not find edge in energy map to " << other_node_index << " with energy " << real_energy << " in the interaction graph!" << std::endl;
386 // }
387 // }
388 // }
389 // }// end scope
390 //
391 // /// Look at interaction graph edges that are absent from the energy graph
392 // { //scope
393 // scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
394 // for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
395 // Size const other_node_index = (Size) get_index_of_adjacent_node( ii );
396 // if ( curr_state_two_body_energies_[ ii ] == 0 ) continue;
397 // bool found_similar_edge( false );
398 //
399 // for ( core::graph::Graph::EdgeListConstIter
400 // iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
401 // iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
402 // iter != iter_end; ++iter ) {
403 // if ( other_node_index != (Size) (*iter)->get_other_ind( seqpos ) ) continue;
404 // found_similar_edge = true;
405 //
406 // //scoring::EnergyMap const & tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->energy_map() );
407 // //Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
408 //
409 // }
410 // if ( ! found_similar_edge ) {
411 // T << "Edge in lmig CUR to node " << other_node_index << " with energy: " << curr_state_two_body_energies_[ ii ] << " absent from energy graph!" << std::endl;
412 // }
413 // }
414 // } // end scope
415 //
416 // /// Place the alternate rotamer on the pose and rescore.
417 // get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(alternate_state_).seqpos(), get_rotamer( alternate_state_ ), false);
418 // get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
419 //
420 // T << "ALT One body energies: ";
421 // 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;
422 // T << "internal one body energies: " << alternate_state_one_body_energy_ << std::endl;
423 // T << "location: alternate_state_one_body_energy_ " << & alternate_state_one_body_energy_ << std::endl;
424 //
425 //
426 // { //scope
427 // scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
428 // for ( core::graph::Graph::EdgeListConstIter
429 // iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
430 // iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
431 // iter != iter_end; ++iter ) {
432 // bool corresponding_edge_found_in_ig( false );
433 // scoring::EnergyMap const tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->fill_energy_map() );
434 // Size const other_node_index = (*iter)->get_other_ind( seqpos );
435 // Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
436 // for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
437 // if ( (Size) get_index_of_adjacent_node( ii ) != other_node_index ) continue;
438 // corresponding_edge_found_in_ig = true;
439 // if ( std::abs( real_energy - alternate_state_two_body_energies_[ ii ]) > 0.001 ) {
440 // T << "ALT Real score: edge to " << other_node_index << " energy: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
441 // T << "ALT Predicted score: edge to " << get_index_of_adjacent_node( ii ) << " energy: " << alternate_state_two_body_energies_[ ii ] << std::endl;
442 // T << "ALT Real - Predicted: " << real_energy - alternate_state_two_body_energies_[ ii ] << std::endl;
443 // tbemap.show_nonzero( T );
444 // T << std::endl;
445 //
446 // int const this_aa( alt_state_sparse_mat_info_.get_aa_type());
447 // int const other_aa( neighbors_curr_state_sparse_info_[ii].get_aa_type() );
448 // T << "Sparse matrix info: (this,other): " ;
449 // T << (int) get_incident_symmin_edge( ii )->get_sparse_aa_neighbor_info()( this_aa, other_aa );
450 // T << " (other,this): ";
451 // T << (int) get_incident_symmin_edge( ii )->get_sparse_aa_neighbor_info()( other_aa, this_aa ) << std::endl;
452 //
453 // core::PackerEnergy recomputed = compute_rotamer_pair_energy( ii, alternate_state_, neighbors_curr_state_[ ii ] );
454 // T << "Recomputed energy: " << recomputed << std::endl;
455 //
456 // break;
457 // }
458 // if ( !corresponding_edge_found_in_ig ) {
459 // T << "Did not find edge in energy map to " << other_node_index << " with energy " << real_energy << " in the interaction graph!" << std::endl;
460 // }
461 //
462 // }
463 // }
464 // }// end scope
465 // /// Look at interaction graph edges that are absent from the energy graph
466 // { //scope
467 // scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
468 // for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
469 // Size const other_node_index = (Size) get_index_of_adjacent_node( ii );
470 // if ( alternate_state_two_body_energies_[ ii ] == 0 ) continue;
471 // bool found_similar_edge( false );
472 //
473 // for ( core::graph::Graph::EdgeListConstIter
474 // iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
475 // iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
476 // iter != iter_end; ++iter ) {
477 // if ( other_node_index != (Size) (*iter)->get_other_ind( seqpos ) ) continue;
478 // found_similar_edge = true;
479 //
480 // //scoring::EnergyMap const & tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->energy_map() );
481 // //Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
482 //
483 // }
484 // if ( ! found_similar_edge ) {
485 // T << "Edge in lmig ALT to node " << other_node_index << " with energy: " << alternate_state_two_body_energies_[ ii ] << " absent from energy graph!" << std::endl;
486 // }
487 // }
488 // } // end scope
489 //
490 //
491 // get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(alternate_state_).seqpos(), get_rotamer( current_state_ ), false);
492 // get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
493 // }
494 // } // end debug
495 
496  return alternate_state_total_energy_ - curr_state_total_energy_;
497 
498 }
499 
500 
501 ///@brief commits the last substitution that was considered by this Node
502 void
504 {
506 
510 
511  //copies from [1] to end
512  //utility::vector1< core::PackerEnergy >::iterator alt_position1 = alternate_state_two_body_energies_.begin();
513  //utility::vector1< core::PackerEnergy >::iterator curr_position1 = curr_state_two_body_energies_.begin();
514 
515  std::copy( alternate_state_two_body_energies_.begin(),
518 
519  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii )
520  {
522  get_node_index(),
525  );
526  }
527 
529 
530 // if ( debug ) {
531 // get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(current_state_).seqpos(), get_rotamer( current_state_ ), false );
532 // get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
533 // }
534 
535  return;
536 }
537 
538 void
540 {
542 }
543 
546  int edge_making_energy_request
547 )
548 {
550  edge_making_energy_request,
552  neighbors_curr_state_[ edge_making_energy_request ]
553  );
554 }
555 
558  int edge_making_energy_request
559 )
560 {
562  edge_making_energy_request,
564  neighbors_curr_state_[ edge_making_energy_request ] );
565 }
566 
567 
568 void
570  int edge_to_altered_neighbor,
571  int other_node_new_state
572 )
573 {
575  curr_state_two_body_energies_[ edge_to_altered_neighbor ] = 0;
576  neighbors_curr_state_[ edge_to_altered_neighbor ] = other_node_new_state;
577 }
578 
579 void
581 {
582  T << "curr_state " << current_state_ << " ";
583  T << "curr_state_one_body_energy_ ";
584  T << curr_state_one_body_energy_ << " ";
585  T << "curr_state_total_energy_" << curr_state_total_energy_ << " ";
586  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
587  {
588  T << "(" << get_index_of_adjacent_node(ii) << ":" << curr_state_two_body_energies_[ ii ] << ") ";
589  }
590  T << std::endl;
591 }
592 
593 
594 void
596 {
597  assert( get_edge_vector_up_to_date() );
599  for (int ii = 1; ii <= get_num_incident_edges(); ++ii) {
601  }
603  return;
604 }
605 
607 {
610 
613  return;
614 }
615 
616 
617 //-----------------------------------------------------------------//
618 
619 
621  InteractionGraphBase* owner,
622  int first_node_ind,
623  int second_node_ind
624 ):
625  SymmOnTheFlyEdge( owner, first_node_ind, second_node_ind),
626  curr_state_energy_( 0.0f ),
627  partial_state_assignment_( false ),
628  preped_for_sim_annealing_( false )
629 {
630 }
631 
633 
635 {
636  throw utility::excn::EXCN_Msg_Exception( "Method unimplemented: SymmMinimalistEdge::get_two_body_energy" );
637  return 0.0;
638 }
639 
640 void
642 {}
643 
644 void
646 {
647  if ( preped_for_sim_annealing_ ) return;
649 }
650 
651 unsigned int
653 {
654  return sizeof( SymmMinimalistEdge );
655 }
656 
657 
658 unsigned int
660 {
661  unsigned int total_memory = SymmOnTheFlyEdge::count_dynamic_memory();
662  return total_memory;
663 }
664 
665 /// @details DANGER: this will not update the cached energies on the nodes this edge is incident upon.
666 void
668 {
669  edge_weight( weight );
670 }
671 
674 {
675  return curr_state_energy_;
676 }
677 
678 
679 void
681  int node_ind,
682  int new_state,
683  core::PackerEnergy & new_energy
684 )
685 {
686  int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
687  int node_not_substituted = ! node_substituted;
688 
690  compute_pair_energy_for_current_state(
692 
693  new_energy = curr_state_energy_;
694 
696  get_edges_position_in_nodes_edge_vector( node_not_substituted ),
698  new_state
699  );
700 }
701 
702 
703 void
705 {
706  int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
707  int node_not_substituted = ! node_substituted;
708 
709  curr_state_energy_ = 0;
710 
712  get_edges_position_in_nodes_edge_vector( node_not_substituted ),
714  0
715  );
716  return;
717 }
718 
719 
721  int node_ind,
722  int new_state
723 )
724 {
725  int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
726  int node_not_substituted = ! node_substituted;
727 
728  curr_state_energy_ = 0;
729 
731  get_edges_position_in_nodes_edge_vector( node_not_substituted ),
732  new_state );
734 }
735 
736 
739 {
741  && get_symmin_node(0)->get_current_state() != 0
742  && get_symmin_node(1)->get_current_state() != 0) {
743 
745  compute_pair_energy_for_current_state(
748  }
749  return curr_state_energy_;
750 }
751 
754  int changing_node_index
755 )
756 {
757  int const node_changing = changing_node_index == get_node_index( 0 ) ? 0 : 1;
758  alt_state_energy_ = get_symmin_node( node_changing )->
759  compute_pair_energy_for_alternate_state(
760  get_edges_position_in_nodes_edge_vector( node_changing ));
761 
762  return alt_state_energy_;
763 }
764 
766 {
767  return 1;
768 }
769 
770 void
772 {
773  T << "SymmMinimalistEdge: " << get_node_index( 0 ) << "/" << get_node_index( 1 );
774  T << " energy= " << curr_state_energy_ << std::endl;
775 }
776 
777 
778 //-------------------------------------------------------------------//
779 
781  int numNodes
782 ) :
783  SymmOnTheFlyInteractionGraph( numNodes ),
784  first_time_prepping_for_simA_( true ),
785  num_commits_since_last_update_( 0 ),
786  total_energy_current_state_assignment_( 0.0 ),
787  total_energy_alternate_state_assignment_( 0.0 ),
788  node_considering_alt_state_( 0 ),
789  have_not_committed_last_substitution_( false )
790 {
791 }
792 
793 
795 
796 void
798 {
800  for (int ii = 1; ii <= get_num_nodes(); ++ii)
801  {
803  }
805 }
806 
807 
810 {
812  get_symmin_node( node_ind )->assign_state( new_state );
815 }
816 
817 
820  ObjexxFCL::FArray1_int & node_states
821 )
822 {
824  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
825  get_symmin_node( ii )->partial_assign_state( node_states( ii ) );
826  }
827  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
829  }
832 }
833 
834 
835 void
837  int node_ind,
838  int new_state,
839  core::PackerEnergy & delta_energy,
840  core::PackerEnergy & prev_energy_for_node
841 )
842 {
845  }
846 
847  node_considering_alt_state_ = node_ind;
848 
849  delta_energy = get_symmin_node( node_ind )->project_deltaE_for_substitution( new_state, prev_energy_for_node );
850 
853 }
854 
857 {
860 
862 
866  }
867 
869 }
870 
871 
874 {
875  //T << "Num rotamer pair energy calculations performed: " << SymmMinimalistNode::num_rpe_calcs << std::endl;
878 }
879 
880 ///@brief O(1) total energy report. Protected read access for derived classes.
883 {
885 }
886 
887 int
889 {
890  int sum = 0;
891  for (std::list< EdgeBase* >::const_iterator iter = get_edge_list_begin();
892  iter != get_edge_list_end(); ++iter)
893  {
894  sum += ((SymmMinimalistEdge*) *iter)->get_two_body_table_size();
895  }
896  return sum;
897 }
898 
899 void
901 {
902  T << "State Assignment: " << std::endl;
903  for (int ii = 1; ii <= get_num_nodes(); ++ii)
904  {
905  T << "Node " << ii << " state " << get_symmin_node(ii)->get_current_state() << std::endl;
906  get_symmin_node(ii)->print();
907  }
908 
909  for (std::list< EdgeBase* >::const_iterator iter = get_edge_list_begin();
910  iter != get_edge_list_end(); ++iter)
911  {
912  ((SymmMinimalistEdge*) (*iter))->print_current_energy();
913  }
914  T << "Energy: " << total_energy_current_state_assignment_ << std::endl;
915 }
916 
917 
918 void
920 
923 {
924  core::PackerEnergy esum = 0;
925  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
926  if ( get_vertex_member_of_energy_sum_group( ii, group_id ) ) {
928  }
929  }
930 
931  for ( std::list< EdgeBase* >::iterator edge_iter = get_edge_list_begin();
932  edge_iter != get_edge_list_end(); ++edge_iter) {
933  int first_node_ind = (*edge_iter)->get_first_node_ind();
934  int second_node_ind = (*edge_iter)->get_second_node_ind();
935 
936  if ( get_vertex_member_of_energy_sum_group( first_node_ind, group_id )
937  && get_vertex_member_of_energy_sum_group( second_node_ind, group_id )) {
938  esum += ((SymmMinimalistEdge*) (*edge_iter))->get_current_two_body_energy();
939  }
940  }
941 
942  return esum;
943 }
944 
945 void
947 {
950  }
952 }
953 
954 unsigned int
956 {
957  return sizeof( SymmMinimalistInteractionGraph );
958 }
959 
960 unsigned int
962 {
963  unsigned int total_memory = SymmOnTheFlyInteractionGraph::count_dynamic_memory();
964  return total_memory;
965 }
966 
967 
968 NodeBase*
969 SymmMinimalistInteractionGraph::create_new_node( int node_index, int num_states )
970 {
971  return new SymmMinimalistNode( this, node_index, num_states );
972 }
973 
974 
975 EdgeBase*
977 {
978  return new SymmMinimalistEdge( this, index1, index2 );
979 }
980 
981 void
983 {
985 
986  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
988  get_one_body_energy_current_state();
989  }
990 
991  for (std::list<EdgeBase*>::iterator iter = get_edge_list_begin();
992  iter != get_edge_list_end(); ++iter) {
994  ((SymmMinimalistEdge*) *iter)->get_current_two_body_energy();
995  }
996 
998  return;
999 }
1000 
1001 } // namespace interaction_graph
1002 } // namespace pack
1003 } // namespace core