20 #include <utility/pointer/ReferenceCount.hh>
23 #include <basic/Tracer.hh>
25 #include <utility/file/file_sys_util.hh>
26 #include <utility/io/izstream.hh>
27 #include <utility/io/ozstream.hh>
28 #include <utility/pointer/owning_ptr.hh>
30 #include <utility/vector1.hh>
32 #include <numeric/random/random.fwd.hh>
34 #include <boost/unordered_map.hpp>
40 #include <utility/exit.hh>
44 namespace genetic_algorithm {
46 static basic::Tracer
TR(
"protocols.genetic_algorithm");
49 utility::pointer::ReferenceCount(),
51 entity_randomizer_(0),
53 current_generation_(1),
55 max_population_size_(0),
56 number_to_propagate_(1),
57 fraction_by_recombination_(0.5),
58 checkpoint_prefix_(
""),
59 checkpoint_write_interval_(0),
60 checkpoint_gzip_(false),
61 checkpoint_rename_(false)
74 TraitEntityHashMap::iterator hash_it(
entity_cache_.find( traits ) );
79 entity->set_traits( traits );
85 entity = hash_it->second;
96 runtime_assert( entity );
97 TraitEntityHashMap::iterator hash_it(
entity_cache_.find( entity->traits() ) );
105 entity = hash_it->second;
117 TraitEntityHashMap::iterator hash_it(
entity_cache_.find( traits ) );
121 entity->set_traits( traits );
126 entity = hash_it->second;
135 runtime_assert( entity );
136 TraitEntityHashMap::iterator hash_it(
entity_cache_.find( entity->traits() ) );
139 entity = hash_it->second;
169 std::sort( sorted_entities.begin(), sorted_entities.end(), lt_OP_deref< Entity > );
172 if (unique && size > 1) {
173 pop_iter new_last(std::unique(sorted_entities.begin(), sorted_entities.end(), eq_OP_deref< Entity >));
174 sorted_entities.erase(new_last, sorted_entities.end());
177 for (
core::Size i = 1; i <= size && i <= sorted_entities.size(); ++i) {
185 core::Real best( 0.0 );
bool first_found =
false;
248 if ( ! (*it)->fitness_valid() ) {
327 best_entities.push_back( (*entity)() );
340 using numeric::random::uniform;
341 Entity const & e1( *pvec[ static_cast<Size>( uniform() * pvec.size() ) + 1 ] );
342 Entity const & e2( *pvec[ static_cast<Size>( uniform() * pvec.size() ) + 1 ] );
368 std::set<EntityOP> earlier_generations_set;
369 std::set<EntityOP> previous_generation_set;
370 std::set<EntityOP> current_generation_set;
373 if (gen_num-1 >= 1) {
381 if (previous_generation_set.find(*iter) == previous_generation_set.end()) {
382 earlier_generations_set.insert(*iter);
395 if (previous_generation_set.find(*iter) != previous_generation_set.end()) {
397 }
else if (earlier_generations_set.find(*iter) != earlier_generations_set.end()) {
398 ++resurrected_entities;
399 }
else if (current_generation_set.find(*iter) != current_generation_set.end()) {
400 ++duplicate_new_entities;
402 current_generation_set.insert(*iter);
404 if (!best_new_entity || ((*iter)->fitness_valid() && (*iter)->fitness() < best_new_entity->fitness())) {
405 best_new_entity = *iter;
411 std::sort( sorted_generation.begin(), sorted_generation.end(), lt_OP_deref< Entity > );
412 core::Real gen_size(static_cast<core::Real>(sorted_generation.size()));
414 os <<
"Distinct new entities: " << new_entities << std::endl;
415 os <<
"Duplicate new entities: " << duplicate_new_entities << std::endl;
416 os <<
"Entities from previous generation: " << heldover_entities << std::endl;
417 os <<
"Entities resurrected from earlier generations: " << resurrected_entities << std::endl;
418 os <<
"Fitness Percentiles: 0%=" << sorted_generation.front()->fitness()
419 <<
" 25%=" << sorted_generation[
static_cast<core::Size>(ceil(gen_size*.25))]->fitness()
420 <<
" 50%=" << sorted_generation[
static_cast<core::Size>(ceil(gen_size*.50))]->fitness()
421 <<
" 75%=" << sorted_generation[
static_cast<core::Size>(ceil(gen_size*.75))]->fitness()
422 <<
" 100%=" << sorted_generation.back()->fitness() << std::endl;
423 os <<
"Best new entity:" <<
'\n';
424 os << *best_new_entity << std::endl;
443 if (it->second->fitness_valid()) {
444 it->second->write_checkpoint(os);
468 utility::io::izstream file;
469 file.open( filename.c_str() );
470 if ( !file )
return false;
471 TR(basic::t_info) <<
"Reading cached entities from file " << filename <<
'\n';
476 while ( entity->read_checkpoint(file) ) {
477 TR(basic::t_debug) << *entity <<
'\n';
482 TR(basic::t_debug) << std::flush;
485 TR(basic::t_info) <<
"Read " << counter <<
" cached fitnesses" << std::endl;
495 utility::io::ozstream file( filename_tmp.c_str() );
497 std::cerr <<
"trouble opening file " << filename <<
" for writing" <<
'\n';
506 if ( std::rename(filename_tmp.c_str(), filename.c_str()) ) {
507 std::cerr <<
"trouble renaming file " << filename_tmp <<
" to " << filename << std::endl;
532 utility::io::ozstream file( filename_tmp.c_str() );
534 std::cerr <<
"trouble opening file " << filename <<
" for writing" << std::endl;
540 if (generation.size()) {
541 file <<
"generation " << i <<
'\n';
542 for (
core::Size j = 1; j <= generation.size(); ++j) {
544 for (
core::Size k = 1; k <= traits.size(); ++k) {
545 if (k != 1) file <<
' ';
546 file << traits[k]->to_string();
556 if ( std::rename(filename_tmp.c_str(), filename.c_str()) ) {
557 std::cerr <<
"trouble renaming file " << filename_tmp <<
" to " << filename << std::endl;
569 utility::io::izstream file( filename.c_str() );
571 std::cerr <<
"trouble opening file " << filename <<
" for reading" << std::endl;
577 while (file.getline(line)) {
578 std::istringstream iss(line);
580 if (!(iss >> word))
return false;
581 if ( word ==
"generation" ) {
582 if (!(iss >> gen_num))
return false;
583 runtime_assert(gen_num > 0);
589 runtime_assert(gen_num > 0);
592 while (iss >> word) {