Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)