lp-modeler
This project provides a mathematical programming modeling library for Rust.
An optimization problem (e.g. an integer or linear programme) can be formulated using familiar Rust syntax (see examples), and written into a universal LP model format. This can then be processed by a mixed integer programming solver. Presently supported solvers are; COIN-OR CBC, Gurobi and GLPK.
This project is inspired by COIN-OR PuLP which provides such a library for Python.
Usage
These examples present a formulation (in LP model format), and demonstrate the Rust code required to generate this formulation. Code can be found in tests/problems.rs.
Example 1 - Simple model
Formulation
\ One Problem
Maximize
10 a + 20 b
Subject To
c1: 500 a + 1200 b + 1500 c <= 10000
c2: a - b <= 0
Generals
a c b
End
Rust code
extern crate lp_modeler;
use ;
use *;
To generate the LP file which is shown above:
problem.write_lp
Example 2 - An Assignment model
Formulation
This more complex formulation programmatically generates the expressions for the objective and constraints.
We wish to maximise the quality of the pairing between a group of men and women, based on their mutual compatibility score. Each man must be assigned to exactly one woman, and vice versa.
Compatibility Score Matrix
| Abe | Ben | Cam | |
|---|---|---|---|
| Deb | 50 | 60 | 60 |
| Eve | 75 | 95 | 70 |
| Fay | 75 | 80 | 80 |
This problem is formulated as an Assignment Problem.
Rust code
extern crate lp_modeler;
use HashMap;
use *;
use ;
This code computes the objective function value and processes the output to print the chosen pairing of men and women:
Status: Optimal
Objective Value: 230
B_E = 1
C_D = 1
A_F = 1
Changelog
0.4.3
- Add a native coin-or impl (NativeCBCSolver) to call CoinOR CBC trough the C API.
0.4.2
- Fix incorrect simplification of (expr-c1)+c2
0.4.1
- Fix failed cbc parsing on infeasible solution
0.4.0
-
Improve modules
- Remove maplit dependency
- All the features to write expressions and constraints are put into
dslmodule use lp_modeler::dsl::*is enough to write a systemuse lp_modeler::solvers::*is always used to choose a solver
-
Add a
sum()method for vector ofLpExpression/Into<LpExpression>instead oflp_sum()function -
Add a
sum()function used in the form:problem += sum ).le;
0.3.3
- Fix and improve error message for GLPK solution parsing
- Format code with rust fmt
0.3.3
- Add new examples in documentation
- Improve 0.0 comparison
0.3.1
- Add distributive property (ex:
3 * (a + b + 2) = 3*a + 3*b + 6) - Add trivial rules (ex:
3 * a * 0 = 0or3 + 0 = 3) - Add commutative property to simplify some computations
- Support for GLPK
0.3.0
- Functional lib with simple algebra properties
Contributors
Main contributor
- Joel Cavat (jcavat)
All contributions :heart:
- Thomas Vincent (tvincent2)
- Antony Phillips (aphi)
- Florian B. (Lesstat)
- Amila Welihinda (amilajack)
- (zappolowski)
- Yisu Rem Wang (remysucre)
- Tony Cox (tony-cox)
- EdorianDark
- Colman Humphrey (ColmanHumphrey)
Further work
- Parse and provide the objective value
- Config for lp_solve and CPLEX
- It would be great to use some constraint for binary variables such as
- a && b which is the constraint a + b = 2
- a || b which is the constraint a + b >= 1
- a <=> b which is the constraint a = b
- a => b which is the constraint a <= b
- All these cases are easy with two constraints but more complex with expressions
- ...