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 std::ffi::CString;
14    use super::*;
15    use std::mem::MaybeUninit;
16
17    #[test]
18    fn test_create() {
19        let mut scip_ptr = MaybeUninit::uninit();
20        unsafe { SCIPcreate(scip_ptr.as_mut_ptr()) };
21        let mut scip_ptr = unsafe { scip_ptr.assume_init() };
22
23        // include default plugins
24        unsafe { SCIPincludeDefaultPlugins(scip_ptr) };
25
26        let name = CString::new("test").unwrap();
27        unsafe { SCIPcreateProbBasic(scip_ptr, name.as_ptr()) };
28
29        // add a variable
30        let mut var_ptr = MaybeUninit::uninit();
31        unsafe {
32            SCIPcreateVarBasic(
33                scip_ptr,
34                var_ptr.as_mut_ptr(),
35                CString::new("x").unwrap().as_ptr(),
36                0.0,
37                1.0,
38                1.0,
39                SCIP_Vartype_SCIP_VARTYPE_BINARY,
40            )
41        };
42        let mut var_ptr = unsafe { var_ptr.assume_init() };
43        unsafe { SCIPaddVar(scip_ptr, var_ptr) };
44
45        // add a constraint
46        let mut cons_ptr = MaybeUninit::uninit();
47        unsafe {
48            SCIPcreateConsBasicLinear(
49                scip_ptr,
50                cons_ptr.as_mut_ptr(),
51                CString::new("c").unwrap().as_ptr(),
52                1,
53                &mut var_ptr,
54                &mut 1.0,
55                1.0,
56                1.0,
57            )
58        };
59        let mut cons_ptr = unsafe { cons_ptr.assume_init() };
60        unsafe { SCIPaddCons(scip_ptr, cons_ptr) };
61
62        unsafe { SCIPsolve(scip_ptr) };
63
64        let obj_val = unsafe { SCIPgetPrimalbound(scip_ptr) };
65        let eps = unsafe { SCIPfeastol(scip_ptr) };
66        assert!((obj_val - 1.0).abs() < eps);
67
68        unsafe { SCIPreleaseVar(scip_ptr, &mut var_ptr) };
69        unsafe { SCIPreleaseCons(scip_ptr, &mut cons_ptr) };
70        unsafe { SCIPfree(&mut scip_ptr) };
71    }
72}