Brett 2025-04-16 23:27:34 -04:00
parent 81b35f20b9
commit f89628615a
2 changed files with 63 additions and 2 deletions

View File

@ -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)

View File

@ -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);
} }