ISolver Interface

Marker interface for solvers.

Definition

Namespace: Orx.MathProg
Assembly: Orx.MathProg (in Orx.MathProg.dll) Version: 1.0.0
C#
public interface ISolver

Methods

CheckAvailability Checks availability of the solver on the host, and returns the result.
  • The solver can be used if solver.CheckAvailability().IsOk.
  • The solver is not available otherwise. solver.CheckAvailability().ErrorMessage.Unwrap() provides the error details.
Possible fixes when solver.CheckAvailability().IsErr are as follows:
  • Make sure that the desired solver is installed on the host machine; such as cplex or scip.
  • Make sure that the solver's binary directory is included in the path variable.
  • Alternatively, one can provide the absolute path of the solver as follows:
Solve(MathModel) Solves the given model and returns:
  • Ok of the solution if the execution is successfully completed,
  • experienced Err otherwise.

Assume we have just tried to solve the model.

C#
ISolver solver = new X(); // where X : ISolver
var resSolution = await solver.Solve(model);

The result of the solution, resSolution here, can be used in different ways ().

#1: Handle error case and Unwrap

C#
if (resSolution.IsErr)
{
    // do something with the error:
    // * return a proper result
    // * throw an exception using the error message 'resSolution.ErrorMessage().Unwrap()'
}
MathModelSolution solution = resSolution.Unwrap();
// use the solution

#2: Use ThrowIfErr shorthand and Unwrap

C#
MathModelSolution solution = resSolution.ThrowIfErr().Unwrap();
// use the solution

#3: Map the solution to Res of the desired result

C#
Res<double> resObjVal = resSolution.Map(soln => soln.ObjectiveValue.UnwrapOr(double.PositiveInfinity));
// note that soln.ObjectiveValue can be None if the resSolution.IsOk (solver worked properly);
// however, the model is infeasible.
Solve(CancellationToken, MathModel) Solves the given model with a cancellationToken and returns:
  • Ok of the solution if the execution is successfully completed,
  • experienced Err otherwise.

Assume we have just tried to solve the model.

C#
ISolver solver = new X(); // where X : ISolver
var resSolution = await solver.Solve(model);

The result of the solution, resSolution here, can be used in different ways ().

#1: Handle error case and Unwrap

C#
if (resSolution.IsErr)
{
    // do something with the error:
    // * return a proper result
    // * throw an exception using the error message 'resSolution.ErrorMessage().Unwrap()'
}
MathModelSolution solution = resSolution.Unwrap();
// use the solution

#2: Use ThrowIfErr shorthand and Unwrap

C#
MathModelSolution solution = resSolution.ThrowIfErr().Unwrap();
// use the solution

#3: Map the solution to Res of the desired result

C#
Res<double> resObjVal = resSolution.Map(soln => soln.ObjectiveValue.UnwrapOr(double.PositiveInfinity));
// note that soln.ObjectiveValue can be None if the resSolution.IsOk (solver worked properly);
// however, the model is infeasible.

See Also