23 #include <numeric/random/random.hh>
24 #include <numeric/random/random_permutation.hh>
27 #include <ObjexxFCL/FArray1A.hh>
33 #include <utility/vector0.hh>
34 #include <utility/vector1.hh>
41 static numeric::random::RandomGenerator
RG(133780);
44 ObjexxFCL::FArray1D_int & bestrotamer_at_seqpos,
46 bool start_with_current,
49 ObjexxFCL::FArray1_int & current_rot_index,
51 ObjexxFCL::FArray1D< core::PackerEnergy > & rot_freq
54 ig->get_num_total_states(),
55 bestrotamer_at_seqpos,
64 rotamer_sets_( rotamer_sets ),
65 num_nodes_( ig_->get_num_nodes() ),
66 recent_network_state_history_( num_nodes_, recent_history_size_, 0 ),
67 recent_history_hash_values_( recent_history_size_, 0 ),
68 recent_history_hash_count_( hash_size_, 0 ),
69 recent_history_head_( 0 ),
70 curr_in_recent_history_( 0 ),
71 netstate_duplicated_( false ),
72 progress_through_sBR_( -1 ),
73 sBR_rotamers_( ig_->get_num_total_states() ),
75 num_sa_trajectories_( 5 ),
76 sa_inner_iterations_length_scale_( 0.05 ),
90 if (
ig_->get_num_total_states() == 0 ) {
95 ig_->prepare_for_FASTER();
96 ig_->blanket_assign_state_0();
98 if (
ig_->any_vertex_state_unassigned()) {
99 std::cout <<
"Failed to assign BMEC; some vertices have 0 states" << std::endl;
110 ObjexxFCL::FArray1D_int best_network_state(
num_nodes_, 0 );
111 ObjexxFCL::FArray1D_int dummy(
num_nodes_, 0 );
129 fixbb_annealer.
run();
132 if ( ii == 1 || best_energy >
ig_->get_energy_current_state_assignment() ) {
133 ig_->get_current_network_state( best_network_state );
139 best_energy =
ig_->get_energy_current_state_assignment();
142 ig_->prepare_for_FASTER();
148 energy =
ig_->get_energy_current_state_assignment();
149 if ( energy < best_energy ) {
151 best_energy = energy;
152 ig_->get_current_network_state( best_network_state );
174 ig_->set_network_state( best_network_state );
189 ObjexxFCL::FArray1D_int current_network_state(
num_nodes_, 0 );
193 ig_->relax_in_current_context();
194 ig_->commit_relaxation();
198 ig_->get_current_network_state( current_network_state );
208 ObjexxFCL::FArray1D_int iBRstate(
ig_->get_num_nodes() );
209 ig_->get_current_network_state( iBRstate );
211 ObjexxFCL::FArray1D_int best_ciBRs_state(
ig_->get_num_nodes() );
214 for (
int ii = 1; ii < 10; ++ii)
216 ig_->set_network_state( iBRstate );
219 if ( ii == 1 || ciBR_energy < best_energy )
221 ig_->get_current_network_state( best_ciBRs_state );
222 best_energy = ciBR_energy;
226 ig_->set_network_state( best_ciBRs_state );
232 Real const DESMET_ciBR_ACCEPT_RATE = 0.8;
233 int const limit = 2000;
236 ObjexxFCL::FArray1D_int current_network_state(
num_nodes_, 0 );
237 ObjexxFCL::FArray1D_int best_network_state(
num_nodes_, 0 );
243 if ( count == limit )
break;
245 ig_->relax_in_current_context();
246 ig_->probabilistically_commit_relaxation( DESMET_ciBR_ACCEPT_RATE );
250 ig_->get_current_network_state( current_network_state );
253 if ( count == 1 ||
ig_->get_energy_current_state_assignment() < ciBR_best_energy ) {
254 ciBR_best_energy =
ig_->get_energy_current_state_assignment();
255 best_network_state = current_network_state;
258 ig_->set_network_state( best_network_state );
265 int numAttemptsSinceLastCommit = 0;
267 int num_rotamers =
static_cast< int > (
sBR_rotamers_.size());
271 while ( numAttemptsSinceLastCommit != num_rotamers ) {
272 ++numAttemptsSinceLastCommit;
275 int const node =
rotamer_sets_->moltenres_for_rotamer( ran_rotamer );
276 int const ran_rotamer_on_node =
rotamer_sets_->rotid_on_moltenresidue( ran_rotamer );
278 if ( ran_rotamer_on_node ==
ig_->get_current_state_for_node( node ) )
continue;
288 if ( deltaE < 0.001 ) {
291 if ( total_energy < last_energy ) {
294 last_energy = total_energy;
295 ig_->commit_relaxation();
296 numAttemptsSinceLastCommit = 0;
300 ig_->reject_perturbation();
304 ig_->reject_perturbation();
319 for (
int ii = 1; ii < 10000; ++ii) {
321 int node2 =
ig_->get_random_neighbor_for_node( node1 );
323 if (node2 == 0)
continue;
330 if ( deltaE < 0.001 ) {
332 if ( total_energy < last_energy ) {
333 last_energy = total_energy;
334 ig_->commit_relaxation();
337 ig_->reject_perturbation();
340 ig_->reject_perturbation();
366 ObjexxFCL::FArray1D_int best_state_on_node(
num_nodes_, 0 );
367 ig_->get_current_network_state( best_state_on_node );
405 history_line = netstate;
409 if ( num_same_hash != 0 ) {
428 if ( num_same_hash == 0 ) {
449 ObjexxFCL::FArray1D_int state_on_node(
ig_->get_num_nodes(), 0 );
450 ig_->get_current_network_state( state_on_node );
451 int count_since_last_commit( 0 );
452 int count_total( 0 );
453 int num_rotamers =
static_cast< int > (
sBR_rotamers_.size());
460 while ( count_since_last_commit < num_rotamers ) {
461 ++count_since_last_commit;
465 int const node =
rotamer_sets_->moltenres_for_rotamer( ran_rotamer );
466 int const ran_rotamer_on_node =
rotamer_sets_->rotid_on_moltenresidue( ran_rotamer );
468 if ( state_on_node( node ) == ran_rotamer_on_node )
continue;
470 ig_->consider_substitution( node, ran_rotamer_on_node, deltaE, dummy );
471 if ( state_on_node( node ) == 0 || deltaE < 0 ) {
473 state_on_node( node ) = ran_rotamer_on_node;
474 if ( totalE + 1e-4 < best_energy) {
475 count_since_last_commit = 0;
476 best_energy = totalE;
480 if ( count_since_last_commit > 2*num_rotamers ) {
493 int num_states_for_node =
ig_->get_num_states_for_node( node );
494 int rand_state = ((
int) (
RG.uniform() * num_states_for_node ) ) + 1;