straindesign.solver_interface

Unified solver interface for LPs and MILPs (MILP_LP)

Module Contents

class straindesign.solver_interface.MILP_LP(**kwargs)[source]

Bases: object

Unified MILP and LP interface

This class is a wrapper for several solver interfaces to offer unique and consistent bindings for the construction and manipulation of MILPs and LPs in an vector-matrix-based manner and their solution.

Accepts a (mixed integer) linear problem in the form:

minimize(c), subject to: A_ineq * x <= b_ineq, A_eq * x = b_eq, lb <= x <= ub, forall(i) type(x_i) = vtype(i) (continous, binary, integer), indicator constraints: x(j) = [0|1] -> a_indic * x [<=|=|>=] b_indic

Please ensure that the number of variables and (in)equalities is consistent

Example

milp = MILP_LP(c, A_ineq, b_ineq, A_eq, b_eq, lb, ub, vtype, indic_constr)

Parameters:
  • c (list of float) – (Default: None) The objective vector (Objective sense: minimization).

  • A_ineq (sparse.csr_matrix) – (Default: None) A coefficient matrix of the static inequalities.

  • b_ineq (list of float) – (Default: None) The right hand side of the static inequalities.

  • A_eq (sparse.csr_matrix) – (Default: None) A coefficient matrix of the static equalities.

  • b_eq (list of float) – (Default: None) The right hand side of the static equalities.

  • lb (list of float) – (Default: None) The lower variable bounds.

  • ub (list of float) – (Default: None) The upper variable bounds.

  • vtype (str) – (Default: None) A character string that specifies the type of each variable: ‘c’ontinous, ‘b’inary or ‘i’nteger

  • indic_constr (IndicatorConstraints) – (Default: None) A set of indicator constraints stored in an object of IndicatorConstraints (see reference manual or docstring).

  • M (int) – (Default: None) A large value that is used in the translation of indicator constraints to bigM-constraints for solvers that do not natively support them. If no value is provided, 1000 is used.

  • solver (str) – (Default: taken from avail_solvers) Solver backend that should be used: ‘cplex’, ‘gurobi’, ‘glpk’ or ‘scip’

  • skip_checks (bool) – (Default: False) Upon MILP construction, the dimensions of all provided vectors and matrices are checked to verify their consistency. If skip_checks=True is set, these checks are skipped.

  • tlim (float) – Solution time limit in seconds.

  • Returns

    (MILP_LP):

    A MILP/LP solver interface class.

add_eq_constraints(A_eq, b_eq)[source]

Add equality constraints to the model

Additional equality constraints have the form A_eq * x = b_eq. The number of columns in A_eq must match with the number of variables x in the problem.

Parameters:
  • A_eq (sparse.csr_matrix) – The coefficient matrix

  • b_eq (list of float) – The right hand side vector

add_ineq_constraints(A_ineq, b_ineq)[source]

Add inequality constraints to the model

Additional inequality constraints have the form A_ineq * x <= b_ineq. The number of columns in A_ineq must match with the number of variables x in the problem.

Parameters:
  • A_ineq (sparse.csr_matrix) – The coefficient matrix

  • b_ineq (list of float) – The right hand side vector

clear_objective()[source]

Clear objective

Set all coefficients in the objective vector to 0.

populate(n) Tuple[List, float, float][source]

Generate a solution pool for MILPs

Example

sols_x, optim, status = cplex.populate()

Returns:

(Tuple[List of lists, float, float])

solution_vectors, optimal_value, optimization_status

set_ineq_constraint(idx, a_ineq, b_ineq)[source]

Replace a specific inequality constraint

Replace the constraint with the index idx with the constraint a_ineq*x ~ b_ineq

Parameters:
  • idx (int) – Index of the constraint

  • a_ineq (list of float) – The coefficient vector

  • b_ineq (float) – The right hand side value

set_objective(c)[source]

Set the objective function with a vector

set_objective_idx(C)[source]

Set the objective function with index-value pairs

e.g.: C=[[1, 1.0], [4,-0.2]]

set_time_limit(t)[source]

Set the computation time limit (in seconds)

set_ub(ub)[source]

Set the upper bounds to a given vector

slim_solve() float[source]

Solve the MILP or LP, but return only the optimal value

Example

optim = cplex.slim_solve()

Returns:

(float)

Optimum value of the objective function.

solve() Tuple[List, float, float][source]

Solve the MILP or LP

Example

sol_x, optim, status = milp.solve()

Returns:

(Tuple[List, float, float])

solution_vector, optimal_value, optimization_status