def test_call(self): g = PiecewiseLinearFunction([1, 2, 3], [1, 2, 1]) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 1.5) self.assertEqual(f(2), 2) self.assertEqual(f(2.5), 1.5) self.assertEqual(f(3), 1) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(4.1) # step function g = PiecewiseLinearFunction([1, 2, 2, 3], [1, 2, 3, 4]) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 1.5) self.assertEqual(f(2), 2) # lower semicontinuous self.assertEqual(f(2.5), 3.5) self.assertEqual(f(3), 4) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(3.1) # another step function g = PiecewiseLinearFunction([1, 1, 2, 3], [1, 2, 3, 4], equal_slopes_tolerance=-1) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False, equal_slopes_tolerance=-1) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 2.5) self.assertEqual(f(2), 3) # lower semicontinuous self.assertEqual(f(2.5), 3.5) self.assertEqual(f(3), 4) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(3.1)
def test_bad_init(self): # lists not the same length with self.assertRaises(ValueError): PiecewiseLinearFunction([1, 2, 3], [1, 2, 1, 1], validate=False) # lists not the same length with self.assertRaises(ValueError): PiecewiseLinearFunction([1, 2, 3, 4], [1, 2, 1], validate=False) # breakpoints list not nondecreasing with self.assertRaises(util.PiecewiseValidationError): PiecewiseLinearFunction([1, 3, 2], [1, 2, 1]) PiecewiseLinearFunction([1, 3, 2], [1, 2, 1], validate=False) PiecewiseLinearFunction([1, 2, 3], [1, 1, 1 + 2e-6], equal_slopes_tolerance=1e-6) # consecutive slopes are "equal" with self.assertRaises(util.PiecewiseValidationError): PiecewiseLinearFunction([1, 2, 3], [1, 1, 1 + 2e-6], equal_slopes_tolerance=3e-6) PiecewiseLinearFunction([1, 2, 3], [1, 1, 1 + 2e-6], validate=False) f = PiecewiseLinearFunction([1, 2, 3], [1, 2, 1]) TransformedPiecewiseLinearFunction(f, input=variable(lb=1, ub=3), require_bounded_input_variable=True) TransformedPiecewiseLinearFunction( f, input=variable(lb=1, ub=3), require_bounded_input_variable=False) # variable is not bounded with self.assertRaises(util.PiecewiseValidationError): TransformedPiecewiseLinearFunction( f, input=variable(lb=1), require_bounded_input_variable=True) TransformedPiecewiseLinearFunction( f, input=variable(lb=1), require_bounded_input_variable=False) with self.assertRaises(util.PiecewiseValidationError): TransformedPiecewiseLinearFunction( f, input=variable(ub=3), require_bounded_input_variable=True) TransformedPiecewiseLinearFunction( f, input=variable(ub=3), require_bounded_input_variable=False) with self.assertRaises(util.PiecewiseValidationError): TransformedPiecewiseLinearFunction( f, require_bounded_input_variable=True) TransformedPiecewiseLinearFunction( f, require_bounded_input_variable=False) # variable domain is not fully covered with self.assertRaises(util.PiecewiseValidationError): TransformedPiecewiseLinearFunction( f, input=variable(lb=0), require_bounded_input_variable=False, require_variable_domain_coverage=True) TransformedPiecewiseLinearFunction( f, input=variable(lb=0), require_bounded_input_variable=False, require_variable_domain_coverage=False) with self.assertRaises(util.PiecewiseValidationError): TransformedPiecewiseLinearFunction( f, input=variable(ub=4), require_bounded_input_variable=False, require_variable_domain_coverage=True) TransformedPiecewiseLinearFunction( f, input=variable(ub=4), require_bounded_input_variable=False, require_variable_domain_coverage=False)
def test_call(self): g = PiecewiseLinearFunction([1], [0]) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 0) self.assertIs(type(f(1)), float) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(1.1) g = PiecewiseLinearFunction([1, 2], [0, 4]) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 0) self.assertIs(type(f(1)), float) self.assertEqual(f(1.5), 2) self.assertIs(type(f(1.5)), float) self.assertEqual(f(2), 4) self.assertIs(type(f(2)), float) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(2.1) # step function g = PiecewiseLinearFunction([1, 1], [0, 1]) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 0) self.assertIs(type(f(1)), float) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(1.1) g = PiecewiseLinearFunction([1, 2, 3], [1, 2, 1]) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertIs(type(f(1)), float) self.assertEqual(f(1.5), 1.5) self.assertIs(type(f(1.5)), float) self.assertEqual(f(2), 2) self.assertIs(type(f(2)), float) self.assertEqual(f(2.5), 1.5) self.assertIs(type(f(2.5)), float) self.assertEqual(f(3), 1) self.assertIs(type(f(3)), float) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(3.1) # step function g = PiecewiseLinearFunction([1, 2, 2, 3], [1, 2, 3, 4]) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertIs(type(f(1)), float) self.assertEqual(f(1.5), 1.5) self.assertIs(type(f(1.5)), float) self.assertEqual(f(2), 2) # lower semicontinuous self.assertIs(type(f(2)), float) self.assertEqual(f(2.5), 3.5) self.assertIs(type(f(2.5)), float) self.assertEqual(f(3), 4) self.assertIs(type(f(3)), float) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(3.1) # another step function g = PiecewiseLinearFunction([1, 1, 2, 3], [1, 2, 3, 4], equal_slopes_tolerance=-1) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False, equal_slopes_tolerance=-1) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 2.5) self.assertEqual(f(2), 3) # lower semicontinuous self.assertEqual(f(2.5), 3.5) self.assertEqual(f(3), 4) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(3.1) # another step function g = PiecewiseLinearFunction([1, 2, 3, 3], [1, 2, 3, 4], equal_slopes_tolerance=-1) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False, equal_slopes_tolerance=-1) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 1.5) self.assertEqual(f(2), 2) self.assertEqual(f(2.5), 2.5) self.assertEqual(f(3), 3) # lower semicontinuous with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(3.1) # another step function using parameters g = PiecewiseLinearFunction([ pmo.parameter(1), pmo.parameter(1), pmo.parameter(2), pmo.parameter(3) ], [ pmo.parameter(1), pmo.parameter(2), pmo.parameter(3), pmo.parameter(4) ], equal_slopes_tolerance=-1) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False, equal_slopes_tolerance=-1) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 2.5) self.assertEqual(f(2), 3) # lower semicontinuous self.assertEqual(f(2.5), 3.5) self.assertEqual(f(3), 4) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(3.1) # another step function g = PiecewiseLinearFunction([1, 1, 2, 3, 4], [1, 2, 3, 4, 5], equal_slopes_tolerance=-1) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False, equal_slopes_tolerance=-1) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) # lower semicontinuous self.assertEqual(f(1.5), 2.5) self.assertEqual(f(2), 3) self.assertEqual(f(2.5), 3.5) self.assertEqual(f(3), 4) self.assertEqual(f(3.5), 4.5) self.assertEqual(f(4), 5) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(4.1) # another step function g = PiecewiseLinearFunction([1, 2, 2, 3, 4], [1, 2, 3, 4, 5], equal_slopes_tolerance=-1) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False, equal_slopes_tolerance=-1) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 1.5) self.assertEqual(f(2), 2) # lower semicontinuous self.assertEqual(f(2.5), 3.5) self.assertEqual(f(3), 4) self.assertEqual(f(3.5), 4.5) self.assertEqual(f(4), 5) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(4.1) # another step function g = PiecewiseLinearFunction([1, 2, 3, 3, 4], [1, 2, 3, 4, 5], equal_slopes_tolerance=-1) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False, equal_slopes_tolerance=-1) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 1.5) self.assertEqual(f(2), 2) self.assertEqual(f(2.5), 2.5) self.assertEqual(f(3), 3) # lower semicontinuous self.assertEqual(f(3.5), 4.5) self.assertEqual(f(4), 5) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(4.1) # another step function g = PiecewiseLinearFunction([1, 2, 3, 4, 4], [1, 2, 3, 4, 5], equal_slopes_tolerance=-1) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False, equal_slopes_tolerance=-1) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 1.5) self.assertEqual(f(2), 2) self.assertEqual(f(2.5), 2.5) self.assertEqual(f(3), 3) self.assertEqual(f(3.5), 3.5) self.assertEqual(f(4), 4) # lower semicontinuous with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(4.1) # another step function g = PiecewiseLinearFunction([1, 2, 3, 4, 5], [1, 2, 3, 4, 5], equal_slopes_tolerance=-1) f = TransformedPiecewiseLinearFunction( g, require_bounded_input_variable=False, equal_slopes_tolerance=-1) self.assertTrue(f.parent is None) self.assertEqual(f.ctype, IBlock) self.assertEqual(f(1), 1) self.assertEqual(f(1.5), 1.5) self.assertEqual(f(2), 2) self.assertEqual(f(2.5), 2.5) self.assertEqual(f(3), 3) self.assertEqual(f(3.5), 3.5) self.assertEqual(f(4), 4) self.assertEqual(f(4.5), 4.5) self.assertEqual(f(5), 5) with self.assertRaises(ValueError): f(0.9) with self.assertRaises(ValueError): f(5.1)