Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
LinearMemoryInteractionGraph.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/LinearMemoryInteractionGraph.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.linmem_ig", basic::t_error );
42 
43 /// @brief For testing the LinMemIG, 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  OnTheFlyNode( 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 << "LinearMemNode " << get_node_index() << " with " << get_num_states() << " states" << std::endl;
107  T << "curr_state " << current_state_ << " ";
108  T << "curr_state_sparse_mat_info_ ";
111  T << "Curr One Body Energy: " << curr_state_one_body_energy_ << std::endl;
112  T << "Curr Two Body Energies:";
113  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
114  {
115  T << " " << get_index_of_adjacent_node(ii) << ":" << curr_state_two_body_energies_[ ii ];
116  }
117  T << std::endl;
118 
119  if ( ! alternate_state_is_being_considered_ ) return;
120  T << "Alt One Body Energy: " << alternate_state_one_body_energy_ << std::endl;
121  T << "Alt Two Body Energies:";
122  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
123  {
125  }
126  T << std::endl << "-----------------" << std::endl;
127 
128 
129 }
130 
131 unsigned int
133 {
134  return sizeof( LinearMemNode );
135 }
136 
137 unsigned int
139 {
140  unsigned int total_memory = OnTheFlyNode::count_dynamic_memory();
141 
142  total_memory += rhq_.dynamic_memory_usage();
143  total_memory += aa_neighbors_for_edges_.size() * sizeof( unsigned char );
144  total_memory += neighbors_curr_state_.size() * sizeof( int );
145  total_memory += neighbors_state_recent_history_index_.size() * sizeof( int );
146  total_memory += neighbors_curr_state_sparse_info_.size() * sizeof( SparseMatrixIndex );
147 
148  total_memory += curr_state_two_body_energies_.size() * sizeof( core::PackerEnergy );
149  total_memory += alternate_state_two_body_energies_.size() * sizeof( core::PackerEnergy );
150 
151  return total_memory;
152 }
153 
154 
155 ///@brief puts the LinMemNode in the unassigned state
156 void
158 {
159  current_state_ = 0;
160  alternate_state_ = 0;
162 
164  std::fill(
167  0.0f);
169 
170  for (int ii = 1; ii <= get_num_incident_edges(); ++ii )
171  {
173  acknowledge_state_zeroed( get_node_index() );
174  }
175 
176  return;
177 }
178 
179 
180 ////@brief assigns a new state to the Node
181 void
183 {
184  assert( new_state >= 0 && new_state <= get_num_states());
185 
186  if (new_state == 0) assign_zero_state();
187  else
188  {
189  //T << "assign_state: node - " << get_node_index() << " new state " << new_state << "...";
190  current_state_ = new_state;
196  int bumped_recent_history_index = update_recent_history( current_state_ );
197 
198  for (int ii = 1; ii <= get_num_incident_edges(); ++ii )
199  {
201  get_node_index(),
204  bumped_recent_history_index,
205  rhq_.head_of_queue(),
207  );
208 
210  }
211  //T<< "..done" << std::endl;
212  }
213  if ( debug ) {
216  }
217  return;
218 }
219 
220 
221 void
223 {
224  if (new_state == 0 )
225  {
227  return;
228  }
229 
230  current_state_ = new_state;
233  int bumped_recent_history_index = update_recent_history( current_state_ );
234 
235  for (int ii = 1; ii <= get_num_incident_edges(); ++ii )
236  {
238  get_node_index(),
241  bumped_recent_history_index,
242  rhq_.head_of_queue()
243  );
244  }
246 }
247 
248 
250 {
251  if ( current_state_ == 0 ) return;
252 
255  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
256  {
259  get_energy_following_partial_state_assignment();
261  }
262 }
263 
264 
267 (
268  int alternate_state,
269  core::PackerEnergy & prev_node_energy
270 )
271 {
272  alternate_state_is_being_considered_ = true;
273  //procrastinated_ = false;
274  //T << "proj_deltaE: node - " << get_node_index()
275  // << " alt state " << alternate_state << "...";
276 
277  alternate_state_ = alternate_state;
278  int alternate_state_recent_history_index = rhq_.pos_in_history_queue( alternate_state_ );
279 
280  bool store_rpes = num_recently_accepted_ < THRESHOLD_ACCEPTANCE_RATE_FOR_RPE_STORAGE;
281 
282  alt_state_sparse_mat_info_ = get_sparse_mat_info_for_state( alternate_state );
283  alternate_state_one_body_energy_ = get_one_body_energy( alternate_state );
284  alternate_state_total_energy_ = alternate_state_one_body_energy_;
285  prev_node_energy = curr_state_total_energy_;
286 
287  int aa_neighb_linear_index_offset = aa_neighbors_for_edges_.
288  index(1, 1, alt_state_sparse_mat_info_.get_aa_type() ) - 1;
289 
290  for (int ii = 1; ii <= get_num_incident_edges();
291  ++ii, aa_neighb_linear_index_offset += get_num_aa_types())
292  {
293 
294  if ( neighbors_curr_state_[ ii ] != 0 &&
295  aa_neighbors_for_edges_[ aa_neighb_linear_index_offset
296  + neighbors_curr_state_sparse_info_[ ii ].get_aa_type() ] ) {
297 
298  alternate_state_two_body_energies_[ ii ] =
299  get_incident_linmem_edge( ii )->get_energy_for_alt_state(
300  store_rpes,
301  get_node_index(),
302  alternate_state_,
303  alternate_state_recent_history_index,
304  neighbors_curr_state_[ ii ],
305  neighbors_state_recent_history_index_[ ii ]
306  );
307 
308  } else {
309  alternate_state_two_body_energies_[ ii ] = 0;
310  }
311 
312  alternate_state_total_energy_ += alternate_state_two_body_energies_[ ii ];
313  }
314 
315  if ( debug && ! get_owner()->any_vertex_state_unassigned() ) {
316  assert( get_rotamer(alternate_state_).seqpos() == get_rotamer(current_state_).seqpos() );
317  get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(alternate_state_).seqpos(), get_rotamer( alternate_state_ ), false);
318  Real score_after = get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
319  /// Now handled automatically. get_on_the_fly_owner()->score_function().accumulate_residue_total_energies( get_on_the_fly_owner()->non_const_pose() );
320  Real rep_after = get_on_the_fly_owner()->pose().energies().residue_total_energies( get_rotamer(alternate_state_).seqpos() )[ scoring::fa_rep ];
321 
322  get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(current_state_).seqpos(), get_rotamer( current_state_ ), false);
323  Real score_before = get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
324  /// Now handled automatically. get_on_the_fly_owner()->score_function().accumulate_residue_total_energies( get_on_the_fly_owner()->non_const_pose() );
325  Real rep_before = get_on_the_fly_owner()->pose().energies().residue_total_energies( get_rotamer(alternate_state_).seqpos() )[ scoring::fa_rep ];
326 
327  Real actual_score_delta = score_after - score_before;
328  Real projected_score_delta = alternate_state_total_energy_ - curr_state_total_energy_;
329  Real delta_delta = actual_score_delta - projected_score_delta;
330 
331  if ( (std::abs( delta_delta ) > 0.001 && std::abs( delta_delta / score_after ) > 10E-5) &&
332  (rep_after < 4 && rep_before < 4) ) {
333 
334  T << "Score before: " << score_before << " Score after " << score_after << " delta: " << actual_score_delta;
335  T << " projected delta: " << projected_score_delta << " delta delta: " << delta_delta << " rep: " << rep_before << " " << rep_after << std::endl;
336 
337 
338  /// LOOK AT CURRENT ENERGIES
339  Size const seqpos( get_rotamer(alternate_state_).seqpos() );
340  T << "Problem rotamer substitution at " << seqpos << ": from " << get_rotamer( current_state_).name() << " to " << get_rotamer(alternate_state_).name() << std::endl;
341  T << "CURR One body energies: ";
342  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;
343  T << "internal one body energies: " << curr_state_one_body_energy_ << std::endl;
344  T << "location: curr_state_one_body_energy_ " << & curr_state_one_body_energy_ << std::endl;
345 
346  { //scope
347  scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
349  iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
350  iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
351  iter != iter_end; ++iter ) {
352  bool corresponding_edge_found_in_ig( false );
353  scoring::EnergyMap const tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->fill_energy_map() );
354  Size const other_node_index = (*iter)->get_other_ind( seqpos );
355  Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
356  for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
357  if ( (Size) get_index_of_adjacent_node( ii ) != other_node_index ) continue;
358  corresponding_edge_found_in_ig = true;
359  if ( std::abs( real_energy - curr_state_two_body_energies_[ ii ]) > 0.001 ) {
360  T << "Other residue: " << get_adjacent_linmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]).name() << std::endl;
361  T << "CURR Real score: edge to " << other_node_index << " energy: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
362  T << "CURR Predicted score: edge to " << get_index_of_adjacent_node( ii ) << " energy: " << curr_state_two_body_energies_[ ii ] << std::endl;
363  T << "CURR Real - Predicted: " << real_energy - curr_state_two_body_energies_[ ii ] << std::endl;
364 
365  tbemap.show_nonzero( T );
366  T << std::endl;
367 
368  int const this_aa( curr_state_sparse_mat_info_.get_aa_type());
369  int const other_aa( neighbors_curr_state_sparse_info_[ii].get_aa_type() );
370  T << "Sparse matrix info: (this,other): " ;
371  T << (int) get_incident_linmem_edge( ii )->get_sparse_aa_neighbor_info()( this_aa, other_aa );
372  T << " (other,this): ";
373  T << (int) get_incident_linmem_edge( ii )->get_sparse_aa_neighbor_info()( other_aa, this_aa ) << std::endl;
374 
375  core::PackerEnergy recomputed = compute_rotamer_pair_energy( ii, current_state_, neighbors_curr_state_[ ii ] );
376  T << "Recomputed energy: " << recomputed << std::endl;
377 
378  scoring::EnergyMap tbemap;
379  get_on_the_fly_owner()->score_function().eval_ci_2b(
380  get_on_the_fly_owner()->pose().residue( get_node_index() ),
381  get_on_the_fly_owner()->pose().residue( other_node_index ),
382  get_on_the_fly_owner()->pose(),
383  tbemap );
384  get_on_the_fly_owner()->score_function().eval_cd_2b(
385  get_on_the_fly_owner()->pose().residue( get_node_index() ),
386  get_on_the_fly_owner()->pose().residue( other_node_index ),
387  get_on_the_fly_owner()->pose(),
388  tbemap );
389  T << "Rescored from pose: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
390 
391  tbemap.zero();
392  get_on_the_fly_owner()->score_function().eval_ci_2b(
393  get_rotamer( current_state_ ),
394  get_on_the_fly_owner()->pose().residue( other_node_index ),
395  get_on_the_fly_owner()->pose(),
396  tbemap );
397  get_on_the_fly_owner()->score_function().eval_cd_2b(
398  get_rotamer( current_state_ ),
399  get_on_the_fly_owner()->pose().residue( other_node_index ),
400  get_on_the_fly_owner()->pose(),
401  tbemap );
402  T << "Rescored combo: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
403 
404 
405  tbemap.zero();
406  get_on_the_fly_owner()->score_function().eval_ci_2b(
407  get_adjacent_linmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
408  get_on_the_fly_owner()->pose().residue( get_node_index() ),
409  get_on_the_fly_owner()->pose(),
410  tbemap );
411  get_on_the_fly_owner()->score_function().eval_cd_2b(
412  get_adjacent_linmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
413  get_on_the_fly_owner()->pose().residue( get_node_index() ),
414  get_on_the_fly_owner()->pose(),
415  tbemap );
416  T << "Rescored combo 2: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
417 
418 
419  /// Check if order dependence is causing a bug -- res1 and res2 should not have to be ordered in the
420  /// residue pair energy calls
421  tbemap.zero();
422  get_on_the_fly_owner()->score_function().eval_ci_2b(
423  get_on_the_fly_owner()->pose().residue( other_node_index ),
424  get_rotamer( current_state_ ),
425  get_on_the_fly_owner()->pose(),
426  tbemap );
427  get_on_the_fly_owner()->score_function().eval_cd_2b(
428  get_on_the_fly_owner()->pose().residue( other_node_index ),
429  get_rotamer( current_state_ ),
430  get_on_the_fly_owner()->pose(),
431  tbemap );
432  T << "Rescored combo swapped: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
433 
434  /// Check if order dependence is causing a bug -- res1 and res2 should not have to be ordered in the
435  /// residue pair energy calls
436  tbemap.zero();
437  get_on_the_fly_owner()->score_function().eval_ci_2b(
438  get_on_the_fly_owner()->pose().residue( get_node_index() ),
439  get_adjacent_linmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
440  get_on_the_fly_owner()->pose(),
441  tbemap );
442  get_on_the_fly_owner()->score_function().eval_cd_2b(
443  get_on_the_fly_owner()->pose().residue( get_node_index() ),
444  get_adjacent_linmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]),
445  get_on_the_fly_owner()->pose(),
446  tbemap );
447  T << "Rescored combo 2 swapped: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
448 
449  //These references are useful in GDB if you need to debug.
450  //
451  //conformation::Residue const & res_in_pose = get_on_the_fly_owner()->pose().residue( get_node_index() );
452  //conformation::Residue const & res_on_node = get_rotamer( current_state_ );
453  //conformation::Residue const & other_res_in_pose = get_on_the_fly_owner()->pose().residue( other_node_index );
454  //conformation::Residue const & other_res_on_node = get_adjacent_linmem_node( ii )->get_rotamer( neighbors_curr_state_[ ii ]);
455  //LinearMemNode * neighbor = get_adjacent_linmem_node( ii );
456 
457  break;
458  }
459  if ( !corresponding_edge_found_in_ig ) {
460  T << "Did not find edge in energy map to " << other_node_index << " with energy " << real_energy << " in the interaction graph!" << std::endl;
461  }
462  }
463  }
464  }// end scope
465 
466  /// Look at interaction graph edges that are absent from the energy graph
467  { //scope
468  scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
469  for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
470  Size const other_node_index = (Size) get_index_of_adjacent_node( ii );
471  if ( curr_state_two_body_energies_[ ii ] == 0 ) continue;
472  bool found_similar_edge( false );
473 
475  iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
476  iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
477  iter != iter_end; ++iter ) {
478  if ( other_node_index != (Size) (*iter)->get_other_ind( seqpos ) ) continue;
479  found_similar_edge = true;
480 
481  //scoring::EnergyMap const & tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->energy_map() );
482  //Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
483 
484  }
485  if ( ! found_similar_edge ) {
486  T << "Edge in lmig CUR to node " << other_node_index << " with energy: " << curr_state_two_body_energies_[ ii ] << " absent from energy graph!" << std::endl;
487  }
488  }
489  } // end scope
490 
491  /// Place the alternate rotamer on the pose and rescore.
492  get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(alternate_state_).seqpos(), get_rotamer( alternate_state_ ), false);
493  get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
494 
495  T << "ALT One body energies: ";
496  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;
497  T << "internal one body energies: " << alternate_state_one_body_energy_ << std::endl;
498  T << "location: alternate_state_one_body_energy_ " << & alternate_state_one_body_energy_ << std::endl;
499 
500 
501  { //scope
502  scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
504  iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
505  iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
506  iter != iter_end; ++iter ) {
507  bool corresponding_edge_found_in_ig( false );
508  scoring::EnergyMap const tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->fill_energy_map() );
509  Size const other_node_index = (*iter)->get_other_ind( seqpos );
510  Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
511  for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
512  if ( (Size) get_index_of_adjacent_node( ii ) != other_node_index ) continue;
513  corresponding_edge_found_in_ig = true;
514  if ( std::abs( real_energy - alternate_state_two_body_energies_[ ii ]) > 0.001 ) {
515  T << "ALT Real score: edge to " << other_node_index << " energy: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
516  T << "ALT Predicted score: edge to " << get_index_of_adjacent_node( ii ) << " energy: " << alternate_state_two_body_energies_[ ii ] << std::endl;
517  T << "ALT Real - Predicted: " << real_energy - alternate_state_two_body_energies_[ ii ] << std::endl;
518  tbemap.show_nonzero( T );
519  T << std::endl;
520 
521  int const this_aa( alt_state_sparse_mat_info_.get_aa_type());
522  int const other_aa( neighbors_curr_state_sparse_info_[ii].get_aa_type() );
523  T << "Sparse matrix info: (this,other): " ;
524  T << (int) get_incident_linmem_edge( ii )->get_sparse_aa_neighbor_info()( this_aa, other_aa );
525  T << " (other,this): ";
526  T << (int) get_incident_linmem_edge( ii )->get_sparse_aa_neighbor_info()( other_aa, this_aa ) << std::endl;
527 
528  core::PackerEnergy recomputed = compute_rotamer_pair_energy( ii, alternate_state_, neighbors_curr_state_[ ii ] );
529  T << "Recomputed energy: " << recomputed << std::endl;
530 
531  break;
532  }
533  if ( !corresponding_edge_found_in_ig ) {
534  T << "Did not find edge in energy map to " << other_node_index << " with energy " << real_energy << " in the interaction graph!" << std::endl;
535  }
536 
537  }
538  }
539  }// end scope
540  /// Look at interaction graph edges that are absent from the energy graph
541  { //scope
542  scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
543  for ( Size ii = 1; ii <= (Size) get_num_incident_edges(); ++ii ) {
544  Size const other_node_index = (Size) get_index_of_adjacent_node( ii );
545  if ( alternate_state_two_body_energies_[ ii ] == 0 ) continue;
546  bool found_similar_edge( false );
547 
549  iter = energygraph.get_node( seqpos )->const_edge_list_begin(),
550  iter_end = energygraph.get_node( seqpos)->const_edge_list_end();
551  iter != iter_end; ++iter ) {
552  if ( other_node_index != (Size) (*iter)->get_other_ind( seqpos ) ) continue;
553  found_similar_edge = true;
554 
555  //scoring::EnergyMap const & tbemap( (static_cast< scoring::EnergyEdge const * > (*iter))->energy_map() );
556  //Real const real_energy = get_on_the_fly_owner()->score_function().weights().dot( tbemap );
557 
558  }
559  if ( ! found_similar_edge ) {
560  T << "Edge in lmig ALT to node " << other_node_index << " with energy: " << alternate_state_two_body_energies_[ ii ] << " absent from energy graph!" << std::endl;
561  }
562  }
563  } // end scope
564 
565 
566  get_on_the_fly_owner()->non_const_pose().replace_residue( get_rotamer(alternate_state_).seqpos(), get_rotamer( current_state_ ), false);
567  get_on_the_fly_owner()->score_function()( get_on_the_fly_owner()->non_const_pose() );
568  }
569  } // end debug
570 
571  return alternate_state_total_energy_ - curr_state_total_energy_;
572 
573 }
574 
575 
576 ///@brief commits the last substitution that was considered by this Node
577 void
579 {
581 
586 
587  //copies from [1] to end
588  //utility::vector1< core::PackerEnergy >::iterator alt_position1 = alternate_state_two_body_energies_.begin();
589  //utility::vector1< core::PackerEnergy >::iterator curr_position1 = curr_state_two_body_energies_.begin();
590 
591  std::copy( alternate_state_two_body_energies_.begin(),
594 
595  int bumped_recent_history_index = update_recent_history( current_state_ );
596 
597  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii )
598  {
600  get_node_index(),
604  bumped_recent_history_index,
605  rhq_.head_of_queue(),
607  );
608  }
609 
611 
614  {
617  }
620  {
622  }
624 
625  if ( debug ) {
628  }
629 
630  return;
631 }
632 
633 void
635 {
639  {
642  }
645  {
647  }
649 }
650 
653  int edge_making_energy_request
654 )
655 {
657  neighbors_curr_state_sparse_info_[ edge_making_energy_request ].get_aa_type(),
658  edge_making_energy_request,
661  edge_making_energy_request,
663  neighbors_curr_state_[ edge_making_energy_request ]
664  );
665  } else {
666  return 0;
667  }
668 
669 }
670 
673  int edge_making_energy_request
674 )
675 {
677  edge_making_energy_request,
679  neighbors_curr_state_[ edge_making_energy_request ] );
680 }
681 
682 
683 void
685  int edge_to_altered_neighbor,
686  int other_node_new_state,
687  SparseMatrixIndex const & other_node_new_state_sparse_info,
688  int other_state_recent_history_index
689 )
690 {
692  curr_state_two_body_energies_[ edge_to_altered_neighbor ] = 0;
693  neighbors_curr_state_[ edge_to_altered_neighbor ] = other_node_new_state;
694  neighbors_curr_state_sparse_info_[ edge_to_altered_neighbor ] =
695  other_node_new_state_sparse_info;
696  neighbors_state_recent_history_index_[ edge_to_altered_neighbor ] =
697  other_state_recent_history_index;
698 }
699 
700 
701 
703  int num_states_to_maintain_in_recent_history
704 )
705 {
706  rhq_.history_size( num_states_to_maintain_in_recent_history );
707 }
708 
709 int
711 {
712  return rhq_.history_size();
713 }
714 
715 
716 void
718 {
719  T << "curr_state " << current_state_ << " ";
720  T << "curr_state_sparse_mat_info_ ";
723  T << "curr_state_one_body_energy_ ";
724  T << curr_state_one_body_energy_ << " ";
725  T << "curr_state_total_energy_" << curr_state_total_energy_ << " ";
726  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
727  {
728  T << "(" << get_index_of_adjacent_node(ii) << ":" << curr_state_two_body_energies_[ ii ] << ") ";
729  }
730  T << std::endl;
731 }
732 
733 
734 void
736 {
737  assert( get_edge_vector_up_to_date() );
739  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
740  {
743  }
745  return;
746 }
747 
748 
749 
751 {
756 
757  aa_neighbors_for_edges_.dimension(
759 
760  //copy sparse aa-neighbor info from edges
761  int count_neighbs_with_higher_indices = 0;
762  for (int ii = 1; ii <= get_num_incident_edges(); ++ii)
763  {
764  neighbors_curr_state_sparse_info_[ii].set_aa_type( 1 );
766 
767  ObjexxFCL::FArray2D< unsigned char > const & edge_aa_neighbs =
769 
771  ++count_neighbs_with_higher_indices;
772  for ( int jj = 1; jj <= get_num_aa_types(); ++jj ) {
773  for ( int kk = 1; kk <= get_num_aa_types(); ++kk ) {
774  aa_neighbors_for_edges_(kk, ii, jj) = edge_aa_neighbs(kk, jj);
775  }
776  }
777  } else {
778  for ( int jj = 1; jj <= get_num_aa_types(); ++jj ) {
779  for ( int kk = 1; kk <= get_num_aa_types(); ++kk ) {
780  aa_neighbors_for_edges_(kk, ii, jj) = edge_aa_neighbs(jj, kk);
781  }
782  }
783  }
784  }
785 
788  return;
789 }
790 
791 
792 // @ brief - allow derived class to "drive" through the deltaE calculation
793 void
794 LinearMemNode::calc_deltaEpd( int alternate_state )
795 {
796  core::PackerEnergy dummy(0.0f);
797  project_deltaE_for_substitution( alternate_state, dummy );
798 }
799 
800 int
802 {
803  return rhq_.push_to_front_of_history_queue( state );
804 }
805 
806 
807 //-----------------------------------------------------------------//
808 
810 
811 
812 
814  InteractionGraphBase* owner,
815  int first_node_ind,
816  int second_node_ind
817 ):
818  OnTheFlyEdge( owner, first_node_ind, second_node_ind),
819  sparse_aa_neighbors_(
820  get_linmem_ig_owner()->get_num_aatypes(),
821  get_linmem_ig_owner()->get_num_aatypes(),
822  (unsigned char) 0 ),
823  curr_state_energy_( 0.0f ),
824  partial_state_assignment_( false ),
825  preped_for_sim_annealing_( false )
826 {
827  store_rpes_[ 0 ] = store_rpes_[ 1 ] = true;
828 }
829 
831 {}
832 
833 void
835  ObjexxFCL::FArray2_bool const & aa_neighbors
836 )
837 {
838  for (int ii = 1; ii <= get_linmem_ig_owner()->get_num_aatypes(); ++ii) {
839  for (int jj = 1; jj <= get_linmem_ig_owner()->get_num_aatypes(); ++jj) {
840  if ( aa_neighbors( jj, ii ) ) {
841  sparse_aa_neighbors_( jj, ii ) = 1;
842  } else {
843  sparse_aa_neighbors_( jj, ii ) = 0;
844  }
845  }
846  }
847 }
848 
849 
850 void LinearMemEdge::force_aa_neighbors( int node1aa, int node2aa)
851 {
852  sparse_aa_neighbors_( node2aa, node1aa ) = 1;
853 }
854 
856 {
857  for (int ii = 1; ii <= get_linmem_ig_owner()->get_num_aatypes(); ++ii) {
858  for (int jj = 1; jj <= get_linmem_ig_owner()->get_num_aatypes(); ++jj) {
859  sparse_aa_neighbors_( jj, ii ) = 1;
860  }
861  }
862 }
863 
864 bool
866  int node1aa,
867  int node2aa
868 ) const
869 {
870  return sparse_aa_neighbors_( node2aa, node1aa ) != 0;
871 }
872 
874 {
875  throw utility::excn::EXCN_Msg_Exception( "Method unimplemented: LinearMemEdge::get_two_body_energy" );
876  return 0.0;
877 }
878 
879 void
881 {}
882 
883 void
885 {
886  for (int ii = 0; ii < 2; ++ii ) {
887  if ( ! store_rpes_[ ii ] ) wipe( ii );
888  store_rpes_[ ii ] = true;
889  }
890 
891  if ( preped_for_sim_annealing_ ) return;
892 
893  for (int ii = 0; ii < 2; ++ii) {
894  int const other = ! ii;
895  stored_rpes_[ ii ].dimension( get_num_states_for_node( other ),
896  get_linmem_node( ii )->get_recent_history_size() );
898  }
899 
901 }
902 
903 unsigned int
905 {
906  return sizeof( LinearMemEdge );
907 }
908 
909 
910 unsigned int
912 {
913  unsigned int total_memory = OnTheFlyEdge::count_dynamic_memory();
914  total_memory += sparse_aa_neighbors_.size() * sizeof( unsigned char );
915  total_memory += stored_rpes_[ 0 ].size() * sizeof( core::PackerEnergy );
916  total_memory += stored_rpes_[ 1 ].size() * sizeof( core::PackerEnergy );
917 
918  return total_memory;
919 }
920 
921 /// @details DANGER: this will not update the cached energies on the nodes this edge is incident upon.
922 void
924 {
925  Real const reweight_factor = weight / edge_weight();
926  for (int ii = 0; ii < 2; ++ii) {
927  for ( Size jj = 1; jj <= stored_rpes_[ ii ].size(); ++jj ) {
928  if ( stored_rpes_[ ii ][ jj ] != NOT_YET_COMPUTED_ENERGY ) {
929  stored_rpes_[ ii ][ jj ] *= reweight_factor;
930  }
931  }
932  }
933  edge_weight( weight );
934 }
935 
936 
939 {
940  return curr_state_energy_;
941 }
942 
943 
944 void
946  int node_ind,
947  int new_state,
948  SparseMatrixIndex const & new_state_sparse_info,
949  int bumped_recent_history_index,
950  int new_state_recent_history_index,
951  core::PackerEnergy & new_energy
952 )
953 {
954  int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
955  int node_not_substituted = ! node_substituted;
956 
958  node_substituted,
959  node_not_substituted,
960  bumped_recent_history_index );
961 
963  compute_pair_energy_for_current_state(
965 
967 
968  new_energy = curr_state_energy_;
969 
970  get_linmem_node( node_not_substituted )->
971  acknowledge_neighbors_state_substitution
972  (
973  get_edges_position_in_nodes_edge_vector( node_not_substituted ),
975  new_state,
976  new_state_sparse_info,
977  new_state_recent_history_index
978  );
979 
980  return;
981 }
982 
983 
984 void
986 {
987  int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
988  int node_not_substituted = ! node_substituted;
989 
990  curr_state_energy_ = 0;
991  SparseMatrixIndex dummy_sparse_info;
992  dummy_sparse_info.set_aa_type( 1 );
993  dummy_sparse_info.set_state_ind_for_this_aa_type(1);
994 
995  get_linmem_node( node_not_substituted )->
996  acknowledge_neighbors_state_substitution
997  (
998  get_edges_position_in_nodes_edge_vector( node_not_substituted ),
1000  0,
1001  dummy_sparse_info,
1002  0
1003  );
1004  return;
1005 }
1006 
1007 
1009  int node_ind,
1010  int new_state,
1011  SparseMatrixIndex const & new_state_sparse_info,
1012  int bumped_recent_history_index,
1013  int new_state_recent_history_index
1014 )
1015 {
1016  int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
1017  int node_not_substituted = ! node_substituted;
1018 
1020  node_substituted,
1021  node_not_substituted,
1022  bumped_recent_history_index );
1023 
1024  curr_state_energy_ = 0;
1025 
1026  get_linmem_node( node_not_substituted )->
1027  acknowledge_neighbors_partial_state_substitution
1028  (
1029  get_edges_position_in_nodes_edge_vector( node_not_substituted ),
1030  new_state,
1031  new_state_sparse_info,
1032  new_state_recent_history_index
1033  );
1035  return;
1036 }
1037 
1038 
1041 {
1043  && get_linmem_node(0)->get_current_state() != 0
1044  && get_linmem_node(1)->get_current_state() != 0) {
1045 
1047  compute_pair_energy_for_current_state(
1049  partial_state_assignment_ = false;
1051  }
1052  return curr_state_energy_;
1053 }
1054 
1055 void
1057  int node_index,
1058  int state,
1059  int recent_history_id
1060 )
1061 {
1062  int node_with_reset_state = node_index == get_node_index( 0 ) ? 0 : 1;
1063  int other = ! node_with_reset_state;
1064 
1065  if ( recent_history_id != 0 ) {
1066  ObjexxFCL::FArray1A< core::PackerEnergy > row_to_wipe(
1067  stored_rpes_[ node_with_reset_state ]( 1, recent_history_id ),
1068  get_num_states_for_node( other ) );
1069  row_to_wipe = NOT_YET_COMPUTED_ENERGY;
1070  }
1071 
1072  for (unsigned int ii = 1; ii <= stored_rpes_[ other ].size2(); ++ii) {
1073  stored_rpes_[ other ]( state, ii ) = NOT_YET_COMPUTED_ENERGY;
1074  }
1075 
1076 }
1077 
1081  bool store_rpes,
1082  int changing_node_index,
1083  int alternate_state,
1084  int alternate_state_recent_history_index,
1085  int other_node_curr_state,
1086  int other_node_state_recent_history_index
1087 )
1088 {
1089  assert( other_node_curr_state != 0 );
1090 
1091  //T << "get_energy_for_alt_state: " << get_node_index( 0 ) << " " << get_node_index( 1 ) << " srpe: " << store_rpes;
1092  //T << " chID " << changing_node_index << " alt: " << alternate_state << " altHI: " << alternate_state_recent_history_index;
1093  //T << " oncurr: " << other_node_curr_state << " oncurrHI: " << other_node_state_recent_history_index << std::endl;
1094 
1095  bool assignment_of_interest = debug && false; //get_node_index(0) == 67 && get_node_index(1) == 68;
1096 
1097  ///if ( false ) {
1098  if ( assignment_of_interest ){
1099  T << "get_energy_for_alt_state: " << get_node_index( 0 ) << " " << get_node_index( 1 ) << " srpe: " << store_rpes;
1100  T << " chID " << changing_node_index << " alt: " << alternate_state << " altHI: " << alternate_state_recent_history_index;
1101  T << " oncurr: " << other_node_curr_state << " oncurrHI: " << other_node_state_recent_history_index << std::endl;
1102  T << "store_rpes_[ 0 ] " << store_rpes_[ 0 ] << "store_rpes_[ 1 ] " << store_rpes_[ 1 ] << std::endl;
1103  }
1104 
1105  int const node_changing = changing_node_index == get_node_index( 0 ) ? 0 : 1;
1106  int const node_not_changing = ! node_changing;
1107 
1108  if ( store_rpes && ! store_rpes_[ node_changing ] ) {
1109  wipe( node_changing );
1110  }
1111  store_rpes_[ node_changing ] = store_rpes;
1112 
1113  if ( store_rpes_[ node_changing ] && alternate_state_recent_history_index != 0 ) {
1114  alt_state_energy_ = stored_rpes_[ node_changing ]( other_node_curr_state, alternate_state_recent_history_index );
1115  if (alt_state_energy_ != NOT_YET_COMPUTED_ENERGY ) {
1116 
1117  if ( assignment_of_interest ) {
1118  T << "retrieving from stored_rpes_[ " << node_changing << " ] " << alt_state_energy_ << std::endl;
1119  T << "stored at location: " << & ( stored_rpes_[ node_changing ]( other_node_curr_state, alternate_state_recent_history_index ) ) << std::endl;
1120  }
1121 
1122  return alt_state_energy_;
1123  }
1124  }
1125 
1126  if ( store_rpes_[ node_not_changing ] ) {
1127  alt_state_energy_ = stored_rpes_[ node_not_changing ]( alternate_state, other_node_state_recent_history_index );
1128  if ( alt_state_energy_ != NOT_YET_COMPUTED_ENERGY ) {
1129 
1130  if ( assignment_of_interest ) {
1131  T << "retrieving from stored_rpes_[ " << node_not_changing << " ] " << alt_state_energy_ << std::endl;
1132  T << "stored at location: " << & ( stored_rpes_[ node_not_changing ]( alternate_state, other_node_state_recent_history_index ) ) << std::endl;
1133  }
1134  return alt_state_energy_;
1135  }
1136  }
1137 
1138  alt_state_energy_ = get_linmem_node( node_changing )->
1139  compute_pair_energy_for_alternate_state(
1140  get_edges_position_in_nodes_edge_vector( node_changing ));
1141 
1142  //if ( false ) {
1143  if ( assignment_of_interest ) {
1144  T << "get_energy_for_alt_state: computing energy: " << alt_state_energy_ << std::endl;
1145  }
1146 
1147  if ( store_rpes_[ node_changing ] && alternate_state_recent_history_index != 0 ) {
1148  stored_rpes_[ node_changing ]( other_node_curr_state, alternate_state_recent_history_index ) = alt_state_energy_;
1149  }
1150  if ( store_rpes_[ node_not_changing ] ) {
1151  assert( other_node_state_recent_history_index );
1152  if ( assignment_of_interest ) {
1153  T << "about to write alt_state_energy_ to location: " << & ( stored_rpes_[ node_not_changing ]( alternate_state, other_node_state_recent_history_index ) ) << std::endl;
1154  }
1155 
1156  stored_rpes_[ node_not_changing ]( alternate_state, other_node_state_recent_history_index ) = alt_state_energy_;
1157  }
1158 
1159  return alt_state_energy_;
1160 }
1161 
1163 {
1164  return ( stored_rpes_[ 0 ].size() + stored_rpes_[ 1 ].size() );
1165 }
1166 
1167 
1168 
1169 ObjexxFCL::FArray2D< unsigned char > const &
1171 {
1172  return sparse_aa_neighbors_;
1173 }
1174 
1175 
1176 void
1178 {
1179  T << "LinearMemEdge: " << get_node_index( 0 ) << "/" << get_node_index( 1 );
1180  T << " energy= " << curr_state_energy_ << std::endl;
1181 }
1182 
1183 
1184 void
1187  int node_substituted,
1188  int node_not_substituted,
1189  int bumped_recent_history_index
1190 )
1191 {
1192  if ( ! store_rpes_[ node_substituted ] || bumped_recent_history_index == 0 ) return;
1193 
1194  ObjexxFCL::FArray1A< core::PackerEnergy > row_to_reset(
1195  stored_rpes_[ node_substituted ](1, bumped_recent_history_index ),
1196  get_num_states_for_node( node_not_substituted ) );
1197  row_to_reset = NOT_YET_COMPUTED_ENERGY;
1198 }
1199 
1200 void
1202 {
1203  int curr_states[ 2 ];
1204  int recent_history_ids[ 2 ];
1205  for (int ii = 0; ii < 2; ++ii) {
1206  curr_states[ ii ] = get_linmem_node( ii )->get_current_state();
1207  recent_history_ids[ ii ] = get_linmem_node( ii )->get_curr_state_recent_state_id();
1208  if ( curr_states[ ii ] == 0 ) return;
1209  }
1210 
1211  for (int ii = 0; ii < 2; ++ii ) {
1212  int const other = ! ii;
1213  if ( store_rpes_[ ii ] ) {
1214  stored_rpes_[ ii ]( curr_states[ other ], recent_history_ids[ ii ] ) = curr_state_energy_;
1215  }
1216  }
1217 
1218 }
1219 
1220 void
1222 {
1224 }
1225 
1226 //-------------------------------------------------------------------//
1227 
1229  int numNodes
1230 ) : OnTheFlyInteractionGraph( numNodes ),
1231  first_time_prepping_for_simA_( true ),
1232  num_commits_since_last_update_( 0 ),
1233  total_energy_current_state_assignment_( 0.0 ),
1234  total_energy_alternate_state_assignment_( 0.0 ),
1235  node_considering_alt_state_( 0 ),
1236  have_not_committed_last_substitution_( false )
1237 {
1238 }
1239 
1240 
1242 {}
1243 
1244 void
1246 {
1248  for (int ii = 1; ii <= get_num_nodes(); ++ii)
1249  {
1251  }
1253 }
1254 
1255 
1258 {
1260  get_linmem_node( node_ind )->assign_state( new_state );
1263 }
1264 
1265 
1268  ObjexxFCL::FArray1_int & node_states
1269 )
1270 {
1272  for (int ii = 1; ii <= get_num_nodes(); ++ii)
1273  {
1274  get_linmem_node( ii )->partial_assign_state( node_states( ii ) );
1275  }
1276  for (int ii = 1; ii <= get_num_nodes(); ++ii)
1277  {
1279  }
1281  //T << "Set Network State Finished" << std::endl;
1282  //print_current_state_assignment();
1284 }
1285 
1286 
1287 void
1289  int node_ind,
1290  int new_state,
1291  core::PackerEnergy & delta_energy,
1292  core::PackerEnergy & prev_energy_for_node
1293 )
1294 {
1296  {
1298  acknowledge_last_substititon_not_committed();
1299  }
1300 
1301  node_considering_alt_state_ = node_ind;
1302 
1303  delta_energy = get_linmem_node( node_ind )->
1304  project_deltaE_for_substitution( new_state, prev_energy_for_node );
1305 
1309 }
1310 
1313 {
1316 
1319 
1322  {
1324  }
1325 
1327 }
1328 
1329 
1332 {
1333  //T << "Num rotamer pair energy calculations performed: " << LinearMemNode::num_rpe_calcs << std::endl;
1336 }
1337 
1338 ///@brief O(1) total energy report. Protected read access for derived classes.
1341 {
1343 }
1344 
1345 int
1347 {
1348  int sum = 0;
1349  for (std::list< EdgeBase* >::const_iterator iter = get_edge_list_begin();
1350  iter != get_edge_list_end(); ++iter)
1351  {
1352  sum += ((LinearMemEdge*) *iter)->get_two_body_table_size();
1353  }
1354  return sum;
1355 }
1356 
1357 void
1359 {
1360  T << "State Assignment: " << std::endl;
1361  for (int ii = 1; ii <= get_num_nodes(); ++ii)
1362  {
1363  T << "Node " << ii << " state " << get_linmem_node(ii)->get_current_state() << std::endl;
1364  get_linmem_node(ii)->print();
1365  }
1366 
1367  for (std::list< EdgeBase* >::const_iterator iter = get_edge_list_begin();
1368  iter != get_edge_list_end(); ++iter)
1369  {
1370  ((LinearMemEdge*) (*iter))->print_current_energy();
1371  }
1372  T << "Energy: " << total_energy_current_state_assignment_ << std::endl;
1373 }
1374 
1375 
1376 void
1378 {}
1379 
1382 {
1383  core::PackerEnergy esum = 0;
1384  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
1385  if ( get_vertex_member_of_energy_sum_group( ii, group_id ) ) {
1387  }
1388  }
1389 
1390  for ( std::list< EdgeBase* >::iterator edge_iter = get_edge_list_begin();
1391  edge_iter != get_edge_list_end(); ++edge_iter) {
1392  int first_node_ind = (*edge_iter)->get_first_node_ind();
1393  int second_node_ind = (*edge_iter)->get_second_node_ind();
1394 
1395  if ( get_vertex_member_of_energy_sum_group( first_node_ind, group_id )
1396  && get_vertex_member_of_energy_sum_group( second_node_ind, group_id )) {
1397  esum += ((LinearMemEdge*) (*edge_iter))->get_current_two_body_energy();
1398  }
1399  }
1400 
1401  return esum;
1402 }
1403 
1404 void
1406 {
1410  }
1412 
1413 }
1414 
1415 /*
1416 bool
1417 LinearMemoryInteractionGraph::build_sc_only_rotamer() const
1418 {
1419  return true;
1420 }
1421 */
1422 
1423 unsigned int
1425 {
1426  return sizeof( LinearMemoryInteractionGraph );
1427 }
1428 
1429 unsigned int
1431 {
1432  unsigned int total_memory = OnTheFlyInteractionGraph::count_dynamic_memory();
1433  return total_memory;
1434 }
1435 
1436 
1437 NodeBase*
1438 LinearMemoryInteractionGraph::create_new_node( int node_index, int num_states)
1439 {
1440  return new LinearMemNode( this, node_index, num_states );
1441 }
1442 
1443 
1444 EdgeBase*
1446 {
1447  return new LinearMemEdge( this, index1, index2 );
1448 }
1449 
1450 void
1452 {
1454 
1455  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
1457  get_one_body_energy_current_state();
1458  }
1459 
1460  for (std::list<EdgeBase*>::iterator iter = get_edge_list_begin();
1461  iter != get_edge_list_end(); ++iter) {
1463  ((LinearMemEdge*) *iter)->get_current_two_body_energy();
1464  }
1465 
1467  return;
1468 }
1469 
1470 void
1472 {
1473  static int const LinMemIG_history_size( 10 ); //get_cmdline_history_size() -- put into packer task...
1474 
1475  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
1476  get_linmem_node( ii )->set_recent_history_size( LinMemIG_history_size );
1477  }
1478 }
1479 
1480 /*
1481 int
1482 LinearMemoryInteractionGraph::get_cmdline_history_size()
1483 {
1484  int const default_history_size = 20;
1485  int LinMemIG_history_size;
1486  if ( linmem_ig ) {
1487  optional_positive_intafteroption( "linmem_ig", default_history_size, LinMemIG_history_size );
1488  }
1489  return LinMemIG_history_size;
1490 }
1491 */
1492 
1493 } // namespace interaction_graph
1494 } // namespace pack
1495 } // namespace core