24 #include <basic/Tracer.hh>
27 #include <utility/excn/Exceptions.hh>
31 #include <utility/vector1.hh>
32 #include <ObjexxFCL/FArray1A.hh>
39 namespace interaction_graph {
41 static basic::Tracer
T(
"core.pack.interaction_graph.linmem_ig", basic::t_error );
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 )
67 rhq_.num_elements( num_states );
87 rhq_.pos_in_history_queue( ii )
108 T <<
"curr_state_sparse_mat_info_ ";
112 T <<
"Curr Two Body Energies:";
121 T <<
"Alt Two Body Energies:";
126 T << std::endl <<
"-----------------" << std::endl;
142 total_memory +=
rhq_.dynamic_memory_usage();
204 bumped_recent_history_index,
205 rhq_.head_of_queue(),
241 bumped_recent_history_index,
259 get_energy_following_partial_state_assignment();
272 alternate_state_is_being_considered_ =
true;
277 alternate_state_ = alternate_state;
278 int alternate_state_recent_history_index = rhq_.pos_in_history_queue( alternate_state_ );
280 bool store_rpes = num_recently_accepted_ < THRESHOLD_ACCEPTANCE_RATE_FOR_RPE_STORAGE;
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_;
287 int aa_neighb_linear_index_offset = aa_neighbors_for_edges_.
288 index(1, 1, alt_state_sparse_mat_info_.get_aa_type() ) - 1;
290 for (
int ii = 1; ii <= get_num_incident_edges();
291 ++ii, aa_neighb_linear_index_offset += get_num_aa_types())
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() ] ) {
298 alternate_state_two_body_energies_[ ii ] =
299 get_incident_linmem_edge( ii )->get_energy_for_alt_state(
303 alternate_state_recent_history_index,
304 neighbors_curr_state_[ ii ],
305 neighbors_state_recent_history_index_[ ii ]
309 alternate_state_two_body_energies_[ ii ] = 0;
312 alternate_state_total_energy_ += alternate_state_two_body_energies_[ ii ];
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() );
320 Real rep_after = get_on_the_fly_owner()->pose().energies().residue_total_energies( get_rotamer(alternate_state_).seqpos() )[
scoring::fa_rep ];
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() );
325 Real rep_before = get_on_the_fly_owner()->pose().energies().residue_total_energies( get_rotamer(alternate_state_).seqpos() )[
scoring::fa_rep ];
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;
331 if ( (std::abs( delta_delta ) > 0.001 && std::abs( delta_delta / score_after ) > 10
E-5) &&
332 (rep_after < 4 && rep_before < 4) ) {
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;
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;
347 scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
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;
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;
375 core::PackerEnergy recomputed = compute_rotamer_pair_energy( ii, current_state_, neighbors_curr_state_[ ii ] );
376 T <<
"Recomputed energy: " << recomputed << std::endl;
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(),
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(),
389 T <<
"Rescored from pose: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
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(),
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(),
402 T <<
"Rescored combo: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
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(),
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(),
416 T <<
"Rescored combo 2: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
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(),
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(),
432 T <<
"Rescored combo swapped: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
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(),
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(),
447 T <<
"Rescored combo 2 swapped: " << get_on_the_fly_owner()->score_function().weights().dot( tbemap ) << std::endl;
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;
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 );
477 iter != iter_end; ++iter ) {
478 if ( other_node_index != (
Size) (*iter)->get_other_ind( seqpos ) )
continue;
479 found_similar_edge =
true;
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;
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() );
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;
502 scoring::EnergyGraph const & energygraph = get_on_the_fly_owner()->pose().energies().energy_graph();
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;
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;
528 core::PackerEnergy recomputed = compute_rotamer_pair_energy( ii, alternate_state_, neighbors_curr_state_[ ii ] );
529 T <<
"Recomputed energy: " << recomputed << std::endl;
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;
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 );
551 iter != iter_end; ++iter ) {
552 if ( other_node_index != (
Size) (*iter)->get_other_ind( seqpos ) )
continue;
553 found_similar_edge =
true;
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;
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() );
571 return alternate_state_total_energy_ - curr_state_total_energy_;
604 bumped_recent_history_index,
605 rhq_.head_of_queue(),
653 int edge_making_energy_request
658 edge_making_energy_request,
661 edge_making_energy_request,
673 int edge_making_energy_request
677 edge_making_energy_request,
685 int edge_to_altered_neighbor,
686 int other_node_new_state,
688 int other_state_recent_history_index
695 other_node_new_state_sparse_info;
697 other_state_recent_history_index;
703 int num_states_to_maintain_in_recent_history
706 rhq_.history_size( num_states_to_maintain_in_recent_history );
712 return rhq_.history_size();
720 T <<
"curr_state_sparse_mat_info_ ";
723 T <<
"curr_state_one_body_energy_ ";
761 int count_neighbs_with_higher_indices = 0;
767 ObjexxFCL::FArray2D< unsigned char >
const & edge_aa_neighbs =
771 ++count_neighbs_with_higher_indices;
803 return rhq_.push_to_front_of_history_queue( state );
819 sparse_aa_neighbors_(
820 get_linmem_ig_owner()->get_num_aatypes(),
821 get_linmem_ig_owner()->get_num_aatypes(),
823 curr_state_energy_( 0.0f ),
824 partial_state_assignment_( false ),
825 preped_for_sim_annealing_( false )
835 ObjexxFCL::FArray2_bool
const & aa_neighbors
840 if ( aa_neighbors( jj, ii ) ) {
875 throw utility::excn::EXCN_Msg_Exception(
"Method unimplemented: LinearMemEdge::get_two_body_energy" );
886 for (
int ii = 0; ii < 2; ++ii ) {
893 for (
int ii = 0; ii < 2; ++ii) {
894 int const other = ! ii;
926 for (
int ii = 0; ii < 2; ++ii) {
949 int bumped_recent_history_index,
950 int new_state_recent_history_index,
955 int node_not_substituted = ! node_substituted;
959 node_not_substituted,
960 bumped_recent_history_index );
963 compute_pair_energy_for_current_state(
971 acknowledge_neighbors_state_substitution
976 new_state_sparse_info,
977 new_state_recent_history_index
988 int node_not_substituted = ! node_substituted;
996 acknowledge_neighbors_state_substitution
1012 int bumped_recent_history_index,
1013 int new_state_recent_history_index
1017 int node_not_substituted = ! node_substituted;
1021 node_not_substituted,
1022 bumped_recent_history_index );
1027 acknowledge_neighbors_partial_state_substitution
1031 new_state_sparse_info,
1032 new_state_recent_history_index
1047 compute_pair_energy_for_current_state(
1059 int recent_history_id
1062 int node_with_reset_state = node_index ==
get_node_index( 0 ) ? 0 : 1;
1063 int other = ! node_with_reset_state;
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 ),
1072 for (
unsigned int ii = 1; ii <=
stored_rpes_[ other ].size2(); ++ii) {
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
1089 assert( other_node_curr_state != 0 );
1095 bool assignment_of_interest =
debug &&
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;
1105 int const node_changing = changing_node_index == get_node_index( 0 ) ? 0 : 1;
1106 int const node_not_changing = ! node_changing;
1108 if ( store_rpes && ! store_rpes_[ node_changing ] ) {
1109 wipe( node_changing );
1111 store_rpes_[ node_changing ] = store_rpes;
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 ) {
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;
1122 return alt_state_energy_;
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 ) {
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;
1134 return alt_state_energy_;
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 ));
1143 if ( assignment_of_interest ) {
1144 T <<
"get_energy_for_alt_state: computing energy: " << alt_state_energy_ << std::endl;
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_;
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;
1156 stored_rpes_[ node_not_changing ]( alternate_state, other_node_state_recent_history_index ) = alt_state_energy_;
1159 return alt_state_energy_;
1169 ObjexxFCL::FArray2D< unsigned char >
const &
1187 int node_substituted,
1188 int node_not_substituted,
1189 int bumped_recent_history_index
1192 if ( ! store_rpes_[ node_substituted ] || bumped_recent_history_index == 0 )
return;
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;
1203 int curr_states[ 2 ];
1204 int recent_history_ids[ 2 ];
1205 for (
int ii = 0; ii < 2; ++ii) {
1208 if ( curr_states[ ii ] == 0 )
return;
1211 for (
int ii = 0; ii < 2; ++ii ) {
1212 int const other = ! ii;
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 )
1268 ObjexxFCL::FArray1_int & node_states
1298 acknowledge_last_substititon_not_committed();
1304 project_deltaE_for_substitution( new_state, prev_energy_for_node );
1360 T <<
"State Assignment: " << std::endl;
1392 int first_node_ind = (*edge_iter)->get_first_node_ind();
1393 int second_node_ind = (*edge_iter)->get_second_node_ind();
1397 esum += ((
LinearMemEdge*) (*edge_iter))->get_current_two_body_energy();
1433 return total_memory;
1457 get_one_body_energy_current_state();
1473 static int const LinMemIG_history_size( 10 );