#pragma once #include #include #include #include #include #include #include #include namespace fesa { enum class ReferenceQuantity { displacement, reaction, internal_force, centroid_stress }; struct Tolerance final { double relative; double absolute_scale; }; struct ResultPosition final { std::string instance_name; std::int64_t entity_label; std::optional end_node_label; }; struct ComparisonSample final { ReferenceQuantity quantity; ResultPosition position; std::vector reference; std::vector actual; Tolerance tolerance; }; struct ComparisonReport final { bool passed; double maximum_normalized_error; std::vector failures; }; struct ComponentCorrelationMetric final { ReferenceQuantity quantity; std::size_t component_index; std::size_t value_count; double root_mean_square_error; double relative_l2_error; }; struct CorrelationReport final { bool evaluable; std::vector metrics; std::vector failures; }; struct ComparisonSampleMatch final { std::optional sample; std::vector failures; }; [[nodiscard]] ComparisonSampleMatch make_comparison_sample( const ResultFrame& frame, ReferenceQuantity quantity, const ResultPosition& position, std::span reference, Tolerance tolerance); [[nodiscard]] ComparisonReport compare_samples( std::span samples); [[nodiscard]] CorrelationReport correlate_samples( std::span samples); } // namespace fesa