16 CancellationToken cancellationToken =
default)
18 ArgumentNullException.ThrowIfNull(registry);
26 [
"The requested solver cannot be Unknown."]);
30 options.EnsureValid();
32 var diagnostics =
new List<string>();
33 IReadOnlyList<SolverKind> order =
34 BuildSolverOrder(requestedSolver, options);
38 cancellationToken.ThrowIfCancellationRequested();
40 IReadOnlyList<IOptimizationSolverAdapter> adapters =
41 registry.FindBySolverKind(solverKind);
43 if (adapters.Count == 0)
46 $
"No registered adapter targets solver '{solverKind}'.");
49 options.RequireExactSolverKind)
59 cancellationToken.ThrowIfCancellationRequested();
61 if (!SupportsRequiredCapabilities(
63 options.RequiredCapabilities))
66 $
"Adapter '{adapter.AdapterName}' does not support " +
67 "all required capabilities.");
77 $
"Adapter '{adapter.AdapterName}' returned availability " +
78 $
"for '{availability.SolverKind}' instead of " +
79 $
"'{adapter.SolverKind}'.");
83 if (!IsAvailabilityAccepted(availability, options))
86 $
"Adapter '{adapter.AdapterName}' is not usable. " +
87 $
"Availability: {availability.Status}.");
89 foreach (
string diagnostic
in availability.
Diagnostics)
92 $
"{adapter.AdapterName}: {diagnostic}");
99 $
"Adapter '{adapter.AdapterName}' was selected for " +
109 if (requestedSolver !=
SolverKind.Automatic &&
110 options.RequireExactSolverKind)
116 diagnostics.Add(
"No suitable optimization solver could be selected.");
125 private static IReadOnlyList<SolverKind> BuildSolverOrder(
136 return [requestedSolver];
139 var order =
new List<SolverKind> { requestedSolver };
143 if (!order.Contains(solverKind))
145 order.Add(solverKind);
152 private static bool SupportsRequiredCapabilities(
153 IOptimizationSolverAdapter adapter,
154 IEnumerable<SolverCapability> requiredCapabilities)
158 if (!adapter.SupportsCapability(capability))
167 private static bool IsAvailabilityAccepted(
168 SolverAvailabilityInfo availability,
169 SolverSelectionOptions options)
176 return options.AllowLimitedAvailability &&
177 availability.Status ==
Stores optimization-solver adapters and provides deterministic lookup by adapter identifier and solve...
Describes solver availability and the installation selected by an adapter.
SolverKind SolverKind
Gets the concrete solver kind.
IReadOnlyList< string > Diagnostics
Gets diagnostics produced during availability detection.
Configures automatic or explicit optimization-solver selection.
bool RequireExactSolverKind
Gets or sets whether an explicitly requested solver forbids fallback.
List< SolverKind > SolverPriority
Gets the priority used for SolverKind.Automatic. Earlier entries have higher priority.
Describes the outcome of optimization-solver selection.
Selects a usable optimization solver by capability, machine availability, and deterministic priority.
async ValueTask< SolverSelectionResult > SelectAsync(SolverKind requestedSolver, SolverAdapterRegistry registry, SolverSelectionOptions? options=null, CancellationToken cancellationToken=default)
Selects an optimization-solver adapter.
Defines the common metadata and availability contract implemented by every optimization-solver adapte...
SolverKind SolverKind
Gets the concrete solver targeted by this adapter.
ValueTask< SolverAvailabilityInfo > CheckAvailabilityAsync(CancellationToken cancellationToken=default)
Performs the adapter-specific machine discovery / load / license check.
SolverAvailabilityStatus
Describes whether a solver can currently be used on the current computer.
SolverCapability
Identifies an optional capability exposed by an optimization-solver adapter.
SolverKind
Identifies a mathematical optimization solver that can be used by solver-backed ULS algorithms.