26 #include <basic/Tracer.hh>
35 #include <utility/exit.hh>
36 #include <numeric/random/random.hh>
42 #include <utility/vector0.hh>
43 #include <utility/vector1.hh>
48 using namespace ObjexxFCL;
49 static numeric::random::RandomGenerator
FBBCRSA_RG(63556);
55 static basic::Tracer
TR(
"core.pack.annealer.FixbbCoupledRotamerSimAnnealer",basic::t_info );
78 FixbbCoupledRotamerSimAnnealer::FixbbCoupledRotamerSimAnnealer(
80 FArray1D_int & bestrotamer_at_seqpos,
82 bool start_with_current,
85 FArray1_int & current_rot_index,
87 FArray1D< core::PackerEnergy > & rot_freq,
90 RotamerAssigningAnnealer(
93 bestrotamer_at_seqpos,
102 setup_rotamer_couplings( rotamer_couplings );
106 FArray1D_int & bestrotamer_at_seqpos,
108 bool start_with_current,
111 FArray1_int & current_rot_index,
113 FArray1D< core::PackerEnergy > & rot_freq,
116 RotamerAssigningAnnealer(
117 (ig->get_num_total_states()),
118 bestrotamer_at_seqpos,
127 setup_rotamer_couplings( rotamer_couplings );
141 for (
Size moltenres_id=1; moltenres_id<=
rotamer_sets()->nmoltenres(); ++moltenres_id ) {
143 uint const other_resid( (*rotamer_couplings)[ resid ].first );
145 if ( other_resid &&
rotamer_sets()->resid_2_moltenres( other_resid ) ) {
147 (*rotamer_couplings_)[ moltenres_id ].first =
rotamer_sets()->resid_2_moltenres( other_resid );
148 (*rotamer_couplings_)[ moltenres_id ].second = (*rotamer_couplings)[ resid ].second;
153 (*rotamer_couplings_)[ moltenres_id ].first = 0;
167 int const nmoltenres =
ig_->get_num_nodes();
169 FArray1D_int state_on_node( nmoltenres,0 );
170 FArray1D_int best_state_on_node( nmoltenres,0 );
175 FArray1D_int nsteps_for_rot(
ig_->get_num_total_states(), 0 );
182 ig_->prepare_for_simulated_annealing();
183 ig_->blanket_assign_state_0();
190 FArray1D< core::PackerEnergy > previous_nsteps_for_rot(
rotamer_sets()->nrotamers(), 0.0);
204 for (
int nn = 1; nn <= outeriterations; ++nn ){
208 state_on_node = best_state_on_node;
209 ig_->set_network_state( state_on_node );
216 ig_->set_errorfull_deltaE_threshold( treshold_for_deltaE_inaccuracy );
219 for (
int n = 1; n <= inneriterations; ++n ){
221 if (ranrotamer == -1)
continue;
223 int const moltenres_id =
rotamer_sets()->moltenres_for_rotamer( ranrotamer );
224 int const rotamer_state_on_moltenres =
rotamer_sets()->rotid_on_moltenresidue( ranrotamer );
225 int const prevrotamer_state = state_on_node(moltenres_id);
227 if (rotamer_state_on_moltenres == prevrotamer_state )
continue;
231 ig_->consider_substitution( moltenres_id, rotamer_state_on_moltenres,
232 delta_energy, previous_energy_for_node);
241 if ( other_moltenres_id >= 1 ) {
242 TR.Trace <<
"moltenres_id " << moltenres_id <<
" coupled to moltenres_id " << other_moltenres_id << std::endl;
249 int const other_prevrotamer_state( state_on_node( other_moltenres_id ) );
252 other_rotamer_set->rotamer( other_prevrotamer_state ) );
254 if ( !( other_rotamer && (*matcher)( *new_rotamer, *other_rotamer ) ) ) {
256 TR.Trace <<
"Picked rotamer incompatible, trying double substitution" << std::endl;
257 int other_rotamer_state(0);
258 int const other_nrotamers( other_rotamer_set->num_rotamers() );
262 if ( tries > 1000 )
TR.Trace <<
"tries: " << tries <<
'\n';
264 other_rotamer_state =
static_cast<int>( other_nrotamers *
FBBCRSA_RG.uniform() + 1 );
265 other_rotamer = other_rotamer_set->rotamer( other_rotamer_state );
267 if ( (*matcher)(*new_rotamer, *other_rotamer ) ) {
268 TR.Trace <<
"matching rotamer found" << std::endl;
276 Real const dev( std::abs( tmp_currentenergy - currentenergy - delta_energy ) );
278 TR <<
"equal1? " << dev <<
' ' << tmp_currentenergy - currentenergy <<
' ' << delta_energy <<
284 ig_->consider_substitution( other_moltenres_id, other_rotamer_state,
285 delta_energy2, previous_energy_for_node2 );
287 core::PackerEnergy previous_energy_average = ( previous_energy_for_node + previous_energy_for_node2 ) / 2.0;
290 if ( prevrotamer_state == 0 || other_prevrotamer_state == 0 ||
293 TR.Trace <<
"accepting coupled rotamer substitution" << std::endl;
294 currentenergy =
ig_->commit_considered_substitution();
297 Real const dev( std::abs( currentenergy - tmp_currentenergy - delta_energy2 ) );
299 TR <<
"equal2? " << dev <<
' ' << currentenergy - tmp_currentenergy <<
' ' << delta_energy2 <<
304 state_on_node( moltenres_id ) = rotamer_state_on_moltenres;
305 state_on_node( other_moltenres_id ) = other_rotamer_state;
309 if ( ( prevrotamer_state == 0 ) || ( other_prevrotamer_state == 0 ) || ( currentenergy <
bestenergy() )) {
311 best_state_on_node = state_on_node;
313 TR <<
"best-accept: ";
314 for (
Size i=1; i<=
Size(nmoltenres); ++i ) {
315 if ( state_on_node( i ) == 0 ) {
320 if ( rotamer->is_DNA() )
TR << rotamer->name1();
323 TR <<
' ' << nn <<
' ' << n <<
' ' << currentenergy <<
'\n';
329 TR.Trace <<
"rejecting coupled rotamer substitution" << std::endl;
330 ig_->consider_substitution( moltenres_id, prevrotamer_state, delta_energy, previous_energy_for_node );
331 tmp_currentenergy =
ig_->commit_considered_substitution();
334 Real const dev( std::abs( tmp_currentenergy - currentenergy ) );
336 TR <<
"equal3? " << dev <<
' ' << tmp_currentenergy <<
' ' << currentenergy <<
'\n';
339 currentenergy = tmp_currentenergy;
342 loopenergy(nn) = currentenergy;
356 if ( (prevrotamer_state == 0) ||
pass_metropolis(previous_energy_for_node,delta_energy) )
359 currentenergy =
ig_->commit_considered_substitution();
360 state_on_node(moltenres_id) = rotamer_state_on_moltenres;
361 if ((prevrotamer_state == 0)||(currentenergy <
bestenergy() ))
364 best_state_on_node = state_on_node;
368 loopenergy(nn) = currentenergy;
374 for (
int ii = 1; ii <= nmoltenres; ++ii )
376 int iistate = state_on_node(ii);
379 ++nsteps_for_rot(
rotamer_sets()->moltenres_rotid_2_rotid(ii, iistate) );
387 if (
ig_->any_vertex_state_unassigned() )
389 std::cerr <<
"Critical error -- In FixbbCoupledRotamerSimAnnealer, one or more vertex states unassigned at annealing's completion." << std::endl;
390 std::cerr <<
"Critical error -- assignment and energy of assignment meaningless" << std::endl;
392 FArray1D_int nstates_for_moltenres(
rotamer_sets()->nmoltenres(), 0 );
400 if ( best_state_on_node( ii ) == 0 )
402 std::cout <<
"Molten res " << ii <<
" (residue " <<
rotamer_sets()->moltenres_2_resid( ii );
403 std::cout <<
" ) assigned state 0 despite having " << nstates_for_moltenres( ii ) <<
" states to choose from" << std::endl;
406 assert( !
ig_->any_vertex_state_unassigned() );
413 for (
int ii = 1; ii <= nmoltenres; ++ii){
414 int const iiresid =
rotamer_sets()->moltenres_2_resid( ii );