51 #include <basic/Tracer.hh>
55 #include <utility/exit.hh>
56 #include <utility/integer_mapping.hh>
57 #include <utility/string_util.hh>
58 #include <utility/io/izstream.hh>
59 #include <utility/excn/Exceptions.hh>
63 #include <utility/vector0.hh>
64 #include <utility/vector1.hh>
67 #include <utility/mpi_util.hh>
72 namespace pack_daemon {
74 static basic::Tracer
TR(
"protocols.pack_daemon.PackDaemon");
77 include_background_energies_( true ),
78 background_energies_( 0.0 ),
79 setup_complete_( false ),
80 best_assignment_valid_( false )
95 task_->nonconst_residue_task( ii ).and_extrachi_cutoff( 1 );
97 task_->or_double_lazy_ig(
true );
98 task_->set_bump_check(
false );
111 utility_exit_with_message(
"PackDaemon::set_entity_correspondence may only be called after the set_pose_and_task" );
114 utility_exit_with_message(
"Num residue disgreement between input EntityCorrespondence and existing pose_" );
125 TR <<
"Setting dlig nmeg limit" << std::endl;
126 task_->decrease_double_lazy_ig_memlimit( 1024 * 1024 * setting );
139 utility_exit_with_message(
"PackDaemon::set_pose_and_task must be called before setup() can be" );
142 utility_exit_with_message(
"PackDaemon::set_score_function must be called before setup() can be" );
145 utility_exit_with_message(
"PackDaemon::set_entity_correspondence must be called before setup() can be" );
147 TR <<
"PackDaemon::setup()" << std::endl;
155 throw utility::excn::EXCN_Msg_Exception(
"Interaction graph returned by pack_rotamers_setup is not a"
156 " fixed-backbone interaction graph. Cannot continue" );
199 mca_repacker->set_MCA();
218 (*last_entity_) = entity;
281 (*best_entity_) = entity;
291 using namespace core::pack::rotamer_set;
292 using namespace protocols::multistate_design;
298 Size ii_offset =
rot_sets_->nrotamer_offset_for_moltenres( ii );
301 Size ii_rotamers_appended( 0 );
302 if ( ii_entity_id == 0 ) {
304 for (
Size jj = 1, ii_nrots = ii_rotamers->num_rotamers(); jj <= ii_nrots; ++jj ) {
305 rotamer_subset.push_back( ii_offset + jj );
306 ++ii_rotamers_appended;
308 if ( ii_rotamers_appended == 0 ) {
309 throw utility::excn::EXCN_Msg_Exception(
"Failed to find any rotamers for residue "
310 + utility::to_string( ii_resid ) +
"." );
313 PosTypeCOP pt_ptr( dynamic_cast< PosType const * > ( entity.
traits()[ ii_entity_id ].get() ));
315 utility_exit_with_message(
"Failed to downcast entity trait[" +
316 utility::to_string( ii ) +
"] to PosTye; trait name: " +
317 entity.
traits()[ ii ]->name() );
321 for (
Size jj = 1, ii_nrots = ii_rotamers->num_rotamers(); jj <= ii_nrots; ++jj ) {
322 if ( ii_rotamers->rotamer( jj )->aa() == entity_aa ) {
323 rotamer_subset.push_back( ii_offset + jj );
324 ++ii_rotamers_appended;
328 if ( ii_rotamers_appended == 0 ) {
329 throw utility::excn::EXCN_Msg_Exception(
"Failed to find any rotamers for residue "
330 + utility::to_string( ii_resid ) +
" corresponding to entity "
331 + utility::to_string( ii_entity_id ) +
" when looking for "
332 + utility::to_string( entity_aa ) +
" rotamers." );
336 return rotamer_subset;
343 for (
Size ii = 1; ii <= traits_copy.size(); ++ii ) {
344 traits_copy[ ii ] =
last_entity_->traits()[ ii ]->clone();
375 TR <<
"Failed to find entity in entity-hash: " << ent << std::endl;
384 Size iibestrot =
rot_sets_->rotid_on_moltenresidue( rotamer_assignment.first[ ii ] );
386 return_pose->replace_residue(
388 *
rot_sets_->rotamer_set_for_moltenresidue( ii )->rotamer( iibestrot ),
403 *
rot_sets_->rotamer_set_for_moltenresidue( ii )->rotamer( iibestrot ),
413 TR <<
"Entity History:\n";
414 for ( EntityToRotamerHash::const_iterator hashiter =
prev_state_hash_.begin(),
415 hashiter_end =
prev_state_hash_.end(); hashiter != hashiter_end; ++hashiter ) {
416 TR <<
"Stored state:";
417 for (
Size ii = 1; ii <= hashiter->first.size(); ++ii ) {
418 TR <<
" " << hashiter->first[ ii ]->to_string();
420 TR <<
" fitness: " << hashiter->second.second <<
" rotamers: ";
421 for (
Size ii = 1; ii <= hashiter->second.first.size(); ++ii ) {
422 TR <<
" " << hashiter->second.first[ ii ];
431 using namespace core;
432 using namespace core::scoring;
433 using namespace core::graph;
437 EnergyGraph const & energy_graph( energies.energy_graph() );
438 for (
Size ii = 1; ii <=
pose_->total_residue(); ++ii ) {
439 if (
task_->being_packed( ii ) )
continue;
442 iru = energy_graph.get_node(ii)->const_upper_edge_list_begin(),
444 iru != irue; ++iru ) {
445 EnergyEdge const & edge( static_cast< EnergyEdge const & > (**iru) );
447 if (
task_->being_packed( jj ) )
continue;
457 task_factory_( new core::pack::
task::TaskFactory ),
459 limit_dlig_mem_usage_( false ),
460 dlig_nmeg_limit_( 0 ),
462 n_npd_properties_( 0 )
475 utility::io::izstream infile( resfile );
477 utility_exit_with_message(
"Failed to open entity resfile: " + resfile );
484 std::istream & resfile,
488 using namespace core::pack::task;
489 using namespace core::pose;
492 utility_exit_with_message(
"Entity resfile must be set before any daemons may be added and all daemons must use the same correspondece file" );
496 utility_exit_with_message(
"Error reading the number of entities from entity resfile " + resfile_name );
502 entity_task_ = TaskFactory::create_packer_task( ala_pose );
509 std::list< ResfileCommandCOP >
const & ii_command_list(
514 for ( std::list< ResfileCommandCOP >::const_iterator
515 iter = ii_command_list.begin(), iter_end = ii_command_list.end();
516 iter != iter_end; ++iter ) {
540 if ( setting != 0 ) {
572 utility::io::izstream correspondence_file( correspondence_file_name );
573 if ( ! correspondence_file ) {
574 utility_exit_with_message(
"Could not open correspondence file named: " + correspondence_file_name );
578 utility::io::izstream secondary_resfile( secondary_resfile_name );
579 if ( ! secondary_resfile ) {
580 utility_exit_with_message(
"Could not open secondary resfile named: " + secondary_resfile_name );
582 add_pack_daemon( daemon_index, pdb_name, pose, correspondence_file_name, correspondence_file, secondary_resfile_name, secondary_resfile );
591 std::istream & correspondence_file,
592 std::string const & secondary_refile_file_filename,
593 std::istream & secondary_resfile
596 TR <<
"Adding daemon: " << daemon_index <<
" " << pose_file_name <<
" " << correspondence_file_filename <<
" " << secondary_refile_file_filename << std::endl;
598 using namespace core;
599 using namespace core::pack::task;
602 utility_exit_with_message(
"ScoreFunction must be set before DaemonSet::add_pack_daemon may be called" );
605 utility_exit_with_message(
"Entity resfile must be set before DaemonSet::add_pack_daemon may be called" );
612 ec->initialize_from_correspondence_file( correspondence_file );
619 Size ii_entity = ec->entity_for_residue( ii );
620 std::list< ResfileCommandCOP >
const & ii_command_list(
631 for ( std::list< ResfileCommandCOP >::const_iterator
632 iter = ii_command_list.begin(), iter_end = ii_command_list.end();
633 iter != iter_end; ++iter ) {
634 (*iter)->residue_action( *task, ii );
637 task->initialize_from_command_line();
649 Size ii_entity_id = ec->entity_for_residue( ii );
650 if ( ii_entity_id == 0 ) {
655 final_task_allowed = task->residue_task( ii ).allowed_residue_types_begin(),
656 entity_task_allowed =
entity_task_->residue_task( ii_entity_id ).allowed_residue_types_begin(),
657 final_task_allowed_end = task->residue_task( ii ).allowed_residue_types_end(),
658 entity_task_allowed_end =
entity_task_->residue_task( ii_entity_id ).allowed_residue_types_end();
666 while ( final_task_allowed != final_task_allowed_end ) {
668 final_aas[ (*final_task_allowed)->aa() ] =
true;
673 ++final_task_allowed;
675 while ( entity_task_allowed != entity_task_allowed_end ) {
677 entity_aas[ (*entity_task_allowed)->aa() ] =
true;
682 ++entity_task_allowed;
687 if ( entity_aas[ ii ] != final_aas[ ii ] ) {
695 ii_error =
"Discrepancy between allowed residue types in the entity resfile and "
696 "the final resfile for residue " + utility::to_string( ii ) +
" in structure " +
697 pose_file_name +
" which corresponds to entity " + utility::to_string( ii_entity_id ) +
"\n";
699 ii_error +=
"Original residue type: " + pose.
residue_type(ii).
name() +
"\n";
701 ii_error +=
"Final packer task allows residue types\n";
702 final_task_allowed = task->residue_task( ii ).allowed_residue_types_begin();
703 final_task_allowed_end = task->residue_task( ii ).allowed_residue_types_end();
704 while ( final_task_allowed != final_task_allowed_end ) {
705 ii_error += utility::to_string( (*final_task_allowed)->aa()) +
" (" + (*final_task_allowed)->name() +
")\n";
706 ++final_task_allowed;
709 ii_error +=
"Shared packer task allows residue types\n";
710 entity_task_allowed =
entity_task_->residue_task( ii_entity_id ).allowed_residue_types_begin();
711 entity_task_allowed_end =
entity_task_->residue_task( ii_entity_id ).allowed_residue_types_end();
712 while ( entity_task_allowed != entity_task_allowed_end ) {
713 ii_error += utility::to_string((*entity_task_allowed)->aa()) +
"\n";
714 ++entity_task_allowed;
728 daemon->set_entity_correspondence( *ec );
734 daemons_.push_back( std::make_pair( daemon_index, daemon ));
751 msg =
"Requested non-pairwise-decomposable (NPD) property '" + npd_property +
"' but there are"
752 " no NPD Property Calculator Creators that have been registered with the DaemonSet";
754 msg =
"Requested non-pairwise-decomposable (NPD) property '" + npd_property +
"' but no such NPD"
755 " calculator creator has been registered with the DaemonSet. Available calculators include\n";
756 for ( std::map< std::string, NPDPropCalculatorCreatorOP >::const_iterator
759 npditer != npditer_end; ++npditer ) {
760 msg +=
" " + npditer->first +
"\n";
763 throw utility::excn::EXCN_Msg_Exception( msg );
766 Size which_daemon = 0;
768 if (
daemons_[ ii ].first == daemon_index ) {
773 if ( which_daemon == 0 ) {
774 throw utility::excn::EXCN_Msg_Exception(
"Internal error: could not locate requested daemon " +
775 utility::to_string( daemon_index ) +
" while trying to add NPD Property Calculator for that daemon." );
789 iter->second->setup();
801 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
802 std::clock_t starttime = clock();
808 iter != iter_end; ++iter ) {
809 core::Real energy = iter->second->compute_energy_for_assignment( entity );
810 daemon_scores.push_back( std::make_pair( iter->first, energy ) );
813 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
814 std::clock_t midtime = clock();
821 for ( std::list< NPDIndAndCalc >::const_iterator
824 npditer != npditer_end; ++npditer ) {
826 npd_properties.push_back( std::make_pair( npditer->first, npd_property ));
831 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
832 std::clock_t stoptime = clock();
833 packing_runtime_ = ((double) midtime - starttime ) / CLOCKS_PER_SEC;
834 npd_runtime_ = ((double) stoptime - midtime ) / CLOCKS_PER_SEC;
836 return std::make_pair( daemon_scores, npd_properties );
844 iter != iter_end; ++iter ) {
845 std::pair< core::Size, PackDaemonCOP > new_element;
846 new_element.first = iter->first;
847 new_element.second = iter->second;
848 return_daemons.push_back( new_element );
850 return return_daemons;
856 iter->second->mark_last_entity_as_important();
863 iter->second->mark_entity_as_unimportant( ent );
868 std::list< std::pair< core::Size, core::pose::PoseOP > >
874 std::list< std::pair< Size, PoseOP > > return_list;
876 bool generate_pose_for_daemon(
false );
877 for ( DaemonIndices::const_iterator
878 index_iter = daemon_indices.begin(),
879 index_iter_end = daemon_indices.end();
880 index_iter != index_iter_end; ++index_iter ) {
881 if ( iter->first == *index_iter ) {
882 generate_pose_for_daemon =
true;
885 if ( ! generate_pose_for_daemon )
continue;
886 return_list.push_back( std::make_pair( iter->first, iter->second->recreate_pose_for_entity( ent )) );
899 int signal = utility::receive_integer_from_node( 0 );
901 bool leave_main_while_loop(
false );
932 leave_main_while_loop =
true;
940 if ( leave_main_while_loop )
break;
943 utility_exit_with_message(
"MPI-related function requested of class DaemonSet in a non-MPI build" );
951 int n_daemons = utility::receive_integer_from_node( 0 );
965 for (
int ii = 1; ii <= n_daemons; ++ii ) {
966 daemon_indices[ ii ] = utility::receive_integer_from_node( 0 );
967 pdb_names[ ii ] = utility::receive_string_from_node( 0 );
968 pdbs[ ii ] = utility::receive_string_from_node( 0 );
969 correspondence_file_names[ ii ] = utility::receive_string_from_node( 0 );
970 correspondence_files[ ii ] = utility::receive_string_from_node( 0 );
971 secondary_resfile_names[ ii ] = utility::receive_string_from_node( 0 );
972 secondary_resfiles[ ii ] = utility::receive_string_from_node( 0 );
973 int n_npd_properties_for_state = utility::receive_integer_from_node( 0 );
974 for (
Size jj = 1; jj <= n_npd_properties_for_state; ++jj ) {
975 Size npd_property_id = utility::receive_integer_from_node( 0 );
976 std::string property = utility::receive_string_from_node( 0 );
977 npd_properties[ ii ].push_back( std::make_pair( npd_property_id, property ) );
982 for (
int ii = 1; ii <= n_daemons; ++ii ) {
985 std::istringstream correspondence_file( correspondence_files[ ii ] );
986 std::istringstream secondary_resfile( secondary_resfiles[ ii ] );
988 daemon_indices[ ii ],
989 pdb_names[ ii ], pose,
990 correspondence_file_names[ ii ], correspondence_file,
991 secondary_resfile_names[ ii ], secondary_resfile );
992 for ( std::list< std::pair< Size, std::string > >::const_iterator
993 npditer = npd_properties[ ii ].begin(),
994 npditer_end = npd_properties[ ii ].
end();
995 npditer != npditer_end; ++npditer ) {
1000 }
catch ( utility::excn::EXCN_Base & excn ) {
1004 utility::send_string_to_node( 0, message );
1013 int others_successful = utility::receive_integer_from_node( 0 );
1028 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
1029 std::clock_t starttime = clock();
1036 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
1037 std::clock_t stoptime = clock();
1040 assert(
ndaemons() == entity_energies.first.size() );
1044 utility::send_integer_to_node( 0, n_daemons );
1045 for ( std::list< std::pair< core::Size, core::Real > >::const_iterator
1046 iter = entity_energies.first.begin(),
1047 iter_end = entity_energies.first.end();
1048 iter != iter_end; ++iter ) {
1049 utility::send_integer_to_node( 0, iter->first );
1050 utility::send_double_to_node( 0, iter->second );
1053 for ( std::list< std::pair< core::Size, core::Real > >::const_iterator
1054 iter = entity_energies.second.begin(),
1055 iter_end = entity_energies.second.end();
1056 iter != iter_end; ++iter ) {
1057 utility::send_integer_to_node( 0, iter->first );
1058 utility::send_double_to_node( 0, iter->second );
1061 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
1062 core::Real evaltime = ((double) stoptime - starttime) / CLOCKS_PER_SEC;
1064 utility::send_double_to_node( 0, evaltime );
1065 utility::send_double_to_node( 0, packing_runtime_ );
1066 utility::send_double_to_node( 0, npd_runtime_ );
1092 utility::send_integer_to_node( 0, poses.size() );
1093 for ( std::list< std::pair< Size, PoseOP > >::const_iterator
1094 iter = poses.begin(), iter_end = poses.end(); iter != iter_end; ++iter ) {
1095 std::ostringstream oss;
1097 utility::send_integer_to_node( 0, iter->first );
1098 utility::send_string_to_node( 0, oss.str() );
1108 std::string entity_string = utility::receive_string_from_node( 0 );
1122 indices = int_indices;
1159 rot_sets_( rot_sets )
1177 parent( pose, task, ig, rotsets )
1179 ig()->prepare_for_simulated_annealing();
1187 ObjexxFCL::FArray1D< int > rotamer_assignment(
pose()->total_residue() );
1192 rotamer_assignment, rotamer_energy );
1195 result.first.resize(
rot_sets()->nmoltenres() );
1197 for (
Size ii = 1; ii <=
rot_sets()->nmoltenres(); ++ii ) {
1198 result.first[ ii ] = rotamer_assignment(
rot_sets()->moltenres_2_resid( ii ) );
1200 result.second = rotamer_energy;
1211 parent( pose, task, ig, rotsets )
1233 parent( pose, task, ig, rotsets )
1235 ig()->prepare_for_simulated_annealing();
1242 copy_task->or_multi_cool_annealer(
true );
1249 using namespace core::pack::rotamer_set;
1250 using namespace core::pack::interaction_graph;
1253 std::sort( local_rot_to_pack.begin(), local_rot_to_pack.end() );
1255 utility::subset_mapping rotamer_subset_map(
rot_sets()->nrotamers() );
1256 rotamer_subset_map.reserve_destination_size( local_rot_to_pack.size() );
1257 for (
Size ii = 0; ii < local_rot_to_pack.size(); ++ii ) {
1258 rotamer_subset_map.set_next_correspondence( local_rot_to_pack[ ii ] );
1266 ObjexxFCL::FArray1D< int > rotamer_assignment(
pose()->total_residue() );
1269 for (
Size ii = 0; ii < all_rots.size(); ++ii ) all_rots[ ii ] = ii+1;
1272 *
pose(),
task(), rsubset, dense_ig, all_rots,
1273 rotamer_assignment, rotamer_energy );
1276 result.first.resize(
rot_sets()->nmoltenres() );
1278 for (
Size ii = 1; ii <=
rot_sets()->nmoltenres(); ++ii ) {
1279 result.first[ ii ] = rotamer_subset_map.d2s( rotamer_assignment(
rot_sets()->moltenres_2_resid( ii ) ));
1287 result.second = rotamer_energy;
1297 using namespace core::pack::interaction_graph;
1301 dense_ig->initialize( *rot_subsets );
1309 for (
Size ii = 1; ii <= rot_to_pack.size(); ++ii ) {
1310 Size const ii_moltenres = rot_subsets->moltenres_for_rotamer( ii );
1311 Size const ii_local_id = rot_subsets->rotid_on_moltenresidue( ii );
1312 Size const ii_old_rotid =
rot_sets()->rotid_on_moltenresidue(rot_to_pack[ ii - 1 ]);
1314 if ( aaind_for_moltres[ ii_moltenres ] == -1 ) {
1315 aaind_for_moltres[ ii_moltenres ] =
ig()->aatype_for_node_state( ii_moltenres, ii_old_rotid );
1316 }
else if ( aaind_for_moltres[ ii_moltenres ] != 0 ) {
1317 if ( aaind_for_moltres[ ii_moltenres ] !=
ig()->aatype_for_node_state( ii_moltenres, ii_old_rotid ) ) {
1318 aaind_for_moltres[ ii_moltenres ] = 0;
1322 dense_ig->add_to_nodes_one_body_energy(
1325 ig()->get_one_body_energy_for_node_state( ii_moltenres, ii_old_rotid ));
1331 for (
Size ii = 1; ii <= nmoltenres; ++ii ) {
1332 for (
Size jj = ii+1; jj <= nmoltenres; ++jj ) {
1333 if (
ig()->get_edge_exists( ii, jj ) ) {
1334 if ( aaind_for_moltres[ ii ] > 0 && aaind_for_moltres[ jj ] > 0 ) {
1335 if ( !
ig()->get_sparse_aa_info_for_edge( ii, jj,aaind_for_moltres[ ii ], aaind_for_moltres[ jj ] )) {
1340 dense_ig->add_edge( ii, jj );
1341 bool fast_edge_energy_transfer_successfull =
false;
1342 if ( aaind_for_moltres[ ii ] > 0 && aaind_for_moltres[ jj ] > 0 ) {
1343 ObjexxFCL::FArray2D< core::PackerEnergy > edge_energies =
1344 ig()->get_aa_submatrix_energies_for_edge( ii, jj, aaind_for_moltres[ ii ], aaind_for_moltres[ jj ] );
1345 if ( edge_energies.size1() == rot_subsets->nrotamers_for_moltenres( jj ) &&
1346 edge_energies.size2() == rot_subsets->nrotamers_for_moltenres( ii ) ) {
1348 fast_edge_energy_transfer_successfull =
true;
1349 dense_ig->swap_edge_energies( ii, jj, edge_energies );
1351 TR <<
"Surprisingly, edge " << ii <<
" " << jj <<
" did not have the right sized"
1352 <<
" edge energy table from the PDIG:" << rot_subsets->nrotamers_for_moltenres( ii )
1353 <<
" " << edge_energies.size2() <<
" " << rot_subsets->nrotamers_for_moltenres( jj )
1354 <<
" " << edge_energies.size1() << std::endl;
1358 if ( ! fast_edge_energy_transfer_successfull ) {
1359 for (
Size kk = 1, kk_end = rot_subsets->nrotamers_for_moltenres( ii ); kk <= kk_end; ++kk ) {
1360 Size const kk_old =
rot_sets()->rotid_on_moltenresidue(
1361 rot_to_pack[ rot_subsets->moltenres_rotid_2_rotid( ii, kk ) - 1 ] );
1362 for (
Size ll = 1, ll_end = rot_subsets->nrotamers_for_moltenres( jj ); ll <= ll_end; ++ll ) {
1363 Size const ll_old =
rot_sets()->rotid_on_moltenresidue(
1364 rot_to_pack[ rot_subsets->moltenres_rotid_2_rotid( jj, ll ) - 1 ] );
1365 dense_ig->set_two_body_energy_for_edge( ii, jj, kk, ll,
1366 ig()->get_two_body_energy_for_edge( ii, jj, kk_old, ll_old ) );
1389 parent( pose, task, ig, rotsets )
1391 ig()->prepare_for_simulated_annealing();
1399 using namespace core::pack::rotamer_set;
1400 using namespace core::pack::interaction_graph;
1403 std::sort( local_rot_to_pack.begin(), local_rot_to_pack.end() );
1405 utility::subset_mapping rotamer_subset_map(
rot_sets()->nrotamers() );
1406 rotamer_subset_map.reserve_destination_size( local_rot_to_pack.size() );
1407 for (
Size ii = 0; ii < local_rot_to_pack.size(); ++ii ) {
1408 rotamer_subset_map.set_next_correspondence( local_rot_to_pack[ ii ] );
1416 ObjexxFCL::FArray1D< int > rotamer_assignment(
pose()->total_residue() );
1419 for (
Size ii = 0; ii < all_rots.size(); ++ii ) all_rots[ ii ] = ii+1;
1422 *
pose(),
task(), rsubset, dense_ig, all_rots,
1423 rotamer_assignment, rotamer_energy );
1426 result.first.resize(
rot_sets()->nmoltenres() );
1428 for (
Size ii = 1; ii <=
rot_sets()->nmoltenres(); ++ii ) {
1429 result.first[ ii ] = rotamer_subset_map.d2s( rotamer_assignment(
rot_sets()->moltenres_2_resid( ii ) ));
1437 result.second = rotamer_energy;
1448 using namespace core::pack::interaction_graph;
1452 dense_ig->initialize( *rot_subsets );
1453 for (
Size ii = 1; ii <= rot_to_pack.size(); ++ii ) {
1454 Size const ii_moltenres = rot_subsets->moltenres_for_rotamer( ii );
1455 Size const ii_local_id = rot_subsets->rotid_on_moltenresidue( ii );
1456 Size const ii_old_rotid =
rot_sets()->rotid_on_moltenresidue(rot_to_pack[ ii - 1 ]);
1457 dense_ig->add_to_nodes_one_body_energy(
1460 ig()->get_one_body_energy_for_node_state( ii_moltenres, ii_old_rotid ));
1466 for (
Size ii = 1; ii <= nmoltenres; ++ii ) {
1467 for (
Size jj = ii+1; jj <= nmoltenres; ++jj ) {
1468 if (
ig()->get_edge_exists( ii, jj ) ) {
1469 dense_ig->add_edge( ii, jj );
1470 for (
Size kk = 1, kk_end = rot_subsets->nrotamers_for_moltenres( ii ); kk <= kk_end; ++kk ) {
1471 Size const kk_old =
rot_sets()->rotid_on_moltenresidue(
1472 rot_to_pack[ rot_subsets->moltenres_rotid_2_rotid( ii, kk ) - 1 ] );
1473 for (
Size ll = 1, ll_end = rot_subsets->nrotamers_for_moltenres( jj ); ll <= ll_end; ++ll ) {
1474 Size const ll_old =
rot_sets()->rotid_on_moltenresidue(
1475 rot_to_pack[ rot_subsets->moltenres_rotid_2_rotid( jj, ll ) - 1 ] );
1476 dense_ig->set_two_body_energy_for_edge( ii, jj, kk, ll,
1477 ig()->get_two_body_energy_for_edge( ii, jj, kk_old, ll_old ) );
1496 parent( pose, task, ig, rotsets ),
1501 ig()->prepare_for_simulated_annealing();
1509 using namespace core::pack::rotamer_set;
1510 using namespace core::pack::interaction_graph;
1513 std::sort( local_rot_to_pack.begin(), local_rot_to_pack.end() );
1515 utility::subset_mapping rotamer_subset_map(
rot_sets()->nrotamers() );
1516 rotamer_subset_map.reserve_destination_size( local_rot_to_pack.size() );
1517 for (
Size ii = 0; ii < local_rot_to_pack.size(); ++ii ) {
1518 rotamer_subset_map.set_next_correspondence( local_rot_to_pack[ ii ] );
1526 ObjexxFCL::FArray1D< int > rotamer_assignment(
pose()->total_residue() );
1529 for (
Size ii = 0; ii < all_rots.size(); ++ii ) all_rots[ ii ] = ii+1;
1532 using namespace ObjexxFCL;
1533 using namespace core::pack;
1534 using namespace core::pack::annealer;
1536 bool start_with_current =
false;
1537 FArray1D_int current_rot_index(
pose()->total_residue(), 0 );
1538 bool calc_rot_freq =
false;
1539 FArray1D< core::PackerEnergy > rot_freq( faster_ig()->get_num_total_states(), 0.0 );
1541 FASTERAnnealer fa( rotamer_assignment, rotamer_energy, start_with_current,
1542 faster_ig, rsubset(), current_rot_index, calc_rot_freq, rot_freq );
1553 result.first.resize(
rot_sets()->nmoltenres() );
1555 for (
Size ii = 1; ii <=
rot_sets()->nmoltenres(); ++ii ) {
1556 result.first[ ii ] = rotamer_subset_map.d2s( rotamer_assignment(
rot_sets()->moltenres_2_resid( ii ) ));
1564 result.second = rotamer_energy;
1575 using namespace core::pack::interaction_graph;
1579 faster_ig->initialize( *rot_subsets );
1588 for (
Size ii = 1; ii <= rot_to_pack.size(); ++ii ) {
1589 Size const ii_moltenres = rot_subsets->moltenres_for_rotamer( ii );
1590 Size const ii_local_id = rot_subsets->rotid_on_moltenresidue( ii );
1591 Size const ii_old_rotid =
rot_sets()->rotid_on_moltenresidue(rot_to_pack[ ii - 1 ]);
1593 if ( aaind_for_moltres[ ii_moltenres ] == -1 ) {
1594 aaind_for_moltres[ ii_moltenres ] =
ig()->aatype_for_node_state( ii_moltenres, ii_old_rotid );
1595 }
else if ( aaind_for_moltres[ ii_moltenres ] != 0 ) {
1596 if ( aaind_for_moltres[ ii_moltenres ] !=
ig()->aatype_for_node_state( ii_moltenres, ii_old_rotid ) ) {
1597 aaind_for_moltres[ ii_moltenres ] = 0;
1601 faster_ig->add_to_nodes_one_body_energy(
1604 ig()->get_one_body_energy_for_node_state( ii_moltenres, ii_old_rotid ));
1610 for (
Size ii = 1; ii <= nmoltenres; ++ii ) {
1611 for (
Size jj = ii+1; jj <= nmoltenres; ++jj ) {
1612 if (
ig()->get_edge_exists( ii, jj ) ) {
1613 if ( aaind_for_moltres[ ii ] > 0 && aaind_for_moltres[ jj ] > 0 ) {
1614 if ( !
ig()->get_sparse_aa_info_for_edge( ii, jj, aaind_for_moltres[ ii ], aaind_for_moltres[ jj ] )) {
1619 faster_ig->add_edge( ii, jj );
1620 bool fast_edge_energy_transfer_successfull =
false;
1621 if ( aaind_for_moltres[ ii ] > 0 && aaind_for_moltres[ jj ] > 0 ) {
1622 ObjexxFCL::FArray2D< core::PackerEnergy > edge_energies =
1623 ig()->get_aa_submatrix_energies_for_edge( ii, jj, aaind_for_moltres[ ii ], aaind_for_moltres[ jj ] );
1624 if ( edge_energies.size1() == rot_subsets->nrotamers_for_moltenres( jj ) &&
1625 edge_energies.size2() == rot_subsets->nrotamers_for_moltenres( ii ) ) {
1627 fast_edge_energy_transfer_successfull =
true;
1628 faster_ig->swap_edge_energies( ii, jj, edge_energies );
1630 TR <<
"Surprisingly, edge " << ii <<
" " << jj <<
" did not have the right sized"
1631 <<
" edge energy table from the PDIG:" << rot_subsets->nrotamers_for_moltenres( ii )
1632 <<
" " << edge_energies.size2() <<
" " << rot_subsets->nrotamers_for_moltenres( jj )
1633 <<
" " << edge_energies.size1() << std::endl;
1637 if ( ! fast_edge_energy_transfer_successfull ) {
1638 for (
Size kk = 1, kk_end = rot_subsets->nrotamers_for_moltenres( ii ); kk <= kk_end; ++kk ) {
1639 Size const kk_old =
rot_sets()->rotid_on_moltenresidue(
1640 rot_to_pack[ rot_subsets->moltenres_rotid_2_rotid( ii, kk ) - 1 ] );
1641 for (
Size ll = 1, ll_end = rot_subsets->nrotamers_for_moltenres( jj ); ll <= ll_end; ++ll ) {
1642 Size const ll_old =
rot_sets()->rotid_on_moltenresidue(
1643 rot_to_pack[ rot_subsets->moltenres_rotid_2_rotid( jj, ll ) - 1 ] );
1644 faster_ig->set_two_body_energy_for_edge( ii, jj, kk, ll,
1645 ig()->get_two_body_energy_for_edge( ii, jj, kk_old, ll_old ) );