def test_basic_composition(self): x, y = cp.Variable(2) expr = cp.maximum(cp.ceil(cp.ceil(x)), cp.ceil(cp.ceil(y))) problem = cp.Problem(cp.Minimize(expr), [x >= 12, x <= 17, y >= 17.4]) self.assertTrue(problem.is_dqcp()) problem.solve(SOLVER, qcp=True) self.assertEqual(problem.objective.value, 18.0) self.assertLess(x.value, 17.1) self.assertGreater(x.value, 11.9) self.assertGreater(y.value, 17.3) # This problem should have the same solution. expr = cp.maximum(cp.floor(cp.ceil(x)), cp.floor(cp.ceil(y))) problem = cp.Problem(cp.Minimize(expr), [x >= 12, x <= 17, y >= 17.4]) self.assertTrue(problem.is_dqcp()) problem.solve(SOLVER, qcp=True) self.assertEqual(problem.objective.value, 18.0) self.assertLess(x.value, 17.1) self.assertGreater(x.value, 11.9) self.assertGreater(y.value, 17.3)
def test_basic_floor(self): x = cp.Variable() expr = cp.floor(x) self.assertTrue(expr.is_dqcp()) self.assertTrue(expr.is_quasiconvex()) self.assertTrue(expr.is_quasiconcave()) self.assertFalse(expr.is_convex()) self.assertFalse(expr.is_concave()) self.assertFalse(expr.is_dcp()) self.assertFalse(expr.is_dgp()) problem = cp.Problem(cp.Minimize(expr), [x >= 11.8, x <= 17]) self.assertTrue(problem.is_dqcp()) self.assertFalse(problem.is_dcp()) self.assertFalse(problem.is_dgp()) problem.solve(SOLVER, qcp=True) self.assertEqual(problem.objective.value, 11.0) self.assertGreater(x.value, 11.7)