Skip to content

scipopt/russcip

Repository files navigation

russcip

tests coverage

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

An example on how to model and solve an integer program can be found in the examples directory.

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:

Name File Docs
Branching rule branchrule.rs docs
Variable Pricer pricer.rs docs
Event Handler eventhdlr.rs docs
Primal Heuristic heuristic.rs docs
Separator separator.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.