cplex_rs/parameters/tolerances/
mod.rs

1use ffi::{CPXPARAM_MIP_Tolerances_AbsMIPGap, CPXPARAM_MIP_Tolerances_MIPGap};
2
3use crate::errors::{self, Result};
4use crate::parameters::{private, Parameter, ParameterValue};
5
6impl private::Parameter for MIPGap {}
7impl private::Parameter for AbsMIPGap {}
8
9/// Relative MIP gap tolerance
10/// <https://www.ibm.com/docs/en/icos/12.9.0?topic=parameters-relative-mip-gap-tolerance>
11#[derive(Copy, Clone, Debug)]
12pub struct MIPGap(f64);
13
14impl MIPGap {
15    pub fn new(value: f64) -> Result<Self> {
16        if !(0.0..=1.0).contains(&value) {
17            return Err(errors::Input::from_message(
18                "CPXPARAM_MIP_Tolerances_MIPGap cannot be < 0.0 or > 1.0".to_string(),
19            )
20            .into());
21        }
22        Ok(Self(value))
23    }
24}
25
26impl Parameter for MIPGap {
27    fn value(&self) -> ParameterValue {
28        ParameterValue::Double(self.0)
29    }
30
31    fn id(&self) -> u32 {
32        CPXPARAM_MIP_Tolerances_MIPGap
33    }
34}
35
36/// Absolute MIP gap tolerance
37/// <https://www.ibm.com/docs/en/icos/12.9.0?topic=parameters-absolute-mip-gap-tolerance>
38#[derive(Copy, Clone, Debug)]
39pub struct AbsMIPGap(f64);
40
41impl AbsMIPGap {
42    pub fn new(value: f64) -> Result<Self> {
43        if value < 0.0 {
44            return Err(errors::Input::from_message(
45                "CPXPARAM_MIP_Tolerances_AbsMIPGap cannot be < 0.0".to_string(),
46            )
47            .into());
48        }
49        Ok(Self(value))
50    }
51}
52
53impl Parameter for AbsMIPGap {
54    fn value(&self) -> ParameterValue {
55        ParameterValue::Double(self.0)
56    }
57
58    fn id(&self) -> u32 {
59        CPXPARAM_MIP_Tolerances_AbsMIPGap
60    }
61}