Beispiel #1
0
    def pcp_4(ceei: bool = True):
        """
        A power cone formulation of a Fisher market equilibrium pricing model.
        ceei = Competitive Equilibrium from Equal Incomes
        """
        # Generate test data
        np.random.seed(0)
        n_buyer = 4
        n_items = 6
        V = np.random.rand(n_buyer, n_items)
        X = cp.Variable(shape=(n_buyer, n_items), nonneg=True)
        u = cp.sum(cp.multiply(V, X), axis=1)
        if ceei:
            b = np.ones(n_buyer) / n_buyer
        else:
            b = np.array([0.3, 0.15, 0.2, 0.35])
        log_objective = cp.Maximize(cp.sum(cp.multiply(b, cp.log(u))))
        log_cons = [cp.sum(X, axis=0) <= 1]
        log_prob = cp.Problem(log_objective, log_cons)
        log_prob.solve(solver='SCS', eps=1e-8)
        expect_X = X.value

        z = cp.Variable()
        pow_objective = (cp.Maximize(z), np.exp(log_prob.value))
        pow_cons = [(cp.sum(X, axis=0) <= 1, None),
                    (PowConeND(W=u, z=z, alpha=b), None)]
        pow_vars = [(X, expect_X)]
        sth = STH.SolverTestHelper(pow_objective, pow_vars, pow_cons)
        return sth
 def make_test_4(ineq_form: bool):
     """Case when vec houses duplicates"""
     x = cp.Variable()
     objective = cp.Minimize(cp.abs(x - 3))
     vec = [1, 1, 1, 2, 2, 3, 3]
     cons1 = FiniteSet(x, vec, ineq_form=ineq_form)
     expected_x = np.array([3.])
     obj_pair = (objective, 0.0)
     var_pairs = [(x, expected_x)]
     con_pairs = [(cons1, None)]
     sth = STH.SolverTestHelper(obj_pair, var_pairs, con_pairs)
     return sth
 def make_test_3(ineq_form: bool):
     """Case when vec.size==1"""
     x = cp.Variable()
     objective = cp.Minimize(cp.abs(x - 3))
     vec = [1]
     cons1 = FiniteSet(x, vec, ineq_form=ineq_form)
     expected_x = np.array([1.])
     obj_pair = (objective, 2.0)
     var_pairs = [(x, expected_x)]
     con_pairs = [(cons1, None)]
     sth = STH.SolverTestHelper(obj_pair, var_pairs, con_pairs)
     return sth
 def make_test_2(ineq_form: bool):
     x = cp.Variable()
     expect_x = np.array([-1.125])
     objective = cp.Minimize(x)
     vec = [-1.125, 1, 2]
     constr1 = x >= -1.25
     constr2 = x <= 10
     constr3 = FiniteSet(x, vec, ineq_form=ineq_form)
     obj_pairs = (objective, -1.125)
     var_pairs = [(x, expect_x)]
     con_pairs = [(constr1, None), (constr2, None), (constr3, None)]
     sth = STH.SolverTestHelper(obj_pairs, var_pairs, con_pairs)
     return sth
 def make_test_6(ineq_form: bool):
     """vec contains only real quantities + passed expression is affine"""
     x = cp.Variable()
     expect_x = np.array([-1.0625])
     objective = cp.Minimize(x)
     vec = [-1.125, 1.5, 2.24]
     constr1 = x >= -1.25
     constr2 = x <= 10
     expr = 2 * x + 1
     constr3 = FiniteSet(expr, vec, ineq_form=ineq_form)
     obj_pairs = (objective, -1.0625)
     var_pairs = [(x, expect_x)]
     con_pairs = [(constr1, None), (constr2, None), (constr3, None)]
     sth = STH.SolverTestHelper(obj_pairs, var_pairs, con_pairs)
     return sth
 def make_test_7(ineq_form: bool):
     """For testing vectorization of FiniteSet class"""
     x = cp.Variable(shape=(4, ))
     expect_x = np.array([0., 7., 3., 0.])
     vec = np.arange(10)
     objective = cp.Maximize(x[0] + x[1] + 2 * x[2] - 2 * x[3])
     constr1 = FiniteSet(x, vec, ineq_form=ineq_form)
     constr2 = x[0] + 2 * x[2] <= 700
     constr3 = 2 * x[1] - 8 * x[2] <= 0
     constr4 = x[1] - 2 * x[2] + x[3] >= 1
     constr5 = x[0] + x[1] + x[2] + x[3] == 10
     obj_pair = (objective, 13.0)
     con_pairs = [(constr1, None), (constr2, None), (constr3, None),
                  (constr4, None), (constr5, None)]
     var_pairs = [(x, expect_x)]
     sth = STH.SolverTestHelper(obj_pair, var_pairs, con_pairs)
     return sth
 def make_test_1(ineq_form: bool):
     """vec contains a contiguous range of integers"""
     x = cp.Variable(shape=(4, ))
     expect_x = np.array([0., 7., 3., 0.])
     vec = np.arange(10)
     objective = cp.Maximize(x[0] + x[1] + 2 * x[2] - 2 * x[3])
     constr1 = FiniteSet(x[0], vec, ineq_form=ineq_form)
     constr2 = FiniteSet(x[1], vec, ineq_form=ineq_form)
     constr3 = FiniteSet(x[2], vec, ineq_form=ineq_form)
     constr4 = FiniteSet(x[3], vec, ineq_form=ineq_form)
     constr5 = x[0] + 2 * x[2] <= 700
     constr6 = 2 * x[1] - 8 * x[2] <= 0
     constr7 = x[1] - 2 * x[2] + x[3] >= 1
     constr8 = x[0] + x[1] + x[2] + x[3] == 10
     obj_pair = (objective, 13.0)
     con_pairs = [(constr1, None), (constr2, None), (constr3, None),
                  (constr4, None), (constr5, None), (constr6, None),
                  (constr7, None), (constr8, None)]
     var_pairs = [(x, expect_x)]
     sth = STH.SolverTestHelper(obj_pair, var_pairs, con_pairs)
     return sth
 def make_test_5(ineq_form: bool):
     """Case when input expression to FiniteSet constraint is affine"""
     x = cp.Variable(shape=(4, ))
     vec = np.arange(10)
     objective = cp.Maximize(x[0] + x[1] + 2 * x[2] - 2 * x[3])
     expr0 = 2 * x[0] + 1
     expr2 = 3 * x[2] + 5
     constr1 = FiniteSet(expr0, vec, ineq_form=ineq_form)
     constr2 = FiniteSet(x[1], vec, ineq_form=ineq_form)
     constr3 = FiniteSet(expr2, vec, ineq_form=ineq_form)
     constr4 = FiniteSet(x[3], vec, ineq_form=ineq_form)
     constr5 = x[0] + 2 * x[2] <= 700
     constr6 = 2 * x[1] - 8 * x[2] <= 0
     constr7 = x[1] - 2 * x[2] + x[3] >= 1
     constr8 = x[0] + x[1] + x[2] + x[3] == 10
     expected_x = np.array([4., 4., 1., 1.])
     obj_pair = (objective, 8.0)
     con_pairs = [(constr1, None), (constr2, None), (constr3, None),
                  (constr4, None), (constr5, None), (constr6, None),
                  (constr7, None), (constr8, None)]
     var_pairs = [(x, expected_x)]
     sth = STH.SolverTestHelper(obj_pair, var_pairs, con_pairs)
     return sth
Beispiel #9
0
    def pcp_3(axis):
        """
        A modification of pcp_2. Reformulate

            max  (x**0.2)*(y**0.8) + z**0.4 - x
            s.t. x + y + z/2 == 2
                 x, y, z >= 0
        Into

            max  x3 + x4 - x0
            s.t. x0 + x1 + x2 / 2 == 2,

                 W := [[x0, x2],
                      [x1, 1.0]]
                 z := [x3, x4]
                 alpha := [[0.2, 0.4],
                          [0.8, 0.6]]
                 (W, z) in PowND(alpha, axis=0)
        """
        x = cp.Variable(shape=(3, ))
        expect_x = np.array([0.06393515, 0.78320961, 2.30571048])
        hypos = cp.Variable(shape=(2, ))
        expect_hypos = None
        objective = cp.Maximize(cp.sum(hypos) - x[0])
        W = cp.bmat([[x[0], x[2]], [x[1], 1.0]])
        alpha = np.array([[0.2, 0.4], [0.8, 0.6]])
        if axis == 1:
            W = W.T
            alpha = alpha.T
        con_pairs = [(x[0] + x[1] + 0.5 * x[2] == 2, None),
                     (cp.constraints.PowConeND(W, hypos, alpha,
                                               axis=axis), None)]
        obj_pair = (objective, 1.8073406786220672)
        var_pairs = [(x, expect_x), (hypos, expect_hypos)]
        sth = STH.SolverTestHelper(obj_pair, var_pairs, con_pairs)
        return sth