25 #include <ObjexxFCL/FArray1A.hh>
28 #include <utility/exit.hh>
31 #include <numeric/random/random.hh>
36 #include <utility/vector0.hh>
37 #include <utility/vector1.hh>
45 static numeric::random::RandomGenerator
mca_RG(42411);
51 using namespace ObjexxFCL;
52 using namespace pack::interaction_graph;
53 using namespace pack::rotamer_set;
54 using namespace pack::task;
62 FArray1D_int & bestrotamer_at_seqpos,
64 bool start_with_current,
67 FArray1_int & current_rot_index,
69 FArray1D< core::PackerEnergy > & rot_freq
71 RotamerAssigningAnnealer(
74 bestrotamer_at_seqpos,
83 nsteps_for_rot_( p_rotamer_set->nrotamers() , 0 ),
85 top_to_keep( task->multi_cool_annealer_history_size() ),
86 top_netstates_( ig_->get_num_nodes(), top_to_keep, 0 ),
87 energy_top_( top_to_keep, uninitialized_energy ),
88 worst_top_energy_( uninitialized_energy ),
89 which_netstate_worst_top_( 1 ),
96 FArray1D_int & bestrotamer_at_seqpos,
98 bool start_with_current,
101 FArray1_int & current_rot_index,
103 FArray1D< core::PackerEnergy > & rot_freq
105 RotamerAssigningAnnealer(
106 (ig->get_num_total_states()),
107 bestrotamer_at_seqpos,
116 nsteps_for_rot_( num_rots_to_pack(), 0 ),
118 top_to_keep( task->multi_cool_annealer_history_size() ),
119 top_netstates_( ig_->get_num_nodes(), top_to_keep, 0 ),
120 energy_top_( top_to_keep, uninitialized_energy ),
121 worst_top_energy_( uninitialized_energy ),
122 which_netstate_worst_top_( 1 ),
140 FArray1D_int state_on_node(
rotamer_sets()->nmoltenres(),0 );
141 FArray1D_int best_state_on_node(
rotamer_sets()->nmoltenres(),0 );
146 FArray1D_int network_state_to_restore(
rotamer_sets()->nmoltenres() );
147 FArray1D< core::PackerEnergy > temp_top_generated_at(
top_to_keep, 0.0f );
148 FArray1D< core::PackerEnergy > second_round_cooling_finalE(
top_to_keep, 0.0f );
150 FArray1D_int hamming_start_to_stop(
top_to_keep, 0 );
158 ig_->prepare_for_simulated_annealing();
159 ig_->blanket_assign_state_0();
167 for (
int ii = 1; ii <=
ig_->get_num_nodes(); ++ii ) {
168 float dummy_delta( 0.0 ), dummy_prev_energy( 0.0 );
169 if (
ig_->get_num_states_for_node( ii ) == 1 ) {
170 ig_->consider_substitution( ii, 1, dummy_delta, dummy_prev_energy );
171 ig_->commit_considered_substitution();
172 state_on_node( ii ) = 1;
175 ig_->consider_substitution( ii, randstate, dummy_delta, dummy_prev_energy );
176 ig_->commit_considered_substitution();
177 state_on_node( ii ) = randstate;
181 best_state_on_node = state_on_node;
191 for (
int nn = 1; nn <= outeriterations; ++nn ) {
193 if ( nn % 6 == 1 && nn != 1) {
198 inneriterations /= 5;
204 network_state_to_restore = state_on_node;
207 best_state_on_node = state_on_node;
211 state_on_node = network_state_to_restore;
212 ig_->set_network_state( state_on_node );
229 int which_best_of_best = 1;
233 which_best_of_best = ii;
237 best_state_on_node = best_of_best_state;
260 state_on_node = start_state;
261 ig_->set_network_state( state_on_node );
263 FArray1D_int best_state_on_node_this_starting_point(
rotamer_sets()->nmoltenres() );
264 best_state_on_node_this_starting_point = state_on_node;
270 for (
int nn = 1; nn <= outeriterations; ++nn ) {
271 if (nn != 1 )
cool();
278 best_state_on_node_this_starting_point,
279 best_energy_this_starting_point,
282 FArray1D_int state_to_restore( state_on_node );
288 inneriterations / 2);
294 state_on_node = state_to_restore;
295 ig_->set_network_state( state_on_node );
299 if ( std::abs(best_energy_this_starting_point -
energy_top_( ii ) ) < 0.001 ) {
300 bool same_as_start =
true;
302 if ( best_state_on_node_this_starting_point( jj ) !=
top_netstates_( jj, ii ) ) {
303 same_as_start =
false;
308 if ( same_as_start ) {
315 state_on_node = best_state_on_node_this_starting_point;
316 ig_->set_network_state( state_on_node );
318 best_state_on_node_this_starting_point,
319 best_energy_this_starting_point,
322 second_round_cooling_finalE( ii ) = best_energy_this_starting_point;
324 if ( best_state_on_node_this_starting_point( jj ) !=
top_netstates_(jj, ii ) ) {
325 ++hamming_start_to_stop(ii);
329 if (
bestenergy() > best_energy_this_starting_point ) {
331 bestenergy() = best_energy_this_starting_point;
332 best_state_on_node = best_state_on_node_this_starting_point;
352 ig_->set_network_state( best_state_on_node );
356 if (
ig_->any_vertex_state_unassigned() ) {
357 std::cerr <<
"Critical error -- In MultiCoolAnnealer, one or more vertex states unassigned at annealing's completion." << std::endl;
358 std::cerr <<
"Critical error -- assignment and energy of assignment meaningless" << std::endl;
360 FArray1D_int nstates_for_moltenres(
rotamer_sets()->nmoltenres(), 0 );
366 if ( best_state_on_node( ii ) == 0 ) {
367 std::cerr <<
"Molten res " << ii <<
" (residue " <<
rotamer_sets()->moltenres_2_resid( ii );
368 std::cerr <<
" ) assigned state 0 despite having " << nstates_for_moltenres( ii ) <<
" states to choose from" << std::endl;
371 std::cout <<
"num_top_kept_: " <<
num_top_kept_ << std::endl;
372 assert( !
ig_->any_vertex_state_unassigned() );
421 FArray1D_int & state_on_node,
422 FArray1D_int & best_state_on_node,
428 run_constant_temp_rotamer_substitutions(
429 state_on_node, best_state_on_node,
430 best_energy, num_cycles );
436 FArray1D_int & state_on_node,
437 FArray1D_int & best_state_on_node,
444 int substitutions_without_a_commit = 0;
447 if (
quench() ) { threshold_for_deltaE_inaccuracy = 0; }
448 ig_->set_errorfull_deltaE_threshold( threshold_for_deltaE_inaccuracy );
450 for (
int n = 1; n <= num_cycles; ++n ) {
453 if (ranrotamer == -1)
continue;
455 int rotamer_seqpos =
rotamer_sets()->res_for_rotamer(ranrotamer);
456 int moltenres_id =
rotamer_sets()->resid_2_moltenres(rotamer_seqpos);
457 int rotamer_state_on_moltenres =
rotamer_sets()->rotid_on_moltenresidue(ranrotamer);
458 int prevrotamer_state = state_on_node(moltenres_id);
460 if (rotamer_state_on_moltenres == prevrotamer_state )
continue;
464 ig_->consider_substitution( moltenres_id, rotamer_state_on_moltenres,
465 delta_energy, previous_energy_for_node);
470 if ((prevrotamer_state == 0)||
pass_metropolis(previous_energy_for_node,delta_energy)) {
471 substitutions_without_a_commit = 0;
472 currentenergy =
ig_->commit_considered_substitution();
473 state_on_node(moltenres_id) = rotamer_state_on_moltenres;
474 if ( (prevrotamer_state == 0)||(currentenergy < best_energy) ) {
475 if ( !
ig_->any_vertex_state_unassigned() ) {
476 best_energy = currentenergy;
477 best_state_on_node = state_on_node;
481 ++substitutions_without_a_commit;
490 int iistate = state_on_node(ii);
502 FArray1D_int
const & state_on_node,
508 if (state_on_node(ii) == 0 )
return;
512 if ( std::abs( energy -
energy_top_( ii )) < 0.0001 ) {
531 FArray1A_int netstate_to_replace(
535 netstate_to_replace = state_on_node;