use ffi::{
CPXPARAM_Barrier_Limits_Corrections, CPXPARAM_Barrier_Limits_Growth,
CPXPARAM_Barrier_Limits_Iteration, CPXPARAM_Barrier_Limits_ObjRange,
};
use crate::errors::{self, Result};
use crate::parameters::{private, Parameter, ParameterValue};
impl private::Parameter for Growth {}
impl private::Parameter for Iteration {}
impl private::Parameter for Corrections {}
impl private::Parameter for ObjRange {}
impl private::Parameter for Ordering {}
#[derive(Copy, Clone, Debug)]
pub struct Growth(f64);
impl Growth {
pub fn new(value: f64) -> Result<Self> {
if value < 1.0 {
return Err(errors::Input::from_message(
"CPXPARAM_Barrier_Limits_Growth cannot be < 1.0".to_string(),
)
.into());
}
Ok(Self(value))
}
}
impl Parameter for Growth {
fn value(&self) -> ParameterValue {
ParameterValue::Double(self.0)
}
fn id(&self) -> u32 {
CPXPARAM_Barrier_Limits_Growth
}
}
#[derive(Copy, Clone, Debug)]
pub struct Iteration(pub u64);
impl Parameter for Iteration {
fn value(&self) -> ParameterValue {
ParameterValue::Long(self.0 as i64)
}
fn id(&self) -> u32 {
CPXPARAM_Barrier_Limits_Iteration
}
}
#[derive(Copy, Clone, Debug)]
pub enum Corrections {
Automatic,
Number(u64),
}
impl Parameter for Corrections {
fn value(&self) -> ParameterValue {
ParameterValue::Long(match self {
Self::Automatic => -1,
&Self::Number(n) => n as i64,
})
}
fn id(&self) -> u32 {
CPXPARAM_Barrier_Limits_Corrections
}
}
#[derive(Copy, Clone, Debug)]
pub struct ObjRange(f64);
impl ObjRange {
pub fn new(value: f64) -> Result<Self> {
if value < 0.0 {
return Err(errors::Input::from_message(
"CPXPARAM_Barrier_Limits_ObjRange cannot be < 0.0".to_string(),
)
.into());
}
Ok(Self(value))
}
}
impl Parameter for ObjRange {
fn value(&self) -> ParameterValue {
ParameterValue::Double(self.0)
}
fn id(&self) -> u32 {
CPXPARAM_Barrier_Limits_ObjRange
}
}
#[derive(Copy, Clone, Debug)]
pub enum Ordering {
Automatic,
ApproximateMinimumDegree,
ApproximateMinimumFill,
NestedDissection,
}
impl Parameter for Ordering {
fn value(&self) -> ParameterValue {
ParameterValue::Integer(match self {
Self::Automatic => 0,
Self::ApproximateMinimumDegree => 1,
Self::ApproximateMinimumFill => 2,
Self::NestedDissection => 3,
})
}
fn id(&self) -> u32 {
CPXPARAM_Barrier_Limits_Corrections
}
}