silly fix for new gp

main
Brett 2024-08-27 20:49:39 -04:00
parent ce18a344c8
commit f3dd52341a
6 changed files with 59 additions and 83 deletions

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.25) cmake_minimum_required(VERSION 3.25)
project(image-gp-6 VERSION 0.0.43) project(image-gp-6 VERSION 0.0.44)
include(FetchContent) include(FetchContent)

View File

@ -35,24 +35,19 @@ inline blt::gp::operation_t f_mul([](float a, float b) {
inline blt::gp::operation_t f_pro_div([](float a, float b) { inline blt::gp::operation_t f_pro_div([](float a, float b) {
return b == 0.0f ? 0.0f : (a / b); return b == 0.0f ? 0.0f : (a / b);
}, "f_div"); }, "f_div");
inline blt::gp::operation_t f_literal([]() { inline auto f_literal = blt::gp::operation_t([]() {
return program.get_random().get_float(0.0, 1.0); return program.get_random().get_float(0.0, 1.0);
}, "float_lit"); }, "float_lit").set_ephemeral();
// used for blur size // used for blur size
inline blt::gp::operation_t i_literal([]() { inline auto i_literal = blt::gp::operation_t([]() {
return program.get_random().get_u64(u64_size_min, u64_size_max); return program.get_random().get_u64(u64_size_min, u64_size_max);
}, "int_lit"); }, "int_lit").set_ephemeral();
template<typename context> template<typename context>
void create_float_operations(blt::gp::operator_builder<context>& builder) void create_float_operations(blt::gp::operator_builder<context>& builder)
{ {
// builder.add_operator(f_add);
// builder.add_operator(f_sub);
// builder.add_operator(f_mul);
// builder.add_operator(f_pro_div);
builder.add_operator(f_literal, true);
builder.add_operator(i_literal, true);
} }
#endif //IMAGE_GP_6_FLOAT_OPERATIONS_H #endif //IMAGE_GP_6_FLOAT_OPERATIONS_H

View File

@ -224,14 +224,14 @@ inline blt::gp::operation_t hsv_to_rgb([](const full_image_t& a) {
return img; return img;
}, "hsv"); }, "hsv");
inline blt::gp::operation_t lit([]() { inline auto lit = blt::gp::operation_t([]() {
full_image_t img{}; full_image_t img{};
auto bw = program.get_random().get_float(0.0f, 1.0f); auto bw = program.get_random().get_float(0.0f, 1.0f);
for (auto& i : img.rgb_data) for (auto& i : img.rgb_data)
i = bw; i = bw;
return img; return img;
}, "lit"); }, "lit").set_ephemeral();
inline blt::gp::operation_t vec([]() { inline auto vec = blt::gp::operation_t([]() {
full_image_t img{}; full_image_t img{};
auto r = program.get_random().get_float(0.0f, 1.0f); auto r = program.get_random().get_float(0.0f, 1.0f);
auto g = program.get_random().get_float(0.0f, 1.0f); auto g = program.get_random().get_float(0.0f, 1.0f);
@ -243,7 +243,7 @@ inline blt::gp::operation_t vec([]() {
img.rgb_data[i * CHANNELS + 2] = b; img.rgb_data[i * CHANNELS + 2] = b;
} }
return img; return img;
}, "vec"); }, "vec").set_ephemeral();
inline blt::gp::operation_t random_val([]() { inline blt::gp::operation_t random_val([]() {
full_image_t img{}; full_image_t img{};
for (auto& i : img.rgb_data) for (auto& i : img.rgb_data)
@ -378,50 +378,9 @@ inline blt::gp::operation_t op_y_rgb([]() {
template<typename context> template<typename context>
void create_image_operations(blt::gp::operator_builder<context>& builder) void create_image_operations(blt::gp::operator_builder<context>& builder)
{ {
builder.add_operator(perlin);
builder.add_operator(perlin_terminal);
builder.add_operator(perlin_warped);
builder.add_operator(add);
builder.add_operator(sub);
builder.add_operator(mul);
builder.add_operator(pro_div);
builder.add_operator(op_sin);
builder.add_operator(op_cos);
builder.add_operator(op_atan);
builder.add_operator(op_exp);
builder.add_operator(op_log);
builder.add_operator(op_abs);
builder.add_operator(op_round);
builder.add_operator(op_v_mod);
builder.add_operator(bitwise_and);
builder.add_operator(bitwise_or);
builder.add_operator(bitwise_invert);
builder.add_operator(bitwise_xor);
builder.add_operator(dissolve);
builder.add_operator(band_pass);
builder.add_operator(hsv_to_rgb);
builder.add_operator(gaussian_blur);
builder.add_operator(median_blur);
builder.add_operator(l_system);
// idk when it got enabled but this works on 4.10 // idk when it got enabled but this works on 4.10
#if CV_VERSION_MAJOR >= 4 && CV_VERSION_MINOR >= 10
builder.add_operator(bilateral_filter);
#endif
builder.add_operator(high_pass);
bool state = false;
builder.add_operator(lit, true);
builder.add_operator(vec, true);
builder.add_operator(random_val);
builder.add_operator(op_x_r, state);
builder.add_operator(op_x_g, state);
builder.add_operator(op_x_b, state);
builder.add_operator(op_x_rgb, state);
builder.add_operator(op_y_r, state);
builder.add_operator(op_y_g, state);
builder.add_operator(op_y_b, state);
builder.add_operator(op_y_rgb, state);
} }
#endif //IMAGE_GP_6_IMAGE_OPERATIONS_H #endif //IMAGE_GP_6_IMAGE_OPERATIONS_H

@ -1 +1 @@
Subproject commit 766befd9495bb3b8ef399947801d6ea96b915779 Subproject commit e5966789be45685ed73d0a152319c8da1793e53f

View File

@ -23,6 +23,13 @@
namespace blt::gp namespace blt::gp
{ {
inline tree_t& get_static_tree_tl(gp_program& program)
{
static thread_local tree_t new_tree{program};
new_tree.clear(program);
return new_tree;
}
template<typename> template<typename>
static blt::u8* get_thread_pointer_for_size(blt::size_t bytes) static blt::u8* get_thread_pointer_for_size(blt::size_t bytes)
{ {
@ -105,8 +112,9 @@ namespace blt::gp
if (index < current_func_info.argument_types.size() && val.id != current_func_info.argument_types[index].id) if (index < current_func_info.argument_types.size() && val.id != current_func_info.argument_types[index].id)
{ {
// TODO: new config? // TODO: new config?
auto tree = config.generator.get().generate( auto& tree = get_static_tree_tl(program);
{program, val.id, config.replacement_min_depth, config.replacement_max_depth}); config.generator.get().generate(tree,
{program, val.id, config.replacement_min_depth, config.replacement_max_depth});
auto& child = children_data[children_data.size() - 1 - index]; auto& child = children_data[children_data.size() - 1 - index];
blt::size_t total_bytes_for = c.total_value_bytes(child.start, child.end); blt::size_t total_bytes_for = c.total_value_bytes(child.start, child.end);
@ -186,9 +194,10 @@ namespace blt::gp
for (blt::ptrdiff_t i = static_cast<blt::ptrdiff_t>(replacement_func_info.argc.argc) - 1; for (blt::ptrdiff_t i = static_cast<blt::ptrdiff_t>(replacement_func_info.argc.argc) - 1;
i >= current_func_info.argc.argc; i--) i >= current_func_info.argc.argc; i--)
{ {
auto tree = config.generator.get().generate( auto& tree = get_static_tree_tl(program);
{program, replacement_func_info.argument_types[i].id, config.replacement_min_depth, config.generator.get().generate(tree,
config.replacement_max_depth}); {program, replacement_func_info.argument_types[i].id, config.replacement_min_depth,
config.replacement_max_depth});
blt::size_t total_bytes_for = tree.total_value_bytes(); blt::size_t total_bytes_for = tree.total_value_bytes();
vals.copy_from(tree.get_values(), total_bytes_for); vals.copy_from(tree.get_values(), total_bytes_for);
ops.insert(ops.begin() + static_cast<blt::ptrdiff_t>(start_index), tree.get_operations().begin(), ops.insert(ops.begin() + static_cast<blt::ptrdiff_t>(start_index), tree.get_operations().begin(),
@ -198,8 +207,8 @@ namespace blt::gp
vals.copy_from(data, total_bytes_after); vals.copy_from(data, total_bytes_after);
} }
// now finally update the type. // now finally update the type.
ops[c_node] = {replacement_func_info.function, program.get_typesystem().get_type(replacement_func_info.return_type).size(), ops[c_node] = {program.get_typesystem().get_type(replacement_func_info.return_type).size(), random_replacement,
random_replacement, program.is_static(random_replacement)}; program.is_static(random_replacement)};
} else } else
{ {
blt::size_t bytes_from_head = c.total_value_bytes(c_node + 1); blt::size_t bytes_from_head = c.total_value_bytes(c_node + 1);
@ -229,9 +238,10 @@ namespace blt::gp
id = program.get_random().select(terminals); id = program.get_random().select(terminals);
} while (!program.is_static(id)); } while (!program.is_static(id));
stack_allocator stack; static thread_local stack_allocator stack;
stack.reset();
program.get_operator_info(id).function(nullptr, stack, stack, nullptr); program.get_operator_info(id).func(nullptr, stack, stack);
//auto adjustment = lit.get_function()(); //auto adjustment = lit.get_function()();
auto& adjustment = stack.from<full_image_t>(0); auto& adjustment = stack.from<full_image_t>(0);
@ -305,9 +315,10 @@ namespace blt::gp
blt::size_t start_index = c_node; blt::size_t start_index = c_node;
for (blt::ptrdiff_t i = new_argc - 1; i > static_cast<blt::ptrdiff_t>(arg_position); i--) for (blt::ptrdiff_t i = new_argc - 1; i > static_cast<blt::ptrdiff_t>(arg_position); i--)
{ {
auto tree = config.generator.get().generate( auto& tree = get_static_tree_tl(program);
{program, replacement_func_info.argument_types[i].id, config.replacement_min_depth, config.generator.get().generate(tree,
config.replacement_max_depth}); {program, replacement_func_info.argument_types[i].id, config.replacement_min_depth,
config.replacement_max_depth});
blt::size_t total_bytes_for = tree.total_value_bytes(); blt::size_t total_bytes_for = tree.total_value_bytes();
vals.copy_from(tree.get_values(), total_bytes_for); vals.copy_from(tree.get_values(), total_bytes_for);
ops.insert(ops.begin() + static_cast<blt::ptrdiff_t>(start_index), tree.get_operations().begin(), ops.insert(ops.begin() + static_cast<blt::ptrdiff_t>(start_index), tree.get_operations().begin(),
@ -318,9 +329,10 @@ namespace blt::gp
vals.copy_from(combined_ptr, for_bytes); vals.copy_from(combined_ptr, for_bytes);
for (blt::ptrdiff_t i = static_cast<blt::ptrdiff_t>(arg_position) - 1; i >= 0; i--) for (blt::ptrdiff_t i = static_cast<blt::ptrdiff_t>(arg_position) - 1; i >= 0; i--)
{ {
auto tree = config.generator.get().generate( auto& tree = get_static_tree_tl(program);
{program, replacement_func_info.argument_types[i].id, config.replacement_min_depth, config.generator.get().generate(tree,
config.replacement_max_depth}); {program, replacement_func_info.argument_types[i].id, config.replacement_min_depth,
config.replacement_max_depth});
blt::size_t total_bytes_for = tree.total_value_bytes(); blt::size_t total_bytes_for = tree.total_value_bytes();
vals.copy_from(tree.get_values(), total_bytes_for); vals.copy_from(tree.get_values(), total_bytes_for);
ops.insert(ops.begin() + static_cast<blt::ptrdiff_t>(start_index), tree.get_operations().begin(), ops.insert(ops.begin() + static_cast<blt::ptrdiff_t>(start_index), tree.get_operations().begin(),
@ -330,7 +342,7 @@ namespace blt::gp
vals.copy_from(combined_ptr + for_bytes, after_bytes); vals.copy_from(combined_ptr + for_bytes, after_bytes);
ops.insert(ops.begin() + static_cast<blt::ptrdiff_t>(c_node), ops.insert(ops.begin() + static_cast<blt::ptrdiff_t>(c_node),
{replacement_func_info.function, program.get_typesystem().get_type(replacement_func_info.return_type).size(), {program.get_typesystem().get_type(replacement_func_info.return_type).size(),
random_replacement, program.is_static(random_replacement)}); random_replacement, program.is_static(random_replacement)});
#if BLT_DEBUG_LEVEL >= 2 #if BLT_DEBUG_LEVEL >= 2
@ -477,7 +489,7 @@ namespace blt::gp
vals.copy_from(from_ptr, from_bytes); vals.copy_from(from_ptr, from_bytes);
vals.copy_from(after_ptr, after_to_bytes); vals.copy_from(after_ptr, after_to_bytes);
static std::vector<op_container_t> op_copy; static thread_local std::vector<op_container_t> op_copy;
op_copy.clear(); op_copy.clear();
op_copy.insert(op_copy.begin(), ops.begin() + from_child.start, ops.begin() + from_child.end); op_copy.insert(op_copy.begin(), ops.begin() + from_child.start, ops.begin() + from_child.end);

View File

@ -259,7 +259,7 @@ constexpr auto create_fitness_function()
cv::cvtColor(src, src_hsv, cv::COLOR_RGB2HSV); cv::cvtColor(src, src_hsv, cv::COLOR_RGB2HSV);
calcHist(&src_hsv, 1, channels, cv::Mat(), src_hist, 2, histSize, ranges, true, false); calcHist(&src_hsv, 1, channels, cv::Mat(), src_hist, 2, histSize, ranges, true, false);
normalize(src_hist, src_hist, 0, 1, cv::NORM_MINMAX, -1, cv::Mat()); normalize(src_hist, src_hist, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());
// auto total_hist = compareHist(hist_base, src_hist, cv::HISTCMP_BHATTACHARYYA); // auto total_hist = compareHist(hist_base, src_hist, cv::HISTCMP_BHATTACHARYYA);
auto total_hist = compareHist(hist_base, src_hist, cv::HISTCMP_CORREL); auto total_hist = compareHist(hist_base, src_hist, cv::HISTCMP_CORREL);
@ -286,9 +286,7 @@ void execute_generation()
program.evaluate_fitness(); program.evaluate_fitness();
BLT_END_INTERVAL("Image Test", "Fitness"); BLT_END_INTERVAL("Image Test", "Fitness");
BLT_START_INTERVAL("Image Test", "Gen"); BLT_START_INTERVAL("Image Test", "Gen");
auto sel = blt::gp::select_tournament_t{}; program.create_next_generation();
// auto sel = blt::gp::select_fitness_proportionate_t{};
program.create_next_generation(sel, sel, sel);
BLT_END_INTERVAL("Image Test", "Gen"); BLT_END_INTERVAL("Image Test", "Gen");
BLT_TRACE("Move to next generation"); BLT_TRACE("Move to next generation");
program.next_generation(); program.next_generation();
@ -321,7 +319,9 @@ void run_gp()
{ {
BLT_DEBUG("Generate Initial Population"); BLT_DEBUG("Generate Initial Population");
static constexpr auto fitness_func = create_fitness_function(); static constexpr auto fitness_func = create_fitness_function();
program.generate_population(type_system.get_type<full_image_t>().id(), fitness_func, true); auto sel = blt::gp::select_tournament_t{};
// auto sel = blt::gp::select_fitness_proportionate_t{};
program.generate_population(type_system.get_type<full_image_t>().id(), fitness_func, sel, sel, sel);
while (!program.should_thread_terminate()) while (!program.should_thread_terminate())
{ {
@ -362,10 +362,20 @@ void init(const blt::gfx::window_data&)
type_system.register_type<blt::u64>(); type_system.register_type<blt::u64>();
blt::gp::operator_builder<context> builder{type_system}; blt::gp::operator_builder<context> builder{type_system};
create_image_operations(builder); #if CV_VERSION_MAJOR >= 4 && CV_VERSION_MINOR >= 10
create_float_operations(builder); program.set_operations(
builder.build(perlin, perlin_terminal, perlin_warped, add, sub, mul, pro_div, op_sin, op_cos, op_atan, op_exp, op_log, op_abs, op_round,
op_v_mod, bitwise_and, bitwise_or, bitwise_invert, bitwise_xor, dissolve, band_pass, hsv_to_rgb, gaussian_blur, median_blur,
l_system, high_pass, bilateral_filter, lit, vec, random_val, op_x_r, op_x_g, op_x_b, op_x_rgb, op_y_r, op_y_g, op_y_b,
op_y_rgb, f_literal, i_literal));
#else
program.set_operations(
builder.build(perlin, perlin_terminal, perlin_warped, add, sub, mul, pro_div, op_sin, op_cos, op_atan, op_exp, op_log, op_abs, op_round,
op_v_mod, bitwise_and, bitwise_or, bitwise_invert, bitwise_xor, dissolve, band_pass, hsv_to_rgb, gaussian_blur, median_blur,
l_system, high_pass, lit, vec, random_val, op_x_r, op_x_g, op_x_b, op_x_rgb, op_y_r, op_y_g, op_y_b, op_y_rgb, f_literal,
i_literal));
#endif
program.set_operations(builder.build());
global_matrices.create_internals(); global_matrices.create_internals();
resources.load_resources(); resources.load_resources();