Embed primitive timeline facts in IPA trials

This commit is contained in:
Meta Vens 2026-05-31 00:41:28 +01:00
commit f16ea641af
11 changed files with 392 additions and 21 deletions

View file

@ -769,6 +769,7 @@ static Dictionary<string, WeightedTerms> DocumentFields(IpaTrialResult result, s
["evaluation"] = new(2.5f, Tokenize(result.EvaluationSummary)),
["known_lies"] = new(2.0f, Tokenize(string.Join(' ', result.KnownLies))),
["metrics"] = new(2.0f, Tokenize(MetricText(result))),
["timeline_facts"] = new(2.5f, Tokenize(TimelineFactText(result))),
["artifacts"] = new(1.75f, Tokenize(ArtifactText(result, store))),
["timing"] = new(1.25f, Tokenize(TimingText(result)))
};
@ -799,6 +800,40 @@ static string MetricText(IpaTrialResult result)
return builder.ToString();
}
static string TimelineFactText(IpaTrialResult result)
{
var builder = new StringBuilder();
foreach (var fact in result.TimelineFacts ?? [])
{
builder.Append(fact.Name).Append(' ');
builder.Append(fact.Primitive).Append(' ');
builder.Append(fact.Signal).Append(' ');
builder.Append(fact.Value.ToString("0.######", CultureInfo.InvariantCulture)).Append(' ');
builder.Append(fact.Unit).Append(' ');
builder.Append("blocks ").Append(fact.BlockStart).Append(' ').Append(fact.BlockEnd).Append(' ');
builder.Append(fact.Summary).Append(' ');
if (fact.Name.Contains("release", StringComparison.OrdinalIgnoreCase))
{
builder.Append("closure release burst plosive stop ");
}
if (fact.Name.Contains("branch", StringComparison.OrdinalIgnoreCase))
{
builder.Append("nasal velum admittance branch ");
}
if (fact.Name.Contains("radiation", StringComparison.OrdinalIgnoreCase))
{
builder.Append("radiation lip output flow ");
}
if (fact.Name.Contains("passivity", StringComparison.OrdinalIgnoreCase) ||
fact.Name.Contains("energy", StringComparison.OrdinalIgnoreCase))
{
builder.Append("passivity energy check ");
}
}
return builder.ToString();
}
static string TimingText(IpaTrialResult result) =>
string.Join(' ', result.TimingReceipts.Select(receipt =>
$"{receipt.StageId} {receipt.Notes} latency {receipt.LatencyMilliseconds:0.###} budget {receipt.BudgetMilliseconds:0.###} confidence {receipt.Confidence:0.###}"));
@ -896,6 +931,12 @@ static IEnumerable<EvidenceChunk> BuildEvidenceChunks(IReadOnlyList<IpaTrialResu
text.AppendLine($"{metric.Name} {metric.Value.ToString("0.######", CultureInfo.InvariantCulture)} weight {metric.Weight.ToString("0.######", CultureInfo.InvariantCulture)}");
}
text.AppendLine("timeline_facts");
foreach (var fact in (result.TimelineFacts ?? []).OrderBy(fact => fact.Name, StringComparer.OrdinalIgnoreCase))
{
text.AppendLine($"{fact.Name} {fact.Primitive} {fact.Signal} {fact.Value.ToString("0.######", CultureInfo.InvariantCulture)} {fact.Unit} blocks {fact.BlockStart}-{fact.BlockEnd} {fact.Summary}");
}
text.AppendLine("hypothesis");
text.AppendLine(result.Hypothesis);
text.AppendLine("evaluation");
@ -937,6 +978,14 @@ static string[] EvidenceTags(IpaTrialResult result, SearchDocument document)
{
tags.Add("timeline");
}
if ((result.TimelineFacts ?? []).Any(fact => fact.Name.Contains("release", StringComparison.OrdinalIgnoreCase)))
{
tags.Add("release-facts");
}
if ((result.TimelineFacts ?? []).Any(fact => fact.Name.Contains("passivity", StringComparison.OrdinalIgnoreCase)))
{
tags.Add("passivity-facts");
}
if (MentionsDressing(result))
{
tags.Add("dressing");
@ -1001,6 +1050,16 @@ static string SearchReport(
builder.Append(Metric(result, "articulation_score"));
builder.Append(", rmsRatio=");
builder.AppendLine(Metric(result, "rms_ratio"));
builder.Append(" timeline: releasePeak=");
builder.Append(TimelineFact(result, "contact_release_peak"));
builder.Append(", releaseBlock=");
builder.Append(TimelineFact(result, "contact_release_peak_block"));
builder.Append(", branchAdmittance=");
builder.Append(TimelineFact(result, "branch_admittance_peak"));
builder.Append(", radiationOutput=");
builder.Append(TimelineFact(result, "radiation_output_peak"));
builder.Append(", passivityMax=");
builder.AppendLine(TimelineFact(result, "path_passivity_max"));
builder.Append(" hypothesis: ");
builder.AppendLine(result.Hypothesis);
builder.Append(" evaluation: ");
@ -1068,6 +1127,33 @@ static string DetailReport(string store, IpaTrialResult result)
builder.AppendLine(metric.Weight.ToString("0.######", CultureInfo.InvariantCulture));
}
builder.AppendLine();
builder.AppendLine("## Primitive Timeline Facts");
foreach (var fact in (result.TimelineFacts ?? []).OrderBy(fact => fact.Name, StringComparer.OrdinalIgnoreCase))
{
builder.Append("- ");
builder.Append(fact.Name);
builder.Append(": ");
builder.Append(fact.Value.ToString("0.######", CultureInfo.InvariantCulture));
builder.Append(' ');
builder.Append(fact.Unit);
builder.Append(" / ");
builder.Append(fact.Primitive);
builder.Append(' ');
builder.Append(fact.Signal);
builder.Append(" / blocks ");
builder.Append(fact.BlockStart);
builder.Append('-');
builder.Append(fact.BlockEnd);
if (!string.IsNullOrWhiteSpace(fact.Summary))
{
builder.Append(" / ");
builder.Append(fact.Summary);
}
builder.AppendLine();
}
builder.AppendLine();
builder.AppendLine("## Artifacts");
foreach (var artifact in result.Artifacts)
@ -1124,6 +1210,12 @@ static string StoreReport(string store, IReadOnlyList<IpaTrialResult> results)
builder.Append(Metric(result, "articulation_score"));
builder.Append(", rmsRatio=");
builder.Append(Metric(result, "rms_ratio"));
builder.Append(", releasePeak=");
builder.Append(TimelineFact(result, "contact_release_peak"));
builder.Append(", radiationOutput=");
builder.Append(TimelineFact(result, "radiation_output_peak"));
builder.Append(", passivityMax=");
builder.Append(TimelineFact(result, "path_passivity_max"));
builder.AppendLine();
builder.Append(" patch: ");
builder.AppendLine(result.CandidatePatchUri);
@ -1146,6 +1238,14 @@ static string Metric(IpaTrialResult result, string name) =>
(result.Metrics.FirstOrDefault(metric => metric.Name == name)?.Value ?? 0)
.ToString("0.######", CultureInfo.InvariantCulture);
static string TimelineFact(IpaTrialResult result, string name) =>
(result.TimelineFacts?
.Where(fact => fact.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
.Select(fact => fact.Value)
.DefaultIfEmpty(0)
.Max() ?? 0)
.ToString("0.######", CultureInfo.InvariantCulture);
static IpaTrialResult? ContrastCandidate(IpaTrialResult result, IReadOnlyList<IpaTrialResult> allResults)
{
var sameTarget = allResults