1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use super::cutting_plane::OracleFeas;
use ndarray::prelude::*;

type Arr = Array1<f64>;

#[derive(Debug)]
struct MyOracle {}

impl OracleFeas<Arr> for MyOracle {
    type CutChoices = f64;

    /**
     * @brief
     *
     * @param[in] z
     * @return std::optional<Cut>
     */
    fn assess_feas(&mut self, z: &Arr) -> Option<(Arr, f64)> {
        let x = z[0];
        let y = z[1];

        // constraint 1: x + y <= 3
        let fj = x + y - 3.0;
        if fj > 0.0 {
            return Some((array![1.0, 1.0], fj));
        }
        // constraint 2: x - y >= 1
        let fj = -x + y + 1.0;
        if fj > 0.0 {
            return Some((array![-1.0, 1.0], fj));
        }
        None
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::cutting_plane::{cutting_plane_feas, Options};
    use crate::ell::Ell;
    use ndarray::array;

    // use super::ell_stable::EllStable;

    #[test]
    pub fn test_example2() {
        let mut ell = Ell::new(array![10.0, 10.0], array![0.0, 0.0]);
        let mut oracle = MyOracle {};
        let options = Options {
            max_iters: 2000,
            tol: 1e-12,
        };
        let (feasible, _niter) = cutting_plane_feas(&mut oracle, &mut ell, &options);
        assert!(feasible);
    }
}