def test_conditional_sage_dual_1(self):
     n, m = 2, 6
     x = Variable(shape=(n, ), name='x')
     cons = [1 >= vector2norm(x)]
     gts = [lambda z: 1 - np.linalg.norm(z, 2)]
     eqs = []
     sigdom = SigDomain(n, coniclifts_cons=cons, gts=gts, eqs=eqs)
     np.random.seed(0)
     x0 = np.random.randn(n)
     x0 /= 2 * np.linalg.norm(x0)
     alpha = np.random.randn(m, n)
     c = np.array([1, 2, 3, 4, -0.5, -0.1])
     v0 = np.exp(alpha @ x0)
     v = Variable(shape=(m, ), name='projected_v0')
     t = Variable(shape=(1, ), name='epigraph_var')
     sage_constraint = sage_cones.DualSageCone(v,
                                               alpha,
                                               name='test',
                                               X=sigdom,
                                               c=c)
     epi_constraint = vector2norm(v - v0) <= t
     constraints = [sage_constraint, epi_constraint]
     prob = Problem(CL_MIN, t, constraints)
     prob.solve(solver='ECOS')
     v0 = sage_constraint.violation(norm_ord=1, rough=False)
     assert v0 < 1e-6
     v1 = sage_constraint.violation(norm_ord=np.inf, rough=True)
     assert v1 < 1e-6
     val = prob.value
     assert val < 1e-7
 def test_ordinary_sage_dual_3(self):
     # provide a vector "c" in the dual SAGE cone constructor.
     # generate a point with zero distance from the dual SAGE cone
     n, m = 2, 6
     np.random.seed(0)
     alpha = 10 * np.random.randn(m, n)
     x0 = np.random.randn(n) / 10
     v0 = np.exp(alpha @ x0)
     dummy_vars = Variable(shape=(2, )).scalar_variables()
     c = np.array([1, 2, 3, 4, dummy_vars[0], dummy_vars[1]])
     c = Expression(c)
     v = Variable(shape=(m, ), name='projected_v0')
     t = Variable(shape=(1, ), name='epigraph_var')
     sage_constraint = sage_cones.DualSageCone(v,
                                               alpha,
                                               X=None,
                                               name='test_con',
                                               c=c)
     epi_constraint = vector2norm(v - v0) <= t
     constraints = [sage_constraint, epi_constraint]
     prob = Problem(CL_MIN, t, constraints)
     prob.solve(solver='ECOS')
     viol = sage_constraint.violation(norm_ord=1, rough=False)
     assert viol < 1e-6
     viol = sage_constraint.violation(norm_ord=np.inf, rough=True)
     assert viol < 1e-6
     val = prob.value
     assert val < 1e-7
 def test_ordinary_sage_dual_2(self):
     # generate a point with zero distance from the dual SAGE cone
     n, m = 2, 6
     np.random.seed(0)
     alpha = 10 * np.random.randn(m, n)
     x0 = np.random.randn(n) / 10
     v0 = np.exp(alpha @ x0)
     v = Variable(shape=(m, ), name='projected_v0')
     t = Variable(shape=(1, ), name='epigraph_var')
     sage_constraint = sage_cones.DualSageCone(v,
                                               alpha,
                                               X=None,
                                               name='test_con')
     epi_constraint = vector2norm(v - v0) <= t
     constraints = [sage_constraint, epi_constraint]
     prob = Problem(CL_MIN, t, constraints)
     prob.solve(solver='ECOS')
     viol = sage_constraint.violation(norm_ord=1, rough=False)
     assert viol < 1e-6
     viol = sage_constraint.violation(norm_ord=np.inf, rough=True)
     assert viol < 1e-6
     val = prob.value
     assert val < 1e-7
 def test_ordinary_sage_dual_1(self):
     # generate a point which has positive distance from the dual SAGE cone
     n, m = 2, 6
     np.random.seed(0)
     alpha = 10 * np.random.randn(m, n)
     v0 = 10 * np.abs(np.random.randn(m)) + 0.01
     v0[0] = -v0[0]
     v = Variable(shape=(m, ), name='projected_v0')
     t = Variable(shape=(1, ), name='epigraph_var')
     sage_constraint = sage_cones.DualSageCone(v,
                                               alpha,
                                               X=None,
                                               name='test_con')
     epi_constraint = vector2norm(v - v0) <= t
     constraints = [sage_constraint, epi_constraint]
     prob = Problem(CL_MIN, t, constraints)
     prob.solve(solver='ECOS')
     viol = sage_constraint.violation(norm_ord=1, rough=False)
     assert viol < 1e-6
     viol = sage_constraint.violation(norm_ord=np.inf, rough=True)
     assert viol < 1e-6
     val = prob.value
     assert val + 1e-6 >= abs(v0[0])