use crate::*; use ndarray::arr2; #[test] fn build_simplex_table_1() { let program = Simplex::minimize(&vec![-3.0, 1.0, -2.0]).with(vec![ SimplexConstraint::LessThan(vec![2.0, -2.0, 3.0], 5.0), SimplexConstraint::LessThan(vec![1.0, 1.0, -1.0], 3.0), SimplexConstraint::LessThan(vec![1.0, -1.0, 1.0], 2.0), ]); let simplex = program.unwrap(); assert_eq!( simplex.table, arr2(&[ [ 1.0, 3.0, -1.0, 2.0, 0.0, f64::MIN, 0.0, f64::MIN, 0.0, f64::MIN, 0.0 ], [0.0, 2.0, -2.0, 3.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 5.0], [0.0, 1.0, 1.0, -1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 3.0], [0.0, 1.0, -1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 2.0] ]) ); assert_eq!(simplex.base, vec![5, 7, 9]); assert_eq!(simplex.vars.len(), 9); } #[test] fn build_simplex_table_2() { let simplex = Simplex::minimize(&vec![-1.0, 1.0]) .with(vec![ SimplexConstraint::LessThan(vec![3.0, -4.0], 12.0), SimplexConstraint::LessThan(vec![1.0, -1.0], 10.0), ]) .unwrap(); assert_eq!( simplex.table, arr2(&[ [1.0, 1.0, -1.0, 0.0, f64::MIN, 0.0, f64::MIN, 0.0], [0.0, 3.0, -4.0, 1.0, 1.0, 0.0, 0.0, 12.0], [0.0, 1.0, -1.0, 0.0, 0.0, 1.0, 1.0, 10.0] ]) ); assert_eq!(simplex.base, vec![4, 6]); assert_eq!(simplex.vars.len(), 6); } #[test] fn build_simplex_table_3() { let simplex = Simplex::minimize(&vec![-1.0, 2.0]) .with(vec![ SimplexConstraint::GreaterThan(vec![1.0, 1.0], 2.0), SimplexConstraint::GreaterThan(vec![-1.0, 1.0], 1.0), SimplexConstraint::LessThan(vec![0.0, 1.0], 3.0), ]) .unwrap(); assert_eq!( simplex.table, arr2(&[ [ 1.0, 1.0, -2.0, 0.0, f64::MIN, 0.0, f64::MIN, 0.0, f64::MIN, 0.0 ], [0.0, 1.0, 1.0, -1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 2.0], [0.0, -1.0, 1.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0, 1.0], [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 3.0] ]) ); assert_eq!(simplex.base, vec![4, 6, 8]); assert_eq!(simplex.vars.len(), 8); } #[test] fn get_entry_var_1() { let program = Simplex::minimize(&vec![-3.0, 1.0, -2.0]).with(vec![ SimplexConstraint::LessThan(vec![2.0, -2.0, 3.0], 5.0), SimplexConstraint::LessThan(vec![1.0, 1.0, -1.0], 3.0), SimplexConstraint::LessThan(vec![1.0, -1.0, 1.0], 2.0), ]); let simplex = program.unwrap(); assert_eq!(simplex.get_entry_var(), Some(1)); } #[test] fn get_entry_var_2() { let simplex = Simplex::minimize(&vec![-1.0, 1.0]) .with(vec![ SimplexConstraint::LessThan(vec![3.0, -4.0], 12.0), SimplexConstraint::LessThan(vec![1.0, -1.0], 10.0), ]) .unwrap(); assert_eq!(simplex.get_entry_var(), Some(1)); } #[test] fn get_entry_var_3() { let simplex = Simplex::minimize(&vec![-1.0, 2.0]) .with(vec![ SimplexConstraint::GreaterThan(vec![1.0, 1.0], 2.0), SimplexConstraint::GreaterThan(vec![-1.0, 1.0], 1.0), SimplexConstraint::LessThan(vec![0.0, 1.0], 3.0), ]) .unwrap(); assert_eq!(simplex.get_entry_var(), Some(1)); } #[test] fn get_exit_var_1() { let program = Simplex::minimize(&vec![-3.0, 1.0, -2.0]).with(vec![ SimplexConstraint::LessThan(vec![2.0, -2.0, 3.0], 5.0), SimplexConstraint::LessThan(vec![1.0, 1.0, -1.0], 3.0), SimplexConstraint::LessThan(vec![1.0, -1.0, 1.0], 2.0), ]); let simplex = program.unwrap(); assert_eq!(simplex.get_exit_var(1), Some(9)); } #[test] fn get_exit_var_2() { let simplex = Simplex::minimize(&vec![-1.0, 1.0]) .with(vec![ SimplexConstraint::LessThan(vec![3.0, -4.0], 12.0), SimplexConstraint::LessThan(vec![1.0, -1.0], 10.0), ]) .unwrap(); assert_eq!(simplex.get_exit_var(1), Some(4)); } #[test] fn get_exit_var_3() { let simplex = Simplex::minimize(&vec![-1.0, 2.0]) .with(vec![ SimplexConstraint::GreaterThan(vec![1.0, 1.0], 2.0), SimplexConstraint::GreaterThan(vec![-1.0, 1.0], 1.0), SimplexConstraint::LessThan(vec![0.0, 1.0], 3.0), ]) .unwrap(); assert_eq!(simplex.get_exit_var(1), Some(4)); } #[test] fn step_example_1() { let program = Simplex::minimize(&vec![-3.0, 1.0, -2.0]).with(vec![ SimplexConstraint::LessThan(vec![2.0, -2.0, 3.0], 5.0), SimplexConstraint::LessThan(vec![1.0, 1.0, -1.0], 3.0), SimplexConstraint::LessThan(vec![1.0, -1.0, 1.0], 2.0), ]); let mut simplex = program.unwrap(); let entry_var = simplex.get_entry_var().unwrap(); let exit_var = simplex.get_exit_var(entry_var).unwrap(); simplex.step(entry_var, exit_var); assert_eq!(simplex.base, vec![5, 7, 1]); assert_eq!(simplex.table.column(10), arr1(&[-6.0, 1.0, 1.0, 2.0])); } #[test] fn solve_example_1() { let program = Simplex::minimize(&vec![-3.0, 1.0, -2.0]).with(vec![ SimplexConstraint::LessThan(vec![2.0, -2.0, 3.0], 5.0), SimplexConstraint::LessThan(vec![1.0, 1.0, -1.0], 3.0), SimplexConstraint::LessThan(vec![1.0, -1.0, 1.0], 2.0), ]); let mut simplex = program.unwrap(); assert_eq!(simplex.solve(), SimplexOutput::MultipleOptimum(-8.0)); assert_eq!(simplex.get_var(1), Some(2.5)); assert_eq!(simplex.get_var(2), Some(1.5)); assert_eq!(simplex.get_var(3), Some(1.0)); } #[test] fn solve_example_2() { let mut simplex = Simplex::minimize(&vec![-1.0, 1.0]) .with(vec![ SimplexConstraint::LessThan(vec![3.0, -4.0], 12.0), SimplexConstraint::LessThan(vec![1.0, -1.0], 10.0), ]) .unwrap(); assert_eq!(simplex.solve(), SimplexOutput::MultipleOptimum(-10.0)); } #[test] fn solve_example_3() { let mut simplex = Simplex::minimize(&vec![1.0, -2.0]) .with(vec![ SimplexConstraint::GreaterThan(vec![1.0, 1.0], 2.0), SimplexConstraint::GreaterThan(vec![-1.0, 1.0], 1.0), SimplexConstraint::LessThan(vec![0.0, 1.0], 3.0), ]) .unwrap(); assert_eq!(simplex.solve(), SimplexOutput::MultipleOptimum(-6.0)); } #[test] fn solve_example_4() { let mut simplex = Simplex::minimize(&vec![-2.0, -3.0, -4.0]) .with(vec![ SimplexConstraint::LessThan(vec![3.0, 2.0, 1.0], 10.0), SimplexConstraint::LessThan(vec![2.0, 5.0, 3.0], 15.0), ]) .unwrap(); assert_eq!(simplex.solve(), SimplexOutput::MultipleOptimum(-20.0)); assert_eq!(simplex.get_var(1), Some(0.0)); assert_eq!(simplex.get_var(2), Some(0.0)); assert_eq!(simplex.get_var(3), Some(5.0)); } #[test] fn solve_example_5() { let mut simplex = Simplex::minimize(&vec![-1.0]) .with(vec![SimplexConstraint::LessThan(vec![1.0], 1.0)]) .unwrap(); assert_eq!(simplex.solve(), SimplexOutput::MultipleOptimum(-1.0)); assert_eq!(simplex.get_var(1), Some(1.0)); }