17 public static SolutionScientificProvenance
Apply(
18 LotSizingSolution solution,
20 DateTime? capturedAtUtc =
null)
22 ArgumentNullException.ThrowIfNull(solution);
23 ArgumentNullException.ThrowIfNull(selection);
27 throw new InvalidOperationException(
28 "Scientific provenance cannot be captured from an " +
29 "unsuccessful formulation selection.");
32 ScientificClassificationResult classification =
36 classification.IsBlocked ||
37 classification.DetectedNotation is
null ||
38 classification.PrimaryProblemClass is
null)
40 throw new InvalidOperationException(
41 "Scientific provenance requires an unblocked classification " +
42 "with detected notation and a unique primary problem class.");
52 throw new InvalidOperationException(
53 "Only a scientifically compatible formulation selection can " +
54 "be recorded as solution provenance.");
58 candidate.Compatibility.Profile ??
59 throw new InvalidOperationException(
60 "A scientifically compatible selection must have a profile.");
63 new SolutionScientificProvenance
66 SolutionScientificProvenance.LegacySchemaVersion,
68 UniversalNotationScheme.Id,
69 NotationSchemeVersion =
70 classification.DetectedNotation.SchemeVersion,
72 classification.DetectedNotation.Render(),
73 CanonicalProblemClassCode =
74 classification.PrimaryProblemClass.Definition.Code,
75 ProblemClassMatchKind =
76 classification.PrimaryProblemClass.Kind.ToString(),
81 FormulationScientificCompatibility =
84 (capturedAtUtc ?? DateTime.UtcNow)
88 SolutionScientificProvenanceCodec.Write(
89 solution.GenerationMetadata,
98 public static SolutionScientificProvenance
Apply(
99 LotSizingSolution solution,
103 DateTime? capturedAtUtc =
null)
105 ArgumentNullException.ThrowIfNull(solution);
106 ArgumentNullException.ThrowIfNull(selection);
107 ArgumentNullException.ThrowIfNull(solutionMethod);
113 throw new InvalidOperationException(
114 "Only an executable scientific solution method can be " +
115 "recorded in current solution provenance.");
129 throw new InvalidOperationException(
130 $
"Solver backend '{solverBackendKind}' is not compatible " +
131 $
"with solution method '{solutionMethod.MethodId}'.");
136 throw new InvalidOperationException(
137 "Scientific provenance cannot be captured from an " +
138 "unsuccessful formulation selection.");
141 ScientificClassificationResult classification =
145 classification.IsBlocked ||
146 classification.DetectedNotation is
null ||
147 classification.PrimaryProblemClass is
null)
149 throw new InvalidOperationException(
150 "Scientific provenance requires an unblocked classification " +
151 "with detected notation and a unique primary problem class.");
161 throw new InvalidOperationException(
162 "Only a scientifically compatible formulation selection can " +
163 "be recorded as solution provenance.");
167 candidate.Compatibility.Profile ??
168 throw new InvalidOperationException(
169 "A scientifically compatible selection must have a profile.");
172 new SolutionScientificProvenance
175 SolutionScientificProvenance.CurrentSchemaVersion,
177 UniversalNotationScheme.Id,
178 NotationSchemeVersion =
179 classification.DetectedNotation.SchemeVersion,
181 classification.DetectedNotation.Render(),
182 CanonicalProblemClassCode =
183 classification.PrimaryProblemClass.Definition.Code,
184 ProblemClassMatchKind =
185 classification.PrimaryProblemClass.Kind.ToString(),
190 FormulationScientificCompatibility =
194 SolutionMethodCategory =
197 solverBackendKind.ToString(),
199 (capturedAtUtc ?? DateTime.UtcNow)
203 SolutionScientificProvenanceCodec.Write(
204 solution.GenerationMetadata,