diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ffb533..658f768 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ macro(compile_options target_name) sanitizers(${target_name}) endmacro() -project(blt-gp VERSION 0.5.22) +project(blt-gp VERSION 0.5.23) include(CTest) diff --git a/include/blt/gp/transformers.h b/include/blt/gp/transformers.h index 2eeae6e..f18d696 100644 --- a/include/blt/gp/transformers.h +++ b/include/blt/gp/transformers.h @@ -157,6 +157,7 @@ namespace blt::gp class one_point_crossover_t : public crossover_t { + public: one_point_crossover_t(): crossover_t(config_t{}) { } diff --git a/src/program.cpp b/src/program.cpp index ad946b5..747e792 100644 --- a/src/program.cpp +++ b/src/program.cpp @@ -31,7 +31,8 @@ namespace blt::gp // this is largely to not break the tests :3 // it's also to allow for quick setup of a gp program if you don't care how crossover or mutation is handled static advanced_mutation_t s_mutator; - static subtree_crossover_t s_crossover; + // static subtree_crossover_t s_crossover; + static one_point_crossover_t s_crossover; static ramped_half_initializer_t s_init; prog_config_t::prog_config_t(): mutator(s_mutator), crossover(s_crossover), pop_initializer(s_init) diff --git a/src/transformers.cpp b/src/transformers.cpp index 92ad01e..495dbb7 100644 --- a/src/transformers.cpp +++ b/src/transformers.cpp @@ -123,8 +123,8 @@ namespace blt::gp bool one_point_crossover_t::apply(gp_program& program, const tree_t& p1, const tree_t& p2, tree_t& c1, tree_t& c2) { - if (p1.size() < config.min_tree_size || p2.size() < config.min_tree_size) - return false; + // if (p1.size() < config.min_tree_size || p2.size() < config.min_tree_size) + // return false; tree_t::subtree_point_t point1, point2; // NOLINT if (config.traverse) @@ -173,6 +173,8 @@ namespace blt::gp std::vector p1_reorder_types; std::vector p2_reorder_types; std::vector swap_types; + std::vector p1_to_p2_transfer_types; + std::vector p2_to_p1_transfer_types; std::optional get_p1_index(const type_id& id) { @@ -216,6 +218,8 @@ namespace blt::gp p1_reorder_types.clear(); p2_reorder_types.clear(); swap_types.clear(); + p1_to_p2_transfer_types.clear(); + p2_to_p1_transfer_types.clear(); for (auto& [id, v] : missing_p1_types) v.clear(); for (auto& [id, v] : missing_p2_types) @@ -296,14 +300,16 @@ namespace blt::gp c2.swap_subtrees(resolver.children_data_p2[index1], c2, resolver.children_data_p2[index2]); for (const auto& [p1_index, p2_index] : resolver.swap_types) - { + c1.swap_subtrees(resolver.children_data_p1[p1_index], c2, resolver.children_data_p2[p2_index]); - } + c1.modify_operator(point1.pos, p2_operator.id(), p2_info.return_type); + c2.modify_operator(point2.pos, p1_operator.id(), p1_info.return_type); #if BLT_DEBUG_LEVEL >= 2 if (!c1.check(detail::debug::context_ptr) || !c2.check(detail::debug::context_ptr)) throw std::runtime_error("Tree check failed"); #endif + return true; } bool advanced_crossover_t::apply(gp_program& program, const tree_t& p1, const tree_t& p2, tree_t& c1, tree_t& c2)