ULSAlgorithms ships four optional machine-discovery adapters used by the current portable optimization-execution layer and by all six public solver-backed ULS strategies:
The adapters are responsible for locating a usable optimization engine, checking the required runtime/capability path and returning reproducible selection diagnostics. Provider-specific model execution is then delegated to the corresponding ILinearModelSolverExecutor.
No external optimizer is required by direct exact algorithms or heuristics.
Automatic selection uses the repository-wide order:
At the generic execution level, callers normally use LinearModelSolver, which performs capability-aware selection automatically.
The lower-level discovery API remains available when only engine discovery or diagnostics are required:
No manual registry construction is required for the built-in engines.
The CPLEX adapter has no compile-time dependency on IBM assemblies.
Discovery checks, in order:
A candidate must contain:
The adapter dynamically loads the assemblies, instantiates ILOG.CPLEX.Cplex, reads its Version, then calls End. Failure to create the CPLEX environment is reported as a load or licensing failure rather than silently accepting the installation directory.
The execution backend submits the portable LP model through the selected CPLEX installation and parses the generated solution artifact back into portable variable IDs.
Gurobi is probed through the official gurobi_cl executable.
Discovery checks:
The adapter executes:
and records version and license diagnostics.
The execution backend writes the portable model, requests a result file and maps the returned portable v_<id> variable names to the model.
Xpress remains optional and is loaded by reflection from Optimizer.dll.
Discovery checks:
The adapter invokes Optimizer.XPRS.Init and Optimizer.XPRS.Free. Successful initialization is the availability criterion because it exercises the managed assembly, native runtime and license initialization path.
The execution backend reuses that optional runtime through reflection and maps the returned solution to the portable model.
CBC is probed through the stand-alone cbc executable.
Discovery checks:
The adapter runs:
and parses the CBC version banner. CBC requires no commercial runtime license.
The execution backend invokes CBC on the portable LP model, parses the text solution and returns the same normalized LinearModelSolveResult contract as the commercial engines.
The adapters are no longer discovery-only infrastructure. The production path is:
The four formulation strategies are:
The two cutting-plane strategies are:
All six are normal public exact strategies in the runtime catalog and can use CPLEX, Gurobi, Xpress or CBC through this common execution layer.