parker's emotion chip

main
Brett 2025-04-29 22:38:02 -04:00
parent 6700161699
commit b20cc2513a
2 changed files with 31 additions and 13 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.23) project(blt-gp VERSION 0.5.24)
include(CTest) include(CTest)

View File

@ -176,6 +176,24 @@ namespace blt::gp
std::vector<swap_index_t> p1_to_p2_transfer_types; std::vector<swap_index_t> p1_to_p2_transfer_types;
std::vector<swap_index_t> p2_to_p1_transfer_types; std::vector<swap_index_t> p2_to_p1_transfer_types;
void print_missing_types()
{
for (const auto& [id, v] : missing_p1_types)
{
BLT_INFO("(P1) For type {} missing indexes:", id);
for (const auto idx : v)
BLT_INFO("\t{}", idx);
BLT_INFO("----");
}
for (const auto& [id, v] : missing_p2_types)
{
BLT_INFO("(P2) For type {} missing indexes:", id);
for (const auto idx : v)
BLT_INFO("\t{}", idx);
BLT_INFO("----");
}
}
std::optional<size_t> get_p1_index(const type_id& id) std::optional<size_t> get_p1_index(const type_id& id)
{ {
if (!missing_p1_types.contains(id)) if (!missing_p1_types.contains(id))
@ -228,8 +246,10 @@ namespace blt::gp
} resolver; } resolver;
resolver.clear(); resolver.clear();
auto min_size = std::min(p1_info.argument_types.size(), p2_info.argument_types.size());
// resolve type information // resolve type information
for (size_t i = 0; i < std::min(p1_info.argument_types.size(), p2_info.argument_types.size()); i++) for (size_t i = 0; i < min_size; i++)
{ {
if (p1_info.argument_types[i] != p2_info.argument_types[i]) if (p1_info.argument_types[i] != p2_info.argument_types[i])
{ {
@ -239,6 +259,12 @@ namespace blt::gp
resolver.correct_types.insert(i); resolver.correct_types.insert(i);
} }
for (size_t i = min_size; i < p1_info.argument_types.size(); i++)
resolver.missing_p1_types[p1_info.argument_types[i].id].push_back(i);
for (size_t i = min_size; i < p2_info.argument_types.size(); i++)
resolver.missing_p2_types[p2_info.argument_types[i].id].push_back(i);
// if swaping p1 -> p2 and p2 -> p1, we may already have the types we need just in a different order // if swaping p1 -> p2 and p2 -> p1, we may already have the types we need just in a different order
// first, make a list of types which can simply be reordered // first, make a list of types which can simply be reordered
@ -252,6 +278,7 @@ namespace blt::gp
resolver.p2_correct_types.insert(i); resolver.p2_correct_types.insert(i);
} }
} }
for (size_t i = 0; i < p2_info.argument_types.size(); i++) for (size_t i = 0; i < p2_info.argument_types.size(); i++)
{ {
if (resolver.correct_types.contains(i)) if (resolver.correct_types.contains(i))
@ -262,6 +289,7 @@ namespace blt::gp
resolver.p1_correct_types.insert(i); resolver.p1_correct_types.insert(i);
} }
} }
// next we need to figure out which types need to be swapped // next we need to figure out which types need to be swapped
for (size_t i = 0; i < p1_info.argument_types.size(); i++) for (size_t i = 0; i < p1_info.argument_types.size(); i++)
{ {
@ -269,27 +297,17 @@ namespace blt::gp
continue; continue;
if (auto index = resolver.get_p1_index(p1_info.argument_types[i].id)) if (auto index = resolver.get_p1_index(p1_info.argument_types[i].id))
resolver.swap_types.push_back({*index, i}); resolver.swap_types.push_back({*index, i});
else
{
BLT_WARN("Unable to process type {} in p1", p1_info.argument_types[i].id);
return false;
}
} }
for (size_t i = 0; i < p2_info.argument_types.size(); i++) for (size_t i = 0; i < p2_info.argument_types.size(); i++)
{ {
if (resolver.handled_p1(i)) if (resolver.handled_p1(i))
continue; continue;
if (auto index = resolver.get_p2_index(p2_info.argument_types[i].id)) if (auto index = resolver.get_p2_index(p2_info.argument_types[i].id))
resolver.swap_types.push_back({i, *index}); resolver.swap_types.push_back({i, *index});
else
{
BLT_WARN("Unable to process type {} in p2", p2_info.argument_types[i].id);
return false;
}
} }
// now we do the swap // now we do the swap
p1.find_child_extends(resolver.children_data_p1, point1.pos, p1_info.argument_types.size()); p1.find_child_extends(resolver.children_data_p1, point1.pos, p1_info.argument_types.size());
p2.find_child_extends(resolver.children_data_p2, point2.pos, p2_info.argument_types.size()); p2.find_child_extends(resolver.children_data_p2, point2.pos, p2_info.argument_types.size());