lp_types/constraints/
mod.rs

1mod display;
2use std::fmt::{Display, Formatter, Write};
3mod convert;
4#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
5pub enum OptimizeDirection {
6    Maximize,
7    Minimize,
8}
9
10#[derive(Debug)]
11pub enum LinearConstraint<T> {
12    None,
13    Greater { lower: T, inclusive: bool },
14    Less { upper: T, inclusive: bool },
15    Equal { value: T },
16    NotEqual { value: T },
17    Or { left: Box<LinearConstraint<T>>, right: Box<LinearConstraint<T>> },
18    And { left: Box<LinearConstraint<T>>, right: Box<LinearConstraint<T>> },
19}
20
21impl<T> Default for LinearConstraint<T> {
22    fn default() -> Self {
23        LinearConstraint::None
24    }
25}
26
27impl<T> LinearConstraint<T> {
28    pub fn ge(lower: T) -> Self {
29        LinearConstraint::Greater { lower, inclusive: false }
30    }
31    pub fn geq(lower: T) -> Self {
32        LinearConstraint::Greater { lower, inclusive: true }
33    }
34    pub fn le(upper: T) -> Self {
35        LinearConstraint::Less { upper, inclusive: false }
36    }
37    pub fn leq(upper: T) -> Self {
38        LinearConstraint::Less { upper, inclusive: true }
39    }
40    pub fn eq(value: T) -> Self {
41        LinearConstraint::Equal { value }
42    }
43    pub fn ne(value: T) -> Self {
44        LinearConstraint::NotEqual { value }
45    }
46}
47
48impl<T> LinearConstraint<T> {
49    pub fn contains(&self, value: &T) -> bool
50    where
51        T: PartialOrd,
52    {
53        match self {
54            LinearConstraint::None => true,
55            LinearConstraint::Greater { lower, inclusive } => {
56                if *inclusive {
57                    value >= lower
58                }
59                else {
60                    value > lower
61                }
62            }
63            LinearConstraint::Less { upper, inclusive } => {
64                if *inclusive {
65                    value <= upper
66                }
67                else {
68                    value < upper
69                }
70            }
71            LinearConstraint::Equal { value: v } => value == v,
72            LinearConstraint::NotEqual { value: v } => value != v,
73            LinearConstraint::Or { left, right } => left.contains(value) || right.contains(value),
74            LinearConstraint::And { left, right } => left.contains(value) && right.contains(value),
75        }
76    }
77}