You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
The easiest way is to run this in your crate directory
cargo add russcip --features bundled
for other installation methods, please check INSTALL.md.
Usage
We provide multiple examples listed here, and you can also check the documentation.
Accessing unsafe functions
The ffi module provides access to the raw C-API of SCIP. This can be used to call functions that are not wrapped in
the safe interface yet.
The scip_ptr unsafe function in the Model struct, which gives you access to the underlying SCIP raw pointer.
Each other wrapper struct has a similar function named inner, e.g. Variable::inner or Constraint::inner gives you
a *mut ffi::SCIP_VAR or *mut ffi::SCIP_CONS respectively.
Implementing Custom Plugins
Some of SCIP's plugins are imported to the rust interface as traits. Currently the implemented plugins are:
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.
Attaching custom data to SCIP instance
This is enabled with the help of the anymap crate. You can attach any data to the Model instance using the
set_data method, and retrieve it using the get_data and get_data_mut methods.
This is useful for communicating data between plugins, or storing other representations of the
variables/constraints in the model.
letmut model = Model::new();// Some user-defined datastructMyData{title:String,}let data = MyData{title:"My Data".to_string(),};// Attach the data to the model
model.set_data(data);// Retrieve the datalet data_ref = model.get_data::<MyData>().unwrap();assert_eq!(data_ref.title,"My Data");// Mutate the datalet data_mut = model.get_data_mut::<MyData>().unwrap();
data_mut.title = "New Title".to_string();assert_eq!(data_mut.title,"New Title");
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.