non-fix, this code is wack lol
parent
a74eea9a9b
commit
ec4d29ab79
|
@ -38,8 +38,8 @@ add_executable(gp_image_test ${PROJECT_BUILD_FILES})
|
|||
|
||||
add_dependencies(gp_image_test stats_lib_bindings_rust)
|
||||
|
||||
target_compile_options(gp_image_test PRIVATE -Wall -Wextra -Werror -Wpedantic -Wno-comment -Wno-unused-parameter)
|
||||
target_link_options(gp_image_test PRIVATE -Wall -Wextra -Werror -Wpedantic -Wno-comment -Wno-unused-parameter)
|
||||
target_compile_options(gp_image_test PRIVATE -Wall -Wextra -Wpedantic -Wno-comment -Wno-unused-parameter)
|
||||
target_link_options(gp_image_test PRIVATE -Wall -Wextra -Wpedantic -Wno-comment -Wno-unused-parameter)
|
||||
|
||||
target_link_libraries(gp_image_test BLT_WITH_GRAPHICS)
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ template<typename T>
|
|||
using allowed_funcs = std::vector<T>;
|
||||
|
||||
template<typename T>
|
||||
using allowed_funcs_set = HASHSET<T>;
|
||||
using allowed_funcs_set = blt::hashset_t<T>;
|
||||
|
||||
template<typename T>
|
||||
using func_list = std::vector<allowed_funcs<T>>;
|
||||
|
@ -266,6 +266,8 @@ float eval_DNF_SW_1(const image& img);
|
|||
|
||||
float eval_BAM(const image& img, const image& compare, float allowed_diff);
|
||||
|
||||
float eval_DST(const image& img, const image& compare);
|
||||
|
||||
//template<typename F>
|
||||
//bool isNan(F f)
|
||||
//{
|
||||
|
|
|
@ -56,6 +56,9 @@ struct node
|
|||
|
||||
void reset_children()
|
||||
{
|
||||
for (size_t i = 0; i < argc; i++)
|
||||
BLT_INFO("Child node %p with img %p", sub_nodes[i], &sub_nodes[i]->img.value().getData());
|
||||
blt::logging::flush();
|
||||
for (size_t i = 0; i < argc; i++)
|
||||
sub_nodes[i]->img.reset();
|
||||
}
|
||||
|
|
|
@ -30,24 +30,30 @@
|
|||
#include <config.h>
|
||||
|
||||
using image_data_t = std::array<blt::vec3, width * height>;
|
||||
inline blt::bump_allocator<image_data_t> img_allocator(8192);
|
||||
inline blt::bump_allocator<> img_allocator(8192);
|
||||
|
||||
class image
|
||||
{
|
||||
private:
|
||||
mutable std::variant<image_data_t*, blt::vec3, float> data;
|
||||
mutable std::variant<image_data_t*, blt::vec3, float> data = nullptr;
|
||||
public:
|
||||
image()
|
||||
{
|
||||
data = img_allocator.allocate(1);
|
||||
data = img_allocator.allocate<image_data_t>();
|
||||
img_allocator.construct(std::get<image_data_t*>(data));
|
||||
}
|
||||
|
||||
explicit image(const blt::vec3& v): data(v)
|
||||
{}
|
||||
|
||||
explicit image(float f): data(f)
|
||||
{}
|
||||
|
||||
image(const image& copy)
|
||||
{
|
||||
std::visit(blt::lambda_visitor{
|
||||
[&](const image_data_t* d) {
|
||||
data = img_allocator.allocate(1);
|
||||
data = img_allocator.allocate<image_data_t>();
|
||||
img_allocator.construct(std::get<image_data_t*>(data));
|
||||
|
||||
for (size_t i = 0; i < d->size(); i++)
|
||||
|
@ -64,7 +70,18 @@ class image
|
|||
|
||||
image(image&& move) noexcept
|
||||
{
|
||||
data = std::move(move.data);
|
||||
std::visit(blt::lambda_visitor{
|
||||
[&](image_data_t* d) {
|
||||
this->data = d;
|
||||
},
|
||||
[&](const blt::vec3& v) {
|
||||
this->data = v;
|
||||
},
|
||||
[&](float f) {
|
||||
this->data = f;
|
||||
}
|
||||
}, move.data);
|
||||
|
||||
move.data = nullptr;
|
||||
}
|
||||
|
||||
|
@ -72,11 +89,14 @@ class image
|
|||
{
|
||||
if (© == this)
|
||||
return *this;
|
||||
if (std::holds_alternative<image_data_t*>(data))
|
||||
{
|
||||
BLT_INFO("Copy deallocate");
|
||||
img_allocator.deallocate(std::get<image_data_t*>(data), 1);
|
||||
}
|
||||
std::visit(blt::lambda_visitor{
|
||||
[&](const image_data_t* d) {
|
||||
if (std::holds_alternative<image_data_t*>(data))
|
||||
img_allocator.deallocate(std::get<image_data_t*>(data), 1);
|
||||
data = img_allocator.allocate(1);
|
||||
data = img_allocator.allocate<image_data_t>();
|
||||
img_allocator.construct(std::get<image_data_t*>(data));
|
||||
|
||||
for (size_t i = 0; i < d->size(); i++)
|
||||
|
@ -98,12 +118,6 @@ class image
|
|||
return *this;
|
||||
}
|
||||
|
||||
image(const blt::vec3& v): data(v)
|
||||
{}
|
||||
|
||||
image(float f): data(f)
|
||||
{}
|
||||
|
||||
image_data_t& getData()
|
||||
{
|
||||
if (std::holds_alternative<image_data_t*>(data))
|
||||
|
@ -123,7 +137,7 @@ class image
|
|||
}
|
||||
}, data);
|
||||
|
||||
data = img_allocator.allocate(1);
|
||||
data = img_allocator.allocate<image_data_t>();
|
||||
img_allocator.construct(std::get<image_data_t*>(data));
|
||||
|
||||
for (auto& v : *std::get<image_data_t*>(data))
|
||||
|
@ -151,7 +165,7 @@ class image
|
|||
}
|
||||
}, data);
|
||||
|
||||
data = img_allocator.allocate(1);
|
||||
data = img_allocator.allocate<image_data_t>();
|
||||
img_allocator.construct(std::get<image_data_t*>(data));
|
||||
|
||||
for (auto& v : *std::get<image_data_t*>(data))
|
||||
|
@ -181,7 +195,7 @@ class image
|
|||
{
|
||||
if (!std::holds_alternative<image_data_t*>(data))
|
||||
{
|
||||
data = img_allocator.allocate(1);
|
||||
data = img_allocator.allocate<image_data_t>();
|
||||
img_allocator.construct(std::get<image_data_t*>(data));
|
||||
}
|
||||
(*std::get<image_data_t*>(data))[y * height + x] = c;
|
||||
|
@ -190,7 +204,10 @@ class image
|
|||
~image()
|
||||
{
|
||||
if (std::holds_alternative<image_data_t*>(data))
|
||||
{
|
||||
BLT_TRACE("%p", std::get<image_data_t*>(data));
|
||||
img_allocator.deallocate(std::get<image_data_t*>(data), 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit fab759dd4c7c1dd02feae2f2d6c3eb28ceac09da
|
||||
Subproject commit 3da2a52953a450176f609b017d7764c726b7ff42
|
|
@ -71,12 +71,12 @@ inline float protect_div(float x, float y, float d = 0)
|
|||
|
||||
void f_x(image& img, float x, float y, blt::size_t argc, const image** argv, const data_t& extra_data)
|
||||
{
|
||||
img = x;
|
||||
img = image(x);
|
||||
}
|
||||
|
||||
void f_y(image& img, float x, float y, blt::size_t argc, const image** argv, const data_t& extra_data)
|
||||
{
|
||||
img = y;
|
||||
img = image(y);
|
||||
}
|
||||
|
||||
void f_random(image& img, float x, float y, blt::size_t argc, const image** argv, const data_t& extra_data)
|
||||
|
@ -84,7 +84,7 @@ void f_random(image& img, float x, float y, blt::size_t argc, const image** argv
|
|||
static std::random_device dev;
|
||||
static std::mt19937_64 engine(dev());
|
||||
static std::uniform_real_distribution<float> dist(0, 1);
|
||||
img = dist(engine);
|
||||
img = image(dist(engine));
|
||||
}
|
||||
|
||||
void f_noise(image& img, float x, float y, blt::size_t argc, const image** argv, const data_t& extra_data)
|
||||
|
@ -141,12 +141,12 @@ void f_cnoise(image& img, float x, float y, blt::size_t argc, const image** argv
|
|||
|
||||
void f_scalar(image& img, float x, float y, blt::size_t argc, const image** argv, const data_t& extra_data)
|
||||
{
|
||||
img = extra_data[0];
|
||||
img = image(extra_data[0]);
|
||||
}
|
||||
|
||||
void f_color(image& img, float x, float y, blt::size_t argc, const image** argv, const data_t& extra_data)
|
||||
{
|
||||
img = blt::vec3{extra_data[0], extra_data[1], extra_data[2]};
|
||||
img = image(blt::vec3{extra_data[0], extra_data[1], extra_data[2]});
|
||||
}
|
||||
|
||||
void f_log(image& img, float x, float y, blt::size_t argc, const image** argv, const data_t& extra_data)
|
||||
|
@ -399,3 +399,20 @@ float eval_BAM(const image& img, const image& compare, float allowed_diff)
|
|||
return values;
|
||||
}
|
||||
|
||||
float eval_DST(const image& img, const image& compare)
|
||||
{
|
||||
float dist = 0;
|
||||
for (blt::i32 i = 0; i < width; i++)
|
||||
{
|
||||
for (blt::i32 j = 0; j < height; j++)
|
||||
{
|
||||
auto px_img = img.get(i, j);
|
||||
auto px_cmp = compare.get(i, j);
|
||||
auto dist_v = px_img - px_cmp;
|
||||
auto dist_srd = dist_v * dist_v;
|
||||
dist += std::sqrt(dist_srd.x() + dist_srd.y() + dist_srd.z());
|
||||
}
|
||||
}
|
||||
return 1 - (1 / (1 + (dist / static_cast<float>(width))));
|
||||
}
|
||||
|
||||
|
|
|
@ -23,11 +23,11 @@
|
|||
#include <queue>
|
||||
#include <stack>
|
||||
|
||||
blt::bump_allocator<node> node_allocator(32000);
|
||||
blt::bump_allocator node_allocator(32000);
|
||||
|
||||
node* createNode(function_t type)
|
||||
{
|
||||
auto* n = node_allocator.allocate(1);
|
||||
auto* n = node_allocator.allocate<node>();
|
||||
node_allocator.construct(n, type);
|
||||
return n;
|
||||
}
|
||||
|
@ -236,7 +236,7 @@ void node::evaluate()
|
|||
if (function_t::NAME == function_t::IF) { \
|
||||
/*std::cout << "__:" << function_name_map[to_underlying(this->sub_nodes[0]->type)] << std::endl;*/ \
|
||||
}\
|
||||
if (FUNC_ALLOW_TERMINALS_SET.contains(function_t::NAME)){ \
|
||||
if (FUNC_ALLOW_TERMINALS_SET.contains(function_t::NAME) && false){ \
|
||||
FUNC(img.value(), 0, 0, argc, const_cast<const image**>(sub_node_images.data()), data); \
|
||||
} else { \
|
||||
for (blt::i32 y = 0; y < height; y++) { \
|
||||
|
@ -271,7 +271,7 @@ node::node(const node& copy)
|
|||
|
||||
node* node::clone()
|
||||
{
|
||||
auto np = node_allocator.allocate(1);
|
||||
auto np = node_allocator.allocate<node>(1);
|
||||
// tee hee
|
||||
::new(np) node(*this);
|
||||
return np;
|
||||
|
|
20
src/main.cpp
20
src/main.cpp
|
@ -251,7 +251,8 @@ class tree
|
|||
float fitness()
|
||||
{
|
||||
auto& img = root->getImage();
|
||||
return eval_BAM(img, compare, 0.1) * eval_DNF_SW_1(img) * static_cast<float>(std::min(depth(root.get()), 5ul));
|
||||
//return eval_BAM(img, compare, 0.1) * eval_DNF_SW_1(img) * static_cast<float>(std::min(depth(root.get()), 5ul));
|
||||
return eval_DST(img, compare);
|
||||
}
|
||||
|
||||
void printTree()
|
||||
|
@ -272,11 +273,12 @@ class gp_population
|
|||
struct gp_i
|
||||
{
|
||||
std::unique_ptr<tree> t = nullptr;
|
||||
float fitness = 0;
|
||||
float r_fitness = 0;
|
||||
float a_fitness = 0;
|
||||
|
||||
[[nodiscard]] inline gp_i clone() const
|
||||
{
|
||||
return {t->clone(), fitness};
|
||||
return {t->clone(), r_fitness};
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -317,11 +319,11 @@ class gp_population
|
|||
} while (n == p[index].t.get());
|
||||
|
||||
auto& v = p[index];
|
||||
if (v.fitness >= fitness)
|
||||
if (v.r_fitness >= fitness)
|
||||
{
|
||||
n = v.t.get();
|
||||
ni = index;
|
||||
fitness = v.fitness;
|
||||
fitness = v.r_fitness;
|
||||
}
|
||||
}
|
||||
BLT_ASSERT(n != nullptr);
|
||||
|
@ -339,7 +341,7 @@ class gp_population
|
|||
new_pop[0] = {pop[b.first].t->clone(), b.second};
|
||||
|
||||
for (blt::size_t i = 1; i < POPULATION_SIZE; i++)
|
||||
new_pop[i] = {pop[i].t->clone(), pop[i].fitness};
|
||||
new_pop[i] = {pop[i].t->clone(), pop[i].r_fitness};
|
||||
|
||||
blt::size_t crossover_count = 0;
|
||||
blt::size_t mutation_count = 0;
|
||||
|
@ -392,7 +394,7 @@ class gp_population
|
|||
for (auto& v : pop)
|
||||
{
|
||||
v.t->evaluate();
|
||||
v.fitness = v.t->fitness();
|
||||
v.r_fitness = v.t->fitness();
|
||||
}
|
||||
BLT_TRACE("Complete");
|
||||
}
|
||||
|
@ -408,10 +410,10 @@ class gp_population
|
|||
float fitness = -2 * 8192;
|
||||
for (blt::size_t j = 0; j < POPULATION_SIZE; j++)
|
||||
{
|
||||
if (pop[j].fitness > fitness)
|
||||
if (pop[j].r_fitness > fitness)
|
||||
{
|
||||
i = j;
|
||||
fitness = pop[j].fitness;
|
||||
fitness = pop[j].r_fitness;
|
||||
}
|
||||
}
|
||||
best = i;
|
||||
|
|
Loading…
Reference in New Issue