28 #include <ObjexxFCL/Fmath.hh>
61 FArray1D_int & bestrotamer_at_seqpos,
63 bool start_with_current,
64 pack::InteractionGraphBase * ig,
65 const RotamerSet * p_rotamer_set,
66 FArray1_int & current_rot_index,
68 FArray1D_float & rot_freq
70 RotamerAssigningAnnealer(
73 bestrotamer_at_seqpos,
85 FArray1D_int & bestrotamer_at_seqpos,
87 bool start_with_current,
88 pack::InteractionGraphBase * ig,
89 const RotamerSet * p_rotamer_set,
90 FArray1_int & current_rot_index,
92 FArray1D_float & rot_freq
94 RotamerAssigningAnnealer(
95 (ig->get_num_total_states()),
96 bestrotamer_at_seqpos,
152 using namespace param;
157 int const nmoltenres =
ig_->get_num_nodes();
161 FArray1D_int best_state_on_node( nmoltenres,0 );
162 FArray1D_int current_state( nmoltenres, 0 );
168 FArray2D_int rot_2_moltenres( 2,
ig_->get_num_total_states(),0);
178 ig_->prepare_for_simulated_annealing();
179 ig_->blanket_assign_state_0();
182 for(
int ii =1; ii<=nmoltenres; ++ii){
183 for(
int jj =1; jj<=
ig_->get_num_states_for_node( ii); ++jj){
184 rot_2_moltenres(1,rot_tmp)=ii;
185 rot_2_moltenres(2,rot_tmp)=jj;
191 if ( num_of_rot_to_pack_ == 0 )
return;
195 FArray1D_float previous_nsteps_for_rot(p_rotamer_set_->nrotamers(), 0.0);
199 std::string annealer_file( stringafteroption(
"db_annealer_file" ));
200 std::ifstream instructions( annealer_file.c_str() );
202 while ( instructions )
205 instructions >> node_to_change;
207 if ( node_to_change <= 0 || node_to_change > nmoltenres )
209 std::cerr <<
"Error in instructions for Debugging Annealer: node_to_change out of range." << std::endl;
210 std::cerr <<
"Requires 0 < node_in_range <= nmoltenres. nmoltenres: " << nmoltenres <<
" node_to_change: " << node_to_change << std::endl;
214 int new_state_for_node;
215 instructions >> new_state_for_node;
217 if ( new_state_for_node <= 0 || new_state_for_node >
ig_->get_num_states_for_node( node_to_change ) )
219 std::cerr <<
"Error in instructions for Debugging Annealer: new_state_for_node out of range." << std::endl;
220 std::cerr <<
"Requires 0 < new_state_for_node <= num_states_for_node( " << node_to_change <<
");" << std::endl;
221 std::cerr <<
"new_state_for_node: " << new_state_for_node <<
" num_states_for_node( " << node_to_change <<
"): ";
222 std::cerr <<
ig_->get_num_states_for_node( node_to_change ) << std::endl;
227 instructions >> decision;
229 if ( decision !=
'A' && decision !=
'R' && decision !=
'M' )
231 std::cerr <<
"Error in instructions for Debugging Annealer: invalid decision" << std::endl;
232 std::cerr <<
"Requires decision to be either 'A', or 'R' (for accept or reject)" << std::endl;
233 std::cerr <<
"decision: " << decision << std::endl;
237 float deltaE( 0.0f ), previous_energy_for_node( 0.0f );
238 ig_->consider_substitution( node_to_change, new_state_for_node, deltaE, previous_energy_for_node );
240 std::cout <<
"mres: " << node_to_change <<
", state: ";
241 std::cout << new_state_for_node <<
", deltaE: " << deltaE << std::endl;
244 if ( decision ==
'A' )
246 ig_->commit_considered_substitution();
247 current_state( node_to_change ) = new_state_for_node;
252 best_state_on_node = current_state;
255 for (
int ii = 1;ii <= nmoltenres; ++ii){
256 int iiresid = p_rotamer_set_->moltenres_2_resid(ii);