25 #include <basic/Tracer.hh>
27 #include <ObjexxFCL/format.hh>
29 #include <utility/string_util.hh>
30 #include <utility/vector1.functions.hh>
42 #include <basic/options/keys/optE.OptionKeys.gen.hh>
45 #include <utility/vector1.hh>
46 #include <basic/options/option.hh>
51 using namespace core::scoring;
52 using namespace ObjexxFCL::fmt;
55 namespace optimize_weights {
59 static basic::Tracer
TR(
"NestedEnergyTermOptEData");
72 NestedEnergyTermPNatAAOptEPositionData::NestedEnergyTermPNatAAOptEPositionData() {}
77 NestedEnergyTermPNatAAOptEPositionData::~NestedEnergyTermPNatAAOptEPositionData() {}
89 NestedEnergyTermPNatAAOptEPositionData::get_score(
93 Size const num_energy_dofs,
94 int const num_ref_dofs,
95 int const num_total_dofs,
101 return process_score(
TR,
false, component_weights, vars, dE_dvars, num_energy_dofs, num_ref_dofs, num_total_dofs, fixed_terms, score_list, fixed_score_list );
112 NestedEnergyTermPNatAAOptEPositionData::print_score(
117 Size const num_energy_dofs,
118 int const num_ref_dofs,
119 int const num_total_dofs,
125 process_score( ostr,
true, component_weights, vars, dE_dvars, num_energy_dofs, num_ref_dofs, num_total_dofs, fixed_terms, score_list, fixed_score_list );
136 NestedEnergyTermPNatAAOptEPositionData::process_score(
142 Size const num_energy_dofs,
143 int const num_ref_dofs,
150 using namespace core;
151 using namespace core::optimization;
152 using namespace basic::options;
153 using namespace basic::options::OptionKeys;
157 static Real const inv_kT( option[ optE::inv_kT_nataa ] );
169 vector_of_zeros, best_energy_by_aa, unweighted_E_dof, ref_deriv_weight );
188 Real unfolded_energy_for_one_aa = 0.0;
189 Real weighted_unfolded_energy_for_one_aa = 0.0;
201 for(
Size ii = 1; ii <= num_energy_dofs; ++ii ) {
211 unfolded_energy_for_one_aa += (unfolded_energy_emap_vector_[ aa ][ score_list[ ii ]] * vars[ ii ]);
214 if ( ref_deriv_weight[ aa ] != 0.0 ) {
221 unweighted_E_dof[ aa ][ ii ] -= unfolded_energy_emap_vector_[ aa ][ score_list[ ii ] ];
233 for(
Size ii = 1; ii <= fixed_score_list.size(); ++ii ) {
241 unfolded_energy_for_one_aa += (unfolded_energy_emap_vector_[ aa ][ fixed_score_list[ ii ] ] * fixed_terms[ fixed_score_list[ ii ] ]);
252 for(
Size tt = 1;
tt <= num_energy_dofs; ++
tt ) {
260 weighted_unfolded_energy_for_one_aa = unfolded_energy_for_one_aa * vars[
tt ];
263 for(
Size tt = 1;
tt <= fixed_score_list.size(); ++
tt ) {
271 weighted_unfolded_energy_for_one_aa = unfolded_energy_for_one_aa * fixed_terms[ fixed_score_list[
tt ] ];
278 best_energy_by_aa[ aa ] -= weighted_unfolded_energy_for_one_aa;
281 Real const cutoff( 300.0 );
282 if ( best_energy_by_aa[ aa ] > cutoff )
283 best_energy_by_aa[ aa ] = cutoff;
284 else if ( best_energy_by_aa[ aa ] < -1.0*cutoff )
285 best_energy_by_aa[ aa ] = -1.0*cutoff;
299 Real numerator(0.0), partition(0.0);
300 Multivec dpartition( vars.size(), 0.0 ), dnumerator( vars.size(), 0.0 );
304 Real const exp_term( std::exp( -1.0 * inv_kT * best_energy_by_aa[ aa ] ) );
305 partition += exp_term;
306 if ( aa ==
size_t( this_native_aa ) )
307 numerator = exp_term;
313 if ( num_ref_dofs != 0 ) {
314 Real const ref_deriv_term( -1.0 * inv_kT * ref_deriv_weight[ aa ] * exp_term );
315 dpartition[ num_energy_dofs + aa ] = ref_deriv_term;
316 if ( aa ==
size_t(this_native_aa) )
317 dnumerator[ num_energy_dofs + aa ] = ref_deriv_term;
328 for(
Size e_term = 1; e_term <= num_energy_dofs; ++e_term ) {
329 Real e_term_deriv( -1.0 * inv_kT * unweighted_E_dof[ aa ][ e_term ] * exp_term );
330 dpartition[ e_term ] += e_term_deriv;
331 if ( aa ==
size_t( this_native_aa ) )
332 dnumerator[ e_term ] = e_term_deriv;
337 for (
Size dof(1); dof <= vars.size(); ++dof ) {
338 dE_dvars[ dof ] += component_weights[ type() ] * ( dpartition[ dof ] / partition - dnumerator[ dof ] / numerator );
340 if ( score_list[ dof ] ==
omega ) { dE_dvars[ dof ] = 0.0; }
341 if ( score_list[ dof ] ==
hbond_lr_bb ) { dE_dvars[ dof ] = 0.0; }
367 ostr <<
"PNATAA " << tag() <<
X(1) << this_native_aa <<
"," << I(2, (
int)this_native_aa) <<
X(1)
369 <<
" num: " << F(7,3,numerator) <<
" part: " << F(7,3,partition)
370 <<
" p: " << F(7,5,numerator / partition)
371 <<
" -lnp: " << F(6,4,-1.0 * std::log( numerator / partition ))
372 <<
" -compwt_lnp: " << F(6, 4, component_weights[ type() ] * (-1.0 * std::log( numerator / partition )) )
373 <<
" best_energy_by_aa: [ ";
375 for (
Size i=1; i <= best_energy_by_aa.size(); ++i ) {
376 ostr << F(5,2,best_energy_by_aa[i]) <<
", ";
378 ostr <<
"]" << std::endl;
381 return ( -1.0 * component_weights[ type() ] * std::log( numerator / partition ) );
393 NestedEnergyTermPNatAAOptEPositionData::type()
const {
405 NestedEnergyTermPNatAAOptEPositionData::write_to_file( std::ofstream & outfile )
const {
407 outfile <<
"position " << position() <<
" "
408 <<
"nataa " << native_aa() <<
" "
410 <<
"unfolded_energy" << std::endl;
417 outfile << std::endl;
419 outfile << std::endl;
421 outfile <<
"nrots " << data().size() <<
"\n";
422 for ( PNatAAOptERotamerDataOPs::const_iterator
rot( rotamer_data_begin() );
rot != rotamer_data_end(); ++
rot ) {
423 outfile << *
rot << std::endl;
435 NestedEnergyTermPNatAAOptEPositionData::read_from_file( std::ifstream & infile ) {
437 using namespace utility;
441 getline( infile, line );
442 Strings words( string_split( line,
' ' ) );
443 assert( words[ 1 ] ==
"position" );
444 set_position( from_string( words[ 2 ],
Size( 0 ) ) );
445 assert( words[ 3 ] ==
"nataa" );
447 assert( words[ 5 ] ==
"neighbor_count" );
448 set_neighbor_count( from_string( words[ 6 ],
Size( 0 ) ) );
451 assert( words[ 7 ] ==
"unfolded_energy" );
456 getline( infile, line );
457 Strings sections( string_split( line,
' ' ) );
464 std::istringstream ss( pair[2] );
468 emap_vector[ aa ] = emap;
471 getline( infile, line );
472 Strings rotamer_line_words( string_split( line,
' ' ) );
473 assert( rotamer_line_words[ 1 ] ==
"nrots" );
474 Size num_rotamers = from_string( rotamer_line_words[ 2 ],
Size( 0 ) );
476 for (
Size ii = 1; ii <= num_rotamers; ++ii ) {
477 getline( infile, line );
480 Strings sections( string_split( line,
',' ) );
484 std::istringstream ss( sections[1] );
488 Strings fixed_vals( string_split( sections[3],
' ' ) ), free_vals( string_split( sections[4],
' ' ) );
489 for ( Strings::iterator fixed_val( fixed_vals.begin() ); fixed_val != fixed_vals.end(); ++fixed_val ) {
491 std::istringstream ss( *fixed_val );
493 fixed_energies.push_back( val );
495 for ( Strings::iterator free_val( free_vals.begin() ); free_val != free_vals.end(); ++free_val ) {
497 std::istringstream ss( *free_val );
499 energies.push_back( val );
501 assert( !energies.empty() );
503 add_rotamer_line_data( new_rot_data );
516 NestedEnergyTermPNatAAOptEPositionData::write_to_binary_file( std::ofstream & )
const {}
526 NestedEnergyTermPNatAAOptEPositionData::read_from_binary_file( std::ifstream & ) {}
533 NestedEnergyTermPNatAAOptEPositionData::memory_use()
const {
536 if ( data().
size() > 0 ) {
537 total +=
sizeof(
Real ) * ( data()[ 1 ]->data().size() + data()[ 1 ]->fixed_data().size() ) * data().size();
540 total +=
sizeof(
EnergyMap ) * unfolded_energy_emap_vector_.size();
552 NestedEnergyTermPNatAAOptEPositionData::send_to_node(
int const destination_node,
int const tag )
const {
555 int ii_pos = position();
556 MPI_Send( & ii_pos, 1, MPI_INT, destination_node, tag, MPI_COMM_WORLD );
559 int ii_aa = native_aa();
560 MPI_Send( & ii_aa, 1, MPI_INT, destination_node, tag, MPI_COMM_WORLD );
564 MPI_Send( & ii_neighbor_count, 1, MPI_INT, destination_node, tag, MPI_COMM_WORLD );
568 int ii_unfolded_energy_emap_vector_size = unfolded_energy_emap_vector_.size();
569 MPI_Send( & ii_unfolded_energy_emap_vector_size, 1, MPI_INT, destination_node, tag, MPI_COMM_WORLD );
579 delete [] unfolded_energies; unfolded_energies = 0;
583 MPI_Send( & ii_num_rotamers, 1, MPI_UNSIGNED_LONG, destination_node, tag, MPI_COMM_WORLD );
585 if ( ii_num_rotamers == 0 )
588 Size free_count = data()[1]->data().size();
589 Size fixed_count = data()[1]->fixed_data().size();
592 MPI_Send( & free_count, 1, MPI_UNSIGNED_LONG, destination_node, tag, MPI_COMM_WORLD );
593 MPI_Send( & fixed_count, 1, MPI_UNSIGNED_LONG, destination_node, tag, MPI_COMM_WORLD );
595 int * ii_aa_types = new
int[ ii_num_rotamers ];
596 int * ii_rot_nums = new
int[ ii_num_rotamers ];
597 Real * free_data = new
Real[ ii_num_rotamers * free_count ];
598 Real * fixed_data = new
Real[ ii_num_rotamers * fixed_count ];
599 for (
Size jj = 1; jj <= ii_num_rotamers; ++jj ) {
600 ii_aa_types[ jj - 1 ] = data()[ jj ]->this_aa();
601 ii_rot_nums[ jj - 1 ] = data()[ jj ]->rot_number();
602 for (
Size kk = 1; kk <= free_count; ++kk ) {
603 free_data[ ( jj - 1 ) * free_count + kk - 1 ] = data()[ jj ]->data()[ kk ];
605 for (
Size kk = 1; kk <= fixed_count; ++kk ) {
606 fixed_data[ ( jj - 1 ) * fixed_count + kk - 1 ] = data()[ jj ]->fixed_data()[ kk ];
611 MPI_Send( ii_aa_types, ii_num_rotamers, MPI_INT, destination_node, tag, MPI_COMM_WORLD );
614 MPI_Send( ii_rot_nums, ii_num_rotamers, MPI_INT, destination_node, tag, MPI_COMM_WORLD );
617 MPI_Send( free_data, ii_num_rotamers * free_count, MPI_DOUBLE, destination_node, tag, MPI_COMM_WORLD );
620 MPI_Send( fixed_data, ii_num_rotamers * fixed_count, MPI_DOUBLE, destination_node, tag, MPI_COMM_WORLD );
622 delete [] ii_aa_types; ii_aa_types = 0;
623 delete [] ii_rot_nums; ii_rot_nums = 0;
624 delete [] free_data; free_data = 0;
625 delete [] fixed_data; fixed_data = 0;
627 OptEPositionData::send_to_node( destination_node, tag );
635 NestedEnergyTermPNatAAOptEPositionData::receive_from_node(
int const source_node,
int const tag ) {
641 MPI_Recv( & ii_pos, 1, MPI_INT, source_node, tag, MPI_COMM_WORLD, &stat );
642 set_position( ii_pos );
646 MPI_Recv( & ii_aa, 1, MPI_INT, source_node, tag, MPI_COMM_WORLD, &stat );
650 int ii_neighbor_count;
651 MPI_Recv( & ii_neighbor_count, 1, MPI_INT, source_node, tag, MPI_COMM_WORLD, &stat );
652 set_neighbor_count( ii_neighbor_count );
656 int ii_unfolded_energy_emap_vector_size;
657 MPI_Recv( & ii_unfolded_energy_emap_vector_size, 1, MPI_INT, source_node, tag, MPI_COMM_WORLD, &stat );
659 emap_vector.resize( ii_unfolded_energy_emap_vector_size );
671 set_unfolded_energy_emap_vector( emap_vector );
672 delete [] unfolded_energies; unfolded_energies = 0;
676 Size ii_num_rotamers;
677 MPI_Recv( & ii_num_rotamers, 1, MPI_UNSIGNED_LONG, source_node, tag, MPI_COMM_WORLD, &stat );
679 if ( ii_num_rotamers == 0 )
686 MPI_Recv( & free_count, 1, MPI_UNSIGNED_LONG, source_node, tag, MPI_COMM_WORLD, &stat );
687 MPI_Recv( & fixed_count, 1, MPI_UNSIGNED_LONG, source_node, tag, MPI_COMM_WORLD, &stat );
690 int * ii_aa_types =
new int[ ii_num_rotamers ];
691 int * ii_rot_nums =
new int[ ii_num_rotamers ];
692 Real * free_data =
new Real[ ii_num_rotamers * free_count ];
693 Real * fixed_data =
new Real[ ii_num_rotamers * fixed_count ];
696 MPI_Recv( ii_aa_types, ii_num_rotamers, MPI_INT, source_node, tag, MPI_COMM_WORLD, &stat );
699 MPI_Recv( ii_rot_nums, ii_num_rotamers, MPI_INT, source_node, tag, MPI_COMM_WORLD, &stat );
702 MPI_Recv( free_data, ii_num_rotamers * free_count, MPI_DOUBLE, source_node, tag, MPI_COMM_WORLD, &stat );
705 MPI_Recv( fixed_data, ii_num_rotamers * fixed_count, MPI_DOUBLE, source_node, tag, MPI_COMM_WORLD, &stat );
710 for (
Size jj = 1; jj <= ii_num_rotamers; ++jj ) {
711 for (
Size kk = 1; kk <= free_count; ++kk ) {
712 free_data_vect[ kk ] = free_data[ ( jj - 1 ) * free_count + kk - 1 ];
714 for (
Size kk = 1; kk <= fixed_count; ++kk ) {
715 fixed_data_vect[ kk ] = fixed_data[ ( jj - 1 ) * fixed_count + kk - 1 ];
719 ii_rot_nums[ jj - 1 ],
722 add_rotamer_line_data( jj_rotamer_data );
726 delete [] ii_aa_types; ii_aa_types = 0;
727 delete [] ii_rot_nums; ii_rot_nums = 0;
728 delete [] free_data; free_data = 0;
729 delete [] fixed_data; fixed_data = 0;
731 OptEPositionData::receive_from_node( source_node, tag );
744 NestedEnergyTermDDGMutationOptEData::NestedEnergyTermDDGMutationOptEData() {}
749 NestedEnergyTermDDGMutationOptEData::~NestedEnergyTermDDGMutationOptEData() {}
761 NestedEnergyTermDDGMutationOptEData::get_score(
766 Size const num_energy_dofs,
767 int const num_ref_dofs,
768 int const num_total_dofs,
774 return process_score(
TR,
false, component_weights, vars, dE_dvars, num_energy_dofs, num_ref_dofs, num_total_dofs, fixed_terms, free_score_list, fixed_score_list );
782 NestedEnergyTermDDGMutationOptEData::print_score(
788 Size const num_energy_dofs,
789 int const num_ref_dofs,
790 int const num_total_dofs,
796 process_score( ostr,
true, component_weights, vars, dE_dvars, num_energy_dofs, num_ref_dofs, num_total_dofs, fixed_terms, free_score_list, fixed_score_list );
807 NestedEnergyTermDDGMutationOptEData::process_score(
814 Size const num_energy_dofs,
815 int const num_ref_dofs,
822 using namespace core::optimization;
823 using namespace basic::options;
824 using namespace basic::options::OptionKeys;
825 using namespace utility;
828 if ( muts_.size() == 0 || wts_.size() == 0 )
return 0.0;
843 for (
Size ii = 1; ii <= num_energy_dofs; ++ii ) {
844 for (
Size jj = 1; jj <= wts_.size(); ++jj ) {
848 if ( ( score_list[ ii ] ==
fa_rep ) && ( vars[ ii ] * wts_[ jj ]->free_data()[ ii ] > 10 ) ) { wt_energies[ jj ] += 10; }
851 wt_energies[ jj ] += vars[ ii ] * wts_[ jj ]->free_data()[ ii ];
853 for (
Size jj = 1; jj <= muts_.size(); ++jj ) {
855 if ( ( score_list[ ii ] ==
fa_rep ) && ( vars[ ii ] * muts_[ jj ]->free_data()[ ii ] > 10 ) ) { mut_energies[ jj ] += 10; }
858 mut_energies[ jj ] += vars[ ii ] * muts_[ jj ]->free_data()[ ii ];
861 for (
Size ii = 1; ii <= fixed_score_list.size(); ++ii ) {
862 for (
Size jj = 1; jj <= wts_.size(); ++jj ) {
864 if ( ( fixed_score_list[ ii ] ==
fa_rep ) && ( fixed_terms[ fixed_score_list[ ii ] ] * wts_[ jj ]->fixed_data()[ ii ] > 10 ) ) { wt_energies[ jj ] += 10; }
867 wt_energies[ jj ] += fixed_terms[ fixed_score_list[ ii ] ] * wts_[ jj ]->fixed_data()[ ii ];
869 for (
Size jj = 1; jj <= muts_.size(); ++jj ) {
871 if ( ( fixed_score_list[ ii ] ==
fa_rep ) && ( fixed_terms[ fixed_score_list[ ii ] ] * muts_[ jj ]->fixed_data()[ ii ] > 10 ) ) { mut_energies[ jj ] += 10; }
874 mut_energies[ jj ] += fixed_terms[ fixed_score_list[ ii ] ] * muts_[ jj ]->fixed_data()[ ii ];
880 if ( num_ref_dofs != 0 ) {
881 for (
Size jj = 1; jj <= wts_.size(); ++jj ) {
882 wt_energies[ jj ] += vars[ num_energy_dofs + wt_aa_ ];
884 for (
Size jj = 1; jj <= muts_.size(); ++jj ) {
885 mut_energies[ jj ] += vars[ num_energy_dofs + mut_aa_ ];
897 Real wt_unweighted_unfolded_energy(0.0), wt_weighted_unfolded_energy(0.0);
898 Real mut_unweighted_unfolded_energy(0.0), mut_weighted_unfolded_energy(0.0);
902 for (
Size ii = 1; ii <= num_energy_dofs; ++ii ) {
919 wt_unweighted_unfolded_energy += ( vars[ii] * wt_unfolded_energies_emap_[ score_list[ ii ] ] );
920 mut_unweighted_unfolded_energy += ( vars[ii] * mut_unfolded_energies_emap_[ score_list[ ii ] ] );
926 for (
Size ii = 1; ii <= fixed_score_list.size(); ++ii ) {
937 wt_unweighted_unfolded_energy += ( fixed_terms[ fixed_score_list[ ii ] ] * wt_unfolded_energies_emap_[ fixed_score_list[ ii ] ] );
938 mut_unweighted_unfolded_energy += ( fixed_terms[ fixed_score_list[ ii ] ] * mut_unfolded_energies_emap_[ fixed_score_list[ ii ] ] );
944 Real unfolded_weight = 0.0;
945 for (
Size ii = 1; ii <= num_energy_dofs; ++ii ) {
947 wt_weighted_unfolded_energy = vars[ii] * wt_unweighted_unfolded_energy;
948 mut_weighted_unfolded_energy = vars[ii] * mut_unweighted_unfolded_energy;
949 unfolded_weight = vars[ii];
960 for (
Size ii = 1; ii <= fixed_score_list.size(); ++ii ) {
962 wt_weighted_unfolded_energy = fixed_terms[ fixed_score_list[ ii ] ] * wt_unweighted_unfolded_energy;
963 mut_weighted_unfolded_energy = fixed_terms[ fixed_score_list[ ii ] ] * mut_unweighted_unfolded_energy;
964 unfolded_weight = fixed_terms[ fixed_score_list[ ii ] ];
974 for (
Size ii = 1; ii <= wts_.size(); ++ii ) { wt_energies[ ii ] -= wt_weighted_unfolded_energy; }
975 for (
Size ii = 1; ii <= muts_.size(); ++ii ) { mut_energies[ ii ] -= mut_weighted_unfolded_energy; }
992 Real predicted_ddG( 0.0 );
993 Real ddG_diff( 0.0 );
996 Size const best_wt = arg_min( wt_energies );
997 Size const best_mut = arg_min( mut_energies );
999 Real const best_wt_energy = wt_energies[ best_wt ];
1000 Real const best_mut_energy = mut_energies[ best_mut ];
1002 predicted_ddG = best_mut_energy - best_wt_energy;
1003 ddG_diff = predicted_ddG - experimental_ddG_;
1006 ostr <<
"DDG " <<
A( 20, tag() ) <<
X(1) <<
"pred: " << F(6,2,predicted_ddG) <<
" exp: " << F(6,2,experimental_ddG_)
1010 TR <<
"process_score(): unf weight: " << F(5,3,unfolded_weight)
1011 <<
", raw unfE: " << wt_unweighted_unfolded_energy <<
", " << mut_unweighted_unfolded_energy
1012 <<
"; unfE: " << wt_weighted_unfolded_energy <<
", " << mut_weighted_unfolded_energy
1013 <<
"; totalE: " << best_wt_energy <<
", " << best_mut_energy
1014 <<
"; pred: " << ObjexxFCL::fmt::F(4,2,predicted_ddG)
1015 <<
", exp'tal: " << experimental_ddG_ <<
", ddG_diff^2: " << ObjexxFCL::fmt::F(6,3,ddG_diff * ddG_diff)
1016 <<
", tag: " << tag() << std::endl;
1020 for(
Size e_dof(1); e_dof <= num_energy_dofs; ++e_dof ) {
1022 if ( ( score_list[ e_dof ] ==
fa_rep ) && ( muts_[ best_mut ]->free_data()[ e_dof ] - wts_[ best_wt ]->free_data()[ e_dof ] ) > 10 ) {
1026 }
else if ( score_list[ e_dof ] ==
unfolded ) {
1028 ( mut_unweighted_unfolded_energy - wt_unweighted_unfolded_energy );
1032 ( muts_[ best_mut ]->free_data()[ e_dof ] - wts_[ best_wt ]->free_data()[ e_dof ] );
1035 if ( num_ref_dofs != 0 ) {
1049 NestedEnergyTermDDGMutationOptEData::type()
const {
1060 NestedEnergyTermDDGMutationOptEData::memory_use()
const {
1065 if ( wts_.size() > 0 ) {
1066 total +=
sizeof(
Real ) * ( wts_[ 1 ]->free_data().size() + wts_[ 1 ]->fixed_data().size() ) * wts_.size();
1068 if ( muts_.size() > 0 ) {
1069 total +=
sizeof(
Real ) * ( muts_[ 1 ]->free_data().size() + muts_[ 1 ]->fixed_data().size() ) * muts_.size();
1086 NestedEnergyTermDDGMutationOptEData::send_to_node(
int const destination_node,
int const tag )
const {
1089 int wt_aa( wt_aa_ ), mut_aa( mut_aa_ );
1090 Real experimental_ddG = experimental_ddG_;
1091 MPI_Send( & experimental_ddG, 1, MPI_DOUBLE, destination_node, tag, MPI_COMM_WORLD );
1092 MPI_Send( & wt_aa, 1, MPI_INT, destination_node, tag, MPI_COMM_WORLD );
1093 MPI_Send( & mut_aa, 1, MPI_INT, destination_node, tag, MPI_COMM_WORLD );
1097 Size nwts = wts_.size();
1098 MPI_Send( & nwts, 1, MPI_UNSIGNED_LONG, destination_node, tag, MPI_COMM_WORLD );
1102 Size nmuts = muts_.size();
1103 MPI_Send( & nmuts, 1, MPI_UNSIGNED_LONG, destination_node, tag, MPI_COMM_WORLD );
1105 if ( nwts == 0 || nmuts == 0 )
1109 Size n_free = muts_[ 1 ]->free_data().size();
1111 MPI_Send( & n_free, 1, MPI_UNSIGNED_LONG, destination_node, tag, MPI_COMM_WORLD );
1114 Size n_fixed = muts_[ 1 ]->fixed_data().size();
1116 MPI_Send( & n_fixed, 1, MPI_UNSIGNED_LONG, destination_node, tag, MPI_COMM_WORLD );
1119 Real * free_data =
new Real[ n_free * nwts ];
1120 Real * fixed_data =
new Real[ n_fixed * nwts ];
1121 for (
Size ii = 1; ii <= nwts; ++ ii ) {
1122 for (
Size jj = 1; jj <= n_free; ++jj ) {
1123 free_data[ ( ii - 1 ) * n_free + ( jj - 1 ) ] = wts_[ ii ]->free_data()[ jj ];
1125 for (
Size jj = 1; jj <= n_fixed; ++jj ) {
1126 fixed_data[ ( ii - 1 ) * n_fixed + ( jj - 1 ) ] = wts_[ ii ]->fixed_data()[ jj ];
1132 MPI_Send( free_data, nwts * n_free, MPI_DOUBLE, destination_node, tag, MPI_COMM_WORLD );
1136 MPI_Send( fixed_data, nwts * n_fixed, MPI_DOUBLE, destination_node, tag, MPI_COMM_WORLD );
1141 Real * decoy_free_data =
new Real[ n_free * nmuts ];
1142 Real * decoy_fixed_data =
new Real[ n_fixed * nmuts ];
1143 for (
Size ii = 1; ii <= nmuts; ++ ii ) {
1144 for (
Size jj = 1; jj <= n_free; ++jj ) {
1145 decoy_free_data[ ( ii - 1 ) * n_free + ( jj - 1 ) ] = muts_[ ii ]->free_data()[ jj ];
1147 for (
Size jj = 1; jj <= n_fixed; ++jj ) {
1148 decoy_fixed_data[ ( ii - 1 ) * n_fixed + ( jj - 1 ) ] = muts_[ ii ]->fixed_data()[ jj ];
1153 MPI_Send( decoy_free_data, nmuts * n_free, MPI_DOUBLE, destination_node, tag, MPI_COMM_WORLD );
1157 MPI_Send( decoy_fixed_data, nmuts * n_fixed, MPI_DOUBLE, destination_node, tag, MPI_COMM_WORLD );
1159 delete [] free_data;
1160 delete [] fixed_data;
1162 delete [] decoy_free_data;
1163 delete [] decoy_fixed_data;
1168 wt_unfolded_energies[ ee - 1 ] = wt_unfolded_energies_emap_[ (
ScoreType) ee ];
1170 MPI_Send( wt_unfolded_energies,
scoring::n_score_types, MPI_DOUBLE, destination_node, tag, MPI_COMM_WORLD );
1171 delete [] wt_unfolded_energies;
1172 wt_unfolded_energies = 0;
1177 mut_unfolded_energies[ ee - 1 ] = mut_unfolded_energies_emap_[ (
ScoreType) ee ];
1179 MPI_Send( mut_unfolded_energies,
scoring::n_score_types, MPI_DOUBLE, destination_node, tag, MPI_COMM_WORLD );
1180 delete [] mut_unfolded_energies;
1181 mut_unfolded_energies = 0;
1184 OptEPositionData::send_to_node( destination_node, tag );
1193 NestedEnergyTermDDGMutationOptEData::receive_from_node(
int const source_node,
int const tag )
1199 int wt_aa( 0 ), mut_aa(0);
1200 MPI_Recv( & experimental_ddG_, 1, MPI_DOUBLE, source_node, tag, MPI_COMM_WORLD, &stat );
1201 MPI_Recv( & wt_aa, 1, MPI_INT, source_node, tag, MPI_COMM_WORLD, &stat );
1202 MPI_Recv( & mut_aa, 1, MPI_INT, source_node, tag, MPI_COMM_WORLD, &stat );
1203 wt_aa_ =
static_cast< AA > ( wt_aa );
1204 mut_aa_ =
static_cast< AA > ( mut_aa );
1208 MPI_Recv( & nwts, 1, MPI_UNSIGNED_LONG, source_node, tag, MPI_COMM_WORLD, &stat );
1212 MPI_Recv( & nmuts, 1, MPI_UNSIGNED_LONG, source_node, tag, MPI_COMM_WORLD, &stat );
1214 if ( nwts == 0 || nmuts == 0 )
return;
1215 wts_.reserve( nwts );
1216 muts_.reserve( nmuts );
1220 MPI_Recv( & n_free, 1, MPI_UNSIGNED_LONG, source_node, tag, MPI_COMM_WORLD, &stat );
1224 MPI_Recv( & n_fixed, 1, MPI_UNSIGNED_LONG, source_node, tag, MPI_COMM_WORLD, &stat );
1227 Real * free_data =
new Real[ n_free * nwts ];
1228 Real * fixed_data =
new Real[ n_fixed * nwts ];
1231 MPI_Recv( free_data, nwts * n_free, MPI_DOUBLE, source_node, tag, MPI_COMM_WORLD, &stat );
1234 MPI_Recv( fixed_data, nwts * n_fixed, MPI_DOUBLE, source_node, tag, MPI_COMM_WORLD, &stat );
1238 for (
Size ii = 1; ii <= nwts; ++ ii ) {
1239 for (
Size jj = 1; jj <= n_free; ++jj ) {
1240 free_data_v[ jj ] = free_data[ ( ii - 1 ) * n_free + ( jj - 1 ) ];
1242 for (
Size jj = 1; jj <= n_fixed; ++jj ) {
1243 fixed_data_v[ jj ] = fixed_data[ ( ii - 1 ) * n_fixed + ( jj - 1 ) ];
1245 wts_.push_back(
new SingleStructureData( free_data_v, fixed_data_v ) );
1249 delete [] free_data; free_data = 0;
1250 delete [] fixed_data; fixed_data = 0;
1253 free_data =
new Real[ n_free * nmuts ];
1254 fixed_data =
new Real[ n_fixed * nmuts ];
1257 MPI_Recv( free_data, nmuts * n_free, MPI_DOUBLE, source_node, tag, MPI_COMM_WORLD, &stat );
1260 MPI_Recv( fixed_data, nmuts * n_fixed, MPI_DOUBLE, source_node, tag, MPI_COMM_WORLD, &stat );
1262 for (
Size ii = 1; ii <= nmuts; ++ ii ) {
1263 for (
Size jj = 1; jj <= n_free; ++jj ) {
1264 free_data_v[ jj ] = free_data[ ( ii - 1 ) * n_free + ( jj - 1 ) ];
1266 for (
Size jj = 1; jj <= n_fixed; ++jj ) {
1267 fixed_data_v[ jj ] = fixed_data[ ( ii - 1 ) * n_fixed + ( jj - 1 ) ];
1269 muts_.push_back(
new SingleStructureData( free_data_v, fixed_data_v ) );
1272 delete [] free_data;
1273 delete [] fixed_data;
1280 MPI_Recv( wt_unfolded_energies,
scoring::n_score_types, MPI_DOUBLE, source_node, tag, MPI_COMM_WORLD, &stat );
1284 emap[ (
ScoreType) ee ] = wt_unfolded_energies[ ee - 1 ];
1286 set_wt_unfolded_energies_emap( emap );
1291 MPI_Recv( mut_unfolded_energies,
scoring::n_score_types, MPI_DOUBLE, source_node, tag, MPI_COMM_WORLD, &stat );
1294 emap[ (
ScoreType) ee ] = mut_unfolded_energies[ ee - 1 ];
1296 set_mut_unfolded_energies_emap( emap );
1298 delete [] wt_unfolded_energies;
1299 delete [] mut_unfolded_energies;
1301 wt_unfolded_energies = 0;
1302 mut_unfolded_energies = 0;
1305 OptEPositionData::receive_from_node( source_node, tag );