uwu
parent
81b35f20b9
commit
f89628615a
|
@ -27,7 +27,7 @@ macro(compile_options target_name)
|
||||||
sanitizers(${target_name})
|
sanitizers(${target_name})
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
project(blt-gp VERSION 0.5.5)
|
project(blt-gp VERSION 0.5.6)
|
||||||
|
|
||||||
include(CTest)
|
include(CTest)
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,35 @@ namespace blt::gp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void write_stat(fs::writer_t& writer, const population_stats& stat)
|
||||||
|
{
|
||||||
|
const auto overall_fitness = stat.overall_fitness.load();
|
||||||
|
const auto average_fitness = stat.average_fitness.load();
|
||||||
|
const auto best_fitness = stat.best_fitness.load();
|
||||||
|
const auto worst_fitness = stat.worst_fitness.load();
|
||||||
|
writer.write(&overall_fitness, sizeof(overall_fitness));
|
||||||
|
writer.write(&average_fitness, sizeof(average_fitness));
|
||||||
|
writer.write(&best_fitness, sizeof(best_fitness));
|
||||||
|
writer.write(&worst_fitness, sizeof(worst_fitness));
|
||||||
|
const size_t fitness_count = stat.normalized_fitness.size();
|
||||||
|
writer.write(&fitness_count, sizeof(fitness_count));
|
||||||
|
for (const auto& fitness : stat.normalized_fitness)
|
||||||
|
writer.write(&fitness, sizeof(fitness));
|
||||||
|
}
|
||||||
|
|
||||||
|
void load_stat(fs::reader_t& reader, population_stats& stat)
|
||||||
|
{
|
||||||
|
reader.read(&stat.overall_fitness, sizeof(stat.overall_fitness));
|
||||||
|
reader.read(&stat.average_fitness, sizeof(stat.average_fitness));
|
||||||
|
reader.read(&stat.best_fitness, sizeof(stat.best_fitness));
|
||||||
|
reader.read(&stat.worst_fitness, sizeof(stat.worst_fitness));
|
||||||
|
size_t fitness_count;
|
||||||
|
reader.read(&fitness_count, sizeof(fitness_count));
|
||||||
|
stat.normalized_fitness.resize(fitness_count);
|
||||||
|
for (auto& fitness : stat.normalized_fitness)
|
||||||
|
reader.read(&fitness, sizeof(fitness));
|
||||||
|
}
|
||||||
|
|
||||||
void gp_program::save_state(fs::writer_t& writer)
|
void gp_program::save_state(fs::writer_t& writer)
|
||||||
{
|
{
|
||||||
const size_t operator_count = storage.operators.size();
|
const size_t operator_count = storage.operators.size();
|
||||||
|
@ -110,6 +139,11 @@ namespace blt::gp
|
||||||
for (const auto argument : op.argument_types)
|
for (const auto argument : op.argument_types)
|
||||||
writer.write(&argument, sizeof(argument));
|
writer.write(&argument, sizeof(argument));
|
||||||
}
|
}
|
||||||
|
const size_t history_count = statistic_history.size();
|
||||||
|
writer.write(&history_count, sizeof(history_count));
|
||||||
|
for (const auto& stat : statistic_history)
|
||||||
|
write_stat(writer, stat);
|
||||||
|
write_stat(writer, current_stats);
|
||||||
save_generation(writer);
|
save_generation(writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,22 +189,49 @@ namespace blt::gp
|
||||||
|
|
||||||
if (op_meta.return_size_bytes != return_size_bytes)
|
if (op_meta.return_size_bytes != return_size_bytes)
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
"Operator ID " + std::to_string(i) + " expected operator to return " + std::to_string(op_meta.return_size_bytes) + " but got " +
|
"Operator ID " + std::to_string(i) + " expected operator to return " + std::to_string(op_meta.return_size_bytes) + " but got "
|
||||||
|
+
|
||||||
std::to_string(return_size_bytes));
|
std::to_string(return_size_bytes));
|
||||||
|
|
||||||
argc_t argc;
|
argc_t argc;
|
||||||
reader.read(&argc, sizeof(argc));
|
reader.read(&argc, sizeof(argc));
|
||||||
|
if (argc.argc != op.argc.argc)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"Operator ID " + std::to_string(i) + " expected " + std::to_string(op.argc.argc) + " arguments but got " + std::to_string(
|
||||||
|
argc.argc));
|
||||||
|
if (argc.argc_context != op.argc.argc_context)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"Operator ID " + std::to_string(i) + " expected " + std::to_string(op.argc.argc_context) + " arguments but got " +
|
||||||
|
std::to_string(argc.argc_context));
|
||||||
type_id return_type;
|
type_id return_type;
|
||||||
reader.read(&return_type, sizeof(return_type));
|
reader.read(&return_type, sizeof(return_type));
|
||||||
|
if (return_type != op.return_type)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"Operator ID " + std::to_string(i) + " expected return type " + std::to_string(op.return_type) + " but got " + std::to_string(
|
||||||
|
return_type));
|
||||||
size_t arg_type_count;
|
size_t arg_type_count;
|
||||||
|
if (arg_type_count != op.argument_types.size())
|
||||||
|
throw std::runtime_error(
|
||||||
|
"Operator ID " + std::to_string(i) + " expected " + std::to_string(op.argument_types.size()) + " arguments but got " +
|
||||||
|
std::to_string(arg_type_count));
|
||||||
reader.read(&arg_type_count, sizeof(arg_type_count));
|
reader.read(&arg_type_count, sizeof(arg_type_count));
|
||||||
for (size_t j = 0; j < arg_type_count; j++)
|
for (size_t j = 0; j < arg_type_count; j++)
|
||||||
{
|
{
|
||||||
type_id type;
|
type_id type;
|
||||||
reader.read(&type, sizeof(type));
|
reader.read(&type, sizeof(type));
|
||||||
|
if (type != op.argument_types[j])
|
||||||
|
throw std::runtime_error(
|
||||||
|
"Operator ID " + std::to_string(i) + " expected argument " + std::to_string(j) + " to be of type " + std::to_string(
|
||||||
|
op.argument_types[j]) + " but got " + std::to_string(type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
size_t history_count;
|
||||||
|
reader.read(&history_count, sizeof(history_count));
|
||||||
|
statistic_history.resize(history_count);
|
||||||
|
for (size_t i = 0; i < history_count; i++)
|
||||||
|
load_stat(reader, statistic_history[i]);
|
||||||
|
load_stat(reader, current_stats);
|
||||||
load_generation(reader);
|
load_generation(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue