lp_types/constraints/
mod.rs1mod 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}