22 #include <basic/Tracer.hh>
31 #include <utility/exit.hh>
38 #include <utility/vector0.hh>
39 #include <utility/vector1.hh>
42 using namespace ObjexxFCL;
45 static basic::Tracer
TR(
"core.pack.annealer.FixbbSimAnnealer");
73 FixbbSimAnnealer::FixbbSimAnnealer(
75 FArray1D_int & bestrotamer_at_seqpos,
77 bool start_with_current,
80 FArray1_int & current_rot_index,
82 FArray1D_float & rot_freq
84 RotamerAssigningAnnealer(
87 bestrotamer_at_seqpos,
99 FArray1D_int & bestrotamer_at_seqpos,
101 bool start_with_current,
104 FArray1_int & current_rot_index,
106 FArray1D_float & rot_freq
108 RotamerAssigningAnnealer(
109 (ig->get_num_total_states()),
110 bestrotamer_at_seqpos,
129 int const nmoltenres =
ig_->get_num_nodes();
131 FArray1D_int state_on_node( nmoltenres,0 );
132 FArray1D_int best_state_on_node( nmoltenres,0 );
137 FArray1D_int nsteps_for_rot(
ig_->get_num_total_states(), 0 );
144 ig_->prepare_for_simulated_annealing();
145 ig_->blanket_assign_state_0();
152 FArray1D_float previous_nsteps_for_rot(
rotamer_sets()->nrotamers(), 0.0);
168 for (
int nn = 1; nn <= outeriterations; ++nn ){
172 state_on_node = best_state_on_node;
173 ig_->set_network_state( state_on_node );
180 ig_->set_errorfull_deltaE_threshold( treshold_for_deltaE_inaccuracy );
183 for (
int n = 1; n <= inneriterations; ++n ){
185 if (ranrotamer == -1)
continue;
187 int const moltenres_id =
rotamer_sets()->moltenres_for_rotamer( ranrotamer );
188 int const rotamer_state_on_moltenres =
rotamer_sets()->rotid_on_moltenresidue( ranrotamer );
189 int const prevrotamer_state = state_on_node(moltenres_id);
191 if (rotamer_state_on_moltenres == prevrotamer_state )
continue;
195 ig_->consider_substitution( moltenres_id, rotamer_state_on_moltenres,
196 delta_energy, previous_energy_for_node);
203 if ( (prevrotamer_state == 0) ||
pass_metropolis(previous_energy_for_node,delta_energy) )
206 currentenergy =
ig_->commit_considered_substitution();
207 state_on_node(moltenres_id) = rotamer_state_on_moltenres;
208 if ((prevrotamer_state == 0)||(currentenergy <
bestenergy() ))
210 best_state_on_node = state_on_node;
241 loopenergy(nn) = currentenergy;
247 for (
int ii = 1; ii <= nmoltenres; ++ii )
249 int iistate = state_on_node(ii);
252 ++nsteps_for_rot(
rotamer_sets()->moltenres_rotid_2_rotid(ii, iistate) );
261 TR <<
"pack_rotamers run final: ";
262 for (
Size ii=0; ii < best_state_on_node.size(); ii++ ) {
263 if ( best_state_on_node[ii] != 0 )
264 TR <<
rotamer_sets()->rotamer_set_for_moltenresidue( ii+1 )->rotamer( best_state_on_node[ii] )->name1();
271 if (
ig_->any_vertex_state_unassigned() ) {
272 std::cerr <<
"Critical error -- In FixbbSimAnnealer, one or more vertex states unassigned at annealing's completion." << std::endl;
273 std::cerr <<
"Critical error -- assignment and energy of assignment meaningless" << std::endl;
275 FArray1D_int nstates_for_moltenres(
rotamer_sets()->nmoltenres(), 0 );
283 if ( best_state_on_node( ii ) == 0 )
285 std::cout <<
"Molten res " << ii <<
" (residue " <<
rotamer_sets()->moltenres_2_resid( ii );
286 std::cout <<
" ) assigned state 0 despite having " << nstates_for_moltenres( ii ) <<
" states to choose from" << std::endl;
289 assert( !
ig_->any_vertex_state_unassigned() );
296 for (
int ii = 1; ii <= nmoltenres; ++ii){
297 int const iiresid =
rotamer_sets()->moltenres_2_resid( ii );