diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index 6302bf2..8763bd8 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -338,14 +338,17 @@ namespace HyperTwistCoachDashboardWidgetInternal bool IsAlignedTightFollowUpPacketSourceLabel(const FString& SourceLabel) { - return SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up") + return SourceLabel + == TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome") + || SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up") || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-aligned-follow-up-packet-tight-")); } bool IsAlignedBroadRecommendedPacketSourceLabel(const FString& SourceLabel) { return SourceLabel - == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended") + == TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome") + || SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended") || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-aligned-follow-up-packet-broad-")); } @@ -405,6 +408,11 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted aligned tight follow-up-packet handoff history"); } + if (SourceLabel + == TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome")) + { + return TEXT("accepted aligned tight follow-up-packet outcome history"); + } return SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up") ? TEXT("aligned tight retained follow-up-packet structure history") @@ -416,6 +424,11 @@ namespace HyperTwistCoachDashboardWidgetInternal { return TEXT("accepted aligned broad recommended-packet handoff history"); } + if (SourceLabel + == TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome")) + { + return TEXT("accepted aligned broad recommended-packet outcome history"); + } return SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended") ? TEXT("aligned broad retained recommended-packet structure history") @@ -11306,6 +11319,24 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() : TEXT("")) ); } + if (CachedCoachPanelState.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount > 0 + || CachedCoachPanelState.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount > 0) + { + GuidancePreferenceDetailLine += FString::Printf( + TEXT(" | Accepted aligned packet outcomes: tight follow-up-first %d (avg %.2f) | broad recommended-first %d (avg %.2f)%s"), + CachedCoachPanelState.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount, + CachedCoachPanelState.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore, + CachedCoachPanelState.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount, + CachedCoachPanelState.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore, + CachedCoachPanelState.PreferredGuidanceSourceLabel + == TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome") + ? TEXT(" | Follow-up is currently being reinforced by accepted aligned tight packet outcomes.") + : (CachedCoachPanelState.PreferredGuidanceSourceLabel + == TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome") + ? TEXT(" | Recommended is currently being reinforced by accepted aligned broad packet outcomes.") + : TEXT("")) + ); + } const bool bQueueRecoveryMemorySource = HyperTwistCoachDashboardWidgetInternal::IsQueueRecoveryMemorySource( CachedCoachPanelState.PreferredGuidanceSourceLabel); diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp index b44c0ce..332352a 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingCoachLibrary.cpp @@ -333,6 +333,8 @@ namespace HyperTwistTrainingCoachLibraryInternal bool IsAlignedTightFollowUpGuidanceSourceLabel(const FString& SourceLabel) { return SourceLabel == TEXT("recommendation-history-aligned-tight-follow-up-outcome") + || SourceLabel + == TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome") || SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up") || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-aligned-follow-up-packet-tight-")) || SourceLabel == TEXT("dashboard-handoff-aligned-follow-up-packet-tight-queued") @@ -343,6 +345,8 @@ namespace HyperTwistTrainingCoachLibraryInternal bool IsAlignedBroadRecommendedGuidanceSourceLabel(const FString& SourceLabel) { return SourceLabel == TEXT("recommendation-history-aligned-broad-recommended-outcome") + || SourceLabel + == TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome") || SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended") || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-aligned-follow-up-packet-broad-")) @@ -410,6 +414,11 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted aligned tight follow-up-packet handoff history"); } + if (SourceLabel + == TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome")) + { + return TEXT("accepted aligned tight follow-up-packet outcome history"); + } return SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up") ? TEXT("aligned tight retained follow-up-packet structure history") @@ -424,6 +433,11 @@ namespace HyperTwistTrainingCoachLibraryInternal { return TEXT("accepted aligned broad recommended-packet handoff history"); } + if (SourceLabel + == TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome")) + { + return TEXT("accepted aligned broad recommended-packet outcome history"); + } return SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended") ? TEXT("aligned broad retained recommended-packet structure history") diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp index c1ce18b..7e6734a 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp @@ -439,15 +439,33 @@ namespace HyperTwistTrainingRepositoryLibraryInternal bool IsAlignedTightFollowUpPacketStructureCoachMemorySource(const FString& SourceLabel) { - return SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up") - || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-aligned-follow-up-packet-tight-")); + return SourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up"); } bool IsAlignedBroadRecommendedPacketStructureCoachMemorySource(const FString& SourceLabel) { return SourceLabel - == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended") - || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-aligned-follow-up-packet-broad-")); + == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended"); + } + + bool IsAcceptedAlignedTightFollowUpPacketOutcomeSource(const FString& SourceLabel) + { + return SourceLabel + == TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome") + || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-aligned-follow-up-packet-tight-")) + || SourceLabel == TEXT("dashboard-handoff-aligned-follow-up-packet-tight-queued") + || SourceLabel == TEXT("dashboard-handoff-aligned-follow-up-packet-tight-follow-up") + || SourceLabel == TEXT("dashboard-handoff-aligned-follow-up-packet-tight-recommended"); + } + + bool IsAcceptedAlignedBroadRecommendedPacketOutcomeSource(const FString& SourceLabel) + { + return SourceLabel + == TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome") + || SourceLabel.StartsWith(TEXT("coach-memory-dashboard-aligned-follow-up-packet-broad-")) + || SourceLabel == TEXT("dashboard-handoff-aligned-follow-up-packet-broad-queued") + || SourceLabel == TEXT("dashboard-handoff-aligned-follow-up-packet-broad-follow-up") + || SourceLabel == TEXT("dashboard-handoff-aligned-follow-up-packet-broad-recommended"); } FString ResolveMethodDrillFollowUpPacketStructureRecoverySourceLabel( @@ -2294,10 +2312,14 @@ namespace HyperTwistTrainingRepositoryLibraryInternal const bool bAlignedTightFollowUpGuidanceOutcomeSource = CoachMemorySnapshot.PreferredGuidanceSourceLabel == TEXT("recommendation-history-aligned-tight-follow-up-outcome") + || CoachMemorySnapshot.PreferredGuidanceSourceLabel + == TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome") || CoachMemorySnapshot.PreferredGuidanceSourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up") || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel == TEXT("recommendation-history-aligned-tight-follow-up-outcome") + || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel + == TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome") || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up") || (CoachMemorySnapshot.PreferredGuidanceLane @@ -2312,10 +2334,14 @@ namespace HyperTwistTrainingRepositoryLibraryInternal const bool bAlignedBroadRecommendedGuidanceOutcomeSource = CoachMemorySnapshot.PreferredGuidanceSourceLabel == TEXT("recommendation-history-aligned-broad-recommended-outcome") + || CoachMemorySnapshot.PreferredGuidanceSourceLabel + == TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome") || CoachMemorySnapshot.PreferredGuidanceSourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended") || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel == TEXT("recommendation-history-aligned-broad-recommended-outcome") + || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel + == TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome") || CoachMemorySnapshot.PreferredCoachHandoffSourceLabel == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended") || (CoachMemorySnapshot.PreferredGuidanceLane @@ -7753,6 +7779,14 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der RecommendationHistory.AlignedTightFollowUpPacketStructureOutcomeAverageScore; Snapshot.AlignedBroadRecommendedPacketStructureOutcomeAverageScore = RecommendationHistory.AlignedBroadRecommendedPacketStructureOutcomeAverageScore; + Snapshot.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount = + RecommendationHistory.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount; + Snapshot.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount = + RecommendationHistory.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount; + Snapshot.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore = + RecommendationHistory.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore; + Snapshot.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore = + RecommendationHistory.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore; Snapshot.bHasRepeatRecommendationPressure = RecommendationHistory.bHasRepeatRecommendationPressure; const int32 DeferredTightenedLaunchBias = FMath::Clamp( RecommendationHistory.DeferredTightenedLaunchPlanCount, @@ -8058,7 +8092,11 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der || Snapshot.PreferredGuidanceSourceLabel.StartsWith(TEXT("recommendation-history")) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedTightFollowUpPacketOutcomeSource( + Snapshot.PreferredGuidanceSourceLabel) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedBroadRecommendedPacketOutcomeSource( Snapshot.PreferredGuidanceSourceLabel)) { Snapshot.PreferredGuidanceLane = EHyperTwistTrainingCoachGuidanceLane::FollowUp; @@ -8072,6 +8110,10 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( Snapshot.PreferredCoachHandoffSourceLabel) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedTightFollowUpPacketOutcomeSource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedBroadRecommendedPacketOutcomeSource( Snapshot.PreferredCoachHandoffSourceLabel)) { Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp; @@ -8088,7 +8130,11 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der || Snapshot.PreferredGuidanceSourceLabel.StartsWith(TEXT("recommendation-history")) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedTightFollowUpPacketOutcomeSource( + Snapshot.PreferredGuidanceSourceLabel) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedBroadRecommendedPacketOutcomeSource( Snapshot.PreferredGuidanceSourceLabel)) { Snapshot.PreferredGuidanceLane = EHyperTwistTrainingCoachGuidanceLane::Recommended; @@ -8102,6 +8148,10 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( Snapshot.PreferredCoachHandoffSourceLabel) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedTightFollowUpPacketOutcomeSource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedBroadRecommendedPacketOutcomeSource( Snapshot.PreferredCoachHandoffSourceLabel)) { Snapshot.PreferredCoachHandoffKind = @@ -8110,6 +8160,106 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended"); } } + const int32 AcceptedAlignedTightPacketOutcomeBias = + (RecommendationHistory.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount >= 2 + && RecommendationHistory.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore + >= 60.0f) + ? FMath::Clamp( + RecommendationHistory.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount + - RecommendationHistory.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount + + (RecommendationHistory.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore + >= 80.0f + ? 1 + : 0), + 1, + 4) + : 0; + const int32 AcceptedAlignedBroadPacketOutcomeBias = + (RecommendationHistory.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount >= 2 + && RecommendationHistory.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore + >= 58.0f) + ? FMath::Clamp( + RecommendationHistory.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount + - RecommendationHistory.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount + + (RecommendationHistory.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore + >= 78.0f + ? 1 + : 0), + 1, + 4) + : 0; + if (AcceptedAlignedTightPacketOutcomeBias > AcceptedAlignedBroadPacketOutcomeBias) + { + Snapshot.FollowUpGuidanceContinueBias += AcceptedAlignedTightPacketOutcomeBias; + Snapshot.SuppressedPrimaryQueuePressureCount += FMath::Max( + 1, + AcceptedAlignedTightPacketOutcomeBias - 1 + ); + if (Snapshot.PreferredGuidanceLane == EHyperTwistTrainingCoachGuidanceLane::None + || Snapshot.PreferredGuidanceLane == EHyperTwistTrainingCoachGuidanceLane::Recommended + || Snapshot.PreferredGuidanceSourceLabel.StartsWith(TEXT("recommendation-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( + Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredGuidanceSourceLabel)) + { + Snapshot.PreferredGuidanceLane = EHyperTwistTrainingCoachGuidanceLane::FollowUp; + Snapshot.PreferredGuidanceSourceLabel = + TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome"); + } + if (Snapshot.PreferredCoachHandoffKind == EHyperTwistTrainingCoachHandoffKind::None + || Snapshot.PreferredCoachHandoffKind == EHyperTwistTrainingCoachHandoffKind::Recommended + || Snapshot.PreferredCoachHandoffSourceLabel.IsEmpty() + || Snapshot.PreferredCoachHandoffSourceLabel.StartsWith(TEXT("recommendation-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedTightFollowUpPacketOutcomeSource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedBroadRecommendedPacketOutcomeSource( + Snapshot.PreferredCoachHandoffSourceLabel)) + { + Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp; + Snapshot.PreferredCoachHandoffSourceLabel = + TEXT("recommendation-history-accepted-aligned-tight-follow-up-packet-outcome"); + } + } + else if (AcceptedAlignedBroadPacketOutcomeBias > AcceptedAlignedTightPacketOutcomeBias) + { + Snapshot.RecommendedGuidanceContinueBias += AcceptedAlignedBroadPacketOutcomeBias; + Snapshot.SuppressedFollowUpQueuePressureCount += AcceptedAlignedBroadPacketOutcomeBias; + if (Snapshot.PreferredGuidanceLane == EHyperTwistTrainingCoachGuidanceLane::None + || Snapshot.PreferredGuidanceLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp + || Snapshot.PreferredGuidanceSourceLabel.StartsWith(TEXT("recommendation-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( + Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredGuidanceSourceLabel)) + { + Snapshot.PreferredGuidanceLane = EHyperTwistTrainingCoachGuidanceLane::Recommended; + Snapshot.PreferredGuidanceSourceLabel = + TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome"); + } + if (Snapshot.PreferredCoachHandoffKind == EHyperTwistTrainingCoachHandoffKind::None + || Snapshot.PreferredCoachHandoffKind == EHyperTwistTrainingCoachHandoffKind::FollowUp + || Snapshot.PreferredCoachHandoffSourceLabel.IsEmpty() + || Snapshot.PreferredCoachHandoffSourceLabel.StartsWith(TEXT("recommendation-history")) + || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedTightFollowUpPacketOutcomeSource( + Snapshot.PreferredCoachHandoffSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedBroadRecommendedPacketOutcomeSource( + Snapshot.PreferredCoachHandoffSourceLabel)) + { + Snapshot.PreferredCoachHandoffKind = + EHyperTwistTrainingCoachHandoffKind::Recommended; + Snapshot.PreferredCoachHandoffSourceLabel = + TEXT("recommendation-history-accepted-aligned-broad-recommended-packet-outcome"); + } + } if (!RecommendationHistory.FocusDeckId.IsEmpty() && (Snapshot.FocusDeckId.IsEmpty() @@ -9375,7 +9525,11 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der || Snapshot.PreferredGuidanceSourceLabel.StartsWith(TEXT("recommendation-history")) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedTightFollowUpPacketOutcomeSource( + Snapshot.PreferredGuidanceSourceLabel) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedBroadRecommendedPacketOutcomeSource( Snapshot.PreferredGuidanceSourceLabel)) { Snapshot.PreferredGuidanceLane = @@ -9402,7 +9556,11 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der || Snapshot.PreferredGuidanceSourceLabel.StartsWith(TEXT("recommendation-history")) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedTightFollowUpPacketOutcomeSource( + Snapshot.PreferredGuidanceSourceLabel) || HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + Snapshot.PreferredGuidanceSourceLabel) + || HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedBroadRecommendedPacketOutcomeSource( Snapshot.PreferredGuidanceSourceLabel)) { Snapshot.PreferredGuidanceLane = @@ -13471,6 +13629,8 @@ FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingReposito float ReliableAlignedTrustedBroadRecommendedLaneOutcomeAccumulator = 0.0f; float AlignedTightFollowUpPacketStructureOutcomeAccumulator = 0.0f; float AlignedBroadRecommendedPacketStructureOutcomeAccumulator = 0.0f; + float AcceptedAlignedTightFollowUpPacketOutcomeAccumulator = 0.0f; + float AcceptedAlignedBroadRecommendedPacketOutcomeAccumulator = 0.0f; FString LatestPlanSortUtc; for (const FHyperTwistTrainingCoachActionPlan& Plan : UserPlans) @@ -13693,6 +13853,18 @@ FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingReposito Summary.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount += 1; AlignedBroadRecommendedPacketStructureOutcomeAccumulator += OutcomeSummary.OutcomeScore; } + if (HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedTightFollowUpPacketOutcomeSource( + OutcomeSummary.PreferredCoachHandoffSourceLabel)) + { + Summary.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount += 1; + AcceptedAlignedTightFollowUpPacketOutcomeAccumulator += OutcomeSummary.OutcomeScore; + } + if (HyperTwistTrainingRepositoryLibraryInternal::IsAcceptedAlignedBroadRecommendedPacketOutcomeSource( + OutcomeSummary.PreferredCoachHandoffSourceLabel)) + { + Summary.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount += 1; + AcceptedAlignedBroadRecommendedPacketOutcomeAccumulator += OutcomeSummary.OutcomeScore; + } if (OutcomeSummary.PlannedLaunchCaseCount > 0) { PlannedLaunchCaseCountAccumulator += @@ -13878,6 +14050,18 @@ FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingReposito AlignedBroadRecommendedPacketStructureOutcomeAccumulator / static_cast(Summary.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount); } + if (Summary.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount > 0) + { + Summary.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore = + AcceptedAlignedTightFollowUpPacketOutcomeAccumulator + / static_cast(Summary.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount); + } + if (Summary.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount > 0) + { + Summary.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore = + AcceptedAlignedBroadRecommendedPacketOutcomeAccumulator + / static_cast(Summary.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount); + } Summary.bHasRepeatRecommendationPressure = Summary.RepeatRecommendationSequenceCount > 0 && (Summary.RecurringCaseCount > 0 @@ -13950,14 +14134,36 @@ FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingReposito 1, 4) : 0; + const int32 AcceptedAlignedTightPacketOutcomeLaneSignal = + (Summary.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount >= 2 + && Summary.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore >= 60.0f) + ? FMath::Clamp( + Summary.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount + - Summary.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount + + (Summary.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore >= 80.0f ? 1 : 0), + 1, + 4) + : 0; + const int32 AcceptedAlignedBroadPacketOutcomeLaneSignal = + (Summary.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount >= 2 + && Summary.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore >= 58.0f) + ? FMath::Clamp( + Summary.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount + - Summary.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount + + (Summary.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore >= 78.0f ? 1 : 0), + 1, + 4) + : 0; Summary.PreferredGuidanceLane = bHasFollowUpLaneSignal && (FollowUpLaneScore + static_cast(ReliableAlignedTrustedTightFollowUpLaneSignal) * 1.5f - + static_cast(AlignedTightPacketStructureOutcomeLaneSignal) * 1.25f) + + static_cast(AlignedTightPacketStructureOutcomeLaneSignal) * 1.25f + + static_cast(AcceptedAlignedTightPacketOutcomeLaneSignal) * 1.5f) > (RecommendedLaneScore + static_cast(ReliableAlignedTrustedBroadRecommendedLaneSignal) * 1.5f - + static_cast(AlignedBroadPacketStructureOutcomeLaneSignal) * 1.25f) + + static_cast(AlignedBroadPacketStructureOutcomeLaneSignal) * 1.25f + + static_cast(AcceptedAlignedBroadPacketOutcomeLaneSignal) * 1.5f) ? EHyperTwistTrainingCoachGuidanceLane::FollowUp : EHyperTwistTrainingCoachGuidanceLane::Recommended; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp index e525c3e..4b313aa 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp @@ -872,6 +872,14 @@ FHyperTwistTrainingCoachPanelState UHyperTwistTrainingSubsystem::GetActiveCoachP ActiveCoachMemorySnapshot.AlignedTightFollowUpPacketStructureOutcomeAverageScore; PanelState.AlignedBroadRecommendedPacketStructureOutcomeAverageScore = ActiveCoachMemorySnapshot.AlignedBroadRecommendedPacketStructureOutcomeAverageScore; + PanelState.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount = + ActiveCoachMemorySnapshot.AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount; + PanelState.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount = + ActiveCoachMemorySnapshot.AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount; + PanelState.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore = + ActiveCoachMemorySnapshot.AcceptedAlignedTightFollowUpPacketOutcomeAverageScore; + PanelState.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore = + ActiveCoachMemorySnapshot.AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore; PanelState.bRepositoryVerificationPassed = ActiveRepositoryRoundTripVerification.bDidRoundTripPass; PanelState.bRepositoryVerificationNeedsAttention = ActiveRepositoryRoundTripVerification.ResolvedPath.IsEmpty() || !ActiveRepositoryRoundTripVerification.bDidRoundTripPass; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index 8e73b70..4d1f4ae 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -2043,6 +2043,18 @@ struct FHyperTwistTrainingCoachMemorySnapshot UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") float AlignedBroadRecommendedPacketStructureOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AcceptedAlignedTightFollowUpPacketOutcomeAverageScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bNeedsCoachIntervention = false; @@ -4585,6 +4597,18 @@ struct FHyperTwistTrainingCoachRecommendationHistorySummary UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") float AlignedBroadRecommendedPacketStructureOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AcceptedAlignedTightFollowUpPacketOutcomeAverageScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") TArray RecurringCaseIds; @@ -5260,6 +5284,18 @@ struct FHyperTwistTrainingCoachPanelState UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") float AlignedBroadRecommendedPacketStructureOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AcceptedAlignedTightFollowUpPacketOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AcceptedAlignedBroadRecommendedPacketOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AcceptedAlignedTightFollowUpPacketOutcomeAverageScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AcceptedAlignedBroadRecommendedPacketOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 SignalCount = 0;