26 #include <basic/Tracer.hh>
35 #include <utility/exit.hh>
36 #include <numeric/random/random.hh>
42 using namespace ObjexxFCL;
43 static numeric::random::RandomGenerator
FBBCRSA_RG(63546);
49 static basic::Tracer
TR(
"core.pack.annealer.FixbbLinkingRotamerSimAnnealer",basic::t_info );
72 FixbbLinkingRotamerSimAnnealer::FixbbLinkingRotamerSimAnnealer(
74 FArray1D_int & bestrotamer_at_seqpos,
76 bool start_with_current,
79 FArray1_int & current_rot_index,
81 FArray1D< core::PackerEnergy > & rot_freq,
84 RotamerAssigningAnnealer(
87 bestrotamer_at_seqpos,
96 setup_rotamer_links( rotamer_links );
100 FArray1D_int & bestrotamer_at_seqpos,
102 bool start_with_current,
105 FArray1_int & current_rot_index,
107 FArray1D< core::PackerEnergy > & rot_freq,
110 RotamerAssigningAnnealer(
111 (ig->get_num_total_states()),
112 bestrotamer_at_seqpos,
121 setup_rotamer_links( rotamer_links );
139 for (
Size moltenres_id=1; moltenres_id<=
rotamer_sets()->nmoltenres(); ++moltenres_id ) {
145 if (rotamer_links->has(resid)){
148 for (
Size i = 1; i <= copies.size(); ++i ){
156 std::cout <<
"a position in the link isn't to be changed" << std::endl;
161 std::cout <<
"singular unlinked position" << std::endl;
174 using namespace core::conformation;
176 int const nmoltenres =
ig_->get_num_nodes();
178 FArray1D_int state_on_node( nmoltenres,0 );
179 FArray1D_int best_state_on_node( nmoltenres,0 );
184 FArray1D_int nsteps_for_rot(
ig_->get_num_total_states(), 0 );
191 ig_->prepare_for_simulated_annealing();
192 ig_->blanket_assign_state_0();
206 for (
int res = segmentTest[1]; res <= segmentTest[1]*2 ; res++){
207 totalrot +=
rotamer_sets()->nrotamers_for_moltenres(res);
242 FArray1D< core::PackerEnergy > previous_nsteps_for_rot(
rotamer_sets()->nrotamers(), 0.0);
266 for (
int nn = 1; nn <= outeriterations; ++nn ){
270 state_on_node = best_state_on_node;
271 ig_->set_network_state( state_on_node );
279 ig_->set_errorfull_deltaE_threshold( treshold_for_deltaE_inaccuracy );
282 for (
int n = 1; n <= inneriterations; ++n ){
285 bool invalid_rotamer =
false;
286 while (!invalid_rotamer){
287 ranrotamer =
static_cast<int>(
FBBCRSA_RG.random_range(1, allrot ));
288 if (rot_valid[ ranrotamer ]){
289 invalid_rotamer =
true;
294 if (ranrotamer == -1)
continue;
296 int const moltenres_id =
rotamer_sets()->moltenres_for_rotamer( ranrotamer );
297 int const rotamer_state_on_moltenres =
rotamer_sets()->rotid_on_moltenresidue( ranrotamer );
298 int const prevrotamer_state = state_on_node(moltenres_id);
300 if (rotamer_state_on_moltenres == prevrotamer_state )
continue;
304 ig_->consider_substitution( moltenres_id, rotamer_state_on_moltenres,
305 delta_energy, previous_energy_for_node);
314 ResidueCOP new_rotamer( rotamer_set->rotamer( rotamer_state_on_moltenres ) );
319 core::PackerEnergy delta_energy_accumulated=0, previous_energy_for_node_accumulated=0;
321 std::map<Size, Size> resid_states;
324 resid_states[moltenres_id] = rotamer_state_on_moltenres;
326 int other_prevrotamer_state(0);
328 bool found_rotamer =
false;
329 Size num_linked_res =0;
332 if ( (*itr != 0) && (*itr != moltenres_id )){
333 TR.Trace <<
"moltenres_id " << moltenres_id <<
" coupled to moltenres_id " << *itr << std::endl;
337 TR.Trace <<
"Picked rotamer incompatible, trying multiple substitution" << std::endl;
339 other_prevrotamer_state = state_on_node(*itr);
343 ResidueCOP other_rotamer( other_prevrotamer_state == 0 ?
ResidueCOP(0) : other_rotamer_set->rotamer( other_prevrotamer_state ) );
345 int other_rotamer_state(0);
346 int const other_nrotamers( other_rotamer_set->num_rotamers() );
347 int tries = other_nrotamers;
348 found_rotamer =
false;
351 other_rotamer_state = tries;
353 other_rotamer = other_rotamer_set->rotamer(other_rotamer_state);
356 if ( new_rotamer->is_similar_rotamer( *other_rotamer ) ) {
359 found_rotamer =
true;
362 resid_states[*itr] = other_rotamer_state;
378 for (std::map<Size, Size>::iterator it = resid_states.begin(), ite = resid_states.end(); it != ite; it++){
379 rot_valid[
rotamer_sets()->moltenres_rotid_2_rotid( (*it).first, (*it).second ) ] =
false;
390 for (std::map<Size, Size>::iterator it = resid_states.begin(), ite = resid_states.end(); it != ite; it++){
395 ig_->consider_substitution( (*it).first, (*it).second,
396 delta_energy_temp, previous_energy_for_node_temp );
399 currentenergy =
ig_->commit_considered_substitution();
411 delta_energy_accumulated += delta_energy_temp;
412 previous_energy_for_node_accumulated += previous_energy_for_node_temp;
423 core::PackerEnergy previous_energy_average = ( previous_energy_for_node + previous_energy_for_node_accumulated );
424 core::PackerEnergy delta_energy_average = ( delta_energy + delta_energy_accumulated );
428 if ( prevrotamer_state == 0 || other_prevrotamer_state == 0 ||
431 TR.Trace <<
"accepting multiple rotamer substitution" << std::endl;
436 for (std::map<Size, Size>::iterator it = resid_states.begin(), ite = resid_states.end(); it != ite; it++){
455 state_on_node( (*it).first ) = (*it).second;
461 if ( ( prevrotamer_state == 0 ) || ( other_prevrotamer_state == 0 ) || ( currentenergy <=
bestenergy() )) {
463 best_state_on_node = state_on_node;
465 std::cout <<
"best-accept: ";
466 for (
Size i=1; i<=
Size(nmoltenres); ++i ) {
467 if ( state_on_node( i ) == 0 ) {
472 if ( rotamer->is_DNA() )
TR << rotamer->name1();
475 std::cout <<
' ' << nn <<
' ' << n <<
' ' << currentenergy <<
'\n';
481 TR.Trace <<
"rejecting multiple rotamer substitution" << std::endl;
484 for (std::map<Size, Size>::iterator it = resid_states.begin(), ite = resid_states.end(); it != ite; it++){
487 ig_->consider_substitution( (*it).first, state_on_node((*it).first),
490 currentenergy =
ig_->commit_considered_substitution();
502 loopenergy(nn) = currentenergy;
516 if ( (prevrotamer_state == 0) ||
pass_metropolis(previous_energy_for_node,delta_energy) )
521 state_on_node(moltenres_id) = rotamer_state_on_moltenres;
522 if ((prevrotamer_state == 0)||(currentenergy <
bestenergy() ))
525 best_state_on_node = state_on_node;
529 loopenergy(nn) = currentenergy;
535 for (
int ii = 1; ii <= nmoltenres; ++ii )
537 int iistate = state_on_node(ii);
540 ++nsteps_for_rot(
rotamer_sets()->moltenres_rotid_2_rotid(ii, iistate) );
549 if (
ig_->any_vertex_state_unassigned() )
551 std::cerr <<
"Critical error -- In FixbbLinkingRotamerSimAnnealer, one or more vertex states unassigned at annealing's completion." << std::endl;
552 std::cerr <<
"Critical error -- assignment and energy of assignment meaningless" << std::endl;
554 FArray1D_int nstates_for_moltenres(
rotamer_sets()->nmoltenres(), 0 );
562 if ( best_state_on_node( ii ) == 0 )
564 std::cout <<
"Molten res " << ii <<
" (residue " <<
rotamer_sets()->moltenres_2_resid( ii );
565 std::cout <<
" ) assigned state 0 despite having " << nstates_for_moltenres( ii ) <<
" states to choose from" << std::endl;
568 assert( !
ig_->any_vertex_state_unassigned() );
575 for (
int ii = 1; ii <= nmoltenres; ++ii){
576 int const iiresid =
rotamer_sets()->moltenres_2_resid( ii );