ULSAlgorithms 1.1.0-g3e5595996d
High-performance exact and heuristic algorithms for uncapacitated lot sizing
Loading...
Searching...
No Matches
OptimizationSolverAdapterBase.cs
Go to the documentation of this file.
2
3/// <summary>
4/// Base class for concrete optimization-solver availability adapters.
5/// </summary>
6public abstract class OptimizationSolverAdapterBase :
8{
9 private readonly SolverCapability[] _capabilities;
10
11 /// <summary>
12 /// Initializes an adapter with its supported capabilities.
13 /// </summary>
15 params SolverCapability[] capabilities)
16 {
17 ArgumentNullException.ThrowIfNull(capabilities);
18
19 if (capabilities.Any(
20 static capability =>
21 capability == SolverCapability.Unknown))
22 {
23 throw new ArgumentException(
24 "Adapter capabilities cannot contain Unknown.",
25 nameof(capabilities));
26 }
27
28 if (capabilities.Distinct().Count() != capabilities.Length)
29 {
30 throw new ArgumentException(
31 "Adapter capabilities cannot contain duplicates.",
32 nameof(capabilities));
33 }
34
35 _capabilities = capabilities.ToArray();
36 }
37
38 /// <inheritdoc />
39 public abstract string AdapterId { get; }
40
41 /// <inheritdoc />
42 public abstract string AdapterName { get; }
43
44 /// <inheritdoc />
45 public virtual string AdapterVersion => "1.0.0";
46
47 /// <inheritdoc />
48 public abstract SolverKind SolverKind { get; }
49
50 /// <inheritdoc />
51 public IReadOnlyCollection<SolverCapability> Capabilities =>
52 _capabilities;
53
54 /// <inheritdoc />
55 public bool SupportsCapability(
56 SolverCapability capability) =>
57 _capabilities.Contains(capability);
58
59 /// <inheritdoc />
60 public abstract ValueTask<SolverAvailabilityInfo>
62 CancellationToken cancellationToken = default);
63
64 /// <summary>
65 /// Maps an exception to a stable availability state.
66 /// </summary>
68 Exception exception)
69 {
70 ArgumentNullException.ThrowIfNull(exception);
71
72 string message =
73 exception.ToString();
74
75 if (message.Contains(
76 "license",
77 StringComparison.OrdinalIgnoreCase) ||
78 message.Contains(
79 "licence",
80 StringComparison.OrdinalIgnoreCase))
81 {
82 return SolverAvailabilityStatus.LicenseUnavailable;
83 }
84
85 if (exception is FileNotFoundException or
86 DirectoryNotFoundException)
87 {
88 return SolverAvailabilityStatus.LibrariesMissing;
89 }
90
91 return SolverAvailabilityStatus.LoadFailure;
92 }
93
94 /// <summary>
95 /// Unwraps reflection invocation exceptions.
96 /// </summary>
97 protected static Exception Unwrap(
98 Exception exception)
99 {
100 ArgumentNullException.ThrowIfNull(exception);
101
102 return exception is
103 System.Reflection.TargetInvocationException invocation &&
104 invocation.InnerException is Exception inner
105 ? inner
106 : exception;
107 }
108}
ValueTask< SolverAvailabilityInfo > CheckAvailabilityAsync(CancellationToken cancellationToken=default)
Performs the adapter-specific machine discovery / load / license check.
static Exception Unwrap(Exception exception)
Unwraps reflection invocation exceptions.
static SolverAvailabilityStatus ClassifyFailure(Exception exception)
Maps an exception to a stable availability state.
bool SupportsCapability(SolverCapability capability)
Tests whether the adapter exposes a capability.
OptimizationSolverAdapterBase(params SolverCapability[] capabilities)
Initializes an adapter with its supported capabilities.
SolverKind SolverKind
Gets the concrete solver targeted by this adapter.
IReadOnlyCollection< SolverCapability > Capabilities
Gets the capabilities implemented by this adapter.
virtual string AdapterVersion
Gets the adapter implementation version.
Defines the common metadata and availability contract implemented by every optimization-solver adapte...
SolverAvailabilityStatus
Describes whether a solver can currently be used on the current computer.
SolverCapability
Identifies an optional capability exposed by an optimization-solver adapter.