something is wrong with the stack
parent
246f305957
commit
602fef0c7c
|
@ -1,5 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.25)
|
cmake_minimum_required(VERSION 3.25)
|
||||||
project(blt-gp VERSION 0.0.55)
|
project(blt-gp VERSION 0.0.56)
|
||||||
|
|
||||||
include(CTest)
|
include(CTest)
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,12 @@ void print_best()
|
||||||
auto best = program.get_best<10>();
|
auto best = program.get_best<10>();
|
||||||
|
|
||||||
for (auto& v : best)
|
for (auto& v : best)
|
||||||
BLT_TRACE("%lf (depth: %ld)", v.get().get_evaluation_value<float>(nullptr), v.get().get_depth(program));
|
{
|
||||||
|
auto size = v.get().get_values().size();
|
||||||
|
BLT_TRACE("%lf (depth: %ld) (size: t: %ld m: %ld u: %ld r: %ld) filled: %f%%", v.get().get_evaluation_value<float>(nullptr),
|
||||||
|
v.get().get_depth(program), size.total_size_bytes, size.total_no_meta_bytes, size.total_used_bytes, size.total_remaining_bytes,
|
||||||
|
static_cast<double>(size.total_used_bytes) / static_cast<double>(size.total_no_meta_bytes));
|
||||||
|
}
|
||||||
//std::string small("--------------------------");
|
//std::string small("--------------------------");
|
||||||
//for (blt::size_t i = 0; i < std::to_string(program.get_current_generation()).size(); i++)
|
//for (blt::size_t i = 0; i < std::to_string(program.get_current_generation()).size(); i++)
|
||||||
// small += "-";
|
// small += "-";
|
||||||
|
@ -96,6 +101,10 @@ int main()
|
||||||
while (!program.should_terminate())
|
while (!program.should_terminate())
|
||||||
{
|
{
|
||||||
program.evaluate_fitness([](blt::gp::tree_t& current_tree, decltype(result_container)& container, blt::size_t index) {
|
program.evaluate_fitness([](blt::gp::tree_t& current_tree, decltype(result_container)& container, blt::size_t index) {
|
||||||
|
auto size = current_tree.get_values().size();
|
||||||
|
BLT_DEBUG("(depth: %ld) (size: t: %ld m: %ld u: %ld r: %ld) filled: %f%%",
|
||||||
|
current_tree.get_depth(program), size.total_size_bytes, size.total_no_meta_bytes, size.total_used_bytes,
|
||||||
|
size.total_remaining_bytes, static_cast<double>(size.total_used_bytes) / static_cast<double>(size.total_no_meta_bytes));
|
||||||
container[index] = current_tree.get_evaluation_value<float>(nullptr);
|
container[index] = current_tree.get_evaluation_value<float>(nullptr);
|
||||||
return container[index];
|
return container[index];
|
||||||
}, result_container);
|
}, result_container);
|
||||||
|
|
|
@ -36,6 +36,15 @@ namespace blt::gp
|
||||||
constexpr static blt::size_t PAGE_SIZE = 0x1000;
|
constexpr static blt::size_t PAGE_SIZE = 0x1000;
|
||||||
constexpr static blt::size_t MAX_ALIGNMENT = 8;
|
constexpr static blt::size_t MAX_ALIGNMENT = 8;
|
||||||
public:
|
public:
|
||||||
|
struct size_data_t
|
||||||
|
{
|
||||||
|
blt::size_t total_size_bytes = 0;
|
||||||
|
blt::size_t total_used_bytes = 0;
|
||||||
|
blt::size_t total_remaining_bytes = 0;
|
||||||
|
blt::size_t total_no_meta_bytes = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pushes an instance of an object on to the stack
|
* Pushes an instance of an object on to the stack
|
||||||
* @tparam T type to push
|
* @tparam T type to push
|
||||||
|
@ -121,9 +130,9 @@ namespace blt::gp
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#if BLT_DEBUG_LEVEL >= 3
|
#if BLT_DEBUG_LEVEL >= 3
|
||||||
counter++;
|
counter++;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
auto diff = head->used_bytes_in_block() - bytes;
|
auto diff = head->used_bytes_in_block() - bytes;
|
||||||
// if there is not enough room left to pop completely off the block, then move to the next previous block
|
// if there is not enough room left to pop completely off the block, then move to the next previous block
|
||||||
|
@ -168,8 +177,32 @@ namespace blt::gp
|
||||||
return head->used_bytes_in_block();
|
return head->used_bytes_in_block();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warning this function is slow!
|
||||||
|
* @return the size of the stack allocator in bytes
|
||||||
|
*/
|
||||||
|
[[nodiscard]] size_data_t size()
|
||||||
|
{
|
||||||
|
size_data_t size_data;
|
||||||
|
auto next = head;
|
||||||
|
while (next != nullptr)
|
||||||
|
{
|
||||||
|
size_data.total_size_bytes += next->metadata.size;
|
||||||
|
size_data.total_no_meta_bytes += next->storage_size();
|
||||||
|
size_data.total_remaining_bytes += next->remaining_bytes_in_block();
|
||||||
|
size_data.total_used_bytes += next->used_bytes_in_block();
|
||||||
|
next = next->metadata.next;
|
||||||
|
}
|
||||||
|
return size_data;
|
||||||
|
}
|
||||||
|
|
||||||
stack_allocator() = default;
|
stack_allocator() = default;
|
||||||
|
|
||||||
|
// it should be possible to remove the complex copy contrusctor along with trasnfer functions
|
||||||
|
// simply keep track of the start of the stack, aloing with the current pointer and never dealloacted
|
||||||
|
// it adds another 8 bytes to each block but should prevent the need for copying when you can just reset the stack.
|
||||||
|
// (read copy)
|
||||||
|
// if you keep track of type size information you can memcpy between stack allocators as you already only allow trivially copyable types
|
||||||
stack_allocator(const stack_allocator& copy)
|
stack_allocator(const stack_allocator& copy)
|
||||||
{
|
{
|
||||||
if (copy.empty())
|
if (copy.empty())
|
||||||
|
@ -241,6 +274,13 @@ namespace blt::gp
|
||||||
|
|
||||||
explicit block(blt::size_t size)
|
explicit block(blt::size_t size)
|
||||||
{
|
{
|
||||||
|
#if BLT_DEBUG_LEVEL > 0
|
||||||
|
if (size < PAGE_SIZE)
|
||||||
|
{
|
||||||
|
BLT_WARN("Hey this block is too small, who allocated it?");
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
metadata.size = size;
|
metadata.size = size;
|
||||||
metadata.offset = buffer;
|
metadata.offset = buffer;
|
||||||
}
|
}
|
||||||
|
@ -309,6 +349,16 @@ namespace blt::gp
|
||||||
|
|
||||||
static block* allocate_block(blt::size_t bytes)
|
static block* allocate_block(blt::size_t bytes)
|
||||||
{
|
{
|
||||||
|
#if BLT_DEBUG_LEVEL > 0
|
||||||
|
if (bytes > 32000)
|
||||||
|
{
|
||||||
|
BLT_WARN("Size too big!");
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if BLT_DEBUG_LEVEL > 2
|
||||||
|
BLT_DEBUG("Allocating bytes %ld", bytes);
|
||||||
|
#endif
|
||||||
auto size = to_nearest_page_size(bytes);
|
auto size = to_nearest_page_size(bytes);
|
||||||
auto* data = std::aligned_alloc(PAGE_SIZE, size);
|
auto* data = std::aligned_alloc(PAGE_SIZE, size);
|
||||||
new(data) block{size};
|
new(data) block{size};
|
||||||
|
|
Loading…
Reference in New Issue