LotSizingDataModel.Solver 2.0.1
Solver-independent modeling, execution, monitoring and adapter infrastructure.
Loading...
Searching...
No Matches
ScientificSolutionProvenanceMapper.cs
Go to the documentation of this file.
1using LotSizingDataModel.Instance.Notation;
2using LotSizingDataModel.Instance.Scientific;
3using LotSizingDataModel.Solution;
4using LotSizingDataModel.Solution.Metadata.Scientific;
8
10
11/// <summary>
12/// Captures scientific classification/formulation evidence for a generated
13/// lot-sizing solution.
14/// </summary>
16{
17 public static SolutionScientificProvenance Apply(
18 LotSizingSolution solution,
20 DateTime? capturedAtUtc = null)
21 {
22 ArgumentNullException.ThrowIfNull(solution);
23 ArgumentNullException.ThrowIfNull(selection);
24
25 if (!selection.IsSuccessful)
26 {
27 throw new InvalidOperationException(
28 "Scientific provenance cannot be captured from an " +
29 "unsuccessful formulation selection.");
30 }
31
32 ScientificClassificationResult classification =
33 selection.Classification;
34
35 if (
36 classification.IsBlocked ||
37 classification.DetectedNotation is null ||
38 classification.PrimaryProblemClass is null)
39 {
40 throw new InvalidOperationException(
41 "Scientific provenance requires an unblocked classification " +
42 "with detected notation and a unique primary problem class.");
43 }
44
46 selection.SelectedCandidate!;
47
48 if (
49 candidate.Compatibility.Kind !=
51 {
52 throw new InvalidOperationException(
53 "Only a scientifically compatible formulation selection can " +
54 "be recorded as solution provenance.");
55 }
56
58 candidate.Compatibility.Profile ??
59 throw new InvalidOperationException(
60 "A scientifically compatible selection must have a profile.");
61
62 var provenance =
63 new SolutionScientificProvenance
64 {
65 SchemaVersion =
66 SolutionScientificProvenance.LegacySchemaVersion,
67 NotationSchemeId =
68 UniversalNotationScheme.Id,
69 NotationSchemeVersion =
70 classification.DetectedNotation.SchemeVersion,
71 DetectedNotation =
72 classification.DetectedNotation.Render(),
73 CanonicalProblemClassCode =
74 classification.PrimaryProblemClass.Definition.Code,
75 ProblemClassMatchKind =
76 classification.PrimaryProblemClass.Kind.ToString(),
77 FormulationId =
78 candidate.Formulation.FormulationId,
79 FormulationFamily =
80 profile.FormulationFamily,
81 FormulationScientificCompatibility =
82 candidate.Compatibility.Kind.ToString(),
83 CapturedAtUtc =
84 (capturedAtUtc ?? DateTime.UtcNow)
85 .ToUniversalTime()
86 };
87
88 SolutionScientificProvenanceCodec.Write(
89 solution.GenerationMetadata,
90 provenance);
91
92 return provenance;
93 }
94 /// <summary>
95 /// Captures current schema-v2 provenance including the scientific
96 /// solution-method family and actual native solver backend.
97 /// </summary>
98 public static SolutionScientificProvenance Apply(
99 LotSizingSolution solution,
102 SolverKind solverBackendKind,
103 DateTime? capturedAtUtc = null)
104 {
105 ArgumentNullException.ThrowIfNull(solution);
106 ArgumentNullException.ThrowIfNull(selection);
107 ArgumentNullException.ThrowIfNull(solutionMethod);
108
109 if (
110 solutionMethod.SupportLevel !=
112 {
113 throw new InvalidOperationException(
114 "Only an executable scientific solution method can be " +
115 "recorded in current solution provenance.");
116 }
117
120 solverBackendKind);
121
122 if (
123 solutionMethod.RequiresMilpBackend &&
124 (
125 backend is null ||
126 !backend.Supports(solutionMethod)
127 ))
128 {
129 throw new InvalidOperationException(
130 $"Solver backend '{solverBackendKind}' is not compatible " +
131 $"with solution method '{solutionMethod.MethodId}'.");
132 }
133
134 if (!selection.IsSuccessful)
135 {
136 throw new InvalidOperationException(
137 "Scientific provenance cannot be captured from an " +
138 "unsuccessful formulation selection.");
139 }
140
141 ScientificClassificationResult classification =
142 selection.Classification;
143
144 if (
145 classification.IsBlocked ||
146 classification.DetectedNotation is null ||
147 classification.PrimaryProblemClass is null)
148 {
149 throw new InvalidOperationException(
150 "Scientific provenance requires an unblocked classification " +
151 "with detected notation and a unique primary problem class.");
152 }
153
155 selection.SelectedCandidate!;
156
157 if (
158 candidate.Compatibility.Kind !=
160 {
161 throw new InvalidOperationException(
162 "Only a scientifically compatible formulation selection can " +
163 "be recorded as solution provenance.");
164 }
165
167 candidate.Compatibility.Profile ??
168 throw new InvalidOperationException(
169 "A scientifically compatible selection must have a profile.");
170
171 var provenance =
172 new SolutionScientificProvenance
173 {
174 SchemaVersion =
175 SolutionScientificProvenance.CurrentSchemaVersion,
176 NotationSchemeId =
177 UniversalNotationScheme.Id,
178 NotationSchemeVersion =
179 classification.DetectedNotation.SchemeVersion,
180 DetectedNotation =
181 classification.DetectedNotation.Render(),
182 CanonicalProblemClassCode =
183 classification.PrimaryProblemClass.Definition.Code,
184 ProblemClassMatchKind =
185 classification.PrimaryProblemClass.Kind.ToString(),
186 FormulationId =
187 candidate.Formulation.FormulationId,
188 FormulationFamily =
189 profile.FormulationFamily,
190 FormulationScientificCompatibility =
191 candidate.Compatibility.Kind.ToString(),
192 SolutionMethodId =
193 solutionMethod.MethodId,
194 SolutionMethodCategory =
195 solutionMethod.Category.ToString(),
196 SolverBackendKind =
197 solverBackendKind.ToString(),
198 CapturedAtUtc =
199 (capturedAtUtc ?? DateTime.UtcNow)
200 .ToUniversalTime()
201 };
202
203 SolutionScientificProvenanceCodec.Write(
204 solution.GenerationMetadata,
205 provenance);
206
207 return provenance;
208 }
209
210}
Captures scientific classification/formulation evidence for a generated lot-sizing solution.
static SolutionScientificProvenance Apply(LotSizingSolution solution, ScientificFormulationSelectionResult selection, DateTime? capturedAtUtc=null)
static SolutionScientificProvenance Apply(LotSizingSolution solution, ScientificFormulationSelectionResult selection, ScientificSolutionMethodDefinition solutionMethod, SolverKind solverBackendKind, DateTime? capturedAtUtc=null)
Captures current schema-v2 provenance including the scientific solution-method family and actual nati...
Known native optimization backends in the current Solver abstraction.
static ? ScientificSolverBackendDefinition Find(SolverKind solverKind)
One technical optimization backend. A backend is not a scientific solution method.
SolverKind
Identifies a supported mathematical optimization solver.
Definition SolverKind.cs:12
ScientificFormulationCompatibilityKind
Scientific compatibility between one classification result and one mathematical-formulation capabilit...
ScientificSolutionMethodSupportLevel
Current implementation support of one scientific solution-method family.