26 #include <basic/Tracer.hh>
29 #include <utility/assert.hh>
31 #include <utility/mpi_util.hh>
32 #include <utility/string_util.hh>
40 #include <utility/vector0.hh>
41 #include <utility/vector1.hh>
45 static basic::Tracer
TR(
"protocols.pack_daemon.MultistateFitnessFunction");
48 namespace pack_daemon {
60 return a.first->fitness() < b.first->fitness();
66 desired_entity_history_size_( 1 ),
67 n_tied_for_worst_( 0 )
75 clock_t start_time = clock();
78 if (
TR.visible( basic::t_debug ) ) {
79 TR.Debug <<
"Evaluating entity " << entity << std::endl;
88 clock_t stop_time = clock();
89 if (
TR.visible( basic::t_debug )) {
90 TR.Debug <<
"evaluate() took " << ((double) stop_time - start_time ) / CLOCKS_PER_SEC <<
" seconds" << std::endl;
145 std::list< std::pair< MultistateFitnessFunction::Size, MultistateFitnessFunction::PoseOP > >
149 if ( entity_index == 0 ) {
150 std::cerr <<
"Failed to find desired top entity: " << ent << std::endl;
151 std::cerr <<
"Top entities:" << std::endl;
153 std::cerr << ii <<
" " << *
top_entities_[ ii ].first << std::endl;
155 utility_exit_with_message(
"Failed to find desired top entity" );
171 daemon_set_->compute_energy_for_assignment( entity );
172 for ( DaemonSet::SizeRealPairs::const_iterator
173 iter = energies.first.begin(), iter_end = energies.first.end();
174 iter != iter_end; ++iter ) {
177 for ( DaemonSet::SizeRealPairs::const_iterator
178 iter = energies.second.begin(), iter_end = energies.second.end();
179 iter != iter_end; ++iter ) {
210 std::list< std::pair< MultistateFitnessFunction::Size, MultistateFitnessFunction::PoseOP > >
216 return daemon_set_->retrieve_relevant_poses_for_entity( ent, which_states );
285 ASSERT_ONLY(
Real const old_worst_fitness =
top_entities_.front().first->fitness();)
287 assert(
top_entities_.front().first->fitness() == old_worst_fitness );
298 while (
top_entities_.front().first->fitness() == new_worst_fitness ) {
333 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
355 utility::send_integer_to_node( ii,
spin_down );
359 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
360 void MPIMultistateFitnessFunction::print_load_balance_statistics( std::ostream & ostr )
const
364 for ( std::list< core::Real >::const_iterator
365 uiter = utilization_by_node_[ ii ].begin(),
366 uiter_end = utilization_by_node_[ ii ].
end(),
367 piter = packing_percentage_[ ii ].begin(),
369 npditer = npd_percentage_[ ii ].begin()
371 ; uiter != uiter_end; ++uiter, ++piter, ++npditer ) {
374 packing_sum += *piter;
378 packing_sum /= count;
380 ostr <<
"Node " << ii <<
" average utilization: " << ut_sum <<
" packing: " << packing_sum <<
" npd: " << npd_sum << std::endl;
384 void MPIMultistateFitnessFunction::reset_load_balance_statistics()
387 utilization_by_node_[ ii ].clear();
395 using namespace utility;
396 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
397 std::clock_t start_time = clock();
411 compute_energy_for_assignment( entity );
412 for ( std::list< std::pair< core::Size, core::Real > >::const_iterator
413 iter = energies.first.begin(), iter_end = energies.first.end();
414 iter != iter_end; ++iter ) {
417 for ( std::list< std::pair< core::Size, core::Real > >::const_iterator
418 iter = energies.second.begin(), iter_end = energies.second.end();
419 iter != iter_end; ++iter ) {
423 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
424 std::clock_t node0_stop_time = clock();
425 times[ 0 ] = ((double) node0_stop_time - start_time ) / CLOCKS_PER_SEC;
426 packing_times[ 0 ] =
daemon_set()->last_packing_runtime();
427 npd_times[ 0 ] =
daemon_set()->last_npd_runtime();
432 int n_results = receive_integer_from_node( ii );
434 for (
int jj = 1; jj <= n_results; ++jj ) {
435 int which_pack_daemon = receive_integer_from_node( ii );
436 Real energy_for_daemon = receive_double_from_node( ii );
441 int n_npd_properties = receive_integer_from_node( ii );
443 for (
int jj = 1; jj <= n_npd_properties; ++jj ) {
444 int which_npd_prop = receive_integer_from_node( ii );
445 Real npd_property = receive_double_from_node( ii );
449 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
450 times[ ii ] = utility::receive_double_from_node( ii );
451 packing_times[ ii ] = utility::receive_double_from_node( ii );
452 npd_times[ ii ] = utility::receive_double_from_node( ii );
457 #ifdef APL_MEASURE_MSD_LOAD_BALANCE
458 std::clock_t final_stop_time = clock();
459 Real runtime = ((double) final_stop_time - start_time ) / CLOCKS_PER_SEC;
460 if (runtime != 0.0 ) {
462 utilization_by_node_[ ii ].push_back( times[ ii ] / runtime );
463 packing_percentage_[ ii ].push_back( packing_times[ ii ] / runtime );
464 npd_percentage_[ ii ].push_back( npd_times[ ii ] / runtime );
468 utilization_by_node_[ ii ].push_back( 1.0 );
469 packing_percentage_[ ii ].push_back( 0.0 );
470 npd_percentage_[ ii ].push_back( 0.0 );
484 daemon_set()->mark_last_entity_as_important();
495 daemon_set()->mark_entity_as_unimportant( entity );
499 std::list< std::pair< MultistateFitnessFunction::Size, MultistateFitnessFunction::PoseOP > >
511 utility::send_integers_to_node( ii, which_states_ints );
513 std::list< std::pair< Size, PoseOP > > return_pose_list;
515 std::list< std::pair< Size, PoseOP > > my_poses =
daemon_set()->
516 retrieve_relevant_poses_for_entity( entity, which_states );
517 return_pose_list.splice( return_pose_list.end(), my_poses );
520 int n_poses_from_ii = utility::receive_integer_from_node( ii );
522 std::string pseudo_pdbname =
"MPI_pdb_from_node_" + utility::to_string( ii );
523 for (
int jj = 1; jj <= n_poses_from_ii; ++jj ) {
525 Size pack_daemon_index = utility::receive_integer_from_node( ii );
526 std::string pdb_string = utility::receive_string_from_node( ii );
531 return_pose_list.push_back( std::make_pair( pack_daemon_index, pose ) );
535 return return_pose_list;
540 std::ostringstream oss;
545 utility::send_string_to_node( ii, entity_string );