diff --git a/examples/symbolic_regression.cpp b/examples/symbolic_regression.cpp index 69eac6d..44ce977 100644 --- a/examples/symbolic_regression.cpp +++ b/examples/symbolic_regression.cpp @@ -142,25 +142,24 @@ int main() #ifdef BLT_TRACK_ALLOCATIONS BLT_TRACE("Total Allocations: %ld times with a total of %s", blt::gp::tracker.getAllocations(), blt::byte_convert_t(blt::gp::tracker.getAllocatedBytes()).convert_to_nearest_type().to_pretty_string().c_str()); - auto crossover_calls = blt::gp::crossover_calls.get_calls(); - auto crossover_allocations = blt::gp::crossover_allocations.get_calls(); - auto mutation_calls = blt::gp::mutation_calls.get_calls(); - auto mutation_allocation = blt::gp::mutation_allocations.get_calls(); - auto reproduction_calls = blt::gp::reproduction_calls.get_calls(); - auto reproduction_allocation = blt::gp::reproduction_allocations.get_calls(); - BLT_TRACE("Total Crossover Calls: %ld", crossover_calls); - BLT_TRACE("Total Mutation Calls: %ld", mutation_calls); - BLT_TRACE("Total Reproduction Calls: %ld", reproduction_calls); - BLT_TRACE("Total Crossover Allocations: %ld", crossover_allocations); - BLT_TRACE("Total Mutation Allocations: %ld", mutation_allocation); - BLT_TRACE("Total Reproduction Allocations: %ld", reproduction_allocation); - + auto crossover_calls_v = blt::gp::crossover_calls.get_calls(); + auto crossover_allocations_v = blt::gp::crossover_allocations.get_calls(); + auto mutation_calls_v = blt::gp::mutation_calls.get_calls(); + auto mutation_allocations_v = blt::gp::mutation_allocations.get_calls(); + auto reproduction_calls_v = blt::gp::reproduction_calls.get_calls(); + auto reproduction_allocations_v = blt::gp::reproduction_allocations.get_calls(); + BLT_TRACE("Total Crossover Calls: %ld Bytes %s", crossover_calls_v, blt::byte_convert_t(blt::gp::crossover_calls.get_value()).convert_to_nearest_type().to_pretty_string().c_str()); + BLT_TRACE("Total Mutation Calls: %ld Bytes %s", mutation_calls_v, blt::byte_convert_t(blt::gp::mutation_calls.get_value()).convert_to_nearest_type().to_pretty_string().c_str()); + BLT_TRACE("Total Reproduction Calls: %ld Bytes %s", reproduction_calls_v, blt::byte_convert_t(blt::gp::reproduction_calls.get_value()).convert_to_nearest_type().to_pretty_string().c_str()); + BLT_TRACE("Total Crossover Allocations: %ld Bytes %s", crossover_allocations_v, blt::byte_convert_t(blt::gp::crossover_allocations.get_value()).convert_to_nearest_type().to_pretty_string().c_str()); + BLT_TRACE("Total Mutation Allocations: %ld Bytes %s", mutation_allocations_v, blt::byte_convert_t(blt::gp::mutation_allocations.get_value()).convert_to_nearest_type().to_pretty_string().c_str()); + BLT_TRACE("Total Reproduction Allocations: %ld Bytes %s", reproduction_allocations_v, blt::byte_convert_t(blt::gp::reproduction_allocations.get_value()).convert_to_nearest_type().to_pretty_string().c_str()); BLT_TRACE("Percent Crossover calls allocate? %lf%%", - static_cast(crossover_allocations) / static_cast(crossover_calls == 0 ? 1 : crossover_calls) * 100); + static_cast(crossover_allocations_v) / static_cast(crossover_calls_v == 0 ? 1 : crossover_calls_v) * 100); BLT_TRACE("Percent Mutation calls allocate? %lf%%", - static_cast(mutation_allocation) / static_cast(mutation_calls == 0 ? 1 : mutation_calls) * 100); + static_cast(mutation_allocations_v) / static_cast(mutation_calls_v == 0 ? 1 : mutation_calls_v) * 100); BLT_TRACE("Percent Reproduction calls allocate? %lf%%", - static_cast(reproduction_allocation) / static_cast(reproduction_calls == 0 ? 1 : reproduction_calls) * 100); + static_cast(reproduction_allocations_v) / static_cast(reproduction_calls_v == 0 ? 1 : reproduction_calls_v) * 100); #endif return 0; diff --git a/include/blt/gp/program.h b/include/blt/gp/program.h index d682ee5..8c3c1e3 100644 --- a/include/blt/gp/program.h +++ b/include/blt/gp/program.h @@ -362,10 +362,6 @@ namespace blt::gp #ifdef BLT_TRACK_ALLOCATIONS auto gen_alloc = blt::gp::tracker.start_measurement(); #endif - BLT_ASSERT_MSG(current_pop.get_individuals().size() == config.population_size, - ("cur pop size: " + std::to_string(current_pop.get_individuals().size())).c_str()); - BLT_ASSERT_MSG(next_pop.get_individuals().size() == config.population_size, - ("next pop size: " + std::to_string(next_pop.get_individuals().size())).c_str()); // should already be empty thread_helper.next_gen_left.store(config.population_size, std::memory_order_release); (*thread_execution_service)(0); @@ -378,10 +374,6 @@ namespace blt::gp void next_generation() { - BLT_ASSERT_MSG(current_pop.get_individuals().size() == config.population_size, - ("cur pop size: " + std::to_string(current_pop.get_individuals().size())).c_str()); - BLT_ASSERT_MSG(next_pop.get_individuals().size() == config.population_size, - ("next pop size: " + std::to_string(next_pop.get_individuals().size())).c_str()); std::swap(current_pop, next_pop); current_generation++; } @@ -406,6 +398,10 @@ namespace blt::gp current_pop = config.pop_initializer.get().generate( {*this, root_type, config.population_size, config.initial_min_tree_size, config.initial_max_tree_size}); next_pop = population_t(current_pop); + BLT_ASSERT_MSG(current_pop.get_individuals().size() == config.population_size, + ("cur pop size: " + std::to_string(current_pop.get_individuals().size())).c_str()); + BLT_ASSERT_MSG(next_pop.get_individuals().size() == config.population_size, + ("next pop size: " + std::to_string(next_pop.get_individuals().size())).c_str()); if (eval_fitness_now) evaluate_fitness_internal(); } @@ -434,6 +430,10 @@ namespace blt::gp current_pop = config.pop_initializer.get().generate( {*this, root_type, config.population_size, config.initial_min_tree_size, config.initial_max_tree_size}); next_pop = population_t(current_pop); + BLT_ASSERT_MSG(current_pop.get_individuals().size() == config.population_size, + ("cur pop size: " + std::to_string(current_pop.get_individuals().size())).c_str()); + BLT_ASSERT_MSG(next_pop.get_individuals().size() == config.population_size, + ("next pop size: " + std::to_string(next_pop.get_individuals().size())).c_str()); if (config.threads == 1) { BLT_INFO("Starting with single thread variant!"); @@ -593,7 +593,7 @@ namespace blt::gp auto index = config.elites + begin; tree_t& c1 = next_pop.get_individuals()[index].tree; tree_t* c2 = nullptr; - if (index + 1 < end) + if (begin + 1 < end) c2 = &next_pop.get_individuals()[index + 1].tree; begin += func(args, crossover_selection, mutation_selection, reproduction_selection, c1, c2); } diff --git a/include/blt/gp/selection.h b/include/blt/gp/selection.h index bf1cc71..958a676 100644 --- a/include/blt/gp/selection.h +++ b/include/blt/gp/selection.h @@ -101,7 +101,7 @@ namespace blt::gp } while (!config.crossover.get().apply(program, *p1, *p2, c1, *c2)); #ifdef BLT_TRACK_ALLOCATIONS tracker.stop_measurement(state); - crossover_calls.call(); + crossover_calls.call(state.getAllocatedByteDifference()); if (state.getAllocationDifference() != 0) crossover_allocations.call(state.getAllocatedByteDifference()); #endif @@ -122,7 +122,7 @@ namespace blt::gp } while (!config.mutator.get().apply(program, *p, c1)); #ifdef BLT_TRACK_ALLOCATIONS tracker.stop_measurement(state); - mutation_calls.call(); + mutation_calls.call(state.getAllocatedByteDifference()); if (state.getAllocationDifference() != 0) { mutation_allocations.call(state.getAllocatedByteDifference()); @@ -141,7 +141,7 @@ namespace blt::gp c1 = reproduction_selection.select(program, current_pop); #ifdef BLT_TRACK_ALLOCATIONS tracker.stop_measurement(state); - reproduction_calls.call(); + reproduction_calls.call(state.getAllocatedByteDifference()); if (state.getAllocationDifference() != 0) { reproduction_allocations.call(state.getAllocatedByteDifference()); diff --git a/lib/blt b/lib/blt index 79e080c..ab482f1 160000 --- a/lib/blt +++ b/lib/blt @@ -1 +1 @@ -Subproject commit 79e080cfd34fb47342f67f19b95ffa27efb0f715 +Subproject commit ab482f1a1c5782bd3501428f26c02f0bb4729946