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