
lp_probe(+Handle, +Probes, -Cost)

   Invoke external solver, probing the problem temporarily modified by the probe specifications.

Arguments
   Handle              Handle to existing solver state
   Probes              Temporary probe specification(s)
   Cost                Value of solution

Type
   library(eplex)

Description

   Similar to lp_solve/2, but the problem is first temporarily modified
   as specified in Probes. Probes is a list of one or more probe
   specifications that specifies how the problem is modified. After the call
   to this predicate, the problem is restored for the external
   solver. However, the results from the probe (obtainable from
   lp_var_get/4 and lp_get/3) are retained.

   The following probe specifications are allowed:

    min(Expr)/max(Expr)
        Minimise/maximise the problem with the objective function Expr.
        Only existing problem variables can be given in Expr. Cannot be
        used in conjunction with objsense, objexpr or perturb_obj.
    objsense(Sense)
        Sense is either min or max. Solves the problem with the original
        objective function, but with the sense given in Sense rather than
        that specified at setup. If only the sense of the objective is to 
        be changed, this changes the objective more efficiently than using
        min(Expr)/max(Expr). Cannot be used in conjunction with min/max.
    objexpr(Expr)
        Optimise the problem with respect to the objective function Expr,
        without changing the optimisation direction specified at problem
        setup. Cannot be used in conjunction with min/max or perturb_obj.
    perturb_obj(ObjDeltas)
        Perturb the existing linear objective coefficients as specified by
        ObjDeltas. ObjDeltas is a (possibly empty) list of specifications
        Var : Delta, where Var is a problem variable and Delta is the
        amount its existing objective coefficient should be changed by. For
        example, if the existing objective is 2*X + 3*Y + Z, 
        perturb_obj([X : 1, Y : -0.5]) will modify the objective to 
        3*X + 2.5*Y + Z for the probe. If a variable occurs more than once in
        ObjDeltas, the change to the objective coefficient is cumulative.
        Perturb_obj is not strictly needed, as its effect can be achieved
        by constructing the whole objective and then probing with that.
        However, this can be expensive if most of the objective stays 
        unchanged, with only a few of its coefficients changed. It is 
        recommended that perturb_obj probe be used in such cases. 
        Cannot be used in conjunction with objexpr or min/max.
    rhscoeffs(RhsCoeffs)
        Alter the rhs coefficients of the matrix as specified by RhsCoeffs.
        RhsCoeffs is a (possibly empty) list of rhs coefficient
        specifications of the form Idx : Rhs, where Idx is the index of the
        expandable constraint obtained from using lp_add_constraints/4, and
        Rhs is the value for the right-hand side constant to use during the
        probe. Any constraints not specified in RhsCoeffs remain unchanged
        during the probe. If Idx occurs more than once in RhsCoeffs, the
        result is undefined.
    bounds(BoundsChanges)
        Alter the bounds of problem variables as specified by
        BoundsChanges. BoundsChanges is a (possibly empty) list of bounds
        changes of the form Var $:: Lo..Hi, where Var is a problem variable
        and Lo and Hi are the new lower and upper bounds to use for the
        variable during the probe. Unlike normal bound changes, the bounds
        can be widened as well narrowed, although failure will still occur
        if Hi < Lo. Variables not specified in BoundsChanges retain their
        bounds during the probe. If Var occurs more than once in 
        BoundsChanges, the result is undefined.
    fixed
        The problem is solved as an LP problem by `fixing' the integer
        variables to their optimal MIP solution values. If there is an
        existing MIP solution for the problem, eplex will try to use that;
        otherwise, a MIP solution is obtained first.
        `Fixed' probing is useful for providing reduced costs for
        MIP problems. Note that reduced costs for the variables will only be
        available if the reduced_cost option for the problem is set to yes
        (this can be done either at problem setup, or by using
        eplex_set/2). For a problem without integer variables, the original
        problem is solved without change.  Note that this probe
        specification is not available if the mip_use_copy option is set to
        no for external solvers that cannot modify a MIP problem.  Cannot
        be used in conjunction with `relaxed'.
    relaxed
        The problem is solved as an LP problem by relaxing all the integer
        constraints.  For a problem with integer variables, this should be
        equivalent to the initial relaxation solved at the start of the MIP
        search. Depending on the solver, the discreteness of the integer
        variables may still be taken into account during presolve. To
        ensure that the problem solved is exactly the LP problem without
        any integer constraints, presolve should be off. For a problem
        without integer variables, the original problem is solved without
        change. Note that this probe specification is not available if the
        mip_use_copy option is set to no for external solvers that cannot
        modify a MIP problem. Cannot be used in conjunction with `fixed'.




Fail Conditions
   External solver was unable to find a solution, or bounds probe used and the specified interval for some variable is empty

Exceptions
     5 --- EplexInstance does not have a solver setup for it.
   eplex_suboptimal --- Solution was found, but is possibly suboptimal
   eplex_unbounded --- Problem is unbounded, no solution values
   eplex_unknown --- Result is unknown (infeasible or unbounded)
   eplex_abort --- External solver aborted for some reason
   abort --- Incorrect specification for the probe(s)
     6 --- mip_use_copy option was set to no (solver dependent) for probes that require yes.
    40 --- Handle not valid: solver state had been destroyed by cleanup

See Also
   lp_solve / 2, lp_setup / 4, lp_var_get / 4, lp_get / 3, lp_set / 3, lp_add_constraints / 4
