acoular 23.11__py3-none-any.whl → 24.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. acoular/__init__.py +118 -50
  2. acoular/calib.py +29 -38
  3. acoular/configuration.py +116 -73
  4. acoular/demo/__init__.py +10 -4
  5. acoular/demo/acoular_demo.py +78 -53
  6. acoular/environments.py +265 -262
  7. acoular/fastFuncs.py +361 -191
  8. acoular/fbeamform.py +1478 -1407
  9. acoular/grids.py +501 -545
  10. acoular/h5cache.py +50 -59
  11. acoular/h5files.py +154 -137
  12. acoular/internal.py +10 -11
  13. acoular/microphones.py +57 -53
  14. acoular/sdinput.py +47 -52
  15. acoular/signals.py +167 -179
  16. acoular/sources.py +818 -693
  17. acoular/spectra.py +349 -359
  18. acoular/tbeamform.py +414 -413
  19. acoular/tfastfuncs.py +178 -101
  20. acoular/tools/__init__.py +25 -0
  21. acoular/tools/aiaa.py +186 -0
  22. acoular/tools/helpers.py +189 -0
  23. acoular/tools/metrics.py +165 -0
  24. acoular/tprocess.py +1201 -1143
  25. acoular/traitsviews.py +513 -501
  26. acoular/trajectory.py +50 -52
  27. acoular/version.py +5 -6
  28. acoular/xml/minidsp_uma-16.xml +20 -0
  29. acoular/xml/{minidsp_uma16.xml → minidsp_uma-16_mirrored.xml} +3 -0
  30. {acoular-23.11.dist-info → acoular-24.5.dist-info}/METADATA +47 -40
  31. acoular-24.5.dist-info/RECORD +50 -0
  32. {acoular-23.11.dist-info → acoular-24.5.dist-info}/WHEEL +1 -1
  33. acoular-24.5.dist-info/licenses/LICENSE +28 -0
  34. acoular/fileimport.py +0 -380
  35. acoular/nidaqimport.py +0 -273
  36. acoular/tests/reference_data/BeamformerBase.npy +0 -0
  37. acoular/tests/reference_data/BeamformerBaseFalse1.npy +0 -0
  38. acoular/tests/reference_data/BeamformerBaseFalse2.npy +0 -0
  39. acoular/tests/reference_data/BeamformerBaseFalse3.npy +0 -0
  40. acoular/tests/reference_data/BeamformerBaseFalse4.npy +0 -0
  41. acoular/tests/reference_data/BeamformerBaseTrue1.npy +0 -0
  42. acoular/tests/reference_data/BeamformerBaseTrue2.npy +0 -0
  43. acoular/tests/reference_data/BeamformerBaseTrue3.npy +0 -0
  44. acoular/tests/reference_data/BeamformerBaseTrue4.npy +0 -0
  45. acoular/tests/reference_data/BeamformerCMF.npy +0 -0
  46. acoular/tests/reference_data/BeamformerCapon.npy +0 -0
  47. acoular/tests/reference_data/BeamformerClean.npy +0 -0
  48. acoular/tests/reference_data/BeamformerCleansc.npy +0 -0
  49. acoular/tests/reference_data/BeamformerCleant.npy +0 -0
  50. acoular/tests/reference_data/BeamformerCleantSq.npy +0 -0
  51. acoular/tests/reference_data/BeamformerCleantSqTraj.npy +0 -0
  52. acoular/tests/reference_data/BeamformerCleantTraj.npy +0 -0
  53. acoular/tests/reference_data/BeamformerDamas.npy +0 -0
  54. acoular/tests/reference_data/BeamformerDamasPlus.npy +0 -0
  55. acoular/tests/reference_data/BeamformerEig.npy +0 -0
  56. acoular/tests/reference_data/BeamformerEigFalse1.npy +0 -0
  57. acoular/tests/reference_data/BeamformerEigFalse2.npy +0 -0
  58. acoular/tests/reference_data/BeamformerEigFalse3.npy +0 -0
  59. acoular/tests/reference_data/BeamformerEigFalse4.npy +0 -0
  60. acoular/tests/reference_data/BeamformerEigTrue1.npy +0 -0
  61. acoular/tests/reference_data/BeamformerEigTrue2.npy +0 -0
  62. acoular/tests/reference_data/BeamformerEigTrue3.npy +0 -0
  63. acoular/tests/reference_data/BeamformerEigTrue4.npy +0 -0
  64. acoular/tests/reference_data/BeamformerFunctional.npy +0 -0
  65. acoular/tests/reference_data/BeamformerGIB.npy +0 -0
  66. acoular/tests/reference_data/BeamformerGridlessOrth.npy +0 -0
  67. acoular/tests/reference_data/BeamformerMusic.npy +0 -0
  68. acoular/tests/reference_data/BeamformerOrth.npy +0 -0
  69. acoular/tests/reference_data/BeamformerTime.npy +0 -0
  70. acoular/tests/reference_data/BeamformerTimeSq.npy +0 -0
  71. acoular/tests/reference_data/BeamformerTimeSqTraj.npy +0 -0
  72. acoular/tests/reference_data/BeamformerTimeTraj.npy +0 -0
  73. acoular/tests/reference_data/Environment.npy +0 -0
  74. acoular/tests/reference_data/Example1_numerical_values_testsum.h5 +0 -0
  75. acoular/tests/reference_data/FiltFiltOctave__.npy +0 -0
  76. acoular/tests/reference_data/FiltFiltOctave_band_100_0_fraction_Thirdoctave_.npy +0 -0
  77. acoular/tests/reference_data/FiltFreqWeight_weight_A_.npy +0 -0
  78. acoular/tests/reference_data/FiltFreqWeight_weight_C_.npy +0 -0
  79. acoular/tests/reference_data/FiltFreqWeight_weight_Z_.npy +0 -0
  80. acoular/tests/reference_data/FiltOctave__.npy +0 -0
  81. acoular/tests/reference_data/FiltOctave_band_100_0_fraction_Thirdoctave_.npy +0 -0
  82. acoular/tests/reference_data/Filter__.npy +0 -0
  83. acoular/tests/reference_data/GeneralFlowEnvironment.npy +0 -0
  84. acoular/tests/reference_data/OctaveFilterBank__.npy +0 -0
  85. acoular/tests/reference_data/OpenJet.npy +0 -0
  86. acoular/tests/reference_data/PointSource.npy +0 -0
  87. acoular/tests/reference_data/PowerSpectra_csm.npy +0 -0
  88. acoular/tests/reference_data/PowerSpectra_ev.npy +0 -0
  89. acoular/tests/reference_data/RotatingFlow.npy +0 -0
  90. acoular/tests/reference_data/SlotJet.npy +0 -0
  91. acoular/tests/reference_data/TimeAverage__.npy +0 -0
  92. acoular/tests/reference_data/TimeCumAverage__.npy +0 -0
  93. acoular/tests/reference_data/TimeExpAverage_weight_F_.npy +0 -0
  94. acoular/tests/reference_data/TimeExpAverage_weight_I_.npy +0 -0
  95. acoular/tests/reference_data/TimeExpAverage_weight_S_.npy +0 -0
  96. acoular/tests/reference_data/TimeInOut__.npy +0 -0
  97. acoular/tests/reference_data/TimePower__.npy +0 -0
  98. acoular/tests/reference_data/TimeReverse__.npy +0 -0
  99. acoular/tests/reference_data/UniformFlowEnvironment.npy +0 -0
  100. acoular/tests/reference_data/beamformer_traj_time_data.h5 +0 -0
  101. acoular/tests/run_tests.sh +0 -18
  102. acoular/tests/run_tests_osx.sh +0 -16
  103. acoular/tests/test.npy +0 -0
  104. acoular/tests/test_beamformer_results.py +0 -204
  105. acoular/tests/test_classes.py +0 -60
  106. acoular/tests/test_digest.py +0 -125
  107. acoular/tests/test_environments.py +0 -73
  108. acoular/tests/test_example1.py +0 -124
  109. acoular/tests/test_grid.py +0 -92
  110. acoular/tests/test_integrate.py +0 -102
  111. acoular/tests/test_signals.py +0 -60
  112. acoular/tests/test_sources.py +0 -65
  113. acoular/tests/test_spectra.py +0 -38
  114. acoular/tests/test_timecache.py +0 -35
  115. acoular/tests/test_tprocess.py +0 -90
  116. acoular/tests/test_traj_beamformer_results.py +0 -164
  117. acoular/tests/unsupported/SpeedComparison/OvernightTestcasesBeamformer_nMics32_nGridPoints100_nFreqs4_nTrials10.png +0 -0
  118. acoular/tests/unsupported/SpeedComparison/cythonBeamformer.pyx +0 -237
  119. acoular/tests/unsupported/SpeedComparison/mainForCython.py +0 -103
  120. acoular/tests/unsupported/SpeedComparison/mainForParallelJit.py +0 -143
  121. acoular/tests/unsupported/SpeedComparison/setupCythonOpenMP.py +0 -63
  122. acoular/tests/unsupported/SpeedComparison/sharedFunctions.py +0 -153
  123. acoular/tests/unsupported/SpeedComparison/timeOverNMics_AllImportantMethods.png +0 -0
  124. acoular/tests/unsupported/SpeedComparison/timeOverNMics_faverage.png +0 -0
  125. acoular/tests/unsupported/SpeedComparison/vglOptimierungFAverage.py +0 -204
  126. acoular/tests/unsupported/SpeedComparison/vglOptimierungGaussSeidel.py +0 -182
  127. acoular/tests/unsupported/SpeedComparison/vglOptimierungR_BEAMFULL_INVERSE.py +0 -764
  128. acoular/tests/unsupported/SpeedComparison/vglOptimierungR_BEAM_OS.py +0 -231
  129. acoular/tests/unsupported/SpeedComparison/whatsFastestWayFor_absASquared.py +0 -48
  130. acoular/tests/unsupported/functionalBeamformer.py +0 -123
  131. acoular/tests/unsupported/precisionTest.py +0 -153
  132. acoular/tests/unsupported/validationOfBeamformerFuncsPOSTAcoularIntegration.py +0 -254
  133. acoular/tests/unsupported/validationOfBeamformerFuncsPREeAcoularIntegration.py +0 -531
  134. acoular/tools.py +0 -418
  135. acoular-23.11.dist-info/RECORD +0 -146
  136. acoular-23.11.dist-info/licenses/LICENSE +0 -29
  137. {acoular-23.11.dist-info → acoular-24.5.dist-info}/licenses/AUTHORS.rst +0 -0
Binary file
Binary file
Binary file
@@ -1,18 +0,0 @@
1
- #!/bin/bash
2
-
3
- #remove cache data before testing
4
- rm -rf ./cache/*
5
- rm -rf ./__pycache__
6
-
7
- #build a test suite object which runs the tests in this folder
8
- python -m unittest discover -v -p "test_*.py"
9
-
10
- VAL=$?
11
-
12
- #remove cache data after testing
13
- rm -rf ./cache/*
14
- rm -rf ./__pycache__
15
-
16
- exit $VAL
17
-
18
-
@@ -1,16 +0,0 @@
1
- #!/bin/bash
2
-
3
- #remove cache data before testing
4
- rm -rf ./cache/*
5
- rm -rf ./__pycache__
6
-
7
- #build a test suite object which runs the tests in this folder
8
- python3 -m unittest discover -v -p "test_*.py"
9
-
10
- VAL=$?
11
-
12
- #remove cache data after testing
13
- rm -rf ./cache/*
14
- rm -rf ./__pycache__
15
-
16
- exit $VAL
acoular/tests/test.npy DELETED
Binary file
@@ -1,204 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #pylint: disable-msg=E0611, E1101, C0103, R0901, R0902, R0903, R0904, W0232
3
- #------------------------------------------------------------------------------
4
- # Copyright (c) Acoular Development Team.
5
- #------------------------------------------------------------------------------
6
- """Implements testing of frequency beamformers.
7
- """
8
-
9
- import unittest
10
-
11
- from os.path import join
12
-
13
- import numpy as np
14
-
15
- #acoular imports
16
- import acoular
17
- acoular.config.global_caching = 'none' # to make sure that nothing is cached
18
-
19
- from acoular import Calib, MicGeom, PowerSpectra, \
20
- RectGrid, BeamformerBase, BeamformerEig, BeamformerOrth, BeamformerCleansc, \
21
- MaskedTimeSamples, BeamformerCMF, \
22
- BeamformerCapon, BeamformerMusic, BeamformerDamas, BeamformerClean, \
23
- BeamformerFunctional, BeamformerDamasPlus, BeamformerGIB, BeamformerGridlessOrth,\
24
- SteeringVector, Environment
25
-
26
- # if this flag is set to True
27
- WRITE_NEW_REFERENCE_DATA = False
28
- # new beamformer results are generated for comparison during testing.
29
- # Should always be False. Only set to True if it is necessary to
30
- # recalculate the data due to intended changes of the Beamformers.
31
-
32
-
33
- #load exampledata
34
- datafile = join('..','..','examples','example_data.h5')
35
- calibfile = join('..','..','examples','example_calib.xml')
36
- micgeofile = join( '..','xml','array_56.xml')
37
-
38
- #frequencies to test
39
- cfreqs = 1000,8000
40
-
41
- # values from example 1
42
- t1 = MaskedTimeSamples(name=datafile)
43
- t1.start = 0 # first sample, default
44
- t1.stop = 16000 # last valid sample = 15999
45
- invalid = [1,7] # list of invalid channels (unwanted microphones etc.)
46
- t1.invalid_channels = invalid
47
- t1.calib = Calib(from_file=calibfile)
48
- m = MicGeom(from_file=micgeofile)
49
- m.invalid_channels = invalid
50
- g = RectGrid(x_min=-0.6, x_max=-0.0, y_min=-0.3, y_max=0.3, z=0.68,
51
- increment=0.05 )
52
- env=Environment(c=346.04)
53
- st = SteeringVector(grid=g, mics=m, env=env)
54
- f = PowerSpectra(time_data=t1,
55
- window='Hanning', overlap='50%', block_size=128, #FFT-parameters
56
- cached = False )
57
-
58
- # produces a tuple of beamformer objects to test
59
- # because we need new objects for each test we have to call this more than once
60
- def fbeamformers():
61
- bb = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = False)
62
- be = BeamformerEig(freq_data=f, steer=st, r_diag=True, n=54, cached = False)
63
-
64
- #frequency beamformers to test
65
- bbase = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = False)
66
- bc = BeamformerCapon(freq_data=f, steer=st, cached=False)
67
- beig = BeamformerEig(freq_data=f, steer=st, r_diag=True, n=54, cached = False)
68
- bm = BeamformerMusic(freq_data=f, steer=st, n=6, cached = False)
69
- bd = BeamformerDamas(beamformer=bb, n_iter=10, cached = False)
70
- bdp = BeamformerDamasPlus(beamformer=bb, n_iter=100, cached = False)
71
- bo = BeamformerOrth(freq_data=f, steer=st, r_diag=True, eva_list=list(range(38,54)), cached = False)
72
- bs = BeamformerCleansc(freq_data=f, steer=st, r_diag=True, cached = False)
73
- bcmf = BeamformerCMF(freq_data=f, steer=st, method='LassoLarsBIC', cached = False)
74
- bl = BeamformerClean(beamformer=bb, n_iter=10, cached = False)
75
- bf = BeamformerFunctional(freq_data=f, steer=st, r_diag=False, gamma=3, cached = False)
76
- bgib = BeamformerGIB(freq_data=f, steer=st, method= 'LassoLars', n=2, cached = False)
77
- bgo = BeamformerGridlessOrth(freq_data=f, steer=st, r_diag=False, n=1, shgo={'n':16}, cached = False)
78
- return (bbase, bc, beig, bm, bl, bo, bs, bd, bcmf, bf, bdp, bgib, bgo)
79
-
80
- class acoular_beamformer_test(unittest.TestCase):
81
-
82
- def test_beamformer_freq_results(self):
83
- # we expect the results to computed
84
- acoular.config.global_caching = 'none'
85
- for b in fbeamformers():
86
- with self.subTest(b.__class__.__name__+" global_caching = none"):
87
- name = join('reference_data',f'{b.__class__.__name__}.npy')
88
- # stack all frequency band results together
89
- actual_data = np.array([b.synthetic(cf,1) for cf in cfreqs],dtype=np.float32)
90
- if WRITE_NEW_REFERENCE_DATA:
91
- np.save(name,actual_data)
92
- ref_data = np.load(name)
93
- np.testing.assert_allclose(actual_data, ref_data, rtol=5e-5, atol=5e-8)
94
- # we expect the results to be computed and written to cache
95
- acoular.config.global_caching = 'individual'
96
- for b in fbeamformers():
97
- b.cached = True
98
- with self.subTest(b.__class__.__name__+" global_caching = individual"):
99
- name = join('reference_data',f'{b.__class__.__name__}.npy')
100
- actual_data = np.array([b.synthetic(cf,1) for cf in cfreqs],dtype=np.float32)
101
- ref_data = np.load(name)
102
- np.testing.assert_allclose(actual_data, ref_data, rtol=5e-5, atol=5e-8)
103
- # we expect the results to be read from cache
104
- acoular.config.global_caching = 'all'
105
- for b in fbeamformers():
106
- b.cached = True
107
- with self.subTest(b.__class__.__name__+" global_caching = all"):
108
- name = join('reference_data',f'{b.__class__.__name__}.npy')
109
- actual_data = np.array([b.synthetic(cf,1) for cf in cfreqs],dtype=np.float32)
110
- ref_data = np.load(name)
111
- np.testing.assert_allclose(actual_data, ref_data, rtol=5e-5, atol=5e-8)
112
- # we expect the cached results to be overwritten
113
- acoular.config.global_caching = 'overwrite'
114
- for b0,b1 in zip(fbeamformers(),fbeamformers()):
115
- b0.cached = True
116
- b1.cached = True
117
- with self.subTest(b0.__class__.__name__+" global_caching = overwrite"):
118
- if hasattr(b0,'beamformer'): # BeamformerClean, BeamformerDamas, BeamformerDamasplus
119
- # do not pass because the .beamformer result is not take from cache
120
- continue # nor recalculated
121
- b0.result[:] = 0
122
- self.assertFalse(np.any(b0.result))
123
- name = join('reference_data',f'{b1.__class__.__name__}.npy')
124
- actual_data = np.array([b1.synthetic(cf,1) for cf in cfreqs],dtype=np.float32)
125
- ref_data = np.load(name)
126
- np.testing.assert_allclose(actual_data, ref_data, rtol=5e-5, atol=5e-8)
127
-
128
- def test_beamformer_caching(self):
129
- # within each subcase, we need new beamformer objects because result is not updated when
130
- # global_caching or cached changes
131
- with self.subTest("global_caching = 'none'"):
132
- acoular.config.global_caching = 'none'
133
- b0 = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = True)
134
- b1 = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = True)
135
- self.assertNotEqual(id(b0.result),id(b1.result))
136
- with self.subTest("global_caching = 'individual'"):
137
- acoular.config.global_caching = 'individual'
138
- b0 = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = True)
139
- b1 = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = True)
140
- self.assertEqual(id(b0.result),id(b1.result))
141
- b1 = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = False)
142
- self.assertNotEqual(id(b0.result),id(b1.result))
143
- with self.subTest("global_caching = 'all'"):
144
- acoular.config.global_caching = 'all'
145
- b0 = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = True)
146
- b1 = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = False)
147
- self.assertEqual(id(b0.result),id(b1.result))
148
- with self.subTest("global_caching = 'readonly'"):
149
- acoular.config.global_caching = 'readonly'
150
- b0 = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = True)
151
- b1 = BeamformerBase(freq_data=f, steer=st, r_diag=True, cached = True)
152
- self.assertEqual(id(b0.result),id(b1.result))
153
-
154
- class Test_PowerSpectra(unittest.TestCase):
155
-
156
- def test_csm(self):
157
- """ test that csm result has not changed over different releases"""
158
- name = join('reference_data',f'{f.__class__.__name__}_csm.npy')
159
- # test only two frequencies
160
- actual_data = np.array(f.csm[(16,32),:,:],dtype=np.complex64)
161
- if WRITE_NEW_REFERENCE_DATA:
162
- np.save(name,actual_data)
163
- ref_data = np.load(name)
164
- np.testing.assert_allclose(actual_data, ref_data, rtol=1e-5, atol=1e-8)
165
-
166
- def test_ev(self):
167
- """ test that eve and eva result has not changed over different releases"""
168
- name = join('reference_data',f'{f.__class__.__name__}_ev.npy')
169
- # test only two frequencies
170
- actual_data = np.array((f.eve*f.eva[:,:,np.newaxis])[(16,32),:,:],dtype=np.complex64)
171
- if WRITE_NEW_REFERENCE_DATA:
172
- np.save(name,actual_data)
173
- ref_data = np.load(name)
174
- np.testing.assert_allclose(actual_data, ref_data, rtol=1e-5, atol=1e-8)
175
-
176
-
177
- class TestSteerFormulation(unittest.TestCase):
178
-
179
- def test_all_steer_formulation(self):
180
- """ tests all variants of beamformerFreq subroutines
181
- """
182
- st = SteeringVector(grid=g, mics=m, env=env)
183
- b0 = BeamformerBase(freq_data=f, steer=st, cached = False)
184
- b1 = BeamformerEig(freq_data=f, steer=st, n=54, cached = False)
185
- for ki,kind in enumerate(('classic', 'inverse','true level', 'true location')):
186
- st.steer_type = kind
187
- for b in (b0,b1):
188
- for dr in (True,False):
189
- b.r_diag = dr
190
- with self.subTest(f"{b.__class__.__name__} r_diag:{dr} steer:{kind}"):
191
- name = join('reference_data',f"{b.__class__.__name__}{dr}{ki+1}.npy")
192
- actual_data = np.array([b.synthetic(cf,1) for cf in cfreqs],dtype=np.float32)
193
- if WRITE_NEW_REFERENCE_DATA:
194
- np.save(name,actual_data)
195
- ref_data = np.load(name)
196
- np.testing.assert_allclose(actual_data, ref_data, rtol=1e-5, atol=1e-8)
197
-
198
-
199
- if __name__ == '__main__':
200
- unittest.main() #exit=False
201
-
202
-
203
-
204
-
@@ -1,60 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #pylint: disable-msg=E0611, E1101, C0103, R0901, R0902, R0903, R0904, W0232
3
- #------------------------------------------------------------------------------
4
- # Copyright (c) Acoular Development Team.
5
- #------------------------------------------------------------------------------
6
- """Implements testing of frequency beamformers.
7
- """
8
-
9
- import unittest
10
- import acoular as ac
11
- from traits.api import HasTraits, Int, Float, Bool, Range, TraitEnum, Enum
12
-
13
- class Test_Instancing(unittest.TestCase):
14
- """Test that ensures that digest of Acoular classes changes correctly on
15
- changes of CArray and List attributes.
16
- """
17
-
18
- def test_instancing(self):
19
- """ test that all Acoular classes can be instatiated """
20
- # iterate over all Acoular definitions labels
21
- for i in dir(ac):
22
- with self.subTest(i):
23
- j = getattr(ac,i) # class, function or variable
24
- if isinstance(j,type): # is this a class ?
25
- j() # this is an instance of the class
26
-
27
- def test_set_traits(self):
28
- """ test that important traits can be set"""
29
- # iterate over all Acoular definitions labels
30
- for i in dir(ac):
31
- j = getattr(ac,i) # class, function or variable
32
- # HasTraits derived class ?
33
- if isinstance(j,type) \
34
- and issubclass(j,HasTraits) \
35
- and ('digest' in j.class_traits().keys()):
36
- do = j.class_traits()['digest'].depends_on
37
- if do:
38
- obj = j()
39
- for k in do:
40
- with self.subTest(i+'.'+k):
41
- if k in j.class_trait_names():
42
- tr = j.class_traits()[k]
43
- # handling different Trait types
44
- # todo: use hypothesis based setattr
45
- if tr.is_trait_type(Int):
46
- setattr(obj,k,1)
47
- elif tr.is_trait_type(Float):
48
- setattr(obj,k,0.1)
49
- elif tr.is_trait_type(Bool):
50
- setattr(obj,k,False)
51
- elif tr.is_trait_type(Range):
52
- low = tr.handler._low
53
- high = tr.handler._high
54
- setattr(obj,k,(high+low)/2)
55
- elif tr.is_trait_type(TraitEnum) or tr.is_trait_type(Enum):
56
- v = tr.handler.values
57
- setattr(obj,k,v[len(v)//2])
58
-
59
- if __name__ == '__main__':
60
- unittest.main()
@@ -1,125 +0,0 @@
1
- from acoular import UniformFlowEnvironment,SlotJet,OpenJet,RotatingFlow,MicGeom, SteeringVector,\
2
- BeamformerOrth, RectGrid, MaskedTimeSamples, Sector,\
3
- UncorrelatedNoiseSource, SourceMixer, SamplesGenerator, BeamformerTimeTraj, BeamformerTimeSqTraj,\
4
- BeamformerCleantTraj, BeamformerCleantSqTraj, IntegratorSectorTime, MaskedTimeInOut, ChannelMixer,\
5
- SpatialInterpolator, SpatialInterpolatorRotation, SpatialInterpolatorConstantRotation, Mixer,\
6
- WriteWAV, MergeGrid, FiltWNoiseGenerator, SphericalHarmonicSource, PointSource
7
- from numpy import array
8
- from unittest import TestCase
9
-
10
- # a dictionary containing all classes that should change their digest on
11
- # changes of the following trait types:
12
- # * List
13
- # * CArray
14
- UNEQUAL_DIGEST_TEST_DICT = {
15
- # "MicGeom.mpos_tot item assignment" : (MicGeom(mpos_tot=[[1.,2.,3.]]), "obj.mpos_tot[:] = 0."),
16
- "MicGeom.mpos_tot new array assignment" : (MicGeom(mpos_tot=[[1.,2.,3.]]), "obj.mpos_tot = array([0.])"),
17
- # "MicGeom.invalid_channels item assignment" : (MicGeom(mpos_tot=[[1.,2.,3.]],invalid_channels=[1]), "obj.invalid_channels[0] = 0"),
18
- "MicGeom.invalid_channels new list assignment" : (MicGeom(mpos_tot=[[1.,2.,3.]],invalid_channels=[1]), "obj.invalid_channels = [0]"),
19
- # environments.py
20
- # "UniformFlowEnvironment.fdv item assignment": (UniformFlowEnvironment(), "obj.fdv[0] = 0."),
21
- "UniformFlowEnvironment.fdv array assignment": (UniformFlowEnvironment(), "obj.fdv = array((0., 0., 0.))"),
22
- # "SlotJet.origin item assignment": (SlotJet(), "obj.origin[0] = 1."),
23
- "SlotJet.origin array assignment": (SlotJet(), "obj.origin = array((1., 0., 0.))"),
24
- # "SlotJet.flow item assignment": (SlotJet(), "obj.flow[0] = 0."),
25
- "SlotJet.flow array assignment": (SlotJet(), "obj.flow = array((0., 0., 0.))"),
26
- # "SlotJet.plane item assignment": (SlotJet(), "obj.plane[0] = 1."),
27
- "SlotJet.plane array assignment": (SlotJet(), "obj.plane = array((1., 0., 0.))"),
28
- # "OpenJet.origin item assignment": (OpenJet(), "obj.origin[0] = 1."),
29
- "OpenJet.origin array assignment": (OpenJet(), "obj.origin = array((1., 0., 0.))"),
30
- # "RotatingFlow.origin item assignment": (RotatingFlow(), "obj.origin[0] = 1."),
31
- "RotatingFlow.origin array assignment": (RotatingFlow(), "obj.origin = array((1., 0., 0.))"),
32
- #fbeamform.py
33
- # "SteeringVector.ref item assignment": (SteeringVector(), "obj.ref[0] = 1."),
34
- "SteeringVector.ref array assignment": (SteeringVector(), "obj.ref = array((1., 1., 1.))"),
35
- # "BeamformerOrth.eva_list item assignment": (BeamformerOrth(eva_list=array((0, 1))), "obj.eva_list[0] = 2"),
36
- "BeamformerOrth.eva_list array assignment": (BeamformerOrth(eva_list=array((0, 1))), "obj.eva_list = array((2))"),
37
- #grids.py
38
- "MergeGrid.grids item assignment": (MergeGrid(grids=[RectGrid()]), "obj.grids[0] = RectGrid()"),
39
- "MergeGrid.grids list assignment": (MergeGrid(), "obj.grids = [RectGrid()]"),
40
- # signals.py
41
- # "FiltWNoiseGenerator.ar item assignment": (FiltWNoiseGenerator(ar=[1.,2.,3.]), "obj.ar[0] = 0."),
42
- "FiltWNoiseGenerator.ar array assignment": (FiltWNoiseGenerator(ar=[1.,2.,3.]), "obj.ar = array((0., 0., 0.))"),
43
- # "FiltWNoiseGenerator.ma item assignment": (FiltWNoiseGenerator(ma=[1.,2.,3.]), "obj.ma[0] = 0."),
44
- "FiltWNoiseGenerator.mar array assignment": (FiltWNoiseGenerator(ma=[1.,2.,3.]), "obj.ma = array((0., 0., 0.))"),
45
- #sources.py
46
- "MaskedTimeSamples.invalid_channels item assignment": (MaskedTimeSamples(invalid_channels=[1]), "obj.invalid_channels[0] = 0"),
47
- "MaskedTimeSamples.invalid_channels list assignment": (MaskedTimeSamples(), "obj.invalid_channels = [0]"),
48
- # "SphericalHarmonicSource.alpha item assignment": (SphericalHarmonicSource(alpha=array((0, 1))), "obj.alpha[0] = 1."),
49
- "SphericalHarmonicSource.alpha array assignment": (SphericalHarmonicSource(alpha=array((0, 1))), "obj.alpha = array((1., 1., 1.))"),
50
- # "UncorrelatedNoiseSource.seed item assignment": (UncorrelatedNoiseSource(seed=array((1, 2))), "obj.seed[0] = 3"),
51
- "UncorrelatedNoiseSource.seed array assignment": (UncorrelatedNoiseSource(seed=array((1, 2))), "obj.seed = array((3,4))"),
52
- "SourceMixer.sources item assignment": (SourceMixer(sources=[SamplesGenerator()]), "obj.sources[0] = PointSource()"),
53
- "SourceMixer.sources list assignment": (SourceMixer(sources=[SamplesGenerator()]), "obj.sources = [PointSource()]"),
54
- # tbeamform.py
55
- # "BeamformerTimeTraj.rvec item assignment": (BeamformerTimeTraj(), "obj.rvec[0] = 1."),
56
- "BeamformerTimeTraj.rvec array assignment": (BeamformerTimeTraj(), "obj.rvec = array((1., 0., 0.))"),
57
- # "BeamformerTimeSqTraj.rvec item assignment": (BeamformerTimeSqTraj(), "obj.rvec[0] = 1."),
58
- "BeamformerTimeSqTraj.rvec array assignment": (BeamformerTimeSqTraj(), "obj.rvec = array((1., 0., 0.))"),
59
- # "BeamformerCleantTraj.rvec item assignment": (BeamformerCleantTraj(), "obj.rvec[0] = 1."),
60
- "BeamformerCleantTraj.rvec array assignment": (BeamformerCleantTraj(), "obj.rvec = array((1., 0., 0.))"),
61
- # "BeamformerCleantSqTraj.rvec item assignment": (BeamformerCleantSqTraj(), "obj.rvec[0] = 1."),
62
- "BeamformerCleantSqTraj.rvec array assignment": (BeamformerCleantSqTraj(), "obj.rvec = array((1., 0., 0.))"),
63
- "IntegratorSectorTime.sectors item assignment": (IntegratorSectorTime(sectors=[Sector()]), "obj.sectors[0] = Sector()"),
64
- "IntegratorSectorTime.sectors list assignment": (IntegratorSectorTime(sectors=[Sector()]), "obj.sectors = [Sector()]"),
65
- # tprocess.py
66
- "MaskedTimeInOut.invalid_channels item assignment": (MaskedTimeInOut(invalid_channels=[1]), "obj.invalid_channels[0] = 0"),
67
- "MaskedTimeInOut.invalid_channels list assignment": (MaskedTimeInOut(), "obj.invalid_channels = [0]"),
68
- # "ChannelMixer.weights item assignment" : (ChannelMixer(weights=[[1.,2.,3.]]), "obj.weights[0] = 0."),
69
- "ChannelMixer.weights new array assignment" : (ChannelMixer(weights=[[1.,2.,3.]]), "obj.weights = array([0.])"),
70
- # "SpatialInterpolator.Q item assignment": (SpatialInterpolator(), "obj.Q[0] = 0."),
71
- "SpatialInterpolator.Q array assignment": (SpatialInterpolator(), "obj.Q = array([[0.,0.,0.],[0.,0.,0.],[0.,0.,0.]])"),
72
- # "SpatialInterpolatorRotation.Q item assignment": (SpatialInterpolatorRotation(), "obj.Q[0] = 0."),
73
- "SpatialInterpolatorRotation.Q array assignment": (SpatialInterpolatorRotation(), "obj.Q = array([[0.,0.,0.],[0.,0.,0.],[0.,0.,0.]])"),
74
- # "SpatialInterpolatorConstantRotation.Q item assignment": (SpatialInterpolatorConstantRotation(), "obj.Q[0] = 0."),
75
- "SpatialInterpolatorConstantRotation.Q array assignment": (SpatialInterpolatorConstantRotation(), "obj.Q = array([[0.,0.,0.],[0.,0.,0.],[0.,0.,0.]])"),
76
- "Mixer.sources item assignment": (Mixer(source=SamplesGenerator(), sources=[SamplesGenerator()]), "obj.sources[0] = SamplesGenerator(numchannels=1)"),
77
- "Mixer.sources list assignment": (Mixer(sources=[SamplesGenerator()]), "obj.sources = [SamplesGenerator(), SamplesGenerator()]"),
78
- "WriteWAV.channels item assignment": (WriteWAV(channels=[1]), "obj.channels[0] = 0"),
79
- "WriteWAV.channels list assignment": (WriteWAV(), "obj.channels = [0]"),
80
- }
81
-
82
-
83
- class Test_DigestChange(TestCase):
84
- """Test that ensures that digest of Acoular classes changes correctly on
85
- changes of CArray and List attributes.
86
- """
87
-
88
- def get_digests(self,obj,statement):
89
- """A function that collects the digest of the obj before (d1) and
90
- after (d2) executing the statement that should yield to a change
91
- of the object digest.
92
-
93
- Parameters
94
- ----------
95
- obj : instance
96
- class instance that has an attribute `digest`
97
- statement : "str"
98
- a string that can be executed
99
-
100
- Returns
101
- -------
102
- str, str
103
- digest before and after statement execution
104
- """
105
- d1 = obj.digest
106
- exec(statement)
107
- d2 = obj.digest
108
- return d1,d2
109
-
110
- def test_digest_changes_on_assignment(self):
111
- """ test that object digest change on statement execution """
112
- for test_label,(obj,statement) in UNEQUAL_DIGEST_TEST_DICT.items():
113
- # use subtest to get individual test result.
114
- # tests will not stop if one subtest fails!
115
- with self.subTest(test_label):
116
- digest_before_statement,digest_after_statement = self.get_digests(obj, statement)
117
- self.assertNotEqual(digest_before_statement,digest_after_statement)
118
-
119
-
120
-
121
- if __name__ == '__main__':
122
- import unittest
123
- unittest.main()
124
-
125
-
@@ -1,73 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- #pylint: disable-msg=E0611, E1101, C0103, R0901, R0902, R0903, R0904, W0232
3
- #------------------------------------------------------------------------------
4
- # Copyright (c) Acoular Development Team.
5
- #------------------------------------------------------------------------------
6
- """Implements testing of environments and helpers.
7
- """
8
-
9
- import unittest
10
-
11
- from os.path import join
12
-
13
- import numpy as np
14
- #acoular imports
15
- import acoular
16
- acoular.config.global_caching = 'none' # to make sure that nothing is cached
17
-
18
- from acoular import MicGeom, RectGrid3D, \
19
- SlotJet, OpenJet, RotatingFlow, \
20
- Environment, UniformFlowEnvironment, GeneralFlowEnvironment
21
-
22
- # if this flag is set to True
23
- WRITE_NEW_REFERENCE_DATA = False
24
- # results are generated for comparison during testing.
25
- # Should always be False. Only set to True if it is necessary to
26
- # recalculate the data due to intended changes of the Beamformers.
27
-
28
- m = MicGeom()
29
- m.mpos_tot = ((0.5,0.5,0),(0,0,0),(-0.5,-0.5,0))
30
- mc = m.mpos
31
- g = RectGrid3D(x_min=-0.2, x_max=0.2, y_min=-0.2, y_max=0.2, z_min=0.5, z_max=0.9,
32
- increment=0.2 )
33
- gc = g.gpos
34
-
35
- flows = [
36
- SlotJet(v0=70.0, origin=(-0.7,0,0.7)),
37
- OpenJet(v0=70.0, origin=(-0.7,0,0.7)),
38
- RotatingFlow(v0=70.0, rpm=1000.0)
39
- ]
40
-
41
- envs = [
42
- Environment(),
43
- UniformFlowEnvironment(ma=0.3),
44
- GeneralFlowEnvironment(ff=OpenJet(v0=70.0, origin=(-0.7,0,0.7)))
45
- ]
46
-
47
-
48
- class acoular_env_test(unittest.TestCase):
49
-
50
- def test_flow_results(self):
51
- for fl in flows:
52
- with self.subTest(fl.__class__.__name__):
53
- name = join('reference_data',f'{fl.__class__.__name__}.npy')
54
- # stack all results
55
- actual_data = np.array([np.vstack(fl.v(x)) for x in gc.T])
56
- if WRITE_NEW_REFERENCE_DATA:
57
- np.save(name,actual_data)
58
- ref_data = np.load(name)
59
- np.testing.assert_allclose(actual_data, ref_data, rtol=1e-5, atol=1e-8)
60
-
61
- def test_env_results(self):
62
- for env in envs:
63
- with self.subTest(env.__class__.__name__):
64
- name = join('reference_data',f'{env.__class__.__name__}.npy')
65
- # stack all results
66
- actual_data = np.vstack((env._r(gc,mc).T,env._r(gc).T))
67
- if WRITE_NEW_REFERENCE_DATA:
68
- np.save(name,actual_data)
69
- ref_data = np.load(name)
70
- np.testing.assert_allclose(actual_data, ref_data, rtol=1e-5, atol=1e-8)
71
-
72
- if __name__ == '__main__':
73
- unittest.main()