use crate::{
coeff, linear, mps::*, Bound, Constraint, ConstraintID, DecisionVariable, Function, Instance,
Sense, VariableID,
};
use maplit::btreemap;
#[test]
fn test_unused_variable_filtering() {
let decision_variables = btreemap! {
VariableID::from(0) => DecisionVariable::new(
VariableID::from(0),
crate::decision_variable::Kind::Continuous,
Bound::new(0.0, 10.0).unwrap(),
None,
crate::ATol::default()
).unwrap(),
VariableID::from(1) => DecisionVariable::new(
VariableID::from(1),
crate::decision_variable::Kind::Continuous,
Bound::new(0.0, 10.0).unwrap(),
None,
crate::ATol::default()
).unwrap(),
VariableID::from(2) => DecisionVariable::new(
VariableID::from(2),
crate::decision_variable::Kind::Continuous,
Bound::new(0.0, 10.0).unwrap(),
None,
crate::ATol::default()
).unwrap(), };
let objective = Function::from(linear!(0));
let constraints = btreemap! {
ConstraintID::from(0) => Constraint::less_than_or_equal_to_zero(
ConstraintID::from(0),
Function::from(linear!(1) + coeff!(-5.0))
),
};
let instance =
Instance::new(Sense::Minimize, objective, decision_variables, constraints).unwrap();
let mut buffer = Vec::new();
format::format(&instance, &mut buffer).unwrap();
let loaded_instance = parse(&buffer[..]).unwrap();
assert_eq!(loaded_instance.decision_variables().len(), 2);
let var_ids: Vec<u64> = loaded_instance
.decision_variables()
.keys()
.map(|id| id.into_inner())
.collect();
assert!(var_ids.contains(&0)); assert!(var_ids.contains(&1)); assert!(!var_ids.contains(&2)); }
#[test]
fn test_removed_constraint_variable_preservation() {
let decision_variables = btreemap! {
VariableID::from(0) => DecisionVariable::new(
VariableID::from(0),
crate::decision_variable::Kind::Continuous,
Bound::new(0.0, 10.0).unwrap(),
None,
crate::ATol::default()
).unwrap(),
VariableID::from(1) => DecisionVariable::new(
VariableID::from(1),
crate::decision_variable::Kind::Continuous,
Bound::new(0.0, 10.0).unwrap(),
None,
crate::ATol::default()
).unwrap(),
};
let objective = Function::from(linear!(0));
let constraints = btreemap! {
ConstraintID::from(100) => Constraint::less_than_or_equal_to_zero(
ConstraintID::from(100),
Function::from(linear!(1) + coeff!(-3.0))
),
};
let mut instance =
Instance::new(Sense::Minimize, objective, decision_variables, constraints).unwrap();
instance
.relax_constraint(ConstraintID::from(100), "test_removal".to_string(), [])
.unwrap();
let mut buffer = Vec::new();
format::format(&instance, &mut buffer).unwrap();
let loaded_instance = parse(&buffer[..]).unwrap();
let var_ids: Vec<u64> = loaded_instance
.decision_variables()
.keys()
.map(|id| id.into_inner())
.collect();
assert_eq!(loaded_instance.decision_variables().len(), 1);
assert_eq!(var_ids, vec![0]);
assert_eq!(loaded_instance.constraints().len(), 0);
assert_eq!(loaded_instance.removed_constraints().len(), 0);
assert_eq!(instance.removed_constraints().len(), 1);
}
#[test]
fn test_removed_constraint_information_loss() {
let decision_variables = btreemap! {
VariableID::from(0) => DecisionVariable::new(
VariableID::from(0),
crate::decision_variable::Kind::Continuous,
Bound::new(0.0, 10.0).unwrap(),
None,
crate::ATol::default()
).unwrap(),
};
let objective = Function::from(linear!(0));
let constraints = btreemap! {
ConstraintID::from(0) => Constraint::less_than_or_equal_to_zero(
ConstraintID::from(0),
Function::from(linear!(0) + coeff!(-5.0)) ),
ConstraintID::from(1) => Constraint::equal_to_zero(
ConstraintID::from(1),
Function::from(coeff!(2.0) * linear!(0) + coeff!(-10.0)) ),
};
let mut instance =
Instance::new(Sense::Minimize, objective, decision_variables, constraints).unwrap();
instance
.relax_constraint(ConstraintID::from(1), "redundant".to_string(), [])
.unwrap();
let mut buffer = Vec::new();
format::format(&instance, &mut buffer).unwrap();
let loaded_instance = parse(&buffer[..]).unwrap();
assert_eq!(loaded_instance.constraints().len(), 1);
let first_constraint = loaded_instance.constraints().values().next().unwrap();
assert_eq!(
first_constraint.equality,
crate::Equality::LessThanOrEqualToZero
);
assert_eq!(loaded_instance.removed_constraints().len(), 0);
assert_eq!(instance.constraints().len(), 1); assert_eq!(instance.removed_constraints().len(), 1); }