From 71e38722dba6a33a2f91d0e78eab8b4856d9d94b Mon Sep 17 00:00:00 2001 From: Lukas Platz Date: Mon, 10 Feb 2020 17:04:30 +0100 Subject: [PATCH 1/7] concise CorrelatedField offset parametrization --- nifty6/library/correlated_fields.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/nifty6/library/correlated_fields.py b/nifty6/library/correlated_fields.py index 1d645e34..6d703d6f 100644 --- a/nifty6/library/correlated_fields.py +++ b/nifty6/library/correlated_fields.py @@ -352,18 +352,19 @@ class _Amplitude(Operator): class CorrelatedFieldMaker: - def __init__(self, amplitude_offset, prefix, total_N): - if not isinstance(amplitude_offset, Operator): - raise TypeError("amplitude_offset needs to be an operator") + def __init__(self, offset_mean, offset_fluctuations_op, prefix, total_N): + if not isinstance(offset_fluctuations_op, Operator): + raise TypeError("offset_fluctuations_op needs to be an operator") self._a = [] self._position_spaces = [] - self._azm = amplitude_offset + self._offset_mean = offset_mean + self._azm = offset_fluctuations_op self._prefix = prefix self._total_N = total_N @staticmethod - def make(offset_amplitude_mean, offset_amplitude_stddev, prefix, + def make(offset_mean, offset_variation_mean, offset_variation_stddev, prefix, total_N=0, dofdex=None): if dofdex is None: @@ -371,13 +372,13 @@ class CorrelatedFieldMaker: elif len(dofdex) != total_N: raise ValueError("length of dofdex needs to match total_N") N = max(dofdex) + 1 if total_N > 0 else 0 - zm = _LognormalMomentMatching(offset_amplitude_mean, - offset_amplitude_stddev, + zm = _LognormalMomentMatching(offset_variation_mean, + offset_variation_stddev, prefix + 'zeromode', N) if total_N > 0: zm = _Distributor(dofdex, zm.target, UnstructuredDomain(total_N)) @ zm - return CorrelatedFieldMaker(zm, prefix, total_N) + return CorrelatedFieldMaker(offset_mean, zm, prefix, total_N) def add_fluctuations(self, position_space, @@ -470,12 +471,13 @@ class CorrelatedFieldMaker: corr = reduce(mul, a) return ht(azm*corr*ducktape(hspace, None, self._prefix + 'xi')) - def finalize(self, offset=None, prior_info=100): + def finalize(self, prior_info=100): """ offset vs zeromode: volume factor """ op = self._finalize_from_op() - if offset is not None: + if self._offset_mean is not None: + offset = self._offset_mean # Deviations from this offset must not be considered here as they # are learned by the zeromode if isinstance(offset, (Field, MultiField)): -- GitLab From 3ffab4dfe44fc2d85630b162449e8f05f2cf0a55 Mon Sep 17 00:00:00 2001 From: Lukas Platz Date: Mon, 10 Feb 2020 17:04:57 +0100 Subject: [PATCH 2/7] make demos comply --- demos/getting_started_3.py | 29 ++++++++++++++++++++++++++--- demos/getting_started_mf.py | 2 +- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/demos/getting_started_3.py b/demos/getting_started_3.py index c3fdbb83..3451c5a2 100644 --- a/demos/getting_started_3.py +++ b/demos/getting_started_3.py @@ -57,9 +57,32 @@ if __name__ == '__main__': position_space = ift.RGSpace([128, 128]) - cfmaker = ift.CorrelatedFieldMaker.make(1e-3, 1e-6, '') - cfmaker.add_fluctuations(position_space, - 1., 1e-2, 1, .5, .1, .5, -3, 0.5, '') + cfmaker = ift.CorrelatedFieldMaker.make( + offset_mean = 0., # 0. + offset_variation_mean = 1e-3, # 1e-3 + offset_variation_stddev = 1e-6, # 1e-6 + prefix = '') + + fluctuations_dict = { + # Amplitude of the fluctuations + 'fluctuations_mean': 2.0, # 1.0 + 'fluctuations_stddev': 1.0, # 1e-2 + + # Smooth variation speed + 'flexibility_mean': 2.5, # 1.0 + 'flexibility_stddev': 1.0, # 0.5 + + # How strong the ragged component of the spectrum is + # (Ratio of Wiener process and integrated Wiener process ?) + 'asperity_mean': 0.5, # 0.1 + 'asperity_stddev': 0.5, # 0.5 + + # Slope of linear spectrum component + 'loglogavgslope_mean': -2.0, # -3.0 + 'loglogavgslope_stddev': 0.5 # 0.5 + } + cfmaker.add_fluctuations(position_space, **fluctuations_dict) + correlated_field = cfmaker.finalize() A = cfmaker.amplitude diff --git a/demos/getting_started_mf.py b/demos/getting_started_mf.py index 83da353b..4df8132b 100644 --- a/demos/getting_started_mf.py +++ b/demos/getting_started_mf.py @@ -75,7 +75,7 @@ if __name__ == '__main__': sp2 = ift.RGSpace(npix2) # Set up signal model - cfmaker = ift.CorrelatedFieldMaker.make(1e-2, 1e-6, '') + cfmaker = ift.CorrelatedFieldMaker.make(0., 1e-2, 1e-6, '') cfmaker.add_fluctuations(sp1, 0.1, 1e-2, 1, .1, .01, .5, -2, 1., 'amp1') cfmaker.add_fluctuations(sp2, 0.1, 1e-2, 1, .1, .01, .5, -1.5, .5, 'amp2') -- GitLab From cfa2f51141228bb655c08a73747b107a37d159d1 Mon Sep 17 00:00:00 2001 From: Lukas Platz Date: Fri, 6 Mar 2020 14:39:50 +0100 Subject: [PATCH 3/7] update tests --- test/test_operators/test_correlated_fields.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/test_operators/test_correlated_fields.py b/test/test_operators/test_correlated_fields.py index 517880eb..e420277a 100644 --- a/test/test_operators/test_correlated_fields.py +++ b/test/test_operators/test_correlated_fields.py @@ -30,9 +30,9 @@ import nifty6 as ift ]) @pytest.mark.parametrize('rseed', [13, 2]) @pytest.mark.parametrize('Astds', [[1., 3.], [0.2, 1.4]]) -@pytest.mark.parametrize('offset_std', [1., 10.]) +@pytest.mark.parametrize('offset_std_mean', [1., 10.]) @pytest.mark.parametrize('N', [0,2]) -def testAmplitudesConsistency(rseed, sspace, Astds, offset_std, N): +def testAmplitudesConsistency(rseed, sspace, Astds, offset_std_mean, N): def stats(op, samples): sc = ift.StatCalculator() for s in samples: @@ -50,7 +50,7 @@ def testAmplitudesConsistency(rseed, sspace, Astds, offset_std, N): else: dofdex1, dofdex2, dofdex3 = None, None, None - fa = ift.CorrelatedFieldMaker.make(offset_std, 1E-8, '', N, dofdex1) + fa = ift.CorrelatedFieldMaker.make(0., offset_std_mean, 1E-8, '', N, dofdex1) fa.add_fluctuations(sspace, Astds[0], 1E-8, 1.1, 2., 2.1, .5, -2, 1., 'spatial', dofdex = dofdex2) fa.add_fluctuations(fsspace, Astds[1], 1E-8, 3.1, 1., .5, .1, -4, 1., @@ -81,8 +81,7 @@ def testAmplitudesConsistency(rseed, sspace, Astds, offset_std, N): assert_allclose(slice_fluct_std0, sl_fluct_space, rtol=0.5) assert_allclose(slice_fluct_std1, sl_fluct_freq, rtol=0.5) - - fa = ift.CorrelatedFieldMaker.make(offset_std, .1, '', N, dofdex1) + fa = ift.CorrelatedFieldMaker.make(0., offset_std_mean, .1, '', N, dofdex1) fa.add_fluctuations(fsspace, Astds[1], 1., 3.1, 1., .5, .1, -4, 1., 'freq', dofdex = dofdex3) m = 3. x = fa.moment_slice_to_average(m) -- GitLab From cb0b29db60b96271f060f59ca24591f7acb08853 Mon Sep 17 00:00:00 2001 From: Lukas Platz Date: Fri, 6 Mar 2020 19:37:16 +0100 Subject: [PATCH 4/7] rename parameters --- demos/getting_started_3.py | 8 ++++---- nifty6/library/correlated_fields.py | 23 ++++++++++++++++++++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/demos/getting_started_3.py b/demos/getting_started_3.py index 3451c5a2..45be6b05 100644 --- a/demos/getting_started_3.py +++ b/demos/getting_started_3.py @@ -58,14 +58,14 @@ if __name__ == '__main__': position_space = ift.RGSpace([128, 128]) cfmaker = ift.CorrelatedFieldMaker.make( - offset_mean = 0., # 0. - offset_variation_mean = 1e-3, # 1e-3 - offset_variation_stddev = 1e-6, # 1e-6 + offset_mean = 0.0, # 0. + offset_std_mean = 1e-3, # 1e-3 + offset_std_std = 1e-6, # 1e-6 prefix = '') fluctuations_dict = { # Amplitude of the fluctuations - 'fluctuations_mean': 2.0, # 1.0 + 'fluctuations_mean': 2.0, # 1.0 'fluctuations_stddev': 1.0, # 1e-2 # Smooth variation speed diff --git a/nifty6/library/correlated_fields.py b/nifty6/library/correlated_fields.py index 6d703d6f..4ce7007b 100644 --- a/nifty6/library/correlated_fields.py +++ b/nifty6/library/correlated_fields.py @@ -364,16 +364,33 @@ class CorrelatedFieldMaker: self._total_N = total_N @staticmethod - def make(offset_mean, offset_variation_mean, offset_variation_stddev, prefix, + def make(offset_mean, offset_std_mean, offset_std_std, prefix, total_N=0, dofdex=None): + """Returns a CorrelatedFieldMaker object. + + Parameters + ---------- + offset_mean : float + Mean offset from zero of the correlated field to be made. + offset_std_mean : float + Mean standard deviation of the offset value. + offset_std_std : float + Standard deviation of the stddev of the offset value. + prefix : string + Prefix to the names of the domains of the cf operator to be made. + total_N : integer + ? + dofdex : np.array + ? + """ if dofdex is None: dofdex = np.full(total_N, 0) elif len(dofdex) != total_N: raise ValueError("length of dofdex needs to match total_N") N = max(dofdex) + 1 if total_N > 0 else 0 - zm = _LognormalMomentMatching(offset_variation_mean, - offset_variation_stddev, + zm = _LognormalMomentMatching(offset_std_mean, + offset_std_std, prefix + 'zeromode', N) if total_N > 0: -- GitLab From 8b7d2857fbb72a40ee36408eca55196df9d56ee9 Mon Sep 17 00:00:00 2001 From: Philipp Arras Date: Wed, 25 Mar 2020 15:56:13 +0100 Subject: [PATCH 5/7] Cosmetics --- test/test_operators/test_correlated_fields.py | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/test/test_operators/test_correlated_fields.py b/test/test_operators/test_correlated_fields.py index e420277a..e8233da0 100644 --- a/test/test_operators/test_correlated_fields.py +++ b/test/test_operators/test_correlated_fields.py @@ -31,7 +31,7 @@ import nifty6 as ift @pytest.mark.parametrize('rseed', [13, 2]) @pytest.mark.parametrize('Astds', [[1., 3.], [0.2, 1.4]]) @pytest.mark.parametrize('offset_std_mean', [1., 10.]) -@pytest.mark.parametrize('N', [0,2]) +@pytest.mark.parametrize('N', [0, 2]) def testAmplitudesConsistency(rseed, sspace, Astds, offset_std_mean, N): def stats(op, samples): sc = ift.StatCalculator() @@ -43,18 +43,16 @@ def testAmplitudesConsistency(rseed, sspace, Astds, offset_std_mean, N): nsam = 100 fsspace = ift.RGSpace((12,), (0.4,)) - if N==2: - dofdex1 = [0,0] - dofdex2 = [1,0] - dofdex3 = [1,1] + if N == 2: + dofdex1 = [0, 0] + dofdex2 = [1, 0] + dofdex3 = [1, 1] else: dofdex1, dofdex2, dofdex3 = None, None, None fa = ift.CorrelatedFieldMaker.make(0., offset_std_mean, 1E-8, '', N, dofdex1) - fa.add_fluctuations(sspace, Astds[0], 1E-8, 1.1, 2., 2.1, .5, -2, 1., - 'spatial', dofdex = dofdex2) - fa.add_fluctuations(fsspace, Astds[1], 1E-8, 3.1, 1., .5, .1, -4, 1., - 'freq', dofdex = dofdex3) + fa.add_fluctuations(sspace, Astds[0], 1E-8, 1.1, 2., 2.1, .5, -2, 1., 'spatial', dofdex=dofdex2) + fa.add_fluctuations(fsspace, Astds[1], 1E-8, 3.1, 1., .5, .1, -4, 1., 'freq', dofdex=dofdex3) op = fa.finalize() samples = [ift.from_random('normal', op.domain) for _ in range(nsam)] @@ -82,14 +80,13 @@ def testAmplitudesConsistency(rseed, sspace, Astds, offset_std_mean, N): assert_allclose(slice_fluct_std1, sl_fluct_freq, rtol=0.5) fa = ift.CorrelatedFieldMaker.make(0., offset_std_mean, .1, '', N, dofdex1) - fa.add_fluctuations(fsspace, Astds[1], 1., 3.1, 1., .5, .1, -4, 1., 'freq', dofdex = dofdex3) + fa.add_fluctuations(fsspace, Astds[1], 1., 3.1, 1., .5, .1, -4, 1., 'freq', dofdex=dofdex3) m = 3. x = fa.moment_slice_to_average(m) - fa.add_fluctuations(sspace, x, 1.5, 1.1, 2., 2.1, .5, -2, 1., 'spatial', 0, dofdex = dofdex2) + fa.add_fluctuations(sspace, x, 1.5, 1.1, 2., 2.1, .5, -2, 1., 'spatial', 0, dofdex=dofdex2) op = fa.finalize() em, estd = stats(fa.slice_fluctuation(0), samples) assert_allclose(m, em, rtol=0.5) - assert op.target[-2] == sspace assert op.target[-1] == fsspace -- GitLab From 2c5d7fd2a7281f4bfe2a07e9e7b444fe7fcc6b2c Mon Sep 17 00:00:00 2001 From: Philipp Arras Date: Wed, 25 Mar 2020 15:57:18 +0100 Subject: [PATCH 6/7] Add non-vanishing zeromode mean to tests --- test/test_operators/test_correlated_fields.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/test_operators/test_correlated_fields.py b/test/test_operators/test_correlated_fields.py index e8233da0..7cb82e08 100644 --- a/test/test_operators/test_correlated_fields.py +++ b/test/test_operators/test_correlated_fields.py @@ -32,7 +32,8 @@ import nifty6 as ift @pytest.mark.parametrize('Astds', [[1., 3.], [0.2, 1.4]]) @pytest.mark.parametrize('offset_std_mean', [1., 10.]) @pytest.mark.parametrize('N', [0, 2]) -def testAmplitudesConsistency(rseed, sspace, Astds, offset_std_mean, N): +@pytest.mark.parametrize('zm_mean', [0, 1.]) +def testAmplitudesConsistency(rseed, sspace, Astds, offset_std_mean, N, zm_mean): def stats(op, samples): sc = ift.StatCalculator() for s in samples: @@ -50,7 +51,7 @@ def testAmplitudesConsistency(rseed, sspace, Astds, offset_std_mean, N): else: dofdex1, dofdex2, dofdex3 = None, None, None - fa = ift.CorrelatedFieldMaker.make(0., offset_std_mean, 1E-8, '', N, dofdex1) + fa = ift.CorrelatedFieldMaker.make(zm_mean, offset_std_mean, 1E-8, '', N, dofdex1) fa.add_fluctuations(sspace, Astds[0], 1E-8, 1.1, 2., 2.1, .5, -2, 1., 'spatial', dofdex=dofdex2) fa.add_fluctuations(fsspace, Astds[1], 1E-8, 3.1, 1., .5, .1, -4, 1., 'freq', dofdex=dofdex3) op = fa.finalize() -- GitLab From 8eceb5ede609d503b0ddd805df66f1b0593e4ed0 Mon Sep 17 00:00:00 2001 From: Philipp Arras Date: Wed, 25 Mar 2020 15:58:26 +0100 Subject: [PATCH 7/7] Cosmetics --- test/test_operators/test_correlated_fields.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/test_operators/test_correlated_fields.py b/test/test_operators/test_correlated_fields.py index 7cb82e08..80664369 100644 --- a/test/test_operators/test_correlated_fields.py +++ b/test/test_operators/test_correlated_fields.py @@ -22,12 +22,10 @@ from numpy.testing import assert_allclose import nifty6 as ift -@pytest.mark.parametrize('sspace', [ - ift.RGSpace(4), - ift.RGSpace((4, 4), (0.123, 0.4)), - ift.HPSpace(8), - ift.GLSpace(4) -]) +@pytest.mark.parametrize('sspace', [ift.RGSpace(4), + ift.RGSpace((4, 4), (0.123, 0.4)), + ift.HPSpace(8), + ift.GLSpace(4)]) @pytest.mark.parametrize('rseed', [13, 2]) @pytest.mark.parametrize('Astds', [[1., 3.], [0.2, 1.4]]) @pytest.mark.parametrize('offset_std_mean', [1., 10.]) -- GitLab