using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace MultiWheelC.TrajectoryPlanning.PathSmoothing.Comparison;
/// 原始基线或一种平滑方法的不可变比较条目。
public sealed class PathSmoothingComparisonEntry
{
/// 为测试、离线分析和排序创建不携带路径几何的候选条目。
public PathSmoothingComparisonEntry(
SmoothingMethod method,
PathSmoothingStatus status,
PathQualityMetrics metrics,
SmoothingTimingSummary timing,
string stableGeometryDigest,
string diagnostic)
: this(method, false, status, metrics, timing, stableGeometryDigest, diagnostic, Empty(), Empty())
{
}
private PathSmoothingComparisonEntry(
SmoothingMethod? method,
bool isRawPathBaseline,
PathSmoothingStatus status,
PathQualityMetrics metrics,
SmoothingTimingSummary timing,
string stableGeometryDigest,
string diagnostic,
IReadOnlyList path,
IReadOnlyList segments)
{
Method = method;
IsRawPathBaseline = isRawPathBaseline;
Status = status;
Metrics = metrics ?? new PathQualityMetrics();
Timing = timing ?? new SmoothingTimingSummary(new double[] { 0d, 0d, 0d, 0d, 0d }, false, "未提供计时结果。");
StableGeometryDigest = stableGeometryDigest ?? string.Empty;
Diagnostic = diagnostic ?? string.Empty;
Path = CopyReadOnly(path);
Segments = CopyReadOnly(segments);
}
/// 候选所代表的方法;原始粗路径基线为空。
public SmoothingMethod? Method { get; }
/// 是否为单独分析的原始粗路径基线。
public bool IsRawPathBaseline { get; }
/// 本条目的最终状态。
public PathSmoothingStatus Status { get; }
/// 使用原始基线规范化后的质量指标。
public PathQualityMetrics Metrics { get; }
/// 方法的五次测量计时;基线不参与计时排名。
public SmoothingTimingSummary Timing { get; }
/// 由状态、分段元数据和完整路径 IEEE 754 位模式生成的 SHA-256 摘要。
public string StableGeometryDigest { get; }
/// 面向报告和诊断的稳定说明。
public string Diagnostic { get; }
/// 仅供比较与报告读取的正式路径;失败时为空。
public IReadOnlyList Path { get; }
/// 覆盖 的方向段;失败时为空。
public IReadOnlyList Segments { get; }
/// 条目能否参与方法推荐。
public bool IsEligibleForRecommendation =>
!IsRawPathBaseline &&
Status == PathSmoothingStatus.Success &&
Metrics.IsFeasible &&
Timing.IsDeterministic;
internal static PathSmoothingComparisonEntry CreateCandidate(
SmoothingMethod method,
PathSmoothingStatus status,
PathQualityMetrics metrics,
SmoothingTimingSummary timing,
string stableGeometryDigest,
string diagnostic,
IReadOnlyList path,
IReadOnlyList segments)
{
return new PathSmoothingComparisonEntry(
method, false, status, metrics, timing, stableGeometryDigest, diagnostic, path, segments);
}
internal static PathSmoothingComparisonEntry CreateRawPathBaseline(
PathSmoothingStatus status,
PathQualityMetrics metrics,
string stableGeometryDigest,
string diagnostic,
IReadOnlyList path,
IReadOnlyList segments)
{
return new PathSmoothingComparisonEntry(
null, true, status, metrics,
new SmoothingTimingSummary(new double[] { 0d, 0d, 0d, 0d, 0d }, true, string.Empty),
stableGeometryDigest, diagnostic, path, segments);
}
private static IReadOnlyList Empty()
{
return new ReadOnlyCollection(new List());
}
private static IReadOnlyList CopyReadOnly(IReadOnlyList source)
{
var copy = new List(source == null ? 0 : source.Count);
if (source != null)
{
for (int index = 0; index < source.Count; index++) copy.Add(source[index]);
}
return new ReadOnlyCollection(copy);
}
}