Skip to content
Snippets Groups Projects
Commit 9b02dc5f authored by Hu Zhao's avatar Hu Zhao
Browse files

feat: change nsamples to nbase for saltelli sampling

parent 13e8075c
No related branches found
No related tags found
No related merge requests found
...@@ -40,23 +40,23 @@ class Saltelli: ...@@ -40,23 +40,23 @@ class Saltelli:
self.calc_second_order = calc_second_order self.calc_second_order = calc_second_order
self.skip_values = skip_values self.skip_values = skip_values
def sample(self, nsamples: int) -> np.ndarray: def sample(self, nbase: int) -> np.ndarray:
"""Draw samples using Saltelli's extension of the Sobol' sequence. """Draw samples using Saltelli's extension of the Sobol' sequence.
Parameters Parameters
---------- ----------
nsamples : int nbase : int
Number of samples. Correspond to the argument `N` of Number of base samples. Correspond to the argument `N` of
`SALib.sample.saltelli.sample`. `SALib.sample.saltelli.sample`.
Returns Returns
------- -------
samples : numpy array samples : numpy array
Shape (nsamples*(2*ndim+2), ndim) when `calc_second_order` is True, Shape (nbase*(2*ndim+2), ndim) when `calc_second_order` is True,
Shape (nsamples*(ndim+2), ndim) when `calc_second_order` is False. Shape (nbase*(ndim+2), ndim) when `calc_second_order` is False.
""" """
samples = saltelli.sample( samples = saltelli.sample(
self.problem, nsamples, calc_second_order=self.calc_second_order, self.problem, nbase, calc_second_order=self.calc_second_order,
skip_values=self.skip_values) skip_values=self.skip_values)
return samples return samples
\ No newline at end of file
...@@ -20,7 +20,7 @@ def test_init_TypeError(ndim, bounds, calc_second_order, skip_values): ...@@ -20,7 +20,7 @@ def test_init_TypeError(ndim, bounds, calc_second_order, skip_values):
@pytest.mark.parametrize( @pytest.mark.parametrize(
"ndim, bounds, calc_second_order, skip_values, nsamples, problem", "ndim, bounds, calc_second_order, skip_values, nbase, problem",
[ [
(3, None, True, None, 2**5, {'names':['x1', 'x2', 'x3'], (3, None, True, None, 2**5, {'names':['x1', 'x2', 'x3'],
'num_vars':3, 'bounds':np.array([[0, 1], [0, 1], [0, 1]])} 'num_vars':3, 'bounds':np.array([[0, 1], [0, 1], [0, 1]])}
...@@ -31,16 +31,16 @@ def test_init_TypeError(ndim, bounds, calc_second_order, skip_values): ...@@ -31,16 +31,16 @@ def test_init_TypeError(ndim, bounds, calc_second_order, skip_values):
(3, None, False, None, 2**6, {'names':['x1', 'x2', 'x3'], (3, None, False, None, 2**6, {'names':['x1', 'x2', 'x3'],
'num_vars':3, 'bounds':np.array([[0, 1], [0, 1], [0, 1]])} 'num_vars':3, 'bounds':np.array([[0, 1], [0, 1], [0, 1]])}
), ),
(2, np.array([[2, 4], [20, 40]]), True, 32, 2**8, {'names':['x1', 'x2'], (2, np.array([[2, 4], [20, 40]]), True, 2**10, 2**8, {'names':['x1', 'x2'],
'num_vars':2, 'bounds':np.array([[2, 4], [20, 40]])} 'num_vars':2, 'bounds':np.array([[2, 4], [20, 40]])}
) )
] ]
) )
def test_sample(ndim, bounds, calc_second_order, skip_values, nsamples, problem): def test_sample(ndim, bounds, calc_second_order, skip_values, nbase, problem):
saltelli_sampler = Saltelli(ndim, bounds, calc_second_order, skip_values) saltelli_sampler = Saltelli(ndim, bounds, calc_second_order, skip_values)
samples = saltelli_sampler.sample(nsamples) samples = saltelli_sampler.sample(nbase)
expected = sample(problem, N=nsamples, calc_second_order=calc_second_order, expected = sample(problem, N=nbase, calc_second_order=calc_second_order,
skip_values=skip_values) skip_values=skip_values)
coeff = 2 if calc_second_order else 1 coeff = 2 if calc_second_order else 1
assert samples.shape == (nsamples * (coeff*ndim + 2), ndim) assert samples.shape == (nbase * (coeff*ndim + 2), ndim)
assert np.array_equal(samples, expected) assert np.array_equal(samples, expected)
\ No newline at end of file
...@@ -11,7 +11,7 @@ def f(x1,x2,x3): ...@@ -11,7 +11,7 @@ def f(x1,x2,x3):
@pytest.mark.parametrize( @pytest.mark.parametrize(
"calc_second_order, skip_values, nsamples, seed, mode, max_workers", "calc_second_order, skip_values, nbase, seed, mode, max_workers",
[ [
(False, None, 1024, None, None, None), (False, None, 1024, None, None, None),
(True, None, 1024, 1, 'parallel', 2), (True, None, 1024, 1, 'parallel', 2),
...@@ -19,13 +19,13 @@ def f(x1,x2,x3): ...@@ -19,13 +19,13 @@ def f(x1,x2,x3):
(False, 2**16, 2048, 8, 'serial', None) (False, 2**16, 2048, 8, 'serial', None)
] ]
) )
def test_SobolAnalyze(calc_second_order, skip_values, nsamples, seed, mode, def test_SobolAnalyze(calc_second_order, skip_values, nbase, seed, mode,
max_workers): max_workers):
ndim = 3 ndim = 3
bounds = np.array([[-np.pi, np.pi], [-np.pi, np.pi], [-np.pi, np.pi]]) bounds = np.array([[-np.pi, np.pi], [-np.pi, np.pi], [-np.pi, np.pi]])
saltelli_sampler = Saltelli(ndim, bounds, calc_second_order, skip_values) saltelli_sampler = Saltelli(ndim, bounds, calc_second_order, skip_values)
saltelli_samples = saltelli_sampler.sample(nsamples) saltelli_samples = saltelli_sampler.sample(nbase)
Y = f(saltelli_samples[:,0], saltelli_samples[:,1], saltelli_samples[:, 2]) Y = f(saltelli_samples[:,0], saltelli_samples[:,1], saltelli_samples[:, 2])
sobol_analyzer = SobolAnalyze(ndim, Y, calc_second_order, seed=seed) sobol_analyzer = SobolAnalyze(ndim, Y, calc_second_order, seed=seed)
...@@ -44,7 +44,7 @@ def test_SobolAnalyze(calc_second_order, skip_values, nsamples, seed, mode, ...@@ -44,7 +44,7 @@ def test_SobolAnalyze(calc_second_order, skip_values, nsamples, seed, mode,
@pytest.mark.parametrize( @pytest.mark.parametrize(
"calc_second_order, skip_values, nsamples, seed, mode, max_workers", "calc_second_order, skip_values, nbase, seed, mode, max_workers",
[ [
(False, None, 1024, None, None, None), (False, None, 1024, None, None, None),
(True, None, 1024, 1, 'parallel', 4), (True, None, 1024, 1, 'parallel', 4),
...@@ -53,14 +53,14 @@ def test_SobolAnalyze(calc_second_order, skip_values, nsamples, seed, mode, ...@@ -53,14 +53,14 @@ def test_SobolAnalyze(calc_second_order, skip_values, nsamples, seed, mode,
(False, 2**16, 512, 8, 'serial', None) (False, 2**16, 512, 8, 'serial', None)
] ]
) )
def test_SobolAnalyze_with_emulation(calc_second_order, skip_values, nsamples, def test_SobolAnalyze_with_emulation(calc_second_order, skip_values, nbase,
seed, mode, max_workers): seed, mode, max_workers):
ndim = 3 ndim = 3
bounds = np.array([[-np.pi, np.pi], [-np.pi, np.pi], [-np.pi, np.pi]]) bounds = np.array([[-np.pi, np.pi], [-np.pi, np.pi], [-np.pi, np.pi]])
lhs_sampler = LHS(ndim, bounds, seed, criterion='maximin', iteration=200) lhs_sampler = LHS(ndim, bounds, seed, criterion='maximin', iteration=200)
design = lhs_sampler.sample(100) design = lhs_sampler.sample(nsamples=100)
response = f(design[:,0], design[:,1], design[:,2]) response = f(design[:,0], design[:,1], design[:,2])
scalar_gasp = ScalarGaSP(ndim) scalar_gasp = ScalarGaSP(ndim)
...@@ -75,7 +75,7 @@ def test_SobolAnalyze_with_emulation(calc_second_order, skip_values, nsamples, ...@@ -75,7 +75,7 @@ def test_SobolAnalyze_with_emulation(calc_second_order, skip_values, nsamples,
f'{np.mean(np.abs(relative_diff))}') f'{np.mean(np.abs(relative_diff))}')
saltelli_sampler = Saltelli(ndim, bounds, calc_second_order, skip_values) saltelli_sampler = Saltelli(ndim, bounds, calc_second_order, skip_values)
saltelli_samples = saltelli_sampler.sample(nsamples) saltelli_samples = saltelli_sampler.sample(nbase)
Y = scalar_gasp.sample(saltelli_samples, 50) Y = scalar_gasp.sample(saltelli_samples, 50)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment