diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index 35144b8..e849152 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -11118,6 +11118,24 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() : TEXT("")) ); } + if (CachedCoachPanelState.AlignedTightFollowUpPacketStructureOutcomeHistoryCount > 0 + || CachedCoachPanelState.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount > 0) + { + GuidancePreferenceDetailLine += FString::Printf( + TEXT(" | Aligned retained packet outcomes: tight follow-up-first %d (avg %.2f) | broad recommended-first %d (avg %.2f)%s"), + CachedCoachPanelState.AlignedTightFollowUpPacketStructureOutcomeHistoryCount, + CachedCoachPanelState.AlignedTightFollowUpPacketStructureOutcomeAverageScore, + CachedCoachPanelState.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount, + CachedCoachPanelState.AlignedBroadRecommendedPacketStructureOutcomeAverageScore, + CachedCoachPanelState.PreferredGuidanceSourceLabel + == TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up") + ? TEXT(" | Follow-up is currently being reinforced by retained aligned tight packet outcomes.") + : (CachedCoachPanelState.PreferredGuidanceSourceLabel + == TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended") + ? TEXT(" | Recommended is currently being reinforced by retained aligned broad packet outcomes.") + : TEXT("")) + ); + } const bool bQueueRecoveryMemorySource = HyperTwistCoachDashboardWidgetInternal::IsQueueRecoveryMemorySource( CachedCoachPanelState.PreferredGuidanceSourceLabel); diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp index 10ca0b5..fcf8b9a 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRepositoryLibrary.cpp @@ -423,6 +423,17 @@ namespace HyperTwistTrainingRepositoryLibraryInternal return SourceLabel == TEXT("coach-memory-method-drill-follow-up-packet-structure-broad"); } + bool IsAlignedTightFollowUpPacketStructureCoachMemorySource(const FString& SourceLabel) + { + 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"); + } + FString ResolveMethodDrillFollowUpPacketStructureRecoverySourceLabel( const FString& PreferredCoachHandoffSourceLabel, const FString& PreferredGuidanceSourceLabel) @@ -7712,6 +7723,14 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der RecommendationHistory.ReliableAlignedTrustedTightFollowUpGuidanceOutcomeAverageScore; Snapshot.ReliableAlignedTrustedBroadRecommendedGuidanceOutcomeAverageScore = RecommendationHistory.ReliableAlignedTrustedBroadRecommendedGuidanceOutcomeAverageScore; + Snapshot.AlignedTightFollowUpPacketStructureOutcomeHistoryCount = + RecommendationHistory.AlignedTightFollowUpPacketStructureOutcomeHistoryCount; + Snapshot.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount = + RecommendationHistory.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount; + Snapshot.AlignedTightFollowUpPacketStructureOutcomeAverageScore = + RecommendationHistory.AlignedTightFollowUpPacketStructureOutcomeAverageScore; + Snapshot.AlignedBroadRecommendedPacketStructureOutcomeAverageScore = + RecommendationHistory.AlignedBroadRecommendedPacketStructureOutcomeAverageScore; Snapshot.bHasRepeatRecommendationPressure = RecommendationHistory.bHasRepeatRecommendationPressure; const int32 DeferredTightenedLaunchBias = FMath::Clamp( RecommendationHistory.DeferredTightenedLaunchPlanCount, @@ -7977,6 +7996,98 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der TEXT("recommendation-history-aligned-broad-recommended-outcome"); } } + const int32 AlignedTightPacketStructureOutcomeBias = + (RecommendationHistory.AlignedTightFollowUpPacketStructureOutcomeHistoryCount >= 2 + && RecommendationHistory.AlignedTightFollowUpPacketStructureOutcomeAverageScore + >= 60.0f) + ? FMath::Clamp( + RecommendationHistory.AlignedTightFollowUpPacketStructureOutcomeHistoryCount + - RecommendationHistory.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount + + (RecommendationHistory.AlignedTightFollowUpPacketStructureOutcomeAverageScore + >= 78.0f + ? 1 + : 0), + 1, + 4) + : 0; + const int32 AlignedBroadPacketStructureOutcomeBias = + (RecommendationHistory.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount >= 2 + && RecommendationHistory.AlignedBroadRecommendedPacketStructureOutcomeAverageScore + >= 58.0f) + ? FMath::Clamp( + RecommendationHistory.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount + - RecommendationHistory.AlignedTightFollowUpPacketStructureOutcomeHistoryCount + + (RecommendationHistory.AlignedBroadRecommendedPacketStructureOutcomeAverageScore + >= 76.0f + ? 1 + : 0), + 1, + 4) + : 0; + if (AlignedTightPacketStructureOutcomeBias > AlignedBroadPacketStructureOutcomeBias) + { + Snapshot.FollowUpGuidanceContinueBias += AlignedTightPacketStructureOutcomeBias; + Snapshot.SuppressedPrimaryQueuePressureCount += FMath::Max( + 1, + AlignedTightPacketStructureOutcomeBias - 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("coach-memory-aligned-follow-up-packet-structure-tight-follow-up"); + } + 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)) + { + Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp; + Snapshot.PreferredCoachHandoffSourceLabel = + TEXT("coach-memory-aligned-follow-up-packet-structure-tight-follow-up"); + } + } + else if (AlignedBroadPacketStructureOutcomeBias > AlignedTightPacketStructureOutcomeBias) + { + Snapshot.RecommendedGuidanceContinueBias += AlignedBroadPacketStructureOutcomeBias; + Snapshot.SuppressedFollowUpQueuePressureCount += AlignedBroadPacketStructureOutcomeBias; + 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("coach-memory-aligned-follow-up-packet-structure-broad-recommended"); + } + 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)) + { + Snapshot.PreferredCoachHandoffKind = + EHyperTwistTrainingCoachHandoffKind::Recommended; + Snapshot.PreferredCoachHandoffSourceLabel = + TEXT("coach-memory-aligned-follow-up-packet-structure-broad-recommended"); + } + } if (!RecommendationHistory.FocusDeckId.IsEmpty() && (Snapshot.FocusDeckId.IsEmpty() @@ -13201,6 +13312,8 @@ FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingReposito float ReliableAlignedTrustedBroadPlanOutcomeAccumulator = 0.0f; float ReliableAlignedTrustedTightFollowUpLaneOutcomeAccumulator = 0.0f; float ReliableAlignedTrustedBroadRecommendedLaneOutcomeAccumulator = 0.0f; + float AlignedTightFollowUpPacketStructureOutcomeAccumulator = 0.0f; + float AlignedBroadRecommendedPacketStructureOutcomeAccumulator = 0.0f; FString LatestPlanSortUtc; for (const FHyperTwistTrainingCoachActionPlan& Plan : UserPlans) @@ -13411,6 +13524,18 @@ FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingReposito ReliableAlignedTrustedBroadRecommendedLaneOutcomeAccumulator += OutcomeSummary.OutcomeScore; } } + if (HyperTwistTrainingRepositoryLibraryInternal::IsAlignedTightFollowUpPacketStructureCoachMemorySource( + OutcomeSummary.PreferredCoachHandoffSourceLabel)) + { + Summary.AlignedTightFollowUpPacketStructureOutcomeHistoryCount += 1; + AlignedTightFollowUpPacketStructureOutcomeAccumulator += OutcomeSummary.OutcomeScore; + } + if (HyperTwistTrainingRepositoryLibraryInternal::IsAlignedBroadRecommendedPacketStructureCoachMemorySource( + OutcomeSummary.PreferredCoachHandoffSourceLabel)) + { + Summary.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount += 1; + AlignedBroadRecommendedPacketStructureOutcomeAccumulator += OutcomeSummary.OutcomeScore; + } if (OutcomeSummary.PlannedLaunchCaseCount > 0) { PlannedLaunchCaseCountAccumulator += @@ -13584,6 +13709,18 @@ FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingReposito / static_cast( Summary.ReliableAlignedTrustedBroadRecommendedGuidanceOutcomeHistoryCount); } + if (Summary.AlignedTightFollowUpPacketStructureOutcomeHistoryCount > 0) + { + Summary.AlignedTightFollowUpPacketStructureOutcomeAverageScore = + AlignedTightFollowUpPacketStructureOutcomeAccumulator + / static_cast(Summary.AlignedTightFollowUpPacketStructureOutcomeHistoryCount); + } + if (Summary.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount > 0) + { + Summary.AlignedBroadRecommendedPacketStructureOutcomeAverageScore = + AlignedBroadRecommendedPacketStructureOutcomeAccumulator + / static_cast(Summary.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount); + } Summary.bHasRepeatRecommendationPressure = Summary.RepeatRecommendationSequenceCount > 0 && (Summary.RecurringCaseCount > 0 @@ -13636,11 +13773,34 @@ FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingReposito 1, 4) : 0; + const int32 AlignedTightPacketStructureOutcomeLaneSignal = + (Summary.AlignedTightFollowUpPacketStructureOutcomeHistoryCount >= 2 + && Summary.AlignedTightFollowUpPacketStructureOutcomeAverageScore >= 60.0f) + ? FMath::Clamp( + Summary.AlignedTightFollowUpPacketStructureOutcomeHistoryCount + - Summary.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount + + (Summary.AlignedTightFollowUpPacketStructureOutcomeAverageScore >= 78.0f ? 1 : 0), + 1, + 4) + : 0; + const int32 AlignedBroadPacketStructureOutcomeLaneSignal = + (Summary.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount >= 2 + && Summary.AlignedBroadRecommendedPacketStructureOutcomeAverageScore >= 58.0f) + ? FMath::Clamp( + Summary.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount + - Summary.AlignedTightFollowUpPacketStructureOutcomeHistoryCount + + (Summary.AlignedBroadRecommendedPacketStructureOutcomeAverageScore >= 76.0f ? 1 : 0), + 1, + 4) + : 0; Summary.PreferredGuidanceLane = bHasFollowUpLaneSignal - && (FollowUpLaneScore + static_cast(ReliableAlignedTrustedTightFollowUpLaneSignal) * 1.5f) + && (FollowUpLaneScore + + static_cast(ReliableAlignedTrustedTightFollowUpLaneSignal) * 1.5f + + static_cast(AlignedTightPacketStructureOutcomeLaneSignal) * 1.25f) > (RecommendedLaneScore - + static_cast(ReliableAlignedTrustedBroadRecommendedLaneSignal) * 1.5f) + + static_cast(ReliableAlignedTrustedBroadRecommendedLaneSignal) * 1.5f + + static_cast(AlignedBroadPacketStructureOutcomeLaneSignal) * 1.25f) ? EHyperTwistTrainingCoachGuidanceLane::FollowUp : EHyperTwistTrainingCoachGuidanceLane::Recommended; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp index 6253df8..e525c3e 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp @@ -864,6 +864,14 @@ FHyperTwistTrainingCoachPanelState UHyperTwistTrainingSubsystem::GetActiveCoachP ActiveCoachMemorySnapshot.AlignedTightFollowUpPacketStructureAverageOutcomeScore; PanelState.AlignedBroadRecommendedPacketStructureAverageOutcomeScore = ActiveCoachMemorySnapshot.AlignedBroadRecommendedPacketStructureAverageOutcomeScore; + PanelState.AlignedTightFollowUpPacketStructureOutcomeHistoryCount = + ActiveCoachMemorySnapshot.AlignedTightFollowUpPacketStructureOutcomeHistoryCount; + PanelState.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount = + ActiveCoachMemorySnapshot.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount; + PanelState.AlignedTightFollowUpPacketStructureOutcomeAverageScore = + ActiveCoachMemorySnapshot.AlignedTightFollowUpPacketStructureOutcomeAverageScore; + PanelState.AlignedBroadRecommendedPacketStructureOutcomeAverageScore = + ActiveCoachMemorySnapshot.AlignedBroadRecommendedPacketStructureOutcomeAverageScore; 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 364cf27..1651113 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -2031,6 +2031,18 @@ struct FHyperTwistTrainingCoachMemorySnapshot UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") float AlignedBroadRecommendedPacketStructureAverageOutcomeScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AlignedTightFollowUpPacketStructureOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AlignedBroadRecommendedPacketStructureOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AlignedTightFollowUpPacketStructureOutcomeAverageScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AlignedBroadRecommendedPacketStructureOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bNeedsCoachIntervention = false; @@ -4543,6 +4555,18 @@ struct FHyperTwistTrainingCoachRecommendationHistorySummary UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") float ReliableAlignedTrustedBroadRecommendedGuidanceOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AlignedTightFollowUpPacketStructureOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AlignedBroadRecommendedPacketStructureOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AlignedTightFollowUpPacketStructureOutcomeAverageScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AlignedBroadRecommendedPacketStructureOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") TArray RecurringCaseIds; @@ -5206,6 +5230,18 @@ struct FHyperTwistTrainingCoachPanelState UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") float AlignedBroadRecommendedPacketStructureAverageOutcomeScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AlignedTightFollowUpPacketStructureOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AlignedBroadRecommendedPacketStructureOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AlignedTightFollowUpPacketStructureOutcomeAverageScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AlignedBroadRecommendedPacketStructureOutcomeAverageScore = 0.0f; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 SignalCount = 0;