1717#include < nlohmann/json.hpp>
1818
1919#include " genesis/agents/Personality.hpp"
20+ #include " genesis/agents/PlannerTargetEncoding.hpp"
2021#include " genesis/runtime/Runtime.hpp"
2122#include " genesis/runtime/SchemaVersions.hpp"
2223#include " genesis/telemetry/SchemaVersions.hpp"
@@ -512,14 +513,15 @@ void normalizeScriptPaths(json& script, const std::filesystem::path& root) {
512513 out << " \n " ;
513514
514515 out << " ## 动作与行为\n\n " ;
515- if (summary.contains (" actions" ) && summary.at (" actions" ).is_object () && summary.at (" actions" ).contains (" counts" )) {
516- const auto & actions = summary.at (" actions" ).at (" counts" );
517- out << " - ConsumeResource: `" << actions.value (" ConsumeResource" , 0ULL ) << " `\n " ;
518- out << " - TakeResource: `" << actions.value (" TakeResource" , 0ULL ) << " `\n " ;
519- out << " - ProduceResource: `" << actions.value (" ProduceResource" , 0ULL ) << " `\n " ;
520- out << " - MoveToInteraction: `" << actions.value (" MoveToInteraction" , 0ULL ) << " `\n " ;
521- }
522- out << " \n " ;
516+ if (summary.contains (" actions" ) && summary.at (" actions" ).is_object () && summary.at (" actions" ).contains (" counts" )) {
517+ const auto & actions = summary.at (" actions" ).at (" counts" );
518+ out << " - ConsumeResource: `" << actions.value (" ConsumeResource" , 0ULL ) << " `\n " ;
519+ out << " - TakeResource: `" << actions.value (" TakeResource" , 0ULL ) << " `\n " ;
520+ out << " - ProduceResource: `" << actions.value (" ProduceResource" , 0ULL ) << " `\n " ;
521+ out << " - MoveToInteraction: `" << actions.value (" MoveToInteraction" , 0ULL ) << " `\n " ;
522+ out << " - SocializeWithAgent: `" << actions.value (" SocializeWithAgent" , 0ULL ) << " `\n " ;
523+ }
524+ out << " \n " ;
523525
524526 if (summary.contains (" switching" )) {
525527 const auto & switching = summary.at (" switching" );
@@ -762,19 +764,21 @@ struct ResourceEconomy {
762764 double utilizationSum = 0.0 ;
763765 std::uint64_t utilizationSamples = 0 ;
764766
765- struct WorldlineWindowAgg {
766- std::uint64_t steps{0 };
767- std::uint64_t needSamples{0 };
768- std::uint64_t criticalNeedSamples{0 };
769- double plannerTravelCostSum{0.0 };
770- std::uint64_t plannerTravelCostSamples{0 };
771- std::unordered_map<std::string, std::uint64_t > actionTypeCounts;
772- std::unordered_map<std::uint32_t , std::uint64_t > plannerTargetCounts;
773- std::uint64_t stockoutStepsAny{0 };
774- std::uint64_t stockoutStepsSources{0 };
775- std::uint64_t stockoutStepsWorkshops{0 };
776- std::uint64_t stepsWithAnyConsumption{0 };
777- std::uint64_t stepsWithAnyRegen{0 };
767+ struct WorldlineWindowAgg {
768+ std::uint64_t steps{0 };
769+ std::uint64_t needSamples{0 };
770+ std::uint64_t criticalNeedSamples{0 };
771+ double plannerTravelCostSum{0.0 };
772+ std::uint64_t plannerTravelCostSamples{0 };
773+ std::unordered_map<std::string, std::uint64_t > actionTypeCounts;
774+ std::unordered_map<std::uint32_t , std::uint64_t > plannerTargetCounts;
775+ std::uint64_t socializeEvents{0 };
776+ std::unordered_map<std::uint32_t , std::uint64_t > socializePartnerCounts;
777+ std::uint64_t stockoutStepsAny{0 };
778+ std::uint64_t stockoutStepsSources{0 };
779+ std::uint64_t stockoutStepsWorkshops{0 };
780+ std::uint64_t stepsWithAnyConsumption{0 };
781+ std::uint64_t stepsWithAnyRegen{0 };
778782 std::uint64_t stepsWithAnyDecay{0 };
779783 std::uint64_t productionAttempts{0 };
780784 std::uint64_t productionSucceeded{0 };
@@ -785,19 +789,21 @@ struct ResourceEconomy {
785789 std::uint64_t resourceFailed{0 };
786790 std::unordered_map<std::string, std::uint64_t > resourceFailureReasons;
787791
788- void clear () {
789- steps = 0 ;
790- needSamples = 0 ;
791- criticalNeedSamples = 0 ;
792- plannerTravelCostSum = 0.0 ;
793- plannerTravelCostSamples = 0 ;
794- actionTypeCounts.clear ();
795- plannerTargetCounts.clear ();
796- stockoutStepsAny = 0 ;
797- stockoutStepsSources = 0 ;
798- stockoutStepsWorkshops = 0 ;
799- stepsWithAnyConsumption = 0 ;
800- stepsWithAnyRegen = 0 ;
792+ void clear () {
793+ steps = 0 ;
794+ needSamples = 0 ;
795+ criticalNeedSamples = 0 ;
796+ plannerTravelCostSum = 0.0 ;
797+ plannerTravelCostSamples = 0 ;
798+ actionTypeCounts.clear ();
799+ plannerTargetCounts.clear ();
800+ socializeEvents = 0 ;
801+ socializePartnerCounts.clear ();
802+ stockoutStepsAny = 0 ;
803+ stockoutStepsSources = 0 ;
804+ stockoutStepsWorkshops = 0 ;
805+ stepsWithAnyConsumption = 0 ;
806+ stepsWithAnyRegen = 0 ;
801807 stepsWithAnyDecay = 0 ;
802808 productionAttempts = 0 ;
803809 productionSucceeded = 0 ;
@@ -810,34 +816,40 @@ struct ResourceEconomy {
810816 }
811817 };
812818
813- auto buildWorldlineCountsJson = [](const WorldlineWindowAgg& agg) {
814- json actionCountsJson = json::object ();
815- for (const auto & [k, v] : agg.actionTypeCounts ) {
816- actionCountsJson[k] = v;
817- }
819+ auto buildWorldlineCountsJson = [](const WorldlineWindowAgg& agg) {
820+ json actionCountsJson = json::object ();
821+ for (const auto & [k, v] : agg.actionTypeCounts ) {
822+ actionCountsJson[k] = v;
823+ }
818824
819- json plannerCountsJson = json::object ();
820- for (const auto & [k, v] : agg.plannerTargetCounts ) {
821- plannerCountsJson[std::to_string (k)] = v;
822- }
825+ json plannerCountsJson = json::object ();
826+ for (const auto & [k, v] : agg.plannerTargetCounts ) {
827+ plannerCountsJson[std::to_string (k)] = v;
828+ }
823829
824- json resourceFailureReasonsJson = json::object ();
825- for (const auto & [k, v] : agg.resourceFailureReasons ) {
826- resourceFailureReasonsJson[k] = v;
827- }
830+ json socialJson = json::object ();
831+ socialJson[" events" ] = agg.socializeEvents ;
832+ socialJson[" uniquePartners" ] = agg.socializePartnerCounts .size ();
833+ socialJson[" partnerEntropyBits" ] = entropyBitsFromCounts (agg.socializePartnerCounts );
834+
835+ json resourceFailureReasonsJson = json::object ();
836+ for (const auto & [k, v] : agg.resourceFailureReasons ) {
837+ resourceFailureReasonsJson[k] = v;
838+ }
828839
829840 json productionFailureReasonsJson = json::object ();
830841 for (const auto & [k, v] : agg.productionFailureReasons ) {
831842 productionFailureReasonsJson[k] = v;
832843 }
833844
834- return json{
835- {" actionTypes" , std::move (actionCountsJson)},
836- {" plannerTargets" , std::move (plannerCountsJson)},
837- {" resourceFailureReasons" , std::move (resourceFailureReasonsJson)},
838- {" productionFailureReasons" , std::move (productionFailureReasonsJson)},
839- };
840- };
845+ return json{
846+ {" actionTypes" , std::move (actionCountsJson)},
847+ {" plannerTargets" , std::move (plannerCountsJson)},
848+ {" social" , std::move (socialJson)},
849+ {" resourceFailureReasons" , std::move (resourceFailureReasonsJson)},
850+ {" productionFailureReasons" , std::move (productionFailureReasonsJson)},
851+ };
852+ };
841853
842854 auto buildWorldlineMetricsJson = [&](const WorldlineWindowAgg& agg) {
843855 const double stepCount = static_cast <double >(std::max<std::uint64_t >(1 , agg.steps ));
@@ -907,24 +919,33 @@ struct ResourceEconomy {
907919 std::uint64_t worldlineWindowStartStep = 0 ;
908920 std::uint64_t worldlineStep = 0 ;
909921
910- auto ingestWorldlineWindow = [&](const genesis::telemetry::TickTelemetry& telemetry) {
911- windowAgg.steps ++;
912- windowAgg.needSamples += telemetry.needs .size ();
913- for (const auto & need : telemetry.needs ) {
922+ auto ingestWorldlineWindow = [&](const genesis::telemetry::TickTelemetry& telemetry) {
923+ windowAgg.steps ++;
924+ windowAgg.needSamples += telemetry.needs .size ();
925+ for (const auto & need : telemetry.needs ) {
914926 if (need.critical ) {
915927 windowAgg.criticalNeedSamples ++;
916928 }
917929 }
918- for (const auto & action : telemetry.actions ) {
919- windowAgg.actionTypeCounts [action.currentAction ]++;
920- }
921- for (const auto & decision : telemetry.plannerDecisions ) {
922- windowAgg.plannerTargetCounts [decision.target ]++;
923- if (std::isfinite (decision.travelCost )) {
924- windowAgg.plannerTravelCostSum += static_cast <double >(decision.travelCost );
925- windowAgg.plannerTravelCostSamples ++;
926- }
927- }
930+ for (const auto & action : telemetry.actions ) {
931+ windowAgg.actionTypeCounts [action.currentAction ]++;
932+ if (action.currentAction == " SocializeWithAgent" ) {
933+ windowAgg.socializeEvents ++;
934+ if (action.targetEntityId != 0U ) {
935+ windowAgg.socializePartnerCounts [action.targetEntityId ]++;
936+ }
937+ }
938+ }
939+ for (const auto & decision : telemetry.plannerDecisions ) {
940+ if (decision.target == 0U || genesis::agents::isAgentPlannerTarget (static_cast <std::uint32_t >(decision.target ))) {
941+ continue ;
942+ }
943+ windowAgg.plannerTargetCounts [decision.target ]++;
944+ if (std::isfinite (decision.travelCost )) {
945+ windowAgg.plannerTravelCostSum += static_cast <double >(decision.travelCost );
946+ windowAgg.plannerTravelCostSamples ++;
947+ }
948+ }
928949
929950 bool anyStockout = false ;
930951 bool anyStockoutSource = false ;
@@ -1027,16 +1048,19 @@ struct ResourceEconomy {
10271048 takeTicksByAgent[action.entityId ]++;
10281049 }
10291050 }
1030- for (const auto & decision : telemetry.plannerDecisions ) {
1031- plannerTargetCounts[decision.target ]++;
1032- if (decision.target != 0 ) {
1033- const auto prev = lastPlannerTargetByAgent.contains (decision.entityId ) ? lastPlannerTargetByAgent[decision.entityId ] : 0U ;
1034- if (prev != 0 && prev != decision.target ) {
1035- plannerTargetSwitchesTotal++;
1036- }
1037- lastPlannerTargetByAgent[decision.entityId ] = decision.target ;
1038- }
1039- }
1051+ for (const auto & decision : telemetry.plannerDecisions ) {
1052+ if (decision.target == 0U || genesis::agents::isAgentPlannerTarget (static_cast <std::uint32_t >(decision.target ))) {
1053+ continue ;
1054+ }
1055+ plannerTargetCounts[decision.target ]++;
1056+ if (decision.target != 0U ) {
1057+ const auto prev = lastPlannerTargetByAgent.contains (decision.entityId ) ? lastPlannerTargetByAgent[decision.entityId ] : 0U ;
1058+ if (prev != 0 && prev != decision.target ) {
1059+ plannerTargetSwitchesTotal++;
1060+ }
1061+ lastPlannerTargetByAgent[decision.entityId ] = decision.target ;
1062+ }
1063+ }
10401064
10411065 bool anyStockout = false ;
10421066 bool anyStockoutSource = false ;
0 commit comments