multi type test, it's possible for infinite recursion.

thread
Brett 2024-06-27 01:35:29 -04:00
parent ea80e28f84
commit 78b37584a9
4 changed files with 37 additions and 11 deletions

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.25) cmake_minimum_required(VERSION 3.25)
project(blt-gp VERSION 0.0.36) project(blt-gp VERSION 0.0.37)
include(CTest) include(CTest)

View File

@ -26,10 +26,19 @@ static constexpr long SEED = 41912;
blt::gp::type_system type_system; blt::gp::type_system type_system;
blt::gp::gp_program program(type_system, std::mt19937_64{SEED}); // NOLINT blt::gp::gp_program program(type_system, std::mt19937_64{SEED}); // NOLINT
blt::gp::operation_t add([](float a, float b) { return a + b; }); blt::gp::operation_t add([](float a, float b) {
blt::gp::operation_t sub([](float a, float b) { return a - b; }); BLT_TRACE("a: %f + b: %f = %f", a, b, a + b);
blt::gp::operation_t mul([](float a, float b) { return a * b; }); return a + b;
blt::gp::operation_t pro_div([](float a, float b) { return b == 0 ? 0.0f : a / b; }); });
blt::gp::operation_t sub([](float a, float b) {
BLT_TRACE("a: %f - b: %f = %f", a, b, a - b);
return a - b; });
blt::gp::operation_t mul([](float a, float b) {
BLT_TRACE("a: %f * b: %f = %f", a, b, a * b);
return a * b; });
blt::gp::operation_t pro_div([](float a, float b) {
BLT_TRACE("a: %f / b: %f = %f", a, b, (b == 0 ? 0.0f : a / b));
return b == 0 ? 0.0f : a / b; });
blt::gp::operation_t lit([]() { blt::gp::operation_t lit([]() {
//static std::uniform_real_distribution<float> dist(-32000, 32000); //static std::uniform_real_distribution<float> dist(-32000, 32000);
static std::uniform_real_distribution<float> dist(0.0f, 10.0f); static std::uniform_real_distribution<float> dist(0.0f, 10.0f);

View File

@ -59,6 +59,17 @@ int main()
silly.add_operator(sub); silly.add_operator(sub);
silly.add_operator(mul); silly.add_operator(mul);
silly.add_operator(pro_div); silly.add_operator(pro_div);
silly.add_operator(op_if);
silly.add_operator(eq_f);
silly.add_operator(eq_b);
silly.add_operator(lt);
silly.add_operator(gt);
silly.add_operator(op_and);
silly.add_operator(op_or);
silly.add_operator(op_xor);
silly.add_operator(op_not);
silly.add_operator(lit, true); silly.add_operator(lit, true);
program.set_operations(std::move(silly)); program.set_operations(std::move(silly));

View File

@ -89,6 +89,9 @@ namespace blt::gp
return create_tree([args](gp_program& program, std::stack<stack>& tree_generator, const type& type, blt::size_t new_depth) { return create_tree([args](gp_program& program, std::stack<stack>& tree_generator, const type& type, blt::size_t new_depth) {
if (new_depth >= args.max_depth) if (new_depth >= args.max_depth)
{ {
if (program.get_type_terminals(type.id()).empty())
tree_generator.push({program.select_non_terminal(type.id()), new_depth});
else
tree_generator.push({program.select_terminal(type.id()), new_depth}); tree_generator.push({program.select_terminal(type.id()), new_depth});
return; return;
} }
@ -104,6 +107,9 @@ namespace blt::gp
return create_tree([args](gp_program& program, std::stack<stack>& tree_generator, const type& type, blt::size_t new_depth) { return create_tree([args](gp_program& program, std::stack<stack>& tree_generator, const type& type, blt::size_t new_depth) {
if (new_depth >= args.max_depth) if (new_depth >= args.max_depth)
{ {
if (program.get_type_terminals(type.id()).empty())
tree_generator.push({program.select_non_terminal(type.id()), new_depth});
else
tree_generator.push({program.select_terminal(type.id()), new_depth}); tree_generator.push({program.select_terminal(type.id()), new_depth});
return; return;
} }