diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a83c93..876201a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.25) -project(blt-gp VERSION 0.1.11) +project(blt-gp VERSION 0.1.12) include(CTest) @@ -105,7 +105,7 @@ if (${BUILD_GP_TESTS}) blt_add_project(blt-stack tests/stack_tests.cpp test) blt_add_project(blt-eval tests/evaluation_tests.cpp test) blt_add_project(blt-order tests/order_tests.cpp test) - blt_add_project(blt-destructor tests/destructor_test.cpp test) + #blt_add_project(blt-destructor tests/destructor_test.cpp test) blt_add_project(blt-gp1 tests/gp_test_1.cpp test) blt_add_project(blt-gp2 tests/gp_test_2.cpp test) blt_add_project(blt-gp3 tests/gp_test_3.cpp test) diff --git a/examples/symbolic_regression.cpp b/examples/symbolic_regression.cpp index 08364fc..f61ce8a 100644 --- a/examples/symbolic_regression.cpp +++ b/examples/symbolic_regression.cpp @@ -39,7 +39,7 @@ blt::gp::prog_config_t config = blt::gp::prog_config_t() .set_mutation_chance(0.1) .set_reproduction_chance(0) .set_max_generations(50) - .set_pop_size(5000) + .set_pop_size(500) .set_thread_count(0); blt::gp::type_provider type_system; diff --git a/include/blt/gp/stack.h b/include/blt/gp/stack.h index 7d4e5df..bb0bffa 100644 --- a/include/blt/gp/stack.h +++ b/include/blt/gp/stack.h @@ -216,8 +216,9 @@ namespace blt::gp BLT_ABORT(("Not enough bytes in stack to transfer " + std::to_string(bytes) + " bytes requested but " + std::to_string(bytes) + " bytes stored!").c_str()); #endif - to.copy_from(*this, aligned_size(bytes)); - pop_bytes(bytes); + auto alg = aligned_size(bytes); + to.copy_from(*this, alg); + pop_bytes(alg); } template @@ -300,7 +301,7 @@ namespace blt::gp auto aligned_ptr = get_aligned_pointer(bytes); if (aligned_ptr == nullptr) { - expand(bytes + MAX_ALIGNMENT); + expand(size_ + bytes); aligned_ptr = get_aligned_pointer(bytes); } if (aligned_ptr == nullptr) diff --git a/lib/blt b/lib/blt index daa9757..78710a1 160000 --- a/lib/blt +++ b/lib/blt @@ -1 +1 @@ -Subproject commit daa9757375c50299ed0866426d11a7d85c3719e6 +Subproject commit 78710a12cca9ecf7f92394ddf66ed5e2c0301484 diff --git a/tests/destructor_test.cpp b/tests/destructor_test.cpp index a340449..bf898aa 100644 --- a/tests/destructor_test.cpp +++ b/tests/destructor_test.cpp @@ -198,15 +198,15 @@ int main() program.set_operations(builder.build()); BLT_DEBUG("Generate Initial Population"); - program.generate_population(type_system.get_type().id(), fitness_function); + auto sel = blt::gp::select_fitness_proportionate_t{}; + program.generate_population(type_system.get_type().id(), fitness_function, sel, sel, sel); BLT_DEBUG("Begin Generation Loop"); while (!program.should_terminate()) { BLT_TRACE("------------{Begin Generation %ld}------------", program.get_current_generation()); BLT_START_INTERVAL("Symbolic Regression", "Gen"); - auto sel = blt::gp::select_fitness_proportionate_t{}; - program.create_next_generation(sel, sel, sel); + program.create_next_generation(); BLT_END_INTERVAL("Symbolic Regression", "Gen"); BLT_TRACE("Move to next generation"); BLT_START_INTERVAL("Symbolic Regression", "Fitness"); diff --git a/tests/evaluation_tests.cpp b/tests/evaluation_tests.cpp index 598710f..25b8feb 100644 --- a/tests/evaluation_tests.cpp +++ b/tests/evaluation_tests.cpp @@ -37,7 +37,7 @@ struct large_2048 // not actually 4096 but will fill the whole page (4096) struct large_4096 { - blt::u8 data[blt::gp::stack_allocator::page_size_no_block()]; + blt::u8 data[4096]; }; struct large_6123 diff --git a/tests/gp_test_7.cpp b/tests/gp_test_7.cpp index b228182..4a71b89 100644 --- a/tests/gp_test_7.cpp +++ b/tests/gp_test_7.cpp @@ -58,11 +58,11 @@ void print_best() auto& v = program.get_current_pop().get_individuals()[i]; auto& tree = v.tree; auto size = tree.get_values().size(); - BLT_TRACE("%lf [index %ld] (fitness: %lf, raw: %lf) (depth: %ld) (blocks: %ld) (size: t: %ld m: %ld u: %ld r: %ld) filled: %f%%", + BLT_TRACE("%lf [index %ld] (fitness: %lf, raw: %lf) (depth: %ld) (size: t: %ld u: %ld r: %ld) filled: %f%%", tree.get_evaluation_value(nullptr), i, v.fitness.adjusted_fitness, v.fitness.raw_fitness, - tree.get_depth(program), size.blocks, size.total_size_bytes, size.total_no_meta_bytes, size.total_used_bytes, + tree.get_depth(program), size.total_size_bytes, size.total_used_bytes, size.total_remaining_bytes, - static_cast(size.total_used_bytes) / static_cast(size.total_no_meta_bytes)); + static_cast(size.total_used_bytes) / (size.total_size_bytes == 0 ? 1 : static_cast(size.total_size_bytes))); } //std::string small("--------------------------"); //for (blt::size_t i = 0; i < std::to_string(program.get_current_generation()).size(); i++) @@ -109,12 +109,13 @@ int main() program.set_operations(builder.build()); - program.generate_population(type_system.get_type().id(), fitness_function); + auto sel = blt::gp::select_tournament_t{}; + program.generate_population(type_system.get_type().id(), fitness_function, sel, sel, sel); while (!program.should_terminate()) { print_best(); - program.create_next_generation(blt::gp::select_tournament_t{}, blt::gp::select_tournament_t{}, blt::gp::select_tournament_t{}); + program.create_next_generation(); program.next_generation(); program.evaluate_fitness(); } diff --git a/tests/order_tests.cpp b/tests/order_tests.cpp index 131f675..1eb05c6 100644 --- a/tests/order_tests.cpp +++ b/tests/order_tests.cpp @@ -47,7 +47,7 @@ struct large_2048 // not actually 4096 but will fill the whole page (4096) struct large_4096 { - blt::u8 data[blt::gp::stack_allocator::page_size_no_block()]; + blt::u8 data[4096]; }; struct large_6123 diff --git a/tests/stack_tests.cpp b/tests/stack_tests.cpp index b50ab24..bb66af6 100644 --- a/tests/stack_tests.cpp +++ b/tests/stack_tests.cpp @@ -100,7 +100,8 @@ struct large_2048 // not actually 4096 but will fill the whole page (4096) struct large_4096 { - blt::u8 data[blt::gp::stack_allocator::page_size_no_block()]; + // TODO: this test is now obsolete + blt::u8 data[4096]; }; struct large_6123 @@ -311,16 +312,16 @@ void test_basic() BLT_INFO("Testing basic with stack over boundary"); { blt::gp::stack_allocator stack; - stack.push(std::array{}); + stack.push(std::array{}); stack.push(50.0f); stack.push(10.0f); auto size = stack.size(); BLT_TRACE_STREAM << size << "\n"; - BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); + //BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); basic_2.make_callable()(nullptr, stack, stack, nullptr); BLT_TRACE_STREAM << stack.size() << "\n"; auto val = stack.pop(); - stack.pop>(); + stack.pop>(); RUN_TEST(val != 60.000000f, stack, "Basic 2 Boundary Test Passed", "Basic 2 Test Failed. Unexpected value produced '%lf'", val); BLT_TRACE_STREAM << stack.size() << "\n"; BLT_ASSERT(stack.empty() && "Stack was not empty after basic evaluation over stack boundary"); @@ -348,18 +349,18 @@ void test_mixed() BLT_INFO("Testing mixed with stack over boundary"); { blt::gp::stack_allocator stack; - stack.push(std::array{}); + stack.push(std::array{}); stack.push(50.0f); stack.push(10.0f); stack.push(true); stack.push(false); auto size = stack.size(); BLT_TRACE_STREAM << size << "\n"; - BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); +// BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); basic_mixed_4.make_callable()(nullptr, stack, stack, nullptr); BLT_TRACE_STREAM << stack.size() << "\n"; auto val = stack.pop(); - stack.pop>(); + stack.pop>(); RUN_TEST(val != 50.000000f, stack, "Mixed 4 Boundary Test Passed", "Mixed 4 Test Failed. Unexpected value produced '%lf'", val); BLT_TRACE_STREAM << stack.size() << "\n"; BLT_ASSERT(stack.empty() && "Stack was not empty after evaluation over stack boundary"); @@ -386,17 +387,17 @@ void test_large_256() BLT_INFO("Testing large 256 with stack over boundary"); { blt::gp::stack_allocator stack; - stack.push(std::array{}); + stack.push(std::array{}); stack.push(base_256); stack.push(691.0f); stack.push(69.420f); auto size = stack.size(); BLT_TRACE_STREAM << size << "\n"; - BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); +// BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); large_256_basic_3.make_callable()(nullptr, stack, stack, nullptr); BLT_TRACE_STREAM << stack.size() << "\n"; auto val = stack.pop(); - stack.pop>(); + stack.pop>(); RUN_TEST(!compare(val, base_256), stack, "Large 256 3 Boundary Test Passed", "Large 256 3 Test Failed. Unexpected value produced '%lf'", val); BLT_TRACE_STREAM << stack.size() << "\n"; BLT_ASSERT(stack.empty() && "Stack was not empty after evaluation over stack boundary"); @@ -427,7 +428,7 @@ void test_large_4096() stack.push(true); auto size = stack.size(); BLT_TRACE_STREAM << size << "\n"; - BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); +// BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); large_4096_basic_3b.make_callable()(nullptr, stack, stack, nullptr); BLT_TRACE_STREAM << stack.size() << "\n"; auto val = stack.pop(); @@ -456,17 +457,17 @@ void test_large_18290() BLT_INFO("Testing large 18290 with stack over boundary"); { blt::gp::stack_allocator stack; - stack.push(std::array()); + stack.push(std::array()); stack.push(base_18290); stack.push(-2543.0f); stack.push(true); auto size = stack.size(); BLT_TRACE_STREAM << size << "\n"; - BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); +// BLT_ASSERT(size.blocks > 1 && "Stack doesn't have more than one block!"); large_18290_basic_3b.make_callable()(nullptr, stack, stack, nullptr); BLT_TRACE_STREAM << stack.size() << "\n"; auto val = stack.pop(); - stack.pop>(); + stack.pop>(); RUN_TEST(!compare(val, base_18290), stack, "Large 18290 3 Boundary Test Passed", "Large 4096 3 Test Failed. Unexpected value produced '%lf'", val); BLT_TRACE_STREAM << stack.size() << "\n"; BLT_ASSERT(stack.empty() && "Stack was not empty after evaluation over stack boundary");