Beispiel #1
0
 def test_unbounded(self):
     # Test linprog response to an unbounded problem
     c = np.array([1, 1])
     A_ub = [[-1, 1], [-1, -1]]
     b_ub = [-1, -2]
     c, A_ub, b_ub = map(np.asarray, [c, A_ub, b_ub])
     res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub)
     _assert_unbounded(res)
Beispiel #2
0
 def test_infeasible(self):
     # Test linprog response to an infeasible problem
     c = np.array([-1, -1]) * (-1)
     A_ub = [[1, 0], [0, 1], [-1, -1]]
     b_ub = [2, 2, -5]
     c, A_ub, b_ub = map(np.asarray, [c, A_ub, b_ub])
     res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub)
     _assert_infeasible(res)
Beispiel #3
0
 def test_linprog_cyclic_bland(self):
     # Test the effect of Bland's rule on a cycling problem
     c = np.array([-10, 57, 9, 24.]) * (-1)
     A_ub = np.array([[0.5, -5.5, -2.5, 9], [0.5, -1.5, -0.5, 1],
                      [1, 0, 0, 0]])
     b_ub = np.array([0, 0, 1])
     desired_x = [1, 0, 1, 0]
     res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub)
     _assert_success(res, c, b_ub=b_ub, desired_x=desired_x)
Beispiel #4
0
 def test_linprog_cyclic_bland_bug_8561(self):
     # Test that pivot row is chosen correctly when using Bland's rule
     c = np.array([7, 0, -4, 1.5, 1.5]) * (-1)
     A_ub = np.array([[4, 5.5, 1.5, 1.0, -3.5], [1, -2.5, -2, 2.5, 0.5],
                      [3, -0.5, 4, -12.5, -7], [-1, 4.5, 2, -3.5, -2],
                      [5.5, 2, -4.5, -1, 9.5]])
     b_ub = np.array([0, 0, 0, 0, 1])
     # desired_x = [0, 0, 19, 16/3, 29/3]
     res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub)
     _assert_success(res, c, b_ub=b_ub)
Beispiel #5
0
 def test_linprog_cyclic_recovery(self):
     # Test linprogs recovery from cycling using the Klee-Minty problem
     # Klee-Minty  https://www.math.ubc.ca/~israel/m340/kleemin3.pdf
     c = np.array([100, 10, 1])
     A_ub = [[1, 0, 0], [20, 1, 0], [200, 20, 1]]
     b_ub = [1, 100, 10000]
     c, A_ub, b_ub = map(np.asarray, [c, A_ub, b_ub])
     desired_x = [0, 0, 10000]
     res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub)
     _assert_success(res, c, b_ub=b_ub, desired_x=desired_x)
Beispiel #6
0
 def test_bug_8662(self):
     # linprog simplex used to report inncorrect optimal results
     # https://github.com/scipy/scipy/issues/8662
     c = np.array([-10, 10, 6, 3]) * (-1)
     A_ub = [[8, -8, -4, 6], [-8, 8, 4, -6], [-4, 4, 8, -4],
             [3, -3, -3, -10]]
     b_ub = [9, -9, -9, -4]
     c, A_ub, b_ub = map(np.asarray, [c, A_ub, b_ub])
     desired_fun = -36.0000000000
     res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub)
     _assert_success(res, c, b_ub=b_ub, desired_fun=desired_fun)
Beispiel #7
0
    def test_bug_5400(self):
        # https://github.com/scipy/scipy/issues/5400
        f = 1 / 9
        g = -1e4
        h = -3.1
        A_ub = np.array([
            [1, -2.99, 0, 0, -3, 0, 0, 0, -1, -1, 0, -1, -1, 1, 1, 0, 0, 0, 0],
            [1, 0, -2.9, h, 0, -3, 0, -1, 0, 0, -1, 0, -1, 0, 0, 1, 1, 0, 0],
            [1, 0, 0, h, 0, 0, -3, -1, -1, 0, -1, -1, 0, 0, 0, 0, 0, 1, 1],
            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0],
            [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1],
            [0, 1.99, -1, -1, 0, 0, 0, -1, f, f, 0, 0, 0, g, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 2, -1, -1, 0, 0, 0, -1, f, f, 0, g, 0, 0, 0, 0],
            [0, -1, 1.9, 2.1, 0, 0, 0, f, -1, -1, 0, 0, 0, 0, 0, g, 0, 0, 0],
            [0, 0, 0, 0, -1, 2, -1, 0, 0, 0, f, -1, f, 0, 0, 0, g, 0, 0],
            [0, -1, -1, 2.1, 0, 0, 0, f, f, -1, 0, 0, 0, 0, 0, 0, 0, g, 0],
            [0, 0, 0, 0, -1, -1, 2, 0, 0, 0, f, f, -1, 0, 0, 0, 0, 0, g]
        ])

        b_ub = np.array([
            0.0, 0, 0, 100, 100, 100, 100, 100, 100, 900, 900, 900, 900, 900,
            900, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
        ])

        c = np.array([
            -1.0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0
        ]) * (-1)

        desired_fun = 106.63507541835018

        res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub)
        _assert_success(res,
                        c,
                        b_ub=b_ub,
                        desired_fun=desired_fun,
                        rtol=1e-8,
                        atol=1e-8)
Beispiel #8
0
 def test_basic_artificial_vars(self):
     # Test if linprog succeeds when at the end of Phase 1 some artificial
     # variables remain basic, and the row in T corresponding to the
     # artificial variables is not all zero.
     c = np.array([-0.1, -0.07, 0.004, 0.004, 0.004, 0.004]) * (-1)
     A_ub = np.array([[1.0, 0, 0, 0, 0, 0], [-1.0, 0, 0, 0, 0, 0],
                      [0, -1.0, 0, 0, 0, 0], [0, 1.0, 0, 0, 0, 0],
                      [1.0, 1.0, 0, 0, 0, 0]])
     b_ub = np.array([3.0, 3.0, 3.0, 3.0, 20.0])
     A_eq = np.array([[1.0, 0, -1, 1, -1, 1], [0, -1.0, -1, 1, -1, 1]])
     b_eq = np.array([0, 0])
     res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq)
     _assert_success(res, c, b_ub=b_ub, b_eq=b_eq, desired_fun=0,
                     desired_x=np.zeros_like(c))
Beispiel #9
0
    def test_issue_8174_stackoverflow(self):
        # Test supplementary example from issue 8174.
        # https://github.com/scipy/scipy/issues/8174
        # https://stackoverflow.com/questions/47717012/
        c = np.array([1, 0, 0, 0, 0, 0, 0]) * (-1)
        A_ub = -np.identity(7)
        b_ub = np.full(7, -2)
        A_eq = np.array([[1, 1, 1, 1, 1, 1, 0], [0.3, 1.3, 0.9, 0, 0, 0, -1],
                         [0.3, 0, 0, 0, 0, 0, -2 / 3],
                         [0, 0.65, 0, 0, 0, 0, -1 / 15],
                         [0, 0, 0.3, 0, 0, 0, -1 / 15]])
        b_eq = np.array([100, 0, 0, 0, 0])

        res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq)
        _assert_success(res, c, b_ub=b_ub, b_eq=b_eq)
Beispiel #10
0
 def test_network_flow(self):
     # A network flow problem with supply and demand at nodes
     # and with costs along directed edges.
     # https://www.princeton.edu/~rvdb/542/lectures/lec10.pdf
     c = np.array([2, 4, 9, 11, 4, 3, 8, 7, 0, 15, 16, 18]) * (-1)
     n, p = -1, 1
     A_eq = [[n, n, p, 0, p, 0, 0, 0, 0, p, 0, 0],
             [p, 0, 0, p, 0, p, 0, 0, 0, 0, 0, 0],
             [0, 0, n, n, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, p, p, 0, 0, p, 0],
             [0, 0, 0, 0, n, n, n, 0, p, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, n, n, 0, 0, p],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, n, n, n]]
     b_eq = [0, 19, -16, 33, 0, 0, -36]
     c, A_eq, b_eq = map(np.asarray, [c, A_eq, b_eq])
     desired_fun = -755
     res = linprog_simplex(c, A_eq=A_eq, b_eq=b_eq)
     _assert_success(res, c, b_eq=b_eq, desired_fun=desired_fun)
Beispiel #11
0
 def test_nontrivial_problem(self):
     # Test linprog for a problem involving all constraint types,
     # negative resource limits, and rounding issues.
     c = np.array([-1, 8, 4, -6]) * (-1)
     A_ub = [[-7, -7, 6, 9],
             [1, -1, -3, 0],
             [10, -10, -7, 7],
             [6, -1, 3, 4]]
     b_ub = [-3, 6, -6, 6]
     A_eq = [[-10, 1, 1, -8]]
     b_eq = [-4]
     c, A_ub, b_ub, A_eq, b_eq = \
         map(np.asarray, [c, A_ub, b_ub, A_eq, b_eq])
     desired_fun = 7083 / 1391 * (-1)
     desired_x = [101 / 1391, 1462 / 1391, 0, 752 / 1391]
     res = linprog_simplex(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq)
     _assert_success(res, c, b_ub=b_ub, b_eq=b_eq, desired_fun=desired_fun,
                     desired_x=desired_x)