22 #include <utility/string_util.hh>
25 #include <ObjexxFCL/FArray1D.hh>
26 #include <ObjexxFCL/FArray2D.hh>
27 #include <ObjexxFCL/FArray2A.hh>
36 #include <numeric/random/random.hh>
39 #include <utility/vector1.hh>
42 using namespace ObjexxFCL;
46 namespace interaction_graph {
48 static numeric::random::RandomGenerator
RG(6425);
54 FASTERNode::FASTERNode(
60 one_body_energies_(num_states + 1, core::
PackerEnergy( 0.0 )),
61 curr_state_total_energy_( 0.0 ),
62 alternate_state_is_being_considered_( false ),
63 have_prepared_once_for_FASTER_( false ),
64 in_FASTER_mode_( false ),
66 have_relaxed_since_neighbors_perturbation_( true ),
67 have_contributed_deltaE_following_perturbation_( true ),
84 std::cout <<
"(" << ii <<
", ";
86 if ( ii % 3 == 0 ) std::cout << std::endl;
88 std::cout << std::endl <<
"-----------------" << std::endl;
222 if (new_state == 0) {
297 std::cout <<
"curr_state_one_body_energy_ ";
304 std::cout << std::endl;
335 unsigned int dynamic_memory = 0;
338 dynamic_memory +=
edge_matrix_ptrs_.size() *
sizeof ( FArray2< core::PackerEnergy > );
347 return dynamic_memory;
392 for (
int jj = 1; jj <= local_num_states; ++jj, ++li_curr ) {
405 int const stride = edge_table.size1();
407 for (
int jj = 1; jj <= local_num_states; ++jj, li_curr += stride ) {
416 int state_with_best_one_body_energy( 0 );
420 state_with_best_one_body_energy = ii;
428 bool accept = prob < 1.0 ? (
RG.uniform() < prob) :
true;
454 int neighbors_new_state
477 int const neighbors_perturbed_state
485 FArray2A< core::PackerEnergy >
const & edge_table(
edge_matrix_ptrs_[ which_neighbor ] );
490 for ( int ii = 1; ii <= local_num_states; ++ii, ++li_curr, ++li_pert ) {
491 state_energies_in_current_context_[ ii ] += edge_table[ li_pert ] - edge_table[ li_curr ];
509 int li_curr = edge_table.index( 1, neighbors_current_state );
510 int li_pert = edge_table.index( 1, neighbors_perturbed_state );
513 for (
int ii = 1; ii <= local_num_states; ++ii, ++li_curr, ++li_pert ) {
530 int const stride = edge_table.size1();
531 int li_curr = edge_table.index( neighbors_current_state, 1 );
532 int li_pert = edge_table.index( neighbors_perturbed_state, 1 );
533 for (
int ii = 1; ii <= local_num_states; ++ii, li_curr += stride, li_pert += stride ) {
583 for (
int ii = 2; ii <= local_num_states; ++ii ) {
611 int const num_to_relax = 10;
615 int which10[ num_to_relax ];
618 for (
int ii = 0; ii < num_to_relax; ++ii ) {
625 for (
int ii = 1; ii <= num_to_relax; ++ii ) {
627 which10[ ii - 1] = ii;
628 if ( ii == 1 || bottom_of_top10 > top10[ ii-1 ] ) {
629 bottom_of_top10 = top10[ ii-1 ];
636 if ( iiabs > bottom_of_top10 ) {
637 top10[ whichBottom ] = iiabs;
638 which10[ whichBottom ] = ii;
639 for (
int jj = 0; jj < num_to_relax; ++jj) {
640 if ( jj == 0 || bottom_of_top10 > top10[ jj ] ){
642 bottom_of_top10 = top10[ jj ];
651 for (
int ii = 0; ii < num_to_relax; ++ii ) {
699 for (
int ii = 2; ii <= local_num_states; ++ii ) {
721 get_deltaE_for_neighbor_following_perturbation(
get_node_index() );
767 parent( owner, first_node_ind, second_node_ind),
769 get_faster_node(1)->get_num_states(),
770 get_faster_node(0)->get_num_states(),
774 energies_updated_since_last_prep_for_simA_( true ),
775 have_contributed_deltaE_following_perturbation_( false ),
776 partial_state_assignment_( false )
794 two_body_energies_(state2, state1) += edge_weight() * energy;
795 energies_updated_since_last_prep_for_simA_ =
true;
807 FArray2< core::PackerEnergy >
const & res_res_energy_array
810 assert( res_res_energy_array.size1() == two_body_energies_.size1() );
811 assert( res_res_energy_array.size2() == two_body_energies_.size2() );
812 for (
Size ii = 1, iie = two_body_energies_.size2(); ii <= iie; ++ii ) {
813 for (
Size jj = 1, jje = two_body_energies_.size1(); jj <= jje; ++jj ) {
814 two_body_energies_( jj, ii ) += edge_weight() * res_res_energy_array( jj, ii );
817 energies_updated_since_last_prep_for_simA_ =
true;
835 two_body_energies_( state2, state1 ) = edge_weight() * energy;
836 energies_updated_since_last_prep_for_simA_ =
true;
854 energies_updated_since_last_prep_for_simA_ =
true;
883 bool any_non_zero =
false;
885 for (
Size ii = 0; ii < num_energies; ++ii ) {
889 if ( ! any_non_zero )
delete this;
934 int node_substituted = ( node_ind == get_node_index(0) ? 0 : 1);
935 int node_not_substituted = ! node_substituted;
937 int nodes_curr_states[2];
939 nodes_curr_states[ node_substituted ] = new_state;
941 nodes_curr_states[ node_not_substituted ] =
942 get_faster_node( node_not_substituted )->get_current_state();
944 bool one_node_in_zero_state = ( nodes_curr_states[0] == 0 || nodes_curr_states[1] == 0 );
946 if ( one_node_in_zero_state ) {
949 curr_state_energy_ = two_body_energies_( nodes_curr_states[ 1 ], nodes_curr_states[ 0 ] );
951 new_energy = curr_state_energy_;
953 get_faster_node( node_not_substituted )->acknowledge_neighbors_state_substitution (
954 get_edges_position_in_nodes_edge_vector( node_not_substituted ),
969 int node_not_substituted = ! node_substituted;
987 FArray2A< core::PackerEnergy >
1013 unsigned int dynamic_memory = 0;
1016 return dynamic_memory;
1042 int nodes_perturbed_state
1052 int neighbors_context_state
1058 neighbors_context_state);
1095 if ( weight == 0.0 ) {
1096 utility_exit_with_message(
"Error: set edge weight to 0 not a legal operation. Delete this edge instead" );
1108 ObjexxFCL::FArray2D< core::PackerEnergy > & new_edge_table
1112 utility_exit_with_message(
"swap_edge_energies failed as size1 does not match: two_body_energies_.size1()= "
1114 + utility::to_string( new_edge_table.size1() ) );
1117 utility_exit_with_message(
"swap_edge_energies failed as size2 does not match: two_body_energies_.size2()= "
1119 + utility::to_string( new_edge_table.size2() ) );
1131 num_commits_since_last_update_(0),
1132 total_energy_current_state_assignment_(0),
1133 total_energy_alternate_state_assignment_(0),
1134 node_considering_alt_state_( -1 ),
1227 node_considering_alt_state_ = node_ind;
1228 delta_energy = get_faster_node( node_ind )->
1229 project_deltaE_for_substitution( new_state, prev_energy_for_node );
1232 total_energy_alternate_state_assignment_ =
1233 total_energy_current_state_assignment_ + delta_energy;
1278 get_one_body_energy_current_state();
1287 ((
FASTEREdge*) *iter)->get_current_two_body_energy();
1302 sum += ((
FASTEREdge*) *iter)->get_two_body_table_size();
1332 std::list< EdgeBase* >::iterator next_iter = iter;
1373 energy_total += ((
FASTEREdge*) (*edge_iter))->get_two_body_energies_for_relaxed_states();
1376 return energy_total;
1448 int perturbed_state1,
1450 int perturbed_state2
1487 std::cout <<
"Curr States: ";
1489 std::cout <<
"(" << ii <<
", ";
1493 std::cout << std::endl;
1522 int first_node_ind = (*edge_iter)->get_first_node_ind();
1523 int second_node_ind = (*edge_iter)->get_second_node_ind();
1527 esum += ((
FASTEREdge*) (*edge_iter))->get_current_two_body_energy();
1538 ObjexxFCL::FArray2D< core::PackerEnergy > & new_edge_table
1552 assert( new_node != NULL );