Learn aligned packet outcomes in coach memory

This commit is contained in:
axiomlogicnexus 2026-04-29 23:52:20 +02:00
parent 49e5f653dd
commit 640a29f3a8
4 changed files with 224 additions and 2 deletions

View file

@ -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);

View file

@ -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<float>(
Summary.ReliableAlignedTrustedBroadRecommendedGuidanceOutcomeHistoryCount);
}
if (Summary.AlignedTightFollowUpPacketStructureOutcomeHistoryCount > 0)
{
Summary.AlignedTightFollowUpPacketStructureOutcomeAverageScore =
AlignedTightFollowUpPacketStructureOutcomeAccumulator
/ static_cast<float>(Summary.AlignedTightFollowUpPacketStructureOutcomeHistoryCount);
}
if (Summary.AlignedBroadRecommendedPacketStructureOutcomeHistoryCount > 0)
{
Summary.AlignedBroadRecommendedPacketStructureOutcomeAverageScore =
AlignedBroadRecommendedPacketStructureOutcomeAccumulator
/ static_cast<float>(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<float>(ReliableAlignedTrustedTightFollowUpLaneSignal) * 1.5f)
&& (FollowUpLaneScore
+ static_cast<float>(ReliableAlignedTrustedTightFollowUpLaneSignal) * 1.5f
+ static_cast<float>(AlignedTightPacketStructureOutcomeLaneSignal) * 1.25f)
> (RecommendedLaneScore
+ static_cast<float>(ReliableAlignedTrustedBroadRecommendedLaneSignal) * 1.5f)
+ static_cast<float>(ReliableAlignedTrustedBroadRecommendedLaneSignal) * 1.5f
+ static_cast<float>(AlignedBroadPacketStructureOutcomeLaneSignal) * 1.25f)
? EHyperTwistTrainingCoachGuidanceLane::FollowUp
: EHyperTwistTrainingCoachGuidanceLane::Recommended;

View file

@ -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;

View file

@ -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<FString> 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;