def test_non_convex(self):
        """ Test for non convex cases.
        """
        for size in range(2, 101):
            cond = random.randint(1, 100)

            numpy.random.seed(cond)
            res = helpers.gen_general_obj(size, False, cond, 1)

            self.assertEqual(res.shape, (size, size))
            if size > 50:
                self.assertLess(helpers.mindiag(res), 0)
            self.assertAlmostEqual(numpy.linalg.cond(res), cond)

            numpy.random.seed(cond)
            half = helpers.gen_general_obj(size, False, cond, 0.5)
            self.assertTrue(np.allclose(res, half * 2))
    def test_gen_obj(self):
        # A very large matrix generated in a general way is statistically
        # very unlikely to be PSD by accident, so we want to observe that
        # the generator with convex option makes very large PSD matrices
        # and the generator with nonconvex option will nor 'accidentally'
        # make PSD matrices (though there is always some chance of a fluke)

        # Generate a convex Q for 200 variables with condition number 20
        Q = hp.gen_general_obj(200, True, 20, 20)
        self.assertAlmostEqual(np.linalg.cond(Q), 20)
        self.assertTrue(mh.isPSD(Q))
        np.testing.assert_almost_equal(Q, 0.5 * (Q + Q.T))

        # Generate a nonconvex Q for 200 variables with condition number 20
        Q = hp.gen_general_obj(200, False, 20, 20)
        self.assertAlmostEqual(np.linalg.cond(Q), 20)
        self.assertFalse(mh.isPSD(Q))
        np.testing.assert_almost_equal(Q, 0.5 * (Q + Q.T))