36 public IReadOnlyList<SolverDiscoveryCandidate>
Collect(
39 ArgumentNullException.ThrowIfNull(
45 new List<SolverDiscoveryCandidate>();
47 AddExplicitDirectories(
53 AddEnvironmentVariableCandidates(
59 AddSystemPathCandidates(
65 AddCommonInstallationCandidates(
74 StringComparer.OrdinalIgnoreCase)
91 StringComparer.OrdinalIgnoreCase)
95 private static void AddExplicitDirectories(
96 ICollection<SolverDiscoveryCandidate> candidates,
100 string configuredDirectory
103 string expandedPath =
105 configuredDirectory);
109 in GetConcreteSolverKinds())
117 "Explicitly configured solver search " +
125 private static void AddEnvironmentVariableCandidates(
126 ICollection<SolverDiscoveryCandidate> candidates)
129 SolverEnvironmentVariableDefinition definition
130 in SolverEnvironmentVariableCatalog.All)
132 if (definition.IsLicenseVariable)
138 Environment.GetEnvironmentVariable(
139 definition.VariableName);
141 if (
string.IsNullOrWhiteSpace(
149 definition.SolverKind,
151 .EnvironmentVariable,
154 $
"Environment variable " +
155 $
"{definition.VariableName}.",
158 definition.Priority));
162 private static void AddSystemPathCandidates(
163 ICollection<SolverDiscoveryCandidate> candidates)
166 Environment.GetEnvironmentVariable(
169 if (
string.IsNullOrWhiteSpace(
175 string[] directories =
178 StringSplitOptions.RemoveEmptyEntries |
179 StringSplitOptions.TrimEntries);
185 string expandedDirectory =
191 in GetConcreteSolverKinds())
193 if (!ContainsSolverExecutable(
205 "Solver executable found through the " +
206 "operating-system PATH.",
213 private static void AddCommonInstallationCandidates(
214 ICollection<SolverDiscoveryCandidate> candidates)
217 SolverInstallationPathDefinition definition
218 in SolverInstallationPathCatalog.All)
220 string expandedPath =
222 definition.PathPattern);
226 definition.SolverKind,
228 .CommonInstallationDirectory,
230 definition.Description,
233 definition.Priority));
237 private static SolverDiscoveryCandidate CreateCandidate(
244 return new SolverDiscoveryCandidate
269 private static bool ContainsSolverExecutable(
273 if (!Directory.Exists(
280 string executableName
281 in GetExecutableNames(
296 private static IReadOnlyList<string> GetExecutableNames(
300 OperatingSystem.IsWindows();
302 return solverKind
switch
339 SolverKind.CoinOrCbc =>
351 Array.Empty<
string>()
355 private static IReadOnlyList<SolverKind>
356 GetConcreteSolverKinds()
367 private static string ExpandPath(
371 Environment.ExpandEnvironmentVariables(
374 return Path.GetFullPath(
378 private static string BuildCandidateKey(
379 SolverDiscoveryCandidate candidate)
382 $
"{candidate.SolverKind}|" +
383 $
"{Path.GetFullPath(candidate.Path)}";