Пример #1
0
 def test_MultivariateNormalQMCNonPD(self):
     # try with non-pd but psd cov; should work
     engine = qmc.MultivariateNormalQMC(
         [0, 0, 0],
         [[1, 0, 1], [0, 1, 1], [1, 1, 2]],
     )
     assert engine._corr_matrix is not None
Пример #2
0
 def test_MultivariateNormalQMCDim(self):
     # incompatible dimension of mean/cov
     with pytest.raises(ValueError,
                        match=r"Dimension mismatch between "
                        r"mean and covariance."):
         seed = np.random.RandomState(123456)
         qmc.MultivariateNormalQMC([0], [[1, 0], [0, 1]], seed=seed)
Пример #3
0
 def test_NormalQMCInvTransform(self):
     # d = 1
     seed = np.random.RandomState(123456)
     engine = qmc.MultivariateNormalQMC(
         mean=np.zeros(1), inv_transform=True, seed=seed)
     samples = engine.random()
     assert_equal(samples.shape, (1, 1))
     samples = engine.random(n=5)
     assert_equal(samples.shape, (5, 1))
     # d = 2
     engine = qmc.MultivariateNormalQMC(
         mean=np.zeros(2), inv_transform=True, seed=seed)
     samples = engine.random()
     assert_equal(samples.shape, (1, 2))
     samples = engine.random(n=5)
     assert_equal(samples.shape, (5, 2))
Пример #4
0
 def test_MultivariateNormalQMCSymmetric(self):
     # try with non-symmetric cov and expect an error
     with pytest.raises(ValueError,
                        match=r"Covariance matrix is not "
                        r"symmetric."):
         seed = np.random.RandomState(123456)
         qmc.MultivariateNormalQMC([0, 0], [[1, 0], [2, 1]], seed=seed)
Пример #5
0
 def test_MultivariateNormalQMCNonPD(self):
     # try with non-pd but psd cov; should work
     seed = np.random.RandomState(123456)
     engine = qmc.MultivariateNormalQMC([0, 0, 0],
                                        [[1, 0, 1], [0, 1, 1], [1, 1, 2]],
                                        seed=seed)
     assert_(engine._corr_matrix is not None)
Пример #6
0
 def test_reset(self):
     seed = np.random.RandomState(12345)
     engine = qmc.MultivariateNormalQMC(mean=np.zeros(1), seed=seed)
     samples = engine.random(2)
     engine.reset()
     samples_reset = engine.random(2)
     assert_array_equal(samples, samples_reset)
Пример #7
0
 def test_other_engine(self):
     base_engine = qmc.Sobol(d=2, scramble=False)
     engine = qmc.MultivariateNormalQMC(mean=np.zeros(2),
                                        engine=base_engine,
                                        inv_transform=True)
     samples = engine.random()
     assert_equal(samples.shape, (1, 2))
Пример #8
0
    def test_NormalQMCSeeded(self):
        # test even dimension
        seed = np.random.default_rng(274600237797326520096085022671371676017)
        engine = qmc.MultivariateNormalQMC(
            mean=np.zeros(2), inv_transform=False, seed=seed)
        samples = engine.random(n=2)
        samples_expected = np.array([[0.446961, -1.243236],
                                     [-0.230754, 0.21354]])
        assert_array_almost_equal(samples, samples_expected)

        # test odd dimension
        seed = np.random.default_rng(274600237797326520096085022671371676017)
        engine = qmc.MultivariateNormalQMC(
            mean=np.zeros(3), inv_transform=False, seed=seed)
        samples = engine.random(n=2)
        samples_expected = np.array([[0.446961, -1.243236, 0.324827],
                                     [-0.997875, 0.399134, 1.032234]])
        assert_array_almost_equal(samples, samples_expected)
Пример #9
0
    def test_NormalQMCSeededInvTransform(self):
        # test even dimension
        seed = np.random.default_rng(288527772707286126646493545351112463929)
        engine = qmc.MultivariateNormalQMC(
            mean=np.zeros(2), seed=seed, inv_transform=True)
        samples = engine.random(n=2)
        samples_expected = np.array([[-0.804472, 0.384649],
                                     [0.396424, -0.117676]])
        assert_array_almost_equal(samples, samples_expected)

        # test odd dimension
        seed = np.random.default_rng(288527772707286126646493545351112463929)
        engine = qmc.MultivariateNormalQMC(
            mean=np.zeros(3), seed=seed, inv_transform=True)
        samples = engine.random(n=2)
        samples_expected = np.array([[-0.804472, 0.384649, 1.583568],
                                     [0.165333, -2.266828, -1.655572]])
        assert_array_almost_equal(samples, samples_expected)
Пример #10
0
    def test_validations(self):

        message = r"Dimension of `engine` must be consistent"
        with pytest.raises(ValueError, match=message):
            qmc.MultivariateNormalQMC([0], engine=qmc.Sobol(d=2))

        message = r"`engine` must be an instance of..."
        with pytest.raises(ValueError, match=message):
            qmc.MultivariateNormalQMC([0, 0], engine=np.random.default_rng())

        message = r"Covariance matrix not PSD."
        with pytest.raises(ValueError, match=message):
            qmc.MultivariateNormalQMC([0, 0], [[1, 2], [2, 1]])

        message = r"Covariance matrix is not symmetric."
        with pytest.raises(ValueError, match=message):
            qmc.MultivariateNormalQMC([0, 0], [[1, 0], [2, 1]])

        message = r"Dimension mismatch between mean and covariance."
        with pytest.raises(ValueError, match=message):
            qmc.MultivariateNormalQMC([0], [[1, 0], [0, 1]])
Пример #11
0
 def test_NormalQMCShapiro(self):
     rng = np.random.default_rng(13242)
     engine = qmc.MultivariateNormalQMC(mean=np.zeros(2), seed=rng)
     samples = engine.random(n=256)
     assert all(np.abs(samples.mean(axis=0)) < 1e-2)
     assert all(np.abs(samples.std(axis=0) - 1) < 1e-2)
     # perform Shapiro-Wilk test for normality
     for i in (0, 1):
         _, pval = shapiro(samples[:, i])
         assert pval > 0.9
     # make sure samples are uncorrelated
     cov = np.cov(samples.transpose())
     assert np.abs(cov[0, 1]) < 1e-2
Пример #12
0
    def test_MultivariateNormalQMCSeeded(self):
        # test even dimension
        rng = np.random.default_rng(180182791534511062935571481899241825000)
        a = rng.standard_normal((2, 2))
        A = a @ a.transpose() + np.diag(rng.random(2))
        engine = qmc.MultivariateNormalQMC(np.array([0, 0]), A,
                                           inv_transform=False, seed=rng)
        samples = engine.random(n=2)
        samples_expected = np.array([[0.479575, 0.934723],
                                     [1.712571, 0.172699]])
        assert_array_almost_equal(samples, samples_expected)

        # test odd dimension
        rng = np.random.default_rng(180182791534511062935571481899241825000)
        a = rng.standard_normal((3, 3))
        A = a @ a.transpose() + np.diag(rng.random(3))
        engine = qmc.MultivariateNormalQMC(np.array([0, 0, 0]), A,
                                           inv_transform=False, seed=rng)
        samples = engine.random(n=2)
        samples_expected = np.array([[2.463393, 2.252826, -0.886809],
                                     [1.252468, 0.029449, -1.126328]])
        assert_array_almost_equal(samples, samples_expected)
Пример #13
0
 def test_NormalQMCShapiro(self):
     seed = np.random.RandomState(12345)
     engine = qmc.MultivariateNormalQMC(mean=np.zeros(2), seed=seed)
     samples = engine.random(n=256)
     assert_(all(np.abs(samples.mean(axis=0)) < 1e-2))
     assert_(all(np.abs(samples.std(axis=0) - 1) < 1e-2))
     # perform Shapiro-Wilk test for normality
     for i in (0, 1):
         _, pval = shapiro(samples[:, i])
         assert_(pval > 0.9)
     # make sure samples are uncorrelated
     cov = np.cov(samples.transpose())
     assert_(np.abs(cov[0, 1]) < 1e-2)
Пример #14
0
    def test_NormalQMCSeededInvTransform(self):
        # test even dimension
        seed = np.random.RandomState(12345)
        engine = qmc.MultivariateNormalQMC(mean=np.zeros(2),
                                           seed=seed,
                                           inv_transform=True)
        samples = engine.random(n=2)
        samples_expected = np.array([[0.228309, -0.162516],
                                     [-0.41622922, 0.46622792]])
        assert_array_almost_equal(samples, samples_expected)

        # test odd dimension
        seed = np.random.RandomState(12345)
        engine = qmc.MultivariateNormalQMC(mean=np.zeros(3),
                                           seed=seed,
                                           inv_transform=True)
        samples = engine.random(n=2)
        samples_expected = np.array([
            [0.228309, -0.162516, 0.167352],
            [-1.40525266, 1.37652443, -0.8519666],
        ])
        assert_array_almost_equal(samples, samples_expected)
Пример #15
0
    def test_NormalQMCSeeded(self):
        # test even dimension
        seed = np.random.RandomState(12345)
        engine = qmc.MultivariateNormalQMC(mean=np.zeros(2),
                                           inv_transform=False,
                                           seed=seed)
        samples = engine.random(n=2)
        samples_expected = np.array([[-0.943472, 0.405116],
                                     [-0.63099602, -1.32950772]])
        assert_array_almost_equal(samples, samples_expected)

        # test odd dimension
        seed = np.random.RandomState(12345)
        engine = qmc.MultivariateNormalQMC(mean=np.zeros(3),
                                           inv_transform=False,
                                           seed=seed)
        samples = engine.random(n=2)
        samples_expected = np.array([
            [-0.943472, 0.405116, 0.268828],
            [1.83169884, -1.40473647, 0.24334828],
        ])
        assert_array_almost_equal(samples, samples_expected)
Пример #16
0
    def test_MultivariateNormalQMC(self):
        # d = 1 scalar
        engine = qmc.MultivariateNormalQMC(mean=0, cov=5)
        samples = engine.random()
        assert_equal(samples.shape, (1, 1))
        samples = engine.random(n=5)
        assert_equal(samples.shape, (5, 1))

        # d = 2 list
        engine = qmc.MultivariateNormalQMC(mean=[0, 1], cov=[[1, 0], [0, 1]])
        samples = engine.random()
        assert_equal(samples.shape, (1, 2))
        samples = engine.random(n=5)
        assert_equal(samples.shape, (5, 2))

        # d = 3 np.array
        mean = np.array([0, 1, 2])
        cov = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
        engine = qmc.MultivariateNormalQMC(mean, cov)
        samples = engine.random()
        assert_equal(samples.shape, (1, 3))
        samples = engine.random(n=5)
        assert_equal(samples.shape, (5, 3))
Пример #17
0
    def test_MultivariateNormalQMCSeededInvTransform(self):
        # test even dimension
        rng = np.random.default_rng(224125808928297329711992996940871155974)
        a = rng.standard_normal((2, 2))
        A = a @ a.transpose() + np.diag(rng.random(2))
        engine = qmc.MultivariateNormalQMC(
            np.array([0, 0]), A, seed=rng, inv_transform=True
        )
        samples = engine.random(n=2)
        samples_expected = np.array([[-3.095968, -0.566545],
                                     [0.603154, 0.222434]])
        assert_array_almost_equal(samples, samples_expected)

        # test odd dimension
        rng = np.random.default_rng(224125808928297329711992996940871155974)
        a = rng.standard_normal((3, 3))
        A = a @ a.transpose() + np.diag(rng.random(3))
        engine = qmc.MultivariateNormalQMC(
            np.array([0, 0, 0]), A, seed=rng, inv_transform=True
        )
        samples = engine.random(n=2)
        samples_expected = np.array([[1.427248, -0.338187, -1.560687],
                                     [-0.357026, 1.662937, -0.29769]])
        assert_array_almost_equal(samples, samples_expected)
Пример #18
0
    def test_MultivariateNormalQMCShapiroInvTransform(self):
        # test the standard case
        seed = np.random.RandomState(12345)
        engine = qmc.MultivariateNormalQMC(mean=[0, 0],
                                           cov=[[1, 0], [0, 1]],
                                           seed=seed,
                                           inv_transform=True)
        samples = engine.random(n=256)
        assert_(all(np.abs(samples.mean(axis=0)) < 1e-2))
        assert_(all(np.abs(samples.std(axis=0) - 1) < 1e-2))
        # perform Shapiro-Wilk test for normality
        for i in (0, 1):
            _, pval = shapiro(samples[:, i])
            assert_(pval > 0.9)
        # make sure samples are uncorrelated
        cov = np.cov(samples.transpose())
        assert_(np.abs(cov[0, 1]) < 1e-2)

        # test the correlated, non-zero mean case
        seed = np.random.RandomState(12345)
        engine = qmc.MultivariateNormalQMC(
            mean=[1.0, 2.0],
            cov=[[1.5, 0.5], [0.5, 1.5]],
            seed=seed,
            inv_transform=True,
        )
        samples = engine.random(n=256)
        assert_(all(np.abs(samples.mean(axis=0) - [1, 2]) < 1e-2))
        assert_(all(np.abs(samples.std(axis=0) - np.sqrt(1.5)) < 1e-2))
        # perform Shapiro-Wilk test for normality
        for i in (0, 1):
            _, pval = shapiro(samples[:, i])
            assert_(pval > 0.9)
        # check covariance
        cov = np.cov(samples.transpose())
        assert_(np.abs(cov[0, 1] - 0.5) < 1e-2)
Пример #19
0
 def test_MultivariateNormalQMCDegenerate(self):
     # X, Y iid standard Normal and Z = X + Y, random vector (X, Y, Z)
     seed = np.random.default_rng(163206374175814483578698216542904486209)
     engine = qmc.MultivariateNormalQMC(
         mean=[0.0, 0.0, 0.0],
         cov=[[1.0, 0.0, 1.0], [0.0, 1.0, 1.0], [1.0, 1.0, 2.0]],
         seed=seed,
     )
     samples = engine.random(n=512)
     assert all(np.abs(samples.mean(axis=0)) < 1e-2)
     assert np.abs(np.std(samples[:, 0]) - 1) < 1e-2
     assert np.abs(np.std(samples[:, 1]) - 1) < 1e-2
     assert np.abs(np.std(samples[:, 2]) - np.sqrt(2)) < 1e-2
     for i in (0, 1, 2):
         _, pval = shapiro(samples[:, i])
         assert pval > 0.8
     cov = np.cov(samples.transpose())
     assert np.abs(cov[0, 1]) < 1e-2
     assert np.abs(cov[0, 2] - 1) < 1e-2
     # check to see if X + Y = Z almost exactly
     assert all(np.abs(samples[:, 0] + samples[:, 1] - samples[:, 2])
                < 1e-5)
Пример #20
0
 def test_MultivariateNormalQMCDegenerate(self):
     # X, Y iid standard Normal and Z = X + Y, random vector (X, Y, Z)
     seed = np.random.RandomState(12345)
     engine = qmc.MultivariateNormalQMC(
         mean=[0.0, 0.0, 0.0],
         cov=[[1.0, 0.0, 1.0], [0.0, 1.0, 1.0], [1.0, 1.0, 2.0]],
         seed=seed,
     )
     samples = engine.random(n=512)
     assert_(all(np.abs(samples.mean(axis=0)) < 1e-2))
     assert_(np.abs(np.std(samples[:, 0]) - 1) < 1e-2)
     assert_(np.abs(np.std(samples[:, 1]) - 1) < 1e-2)
     assert_(np.abs(np.std(samples[:, 2]) - np.sqrt(2)) < 1e-2)
     for i in (0, 1, 2):
         _, pval = shapiro(samples[:, i])
         assert_(pval > 0.8)
     cov = np.cov(samples.transpose())
     assert_(np.abs(cov[0, 1]) < 1e-2)
     assert_(np.abs(cov[0, 2] - 1) < 1e-2)
     # check to see if X + Y = Z almost exactly
     assert_(
         all(np.abs(samples[:, 0] + samples[:, 1] - samples[:, 2]) < 1e-5))
Пример #21
0
 def test_MultivariateNormalQMCNonPSD(self):
     # try with non-psd, non-pd cov and expect an assertion error
     with pytest.raises(ValueError, match=r"Covariance matrix not PSD."):
         seed = np.random.RandomState(123456)
         qmc.MultivariateNormalQMC([0, 0], [[1, 2], [2, 1]], seed=seed)
Пример #22
0
def _wrapper_mv_qmc(*args, **kwargs):
    d = kwargs.pop("d")
    return qmc.MultivariateNormalQMC(mean=np.zeros(d), **kwargs)