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
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)
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))
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)
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)
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)
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))
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)
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)
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]])
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
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)
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)
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)
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)
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))
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)
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)
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)
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))
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)
def _wrapper_mv_qmc(*args, **kwargs): d = kwargs.pop("d") return qmc.MultivariateNormalQMC(mean=np.zeros(d), **kwargs)