scip_sys/
lib.rs

1//! This crate exposes automatically generated raw bindings to [SCIP](https://scipopt.org/)'s C-API. The documentation is automatically generated from the C-API docs, for further info please refer to SCIP's original [documentation](https://scipopt.org/doc/html/).
2
3#![allow(non_upper_case_globals)]
4#![allow(non_camel_case_types)]
5#![allow(non_snake_case)]
6#![allow(dead_code)]
7#![allow(improper_ctypes)]
8
9include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
10
11#[cfg(test)]
12mod tests {
13    use super::*;
14    use std::mem::MaybeUninit;
15
16    #[test]
17    fn test_create() {
18        let mut scip_ptr = MaybeUninit::uninit();
19        unsafe { SCIPcreate(scip_ptr.as_mut_ptr()) };
20        let mut scip_ptr = unsafe { scip_ptr.assume_init() };
21
22        // include default plugins
23        unsafe { SCIPincludeDefaultPlugins(scip_ptr) };
24
25        unsafe { SCIPcreateProbBasic(scip_ptr, "test".as_ptr() as *const i8) };
26
27        // add a variable
28        let mut var_ptr = MaybeUninit::uninit();
29        unsafe {
30            SCIPcreateVarBasic(
31                scip_ptr,
32                var_ptr.as_mut_ptr(),
33                "x".as_ptr() as *const i8,
34                0.0,
35                1.0,
36                1.0,
37                SCIP_Vartype_SCIP_VARTYPE_BINARY,
38            )
39        };
40        let mut var_ptr = unsafe { var_ptr.assume_init() };
41        unsafe { SCIPaddVar(scip_ptr, var_ptr) };
42
43        // add a constraint
44        let mut cons_ptr = MaybeUninit::uninit();
45        unsafe {
46            SCIPcreateConsBasicLinear(
47                scip_ptr,
48                cons_ptr.as_mut_ptr(),
49                "c".as_ptr() as *const i8,
50                1,
51                &mut var_ptr,
52                &mut 1.0,
53                1.0,
54                1.0,
55            )
56        };
57        let mut cons_ptr = unsafe { cons_ptr.assume_init() };
58        unsafe { SCIPaddCons(scip_ptr, cons_ptr) };
59
60        unsafe { SCIPsolve(scip_ptr) };
61
62        let obj_val = unsafe { SCIPgetPrimalbound(scip_ptr) };
63        let eps = unsafe { SCIPfeastol(scip_ptr) };
64        assert!((obj_val - 1.0).abs() < eps);
65
66        unsafe { SCIPreleaseVar(scip_ptr, &mut var_ptr) };
67        unsafe { SCIPreleaseCons(scip_ptr, &mut cons_ptr) };
68        unsafe { SCIPfree(&mut scip_ptr) };
69    }
70}