refactor to use args struct

main
Brett 2024-03-22 18:56:29 -04:00
parent 86c2a8f59a
commit 59c558d479
3 changed files with 97 additions and 49 deletions

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.25) cmake_minimum_required(VERSION 3.25)
project(lilfbtf5 VERSION 0.1.36) project(lilfbtf5 VERSION 0.1.37)
option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF) option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF)
option(ENABLE_UBSAN "Enable the ub sanitizer" OFF) option(ENABLE_UBSAN "Enable the ub sanitizer" OFF)

View File

@ -20,23 +20,13 @@
#define LILFBTF5_FWDDECL_H #define LILFBTF5_FWDDECL_H
#include <blt/std/types.h> #include <blt/std/types.h>
#include <blt/std/any.h>
#include <functional> #include <functional>
#include "blt/std/ranges.h" #include "blt/std/ranges.h"
#include <string> #include <string>
namespace fb namespace fb
{ {
namespace detail
{
class node_t;
struct fitness_results
{
double fitness;
blt::size_t hits;
};
}
class func_t; class func_t;
class tree_t; class tree_t;
@ -47,11 +37,32 @@ namespace fb
class gp_population_t; class gp_population_t;
namespace detail
{
class node_t;
struct fitness_results
{
double fitness;
blt::size_t hits;
};
struct func_t_arguments
{
// reference to ourselves
func_t& self;
// list of arguments to use
blt::span<detail::node_t*> arguments;
// any extra information that the tree evaluator wants to provide to us, in the case of an image GP this is going to be the X and Y coords
blt::unsafe::buffer_any_t extra_args;
};
}
// no way we are going to have more than 4billion types or functions. // no way we are going to have more than 4billion types or functions.
using type_id = blt::u32; using type_id = blt::u32;
using function_id = blt::u32; using function_id = blt::u32;
using arg_c_t = blt::size_t; using arg_c_t = blt::size_t;
using func_t_call_t = std::function<void(func_t&, blt::span<detail::node_t*>)>; using func_t_call_t = std::function<void(const detail::func_t_arguments&)>;
using func_t_init_t = std::function<void(func_t&)>; using func_t_init_t = std::function<void(func_t&)>;
using fitness_eval_func_t = std::function<detail::fitness_results(detail::node_t*)>; using fitness_eval_func_t = std::function<detail::fitness_results(detail::node_t*)>;
using function_name = const std::string&; using function_name = const std::string&;

View File

@ -18,61 +18,98 @@ struct data
char c; char c;
}; };
const fb::func_t_call_t add_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { struct pixel
us.setValue(args[0]->value().any_cast<blt::u8>() + args[1]->value().any_cast<blt::u8>()); {
blt::size_t x, y;
}; };
const fb::func_t_call_t sub_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) {
us.setValue(args[0]->value().any_cast<blt::u8>() - args[1]->value().any_cast<blt::u8>()); const blt::size_t image_width = 128, image_height = 128;
struct pixelator_t
{
private:
blt::size_t width, height;
blt::size_t x = 0, y = 0;
public:
pixelator_t(blt::size_t width, blt::size_t height): width(width), height(height)
{}
pixel next()
{
if (x > width)
{
x = 0;
y++;
}
return {x++, y};
}
[[nodiscard]] inline blt::size_t curX() const
{
return x;
}
[[nodiscard]] inline blt::size_t curY() const
{
return y;
}
} pixelator{image_width, image_height};
const fb::func_t_call_t add_f = [](const fb::detail::func_t_arguments& args) {
args.self.setValue(args.arguments[0]->value().any_cast<blt::u8>() + args.arguments[1]->value().any_cast<blt::u8>());
}; };
const fb::func_t_call_t mul_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t sub_f = [](const fb::detail::func_t_arguments& args) {
us.setValue(args[0]->value().any_cast<blt::u8>() * args[1]->value().any_cast<blt::u8>()); args.self.setValue(args.arguments[0]->value().any_cast<blt::u8>() - args.arguments[1]->value().any_cast<blt::u8>());
}; };
const fb::func_t_call_t div_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t mul_f = [](const fb::detail::func_t_arguments& args) {
auto dim = args[1]->value().any_cast<blt::u8>(); args.self.setValue(args.arguments[0]->value().any_cast<blt::u8>() * args.arguments[1]->value().any_cast<blt::u8>());
};
const fb::func_t_call_t div_f = [](const fb::detail::func_t_arguments& args) {
auto dim = args.arguments[1]->value().any_cast<blt::u8>();
if (dim == 0) if (dim == 0)
us.setValue(0); args.self.setValue(0);
else else
us.setValue(args[0]->value().any_cast<blt::u8>() + dim); args.self.setValue(args.arguments[0]->value().any_cast<blt::u8>() + dim);
}; };
const fb::func_t_call_t empty_f = [](fb::func_t&, blt::span<fb::detail::node_t*>) {}; const fb::func_t_call_t empty_f = [](const fb::detail::func_t_arguments&) {};
const fb::func_t_init_t value_init_f = [](fb::func_t& us){ const fb::func_t_init_t value_init_f = [](fb::func_t& self) {
us.setValue(fb::random_value()); self.setValue(fb::random_value());
}; };
const fb::func_t_init_t bool_init_f = [](fb::func_t& us){ const fb::func_t_init_t bool_init_f = [](fb::func_t& self) {
us.setValue(fb::choice()); self.setValue(fb::choice());
}; };
const fb::func_t_call_t if_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t if_f = [](const fb::detail::func_t_arguments& args) {
if (args[0]->value().any_cast<bool>()) if (args.arguments[0]->value().any_cast<bool>())
us.setValue(args[1]->value().any_cast<blt::u8>()); args.self.setValue(args.arguments[1]->value().any_cast<blt::u8>());
else else
us.setValue(args[2]->value().any_cast<blt::u8>()); args.self.setValue(args.arguments[2]->value().any_cast<blt::u8>());
}; };
const fb::func_t_call_t equals_b_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t equals_b_f = [](const fb::detail::func_t_arguments& args) {
us.setValue(args[0]->value().any_cast<bool>() == args[1]->value().any_cast<bool>()); args.self.setValue(args.arguments[0]->value().any_cast<bool>() == args.arguments[1]->value().any_cast<bool>());
}; };
const fb::func_t_call_t equals_n_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t equals_n_f = [](const fb::detail::func_t_arguments& args) {
us.setValue(args[0]->value().any_cast<blt::u8>() == args[1]->value().any_cast<blt::u8>()); args.self.setValue(args.arguments[0]->value().any_cast<blt::u8>() == args.arguments[1]->value().any_cast<blt::u8>());
}; };
const fb::func_t_call_t less_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t less_f = [](const fb::detail::func_t_arguments& args) {
us.setValue(args[0]->value().any_cast<blt::u8>() < args[1]->value().any_cast<blt::u8>()); args.self.setValue(args.arguments[0]->value().any_cast<blt::u8>() < args.arguments[1]->value().any_cast<blt::u8>());
}; };
const fb::func_t_call_t greater_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t greater_f = [](const fb::detail::func_t_arguments& args) {
us.setValue(args[0]->value().any_cast<blt::u8>() > args[1]->value().any_cast<blt::u8>()); args.self.setValue(args.arguments[0]->value().any_cast<blt::u8>() > args.arguments[1]->value().any_cast<blt::u8>());
}; };
const fb::func_t_call_t not_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { us.setValue(!args[0]->value().any_cast<bool>()); }; const fb::func_t_call_t not_f = [](const fb::detail::func_t_arguments& args) { args.self.setValue(!args.arguments[0]->value().any_cast<bool>()); };
const fb::func_t_call_t and_b_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t and_b_f = [](const fb::detail::func_t_arguments& args) {
us.setValue(args[0]->value().any_cast<bool>() && args[1]->value().any_cast<bool>()); args.self.setValue(args.arguments[0]->value().any_cast<bool>() && args.arguments[1]->value().any_cast<bool>());
}; };
const fb::func_t_call_t or_b_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t or_b_f = [](const fb::detail::func_t_arguments& args) {
us.setValue(args[0]->value().any_cast<bool>() || args[1]->value().any_cast<bool>()); args.self.setValue(args.arguments[0]->value().any_cast<bool>() || args.arguments[1]->value().any_cast<bool>());
}; };
const fb::func_t_call_t and_n_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t and_n_f = [](const fb::detail::func_t_arguments& args) {
us.setValue(args[0]->value().any_cast<blt::u8>() & args[1]->value().any_cast<blt::u8>()); args.self.setValue(args.arguments[0]->value().any_cast<blt::u8>() & args.arguments[1]->value().any_cast<blt::u8>());
}; };
const fb::func_t_call_t or_n_f = [](fb::func_t& us, blt::span<fb::detail::node_t*> args) { const fb::func_t_call_t or_n_f = [](const fb::detail::func_t_arguments& args) {
us.setValue(args[0]->value().any_cast<blt::u8>() | args[1]->value().any_cast<blt::u8>()); args.self.setValue(args.arguments[0]->value().any_cast<blt::u8>() | args.arguments[1]->value().any_cast<blt::u8>());
}; };
int main(int argc, const char** argv) int main(int argc, const char** argv)