9 private static readonly
string[] ExplicitHomeVariables =
11 "ULSALGORITHMS_CPLEX_HOME"
14 private static readonly (
string Version,
string[] Variables)[] KnownHomes =
16 (
"22.2", [
"CPLEX_STUDIO_DIR222",
"CPLEX_STUDIO_DIR2220"]),
17 (
"22.1.2", [
"CPLEX_STUDIO_DIR2212"]),
18 (
"22.1.1", [
"CPLEX_STUDIO_DIR2211"]),
19 (
"22.1", [
"CPLEX_STUDIO_DIR221"]),
20 (
"20.1", [
"CPLEX_STUDIO_DIR201"])
28 var diagnostics =
new List<string>();
31 StringComparer.OrdinalIgnoreCase);
33 foreach (
string variableName
in ExplicitHomeVariables)
36 Environment.GetEnvironmentVariable(
37 variableName)?.Trim() ??
41 versionFamily:
"explicit",
43 $
"environment variable {variableName}",
54 foreach ((
string version,
string[] variables) in KnownHomes)
56 foreach (
string variableName
in variables)
59 Environment.GetEnvironmentVariable(
60 variableName)?.Trim() ??
66 $
"environment variable {variableName}",
78 if (OperatingSystem.IsWindows())
80 foreach (
string root
in EnumerateWindowsInstallations())
84 Path.GetFileName(root),
86 "IBM ILOG Program Files scan",
99 "No compatible CPLEX installation was found. " +
100 "Set ULSALGORITHMS_CPLEX_HOME or a standard CPLEX_STUDIO_DIR* " +
101 "environment variable when CPLEX is installed in a non-standard " +
113 string rootDirectory,
114 string discoverySource =
"explicit path",
115 string versionFamily =
"unknown")
117 var diagnostics =
new List<string>();
120 StringComparer.OrdinalIgnoreCase);
133 private static bool TryCandidate(
134 string versionFamily,
135 string? rootDirectory,
137 ISet<string> visited,
138 ICollection<string> diagnostics,
143 if (
string.IsNullOrWhiteSpace(rootDirectory))
154 Environment.ExpandEnvironmentVariables(
155 rootDirectory.Trim().Trim(
'"')));
162 if (!visited.Add(root))
167 string runtimeDirectory =
174 string concertAssembly =
179 string cplexAssembly =
184 if (!File.Exists(concertAssembly) ||
185 !File.Exists(cplexAssembly))
188 $
"CPLEX candidate '{root}' was found from {source}, but " +
189 "ILOG.Concert.dll and ILOG.CPLEX.dll were not both present " +
190 $
"under '{runtimeDirectory}'.");
207 private static IEnumerable<string>
208 EnumerateWindowsInstallations()
210 string programFiles =
211 Environment.GetFolderPath(
212 Environment.SpecialFolder.ProgramFiles);
214 if (
string.IsNullOrWhiteSpace(programFiles))
225 if (!Directory.Exists(ilogRoot))
230 IEnumerable<string> directories;
236 .EnumerateDirectories(
239 SearchOption.TopDirectoryOnly)
242 Path.GetFileName(directory),
243 StringComparer.OrdinalIgnoreCase)
251 foreach (
string directory
in directories)
253 yield
return directory;
record CplexInstallationInfo(string VersionFamily, string RootDirectory, string RuntimeDirectory, string ConcertAssemblyPath, string CplexAssemblyPath, string DiscoverySource)
Describes one compatible IBM ILOG CPLEX installation.