Awesome
russcip
A safe Rust interface for SCIP. This crate also exposes access to the SCIP's C-API through the ffi
module.
The project is currently actively developed, issues/pull-requests are very welcome.
Installation
By running
cargo add russcip --features bundled
The bundled
feature will download a precompiled SCIP as part of the build process.
This is the easiest to get started with russcip, instead you could try the from-source
or if you want to link against your custom SCIP installation check the section below.
from-source
feature
To build SCIP from source, you can enable the from-source
feature. This will download the SCIP source code and build it as part of the build process.
cargo add russcip --features from-source
This is currently the most relaiable way to get a statically-linked build of SCIP. However, it only includes SCIP with SoPlex so can only handle linear constraints.
Custom SCIP installation
If no feature is not enabled, russcip
will look for a scip installation in the current conda environment,
to install SCIP using conda run the following command
conda install --channel conda-forge scip
Alternatively, you can specify the installation directory through the SCIPOPTDIR
environment variable.
russcip is tested against SCIP 9.0.0 but it might work for other versions depending on which functionality you use.
Examples
An example on how to model and solve an integer program can be found in the examples directory. To run the example, you can use the following command
cargo run --example create_and_solve
The raw
feature
You can enable this feature by specifying the feature in your Cargo.toml
[dependencies]
russcip = { features = ["raw"] }
This enables access to the scip_ptr
unsafe function in the Model
struct, which gives you access to the underlying SCIP raw pointer. This is can be used in combination with the ffi
module to call SCIP functions that are not wrapped yet in the safe interface.
Implementing Custom Plugins
Some of SCIP's plugins are imported to the rust interface as traits. Currently the implemented plugins are:
Name | File | Docs |
---|---|---|
Branching rule | branchrule.rs | docs |
Variable Pricer | pricer.rs | docs |
Event Handler | eventhdlr.rs | docs |
Primal Heuristic | heuristic.rs | docs |
To add a custom plugin to a SCIP Model
instance, you should implement its trait and call the corresponding include_{PLUGIN_NAME}
method. For examples on implementing the specific plugin trait you can check the tests in the corresponding files.
Contributing
Thinking about contributing to russcip? First of all thank you! You can check our issues page, there's a bunch of good_first_issues, or you can check our contribution guide. If you'd like to contribute and unsure what to do, or thinking about a big feature and want to discuss if it makes sense and what is the best way to do it? you could open a new issue/discussion or send me a quick email @mmghannam.
About SCIP
SCIP is currently one of the fastest non-commercial solvers for mixed integer programming (MIP) and mixed integer nonlinear programming (MINLP). It is also a framework for constraint integer programming and branch-cut-and-price. It allows for total control of the solution process and the access of detailed information down to the guts of the solver.