From 957f7d06e5a4be6b49710d0d43b13f103dd7cbca Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Wed, 29 Apr 2026 15:52:55 +0200 Subject: [PATCH] Persist drill recovery packet sources upstream --- .../HyperTwistCoachDashboardWidget.cpp | 184 +++++++++++- .../HyperTwistTrainingCoachLibrary.cpp | 74 +++++ .../HyperTwistTrainingRepositoryLibrary.cpp | 283 +++++++++++++++--- .../HyperTwistTrainingTypes.h | 18 ++ 4 files changed, 501 insertions(+), 58 deletions(-) diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index d727dc6..2dba5f1 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -242,6 +242,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted strong drill-recovery-memory queued handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-queued")) + { + return TEXT("accepted strong drill-recovery-packet queued handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-queued")) { return TEXT("accepted strong retained drill-recovery-posture queued handoff history"); @@ -250,6 +254,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted strong drill-recovery-memory follow-up handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-follow-up")) + { + return TEXT("accepted strong drill-recovery-packet follow-up handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-follow-up")) { return TEXT("accepted strong retained drill-recovery-posture follow-up handoff history"); @@ -258,6 +266,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted strong drill-recovery-memory recommended handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-recommended")) + { + return TEXT("accepted strong drill-recovery-packet recommended handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-recommended")) { return TEXT("accepted strong retained drill-recovery-posture recommended handoff history"); @@ -266,6 +278,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted weak drill-recovery-memory queued handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-queued")) + { + return TEXT("accepted weak drill-recovery-packet queued handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-queued")) { return TEXT("accepted weak retained drill-recovery-posture queued handoff history"); @@ -274,6 +290,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted weak drill-recovery-memory follow-up handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-follow-up")) + { + return TEXT("accepted weak drill-recovery-packet follow-up handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-follow-up")) { return TEXT("accepted weak retained drill-recovery-posture follow-up handoff history"); @@ -282,6 +302,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted weak drill-recovery-memory recommended handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-recommended")) + { + return TEXT("accepted weak drill-recovery-packet recommended handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-recommended")) { return TEXT("accepted weak retained drill-recovery-posture recommended handoff history"); @@ -346,6 +370,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted strong drill-recovery-memory queued dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued")) + { + return TEXT("accepted strong drill-recovery-packet queued dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")) { return TEXT("accepted strong retained drill-recovery-posture queued dashboard handoff"); @@ -354,6 +382,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted strong drill-recovery-memory follow-up dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up")) + { + return TEXT("accepted strong drill-recovery-packet follow-up dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")) { return TEXT("accepted strong retained drill-recovery-posture follow-up dashboard handoff"); @@ -362,6 +394,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted strong drill-recovery-memory recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended")) + { + return TEXT("accepted strong drill-recovery-packet recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended")) { return TEXT("accepted strong retained drill-recovery-posture recommended dashboard handoff"); @@ -370,6 +406,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted weak drill-recovery-memory queued dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued")) + { + return TEXT("accepted weak drill-recovery-packet queued dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")) { return TEXT("accepted weak retained drill-recovery-posture queued dashboard handoff"); @@ -378,6 +418,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted weak drill-recovery-memory follow-up dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up")) + { + return TEXT("accepted weak drill-recovery-packet follow-up dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")) { return TEXT("accepted weak retained drill-recovery-posture follow-up dashboard handoff"); @@ -386,6 +430,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted weak drill-recovery-memory recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended")) + { + return TEXT("accepted weak drill-recovery-packet recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended")) { return TEXT("accepted weak retained drill-recovery-posture recommended dashboard handoff"); @@ -450,6 +498,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("successful retained drill-recovery-memory history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-strong")) + { + return TEXT("successful retained drill-recovery-packet history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong")) { return TEXT("successful retained drill-recovery-posture history"); @@ -458,6 +510,10 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("weak retained drill-recovery-memory history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-weak")) + { + return TEXT("weak retained drill-recovery-packet history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak")) { return TEXT("weak retained drill-recovery-posture history"); @@ -486,21 +542,34 @@ namespace HyperTwistCoachDashboardWidgetInternal const bool bMethodDrillDriven = false, const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias = EMethodDrillRecoveryMemoryBias::None, - const bool bRetainedMethodDrillRecoveryPostureDriven = false) + const bool bRetainedMethodDrillRecoveryPostureDriven = false, + const bool bMethodDrillRecoveryPacketDriven = false) { if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Strong) { switch (HandoffKind) { case EHyperTwistTrainingCoachHandoffKind::Queue: + if (bMethodDrillRecoveryPacketDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued"); + } return bRetainedMethodDrillRecoveryPostureDriven ? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") : TEXT("dashboard-handoff-method-drill-recovery-strong-queued"); case EHyperTwistTrainingCoachHandoffKind::FollowUp: + if (bMethodDrillRecoveryPacketDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up"); + } return bRetainedMethodDrillRecoveryPostureDriven ? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") : TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up"); case EHyperTwistTrainingCoachHandoffKind::Recommended: + if (bMethodDrillRecoveryPacketDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended"); + } return bRetainedMethodDrillRecoveryPostureDriven ? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") : TEXT("dashboard-handoff-method-drill-recovery-strong-recommended"); @@ -513,14 +582,26 @@ namespace HyperTwistCoachDashboardWidgetInternal switch (HandoffKind) { case EHyperTwistTrainingCoachHandoffKind::Queue: + if (bMethodDrillRecoveryPacketDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued"); + } return bRetainedMethodDrillRecoveryPostureDriven ? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") : TEXT("dashboard-handoff-method-drill-recovery-weak-queued"); case EHyperTwistTrainingCoachHandoffKind::FollowUp: + if (bMethodDrillRecoveryPacketDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up"); + } return bRetainedMethodDrillRecoveryPostureDriven ? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") : TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up"); case EHyperTwistTrainingCoachHandoffKind::Recommended: + if (bMethodDrillRecoveryPacketDriven) + { + return TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended"); + } return bRetainedMethodDrillRecoveryPostureDriven ? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended") : TEXT("dashboard-handoff-method-drill-recovery-weak-recommended"); @@ -1459,6 +1540,21 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() MethodDrillRecoveryMemoryHistoryEntries, true ); + const HyperTwistCoachDashboardWidgetInternal::FMethodDrillRecoveryPacketDashboardBias + MethodDrillRecoveryPacketQueueBias = + HyperTwistCoachDashboardWidgetInternal::DeriveMethodDrillRecoveryPacketDashboardBias( + MethodDrillRecoveryMemoryHistoryEntries + ); + const HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias + MethodDrillRecoveryPacketLaunchBias = + MethodDrillRecoveryPacketQueueBias.bHasStrongContinuationSignal + && (!MethodDrillRecoveryPacketQueueBias.bHasWeakRedirectSignal + || MethodDrillRecoveryPacketQueueBias.LaunchRecoveryBias + >= MethodDrillRecoveryPacketQueueBias.PromoteRecoveryBias) + ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong + : (MethodDrillRecoveryPacketQueueBias.bHasWeakRedirectSignal + ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak + : HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None); const bool bUseStrongRetainedMethodDrillRecoveryPosture = !bHasDeferredFirstSuppressionSignal && QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchCount > 0 @@ -1478,6 +1574,11 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() && (QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteReducedCount > 0 || QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteCount >= QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchCount); + const bool bUseMethodDrillRecoveryPacketSignal = + !bHasDeferredFirstSuppressionSignal + && MethodDrillRecoveryPacketQueueBias.bHasSignal + && MethodDrillRecoveryPacketLaunchBias + != HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None; auto StartRunAndRefresh = [this](const FHyperTwistTrainingRunState& RunState) { @@ -1532,7 +1633,9 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() bHasDeferredFirstSuppressionSignal, bUseMethodDrillRecoverySignal, RetainedMethodDrillRecoveryMemoryBias, - bUseStrongRetainedMethodDrillRecoveryPosture + MethodDrillRecoveryPacketLaunchBias, + bUseStrongRetainedMethodDrillRecoveryPosture, + bUseMethodDrillRecoveryPacketSignal ]( const EHyperTwistTrainingCoachHandoffKind HandoffKind) { @@ -1550,17 +1653,37 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() false, false, HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong, + true, + bUseMethodDrillRecoveryPacketSignal + ); + } + if (bUseMethodDrillRecoveryPacketSignal) + { + return HyperTwistCoachDashboardWidgetInternal::DashboardHandoffSourceLabel( + HandoffKind, + false, + false, + MethodDrillRecoveryPacketLaunchBias, + false, true ); } if (bUseMethodDrillRecoverySignal) { + const HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias + EffectiveRecoverySourceBias = + RetainedMethodDrillRecoveryMemoryBias + != HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None + ? RetainedMethodDrillRecoveryMemoryBias + : MethodDrillRecoveryPacketLaunchBias; return HyperTwistCoachDashboardWidgetInternal::DashboardHandoffSourceLabel( HandoffKind, false, - RetainedMethodDrillRecoveryMemoryBias + EffectiveRecoverySourceBias == HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None, - RetainedMethodDrillRecoveryMemoryBias + EffectiveRecoverySourceBias, + false, + bUseMethodDrillRecoveryPacketSignal ); } @@ -6526,11 +6649,13 @@ void UHyperTwistCoachDashboardWidget::RecordMethodDrillRecoveryMemoryHistorySnap bUsedMethodDrillRecoveryMemoryForHandoff; auto SourceUsesStrongRetainedMethodDrillRecoveryPosture = [](const FString& SourceLabel) { - return SourceLabel.Contains(TEXT("method-drill-recovery-posture-strong")); + return SourceLabel.Contains(TEXT("method-drill-recovery-posture-strong")) + || SourceLabel.Contains(TEXT("method-drill-recovery-packet-strong")); }; auto SourceUsesWeakRetainedMethodDrillRecoveryPosture = [](const FString& SourceLabel) { - return SourceLabel.Contains(TEXT("method-drill-recovery-posture-weak")); + return SourceLabel.Contains(TEXT("method-drill-recovery-posture-weak")) + || SourceLabel.Contains(TEXT("method-drill-recovery-packet-weak")); }; auto SourceUsesGenericMethodDrillRecoveryMemory = [](const FString& SourceLabel) { @@ -7302,6 +7427,7 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() bool bHandoffRecommendationUsedDeferredFirstSuppressionSignal = false; bool bHandoffRecommendationUsedMethodDrillWeighting = false; bool bHandoffRecommendationUsedMethodDrillRecoveryMemory = false; + bool bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory = false; bool bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture = false; bool bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture = false; const HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias @@ -7391,6 +7517,13 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() MethodDrillRecoveryPacketHandoffBias.PreferredHandoffKind == HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Recommended && bRecommendedReadyForHandoff; + const HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias + MethodDrillRecoveryPacketHandoffSourceBias = + (bPacketPrefersQueueContinuation || bPacketPrefersFollowUpContinuation) + ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong + : ((bPacketPrefersQueueRedirect || bPacketPrefersRecommendedRedirect) + ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak + : HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None); if (!bCanUseCoachHandoff) { CoachHandoffRecommendationStatusLine = @@ -7452,12 +7585,14 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() HandoffRecommendationKind = HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue; bHandoffRecommendationUsedMethodDrillWeighting = true; + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory = true; } else if (bPacketPrefersFollowUpContinuation) { HandoffRecommendationKind = HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::FollowUp; bHandoffRecommendationUsedMethodDrillWeighting = true; + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory = true; } else if (HandoffHistoryBias.PreferredKind == HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue @@ -7500,12 +7635,14 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() HandoffRecommendationKind = HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue; bHandoffRecommendationUsedMethodDrillRecoveryMemory = true; + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory = true; } else if (bPacketPrefersFollowUpContinuation) { HandoffRecommendationKind = HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::FollowUp; bHandoffRecommendationUsedMethodDrillRecoveryMemory = true; + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory = true; } else if (HandoffHistoryBias.PreferredKind == HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue @@ -7559,12 +7696,14 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() HandoffRecommendationKind = HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Recommended; bHandoffRecommendationUsedMethodDrillWeighting = true; + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory = true; } else if (bPacketPrefersQueueRedirect) { HandoffRecommendationKind = HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue; bHandoffRecommendationUsedMethodDrillWeighting = true; + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory = true; } else if (HandoffHistoryBias.PreferredKind == HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue @@ -7607,12 +7746,14 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() HandoffRecommendationKind = HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Recommended; bHandoffRecommendationUsedMethodDrillRecoveryMemory = true; + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory = true; } else if (bPacketPrefersQueueRedirect) { HandoffRecommendationKind = HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue; bHandoffRecommendationUsedMethodDrillRecoveryMemory = true; + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory = true; } else if (HandoffHistoryBias.PreferredKind == HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Recommended @@ -7877,7 +8018,8 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong : HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak, - true + true, + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory ); } else if (bHandoffRecommendationUsedMethodDrillRecoveryMemory @@ -7889,12 +8031,28 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() DisplayedCoachHandoffRecommendationKind, false, false, - EffectiveMethodDrillRecoveryMemoryHandoffBias + EffectiveMethodDrillRecoveryMemoryHandoffBias, + false, + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory + ); + } + else if (bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory + && MethodDrillRecoveryPacketHandoffSourceBias + != HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None) + { + DisplayedCoachHandoffMethodDrillRecoveryMemoryStartActionSourceLabel = + HyperTwistCoachDashboardWidgetInternal::DashboardHandoffSourceLabel( + DisplayedCoachHandoffRecommendationKind, + false, + false, + MethodDrillRecoveryPacketHandoffSourceBias, + false, + true ); } CoachHandoffRecommendationDetailLine = FString::Printf( - TEXT("Closure continuation bias %d | Closure suppression bias %d | Queue ready: %s | Follow-up ready: %s | Recommended ready: %s | Preferred lane: %s | Memory source: %s%s%s%s%s%s%s | Launch bias: %s from %s | broadened/tightened history %d/%d | deferred tightened launches %d | deferred launch cases %d%s | Handoff history preferred: %s | accepted q/f/r %d/%d/%d | deferred-overflow accepted q/f/r %d/%d/%d | deferred-first recommendation q/f/r %d/%d/%d | recommended q/f/r %d/%d/%d"), + TEXT("Closure continuation bias %d | Closure suppression bias %d | Queue ready: %s | Follow-up ready: %s | Recommended ready: %s | Preferred lane: %s | Memory source: %s%s%s%s%s%s%s%s | Launch bias: %s from %s | broadened/tightened history %d/%d | deferred tightened launches %d | deferred launch cases %d%s | Handoff history preferred: %s"), HandoffClosureBias.ContinuationBias, HandoffClosureBias.SuppressionBias, bQueueReadyForHandoff ? TEXT("yes") : TEXT("no"), @@ -7922,6 +8080,9 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() ? TEXT(" | Upstream strong drill-driven recovery memory directly tipped this handoff toward narrow continuation.") : TEXT(" | Upstream weak drill-driven recovery memory directly tipped this handoff back toward broader coach guidance.")) : TEXT(""), + bHandoffRecommendationUsedMethodDrillRecoveryPacketHistory + ? TEXT(" | Retained drill-recovery packet history directly tipped this handoff branch.") + : TEXT(""), bHandoffRecommendationUsedDeferredFirstSuppressionSignal ? (bDeferredFirstSuppressionSignalPromoted ? TEXT(" | Deferred-first queue suppression is promoted and keeping narrowed follow-up continuation ahead.") @@ -7940,7 +8101,10 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() ? TEXT(" | Deferred overflow memory is directly reinforcing this handoff.") : TEXT(""), *HyperTwistCoachDashboardWidgetInternal::DescribeHandoffRecommendationKind( - HandoffHistoryBias.PreferredKind), + HandoffHistoryBias.PreferredKind) + ); + CoachHandoffRecommendationDetailLine += FString::Printf( + TEXT(" | accepted q/f/r %d/%d/%d | deferred-overflow accepted q/f/r %d/%d/%d | deferred-first recommendation q/f/r %d/%d/%d | recommended q/f/r %d/%d/%d"), HandoffHistoryBias.QueueAcceptedDeltaCount, HandoffHistoryBias.FollowUpAcceptedDeltaCount, HandoffHistoryBias.RecommendedAcceptedDeltaCount, diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp index a23ec9e..2476a11 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp @@ -45,9 +45,15 @@ namespace HyperTwistTrainingCoachLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") @@ -61,6 +67,8 @@ namespace HyperTwistTrainingCoachLibraryInternal return IsMethodDrillDashboardHandoffSource(SourceLabel) || SourceLabel == TEXT("coach-memory-method-drill-recovery-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-weak") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-strong") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong") @@ -70,14 +78,19 @@ namespace HyperTwistTrainingCoachLibraryInternal bool IsStrongMethodDrillRecoveryMemorySource(const FString& SourceLabel) { return SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-strong-")) + || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-")) || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-")) || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") || SourceLabel == TEXT("coach-memory-method-drill-recovery-strong") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong"); } @@ -85,14 +98,19 @@ namespace HyperTwistTrainingCoachLibraryInternal bool IsWeakMethodDrillRecoveryMemorySource(const FString& SourceLabel) { return SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-weak-")) + || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-")) || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-")) || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended") || SourceLabel == TEXT("coach-memory-method-drill-recovery-weak") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak"); } @@ -186,14 +204,26 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted strong drill-recovery-memory queued handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-queued")) + { + return TEXT("accepted strong drill-recovery-packet queued handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-strong-follow-up")) { return TEXT("accepted strong drill-recovery-memory follow-up handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-follow-up")) + { + return TEXT("accepted strong drill-recovery-packet follow-up handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-strong-recommended")) { return TEXT("accepted strong drill-recovery-memory recommended handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-recommended")) + { + return TEXT("accepted strong drill-recovery-packet recommended handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-queued")) { return TEXT("accepted strong retained drill-recovery-posture queued handoff history"); @@ -210,14 +240,26 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted weak drill-recovery-memory queued handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-queued")) + { + return TEXT("accepted weak drill-recovery-packet queued handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-follow-up")) { return TEXT("accepted weak drill-recovery-memory follow-up handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-follow-up")) + { + return TEXT("accepted weak drill-recovery-packet follow-up handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-recommended")) { return TEXT("accepted weak drill-recovery-memory recommended handoff history"); } + if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-recommended")) + { + return TEXT("accepted weak drill-recovery-packet recommended handoff history"); + } if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-queued")) { return TEXT("accepted weak retained drill-recovery-posture queued handoff history"); @@ -278,14 +320,26 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted strong drill-recovery-memory queued dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued")) + { + return TEXT("accepted strong drill-recovery-packet queued dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up")) { return TEXT("accepted strong drill-recovery-memory follow-up dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up")) + { + return TEXT("accepted strong drill-recovery-packet follow-up dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended")) { return TEXT("accepted strong drill-recovery-memory recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended")) + { + return TEXT("accepted strong drill-recovery-packet recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")) { return TEXT("accepted strong retained drill-recovery-posture queued dashboard handoff"); @@ -302,14 +356,26 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted weak drill-recovery-memory queued dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued")) + { + return TEXT("accepted weak drill-recovery-packet queued dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up")) { return TEXT("accepted weak drill-recovery-memory follow-up dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up")) + { + return TEXT("accepted weak drill-recovery-packet follow-up dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended")) { return TEXT("accepted weak drill-recovery-memory recommended dashboard handoff"); } + if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended")) + { + return TEXT("accepted weak drill-recovery-packet recommended dashboard handoff"); + } if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")) { return TEXT("accepted weak retained drill-recovery-posture queued dashboard handoff"); @@ -382,10 +448,18 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("successful retained drill-recovery-memory history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-strong")) + { + return TEXT("successful retained drill-recovery-packet history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak")) { return TEXT("weak retained drill-recovery-memory history"); } + if (SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-weak")) + { + return TEXT("weak retained drill-recovery-packet history"); + } if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong")) { return TEXT("successful retained drill-recovery-posture history"); diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp index c8c5ded..470fe0a 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp @@ -79,12 +79,18 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended") @@ -96,21 +102,41 @@ namespace HyperTwistTrainingRepositoryLibraryInternal return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended"); } + bool IsStrongMethodDrillRecoveryPacketDashboardHandoffSource(const FString& SourceLabel) + { + return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended"); + } + bool IsWeakMethodDrillRecoveryDashboardHandoffSource(const FString& SourceLabel) { return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended"); } + bool IsWeakMethodDrillRecoveryPacketDashboardHandoffSource(const FString& SourceLabel) + { + return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended"); + } + bool IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource( const FString& SourceLabel) { @@ -131,12 +157,34 @@ namespace HyperTwistTrainingRepositoryLibraryInternal { return SourceLabel == TEXT("coach-memory-method-drill-recovery-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-weak") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-strong") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak") || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong") || SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak"); } + bool IsStrongMethodDrillRecoveryPacketCoachMemorySource(const FString& SourceLabel) + { + return SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-queued") + || SourceLabel + == TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-follow-up") + || SourceLabel + == TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-recommended") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-strong"); + } + + bool IsWeakMethodDrillRecoveryPacketCoachMemorySource(const FString& SourceLabel) + { + return SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-queued") + || SourceLabel + == TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-follow-up") + || SourceLabel + == TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-recommended") + || SourceLabel == TEXT("coach-memory-method-drill-recovery-packet-weak"); + } + EHyperTwistTrainingCoachHandoffKind DashboardHandoffKindFromSourceLabel(const FString& SourceLabel) { if (SourceLabel == TEXT("dashboard-handoff-queued") @@ -144,7 +192,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-deferred-first-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")) { @@ -155,7 +205,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-deferred-first-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")) { @@ -166,7 +218,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal || SourceLabel == TEXT("dashboard-handoff-deferred-first-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended") + || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-packet-weak-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended") || SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended")) { @@ -176,6 +230,32 @@ namespace HyperTwistTrainingRepositoryLibraryInternal return EHyperTwistTrainingCoachHandoffKind::None; } + FString CoachMemoryDashboardSourceLabelFromDashboardStartSource(const FString& SourceLabel) + { + if (SourceLabel.StartsWith(TEXT("coach-memory-dashboard-"))) + { + return SourceLabel; + } + if (SourceLabel.StartsWith(TEXT("dashboard-handoff-"))) + { + return FString(TEXT("coach-memory-dashboard-")) + + SourceLabel.RightChop(FString(TEXT("dashboard-handoff-")).Len()); + } + if (SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-queued")) + { + return TEXT("coach-memory-dashboard-deferred-overflow-queued"); + } + if (SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-follow-up")) + { + return TEXT("coach-memory-dashboard-deferred-overflow-follow-up"); + } + if (SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-recommended")) + { + return TEXT("coach-memory-dashboard-deferred-overflow-recommended"); + } + return FString(); + } + enum class EMethodDrillRecoveryMemoryBias : uint8 { None, @@ -759,6 +839,18 @@ namespace HyperTwistTrainingRepositoryLibraryInternal 1, 3) : 0; + const bool bStrongMethodDrillRecoveryPacketQueuedHandoff = + QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketQueuedHandoffEventCount > 0; + const bool bStrongMethodDrillRecoveryPacketFollowUpHandoff = + QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketFollowUpHandoffEventCount > 0; + const bool bStrongMethodDrillRecoveryPacketRecommendedHandoff = + QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketRecommendedHandoffEventCount > 0; + const bool bWeakMethodDrillRecoveryPacketQueuedHandoff = + QueueExecutionSummary.StartedWeakMethodDrillRecoveryPacketQueuedHandoffEventCount > 0; + const bool bWeakMethodDrillRecoveryPacketFollowUpHandoff = + QueueExecutionSummary.StartedWeakMethodDrillRecoveryPacketFollowUpHandoffEventCount > 0; + const bool bWeakMethodDrillRecoveryPacketRecommendedHandoff = + QueueExecutionSummary.StartedWeakMethodDrillRecoveryPacketRecommendedHandoffEventCount > 0; if (ExplicitQueuedHandoffSignal > 0 || ExplicitFollowUpHandoffSignal > 0 || ExplicitRecommendedHandoffSignal > 0) @@ -778,14 +870,18 @@ namespace HyperTwistTrainingRepositoryLibraryInternal : EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Queue; Snapshot.PreferredCoachHandoffSourceLabel = - HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( - EHyperTwistTrainingCoachHandoffKind::Queue, - ExplicitDeferredOverflowQueuedHandoffSignal > 0, - ExplicitDeferredFirstQueuedHandoffSignal > 0, - ExplicitMethodDrillQueuedHandoffSignal > 0, - MethodDrillRecoveryMemoryBias, - bRetainedMethodDrillRecoveryPostureDriven - ); + bStrongMethodDrillRecoveryPacketQueuedHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-queued") + : (bWeakMethodDrillRecoveryPacketQueuedHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-queued") + : HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( + EHyperTwistTrainingCoachHandoffKind::Queue, + ExplicitDeferredOverflowQueuedHandoffSignal > 0, + ExplicitDeferredFirstQueuedHandoffSignal > 0, + ExplicitMethodDrillQueuedHandoffSignal > 0, + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven + )); } else if (ExplicitFollowUpHandoffSignal >= ExplicitRecommendedHandoffSignal) { @@ -801,14 +897,18 @@ namespace HyperTwistTrainingRepositoryLibraryInternal : EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp; Snapshot.PreferredCoachHandoffSourceLabel = - HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( - EHyperTwistTrainingCoachHandoffKind::FollowUp, - ExplicitDeferredOverflowFollowUpHandoffSignal > 0, - ExplicitDeferredFirstFollowUpHandoffSignal > 0, - ExplicitMethodDrillFollowUpHandoffSignal > 0, - MethodDrillRecoveryMemoryBias, - bRetainedMethodDrillRecoveryPostureDriven - ); + bStrongMethodDrillRecoveryPacketFollowUpHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-follow-up") + : (bWeakMethodDrillRecoveryPacketFollowUpHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-follow-up") + : HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( + EHyperTwistTrainingCoachHandoffKind::FollowUp, + ExplicitDeferredOverflowFollowUpHandoffSignal > 0, + ExplicitDeferredFirstFollowUpHandoffSignal > 0, + ExplicitMethodDrillFollowUpHandoffSignal > 0, + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven + )); } else { @@ -824,14 +924,18 @@ namespace HyperTwistTrainingRepositoryLibraryInternal : EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Recommended; Snapshot.PreferredCoachHandoffSourceLabel = - HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( - EHyperTwistTrainingCoachHandoffKind::Recommended, - ExplicitDeferredOverflowRecommendedHandoffSignal > 0, - ExplicitDeferredFirstRecommendedHandoffSignal > 0, - ExplicitMethodDrillRecommendedHandoffSignal > 0, - MethodDrillRecoveryMemoryBias, - bRetainedMethodDrillRecoveryPostureDriven - ); + bStrongMethodDrillRecoveryPacketRecommendedHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-recommended") + : (bWeakMethodDrillRecoveryPacketRecommendedHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-recommended") + : HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( + EHyperTwistTrainingCoachHandoffKind::Recommended, + ExplicitDeferredOverflowRecommendedHandoffSignal > 0, + ExplicitDeferredFirstRecommendedHandoffSignal > 0, + ExplicitMethodDrillRecommendedHandoffSignal > 0, + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven + )); } } const int32 WeightedFollowUpRecoverySignal = @@ -918,6 +1022,21 @@ namespace HyperTwistTrainingRepositoryLibraryInternal } } if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery + && HyperTwistTrainingRepositoryLibraryInternal::IsStrongMethodDrillRecoveryPacketCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel)) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-packet-strong"); + } + else if (Snapshot.PreferredQueueRecoveryAction + == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred + && HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryPacketCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel)) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-packet-weak"); + } + else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery && RetainedMethodDrillRecoveryPostureLaunchBias > 0 && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) @@ -6999,6 +7118,18 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der 1, 3) : 0; + const bool bStrongMethodDrillRecoveryPacketQueuedHandoff = + QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketQueuedHandoffEventCount > 0; + const bool bStrongMethodDrillRecoveryPacketFollowUpHandoff = + QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketFollowUpHandoffEventCount > 0; + const bool bStrongMethodDrillRecoveryPacketRecommendedHandoff = + QueueExecutionSummary.StartedStrongMethodDrillRecoveryPacketRecommendedHandoffEventCount > 0; + const bool bWeakMethodDrillRecoveryPacketQueuedHandoff = + QueueExecutionSummary.StartedWeakMethodDrillRecoveryPacketQueuedHandoffEventCount > 0; + const bool bWeakMethodDrillRecoveryPacketFollowUpHandoff = + QueueExecutionSummary.StartedWeakMethodDrillRecoveryPacketFollowUpHandoffEventCount > 0; + const bool bWeakMethodDrillRecoveryPacketRecommendedHandoff = + QueueExecutionSummary.StartedWeakMethodDrillRecoveryPacketRecommendedHandoffEventCount > 0; if (ExplicitQueuedHandoffSignal > 0 || ExplicitFollowUpHandoffSignal > 0 || ExplicitRecommendedHandoffSignal > 0) @@ -7019,14 +7150,18 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Queue; Snapshot.PreferredCoachHandoffSourceLabel = - HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( - EHyperTwistTrainingCoachHandoffKind::Queue, - ExplicitDeferredOverflowQueuedHandoffSignal > 0, - ExplicitDeferredFirstQueuedHandoffSignal > 0, - ExplicitMethodDrillQueuedHandoffSignal > 0, - MethodDrillRecoveryMemoryBias, - bRetainedMethodDrillRecoveryPostureDriven - ); + bStrongMethodDrillRecoveryPacketQueuedHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-queued") + : (bWeakMethodDrillRecoveryPacketQueuedHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-queued") + : HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( + EHyperTwistTrainingCoachHandoffKind::Queue, + ExplicitDeferredOverflowQueuedHandoffSignal > 0, + ExplicitDeferredFirstQueuedHandoffSignal > 0, + ExplicitMethodDrillQueuedHandoffSignal > 0, + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven + )); } else if (ExplicitFollowUpHandoffSignal >= ExplicitRecommendedHandoffSignal) { @@ -7043,14 +7178,18 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp; Snapshot.PreferredCoachHandoffSourceLabel = - HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( - EHyperTwistTrainingCoachHandoffKind::FollowUp, - ExplicitDeferredOverflowFollowUpHandoffSignal > 0, - ExplicitDeferredFirstFollowUpHandoffSignal > 0, - ExplicitMethodDrillFollowUpHandoffSignal > 0, - MethodDrillRecoveryMemoryBias, - bRetainedMethodDrillRecoveryPostureDriven - ); + bStrongMethodDrillRecoveryPacketFollowUpHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-follow-up") + : (bWeakMethodDrillRecoveryPacketFollowUpHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-follow-up") + : HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( + EHyperTwistTrainingCoachHandoffKind::FollowUp, + ExplicitDeferredOverflowFollowUpHandoffSignal > 0, + ExplicitDeferredFirstFollowUpHandoffSignal > 0, + ExplicitMethodDrillFollowUpHandoffSignal > 0, + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven + )); } else { @@ -7067,14 +7206,18 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der : HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None); Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Recommended; Snapshot.PreferredCoachHandoffSourceLabel = - HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( - EHyperTwistTrainingCoachHandoffKind::Recommended, - ExplicitDeferredOverflowRecommendedHandoffSignal > 0, - ExplicitDeferredFirstRecommendedHandoffSignal > 0, - ExplicitMethodDrillRecommendedHandoffSignal > 0, - MethodDrillRecoveryMemoryBias, - bRetainedMethodDrillRecoveryPostureDriven - ); + bStrongMethodDrillRecoveryPacketRecommendedHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-strong-recommended") + : (bWeakMethodDrillRecoveryPacketRecommendedHandoff + ? TEXT("coach-memory-dashboard-method-drill-recovery-packet-weak-recommended") + : HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel( + EHyperTwistTrainingCoachHandoffKind::Recommended, + ExplicitDeferredOverflowRecommendedHandoffSignal > 0, + ExplicitDeferredFirstRecommendedHandoffSignal > 0, + ExplicitMethodDrillRecommendedHandoffSignal > 0, + MethodDrillRecoveryMemoryBias, + bRetainedMethodDrillRecoveryPostureDriven + )); } } const int32 WeightedFollowUpRecoverySignal = @@ -7161,6 +7304,20 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der } } if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery + && HyperTwistTrainingRepositoryLibraryInternal::IsStrongMethodDrillRecoveryPacketCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel)) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-packet-strong"); + } + else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred + && HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryPacketCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel)) + { + Snapshot.PreferredQueueRecoveryActionSourceLabel = + TEXT("coach-memory-method-drill-recovery-packet-weak"); + } + else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery && RetainedMethodDrillRecoveryPostureLaunchBias > 0 && (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty() || Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history")) @@ -9052,9 +9209,15 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito const bool bStrongMethodDrillRecoveryDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsStrongMethodDrillRecoveryDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bStrongMethodDrillRecoveryPacketDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsStrongMethodDrillRecoveryPacketDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); const bool bWeakMethodDrillRecoveryDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); + const bool bWeakMethodDrillRecoveryPacketDashboardHandoff = + HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryPacketDashboardHandoffSource( + HistoryEntry.StartActionSourceLabel); const bool bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff = HyperTwistTrainingRepositoryLibraryInternal::IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource( HistoryEntry.StartActionSourceLabel); @@ -9076,6 +9239,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedMethodDrillQueuedHandoffEventCount += 1; } + if (bStrongMethodDrillRecoveryPacketDashboardHandoff) + { + Summary.StartedStrongMethodDrillRecoveryPacketQueuedHandoffEventCount += 1; + } + if (bWeakMethodDrillRecoveryPacketDashboardHandoff) + { + Summary.StartedWeakMethodDrillRecoveryPacketQueuedHandoffEventCount += 1; + } } else if (DashboardHandoffKind == EHyperTwistTrainingCoachHandoffKind::FollowUp) { @@ -9092,6 +9263,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedMethodDrillFollowUpHandoffEventCount += 1; } + if (bStrongMethodDrillRecoveryPacketDashboardHandoff) + { + Summary.StartedStrongMethodDrillRecoveryPacketFollowUpHandoffEventCount += 1; + } + if (bWeakMethodDrillRecoveryPacketDashboardHandoff) + { + Summary.StartedWeakMethodDrillRecoveryPacketFollowUpHandoffEventCount += 1; + } } else if (DashboardHandoffKind == EHyperTwistTrainingCoachHandoffKind::Recommended) { @@ -9108,6 +9287,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito { Summary.StartedMethodDrillRecommendedHandoffEventCount += 1; } + if (bStrongMethodDrillRecoveryPacketDashboardHandoff) + { + Summary.StartedStrongMethodDrillRecoveryPacketRecommendedHandoffEventCount += 1; + } + if (bWeakMethodDrillRecoveryPacketDashboardHandoff) + { + Summary.StartedWeakMethodDrillRecoveryPacketRecommendedHandoffEventCount += 1; + } } if (bStrongMethodDrillRecoveryDashboardHandoff) { diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index d0c34b4..cd52c39 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -3669,6 +3669,24 @@ struct FHyperTwistTrainingCoachSessionQueueExecutionSummary UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 StartedMethodDrillRecommendedHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedStrongMethodDrillRecoveryPacketQueuedHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedStrongMethodDrillRecoveryPacketFollowUpHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedStrongMethodDrillRecoveryPacketRecommendedHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedWeakMethodDrillRecoveryPacketQueuedHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedWeakMethodDrillRecoveryPacketFollowUpHandoffEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StartedWeakMethodDrillRecoveryPacketRecommendedHandoffEventCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 CompletedMethodDrillQueuedHandoffEventCount = 0;