refactor to use args struct
parent
86c2a8f59a
commit
59c558d479
|
@ -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)
|
||||||
|
|
|
@ -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&;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue