AOT-biomaps 2.9.212__py3-none-any.whl → 2.9.233__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.

Potentially problematic release.


This version of AOT-biomaps might be problematic. Click here for more details.

@@ -1,7 +1,7 @@
1
1
  from AOT_biomaps.AOT_Recon.AlgebraicRecon import AlgebraicRecon
2
2
  from AOT_biomaps.AOT_Recon.ReconEnums import ReconType, OptimizerType, PotentialType, ProcessType
3
3
  from .ReconTools import check_gpu_memory, calculate_memory_requirement
4
- from .AOT_Optimizers import MAPEM, DEPIERRO
4
+ from .AOT_Optimizers import MAPEM, MAPEM_STOP, DEPIERRO
5
5
  from AOT_biomaps.Config import config
6
6
 
7
7
  import warnings
@@ -66,13 +66,15 @@ class BayesianRecon(AlgebraicRecon):
66
66
  dir_name += f'_Beta_{self.beta}_Sigma_{self.sigma}'
67
67
 
68
68
  results_dir = os.path.join(self.saveDir, dir_name)
69
+ if not os.path.exists(results_dir):
70
+ os.makedirs(results_dir)
69
71
 
70
- if os.path.exists(os.path.join(results_dir,"reconIndices.npy")):
72
+ if os.path.exists(os.path.join(results_dir,"indices.npy")):
71
73
  return (True, results_dir)
72
74
 
73
75
  return (False, results_dir)
74
76
 
75
- def load(self, withTumor=True, results_date=None, optimizer=None, potential_function=None, filePath=None):
77
+ def load(self, withTumor=True, results_date=None, optimizer=None, potential_function=None, filePath=None, show_logs=True):
76
78
  """
77
79
  Load the reconstruction results and indices as lists of 2D np arrays for Bayesian reconstruction and store them in self.
78
80
  If the loaded file is a 3D array, it is split into a list of 2D arrays.
@@ -98,7 +100,7 @@ class BayesianRecon(AlgebraicRecon):
98
100
  else:
99
101
  self.reconLaser = data
100
102
  # Essayer de charger les indices
101
- base_dir, file_name = os.path.split(recon_path)
103
+ base_dir, _ = os.path.split(recon_path)
102
104
  indices_path = os.path.join(base_dir, 'indices.npy')
103
105
  if os.path.exists(indices_path):
104
106
  indices_data = np.load(indices_path, allow_pickle=True)
@@ -108,7 +110,8 @@ class BayesianRecon(AlgebraicRecon):
108
110
  self.indices = indices_data
109
111
  else:
110
112
  self.indices = None
111
- print(f"Loaded reconstruction results and indices from {recon_path}")
113
+ if show_logs:
114
+ print(f"Loaded reconstruction results and indices from {recon_path}")
112
115
  else:
113
116
  # Mode chargement depuis le répertoire de résultats
114
117
  if self.saveDir is None:
@@ -171,9 +174,10 @@ class BayesianRecon(AlgebraicRecon):
171
174
  self.indices = [indices_data[i, :, :] for i in range(indices_data.shape[0])]
172
175
  else:
173
176
  self.indices = indices_data
174
- print(f"Loaded reconstruction results and indices from {results_dir}")
177
+ if show_logs:
178
+ print(f"Loaded reconstruction results and indices from {results_dir}")
175
179
 
176
- def run(self, processType=ProcessType.PYTHON, withTumor=True):
180
+ def run(self, processType=ProcessType.PYTHON, withTumor=True, show_logs=True):
177
181
  """
178
182
  This method is a placeholder for the Bayesian reconstruction process.
179
183
  It currently does not perform any operations but serves as a template for future implementations.
@@ -185,109 +189,42 @@ class BayesianRecon(AlgebraicRecon):
185
189
  else:
186
190
  raise ValueError(f"Unknown Bayesian reconstruction type: {processType}")
187
191
 
188
- def _bayesianReconCASToR(self, withTumor):
192
+ def _bayesianReconCASToR(self, show_logs, withTumor):
189
193
  raise NotImplementedError("CASToR Bayesian reconstruction is not implemented yet.")
190
194
 
191
- def _bayesianReconPython(self, withTumor):
192
-
195
+ def _bayesianReconPython(self, show_logs, withTumor):
193
196
  if withTumor:
194
197
  if self.experiment.AOsignal_withTumor is None:
195
198
  raise ValueError("AO signal with tumor is not available. Please generate AO signal with tumor the experiment first in the experiment object.")
196
199
  if self.optimizer.value == OptimizerType.PPGMLEM.value:
197
- self.reconPhantom, self.indices = self._MAPEM_STOP(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withTumor, withTumor=withTumor)
200
+ self.reconPhantom, self.indices = MAPEM_STOP(
201
+ SMatrix=self.SMatrix,
202
+ y=self.experiment.AOsignal_withTumor,
203
+ Omega=self.potentialFunction,
204
+ beta=self.beta,
205
+ delta=self.delta,
206
+ gamma=self.gamma,
207
+ sigma=self.sigma,
208
+ numIterations=self.numIterations,
209
+ isSavingEachIteration=self.isSavingEachIteration,
210
+ withTumor=withTumor,
211
+ device=self.device,
212
+ max_saves=5000,
213
+ show_logs=True)
198
214
  elif self.optimizer.value == OptimizerType.PGC.value:
199
- self.reconPhantom, self.indices = self._MAPEM(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withTumor, withTumor=withTumor)
215
+ self.reconPhantom, self.indices = MAPEM(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withTumor, withTumor=withTumor, show_logs=show_logs)
200
216
  elif self.optimizer.value == OptimizerType.DEPIERRO95.value:
201
- self.reconPhantom, self.indices = self._DEPIERRO(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withTumor, withTumor=withTumor)
217
+ self.reconPhantom, self.indices = DEPIERRO(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withTumor, withTumor=withTumor, show_logs=show_logs)
202
218
  else:
203
219
  raise ValueError(f"Unknown optimizer type: {self.optimizer.value}")
204
220
  else:
205
221
  if self.experiment.AOsignal_withoutTumor is None:
206
222
  raise ValueError("AO signal without tumor is not available. Please generate AO signal without tumor the experiment first in the experiment object.")
207
223
  if self.optimizer.value == OptimizerType.PPGMLEM.value:
208
- self.reconLaser, self.indices = self._MAPEM_STOP(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withoutTumor, withTumor=withTumor)
224
+ self.reconLaser, self.indices = MAPEM_STOP(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withoutTumor, withTumor=withTumor, show_logs=show_logs)
209
225
  elif self.optimizer.value == OptimizerType.PGC.value:
210
- self.reconLaser, self.indices = self._MAPEM(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withoutTumor, withTumor=withTumor)
226
+ self.reconLaser, self.indices = MAPEM(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withoutTumor, withTumor=withTumor, show_logs=show_logs)
211
227
  elif self.optimizer.value == OptimizerType.DEPIERRO95.value:
212
- self.reconLaser, self.indices = self._DEPIERRO(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withoutTumor, withTumor=withTumor)
213
- else:
214
- raise ValueError(f"Unknown optimizer type: {self.optimizer.value}")
215
-
216
- def _MAPEM_STOP(self, SMatrix, y, withTumor):
217
- """
218
- This method implements the MAPEM_STOP algorithm using either CPU or single-GPU PyTorch acceleration.
219
- Multi-GPU and Multi-CPU modes are not implemented for this algorithm.
220
- """
221
- result = None
222
- required_memory = calculate_memory_requirement(SMatrix, y)
223
-
224
- if self.isGPU:
225
- if check_gpu_memory(config.select_best_gpu(), required_memory):
226
- try:
227
- result = MAPEM._MAPEM_GPU_STOP(SMatrix=SMatrix, y=y, Omega=self.potentialFunction, numIterations=self.numIterations, beta=self.beta, delta=self.delta, gamma=self.gamma, sigma=self.sigma, isSavingEachIteration=self.isSavingEachIteration, withTumor=withTumor)
228
- except Exception as e:
229
- warnings.warn(f"Falling back to CPU implementation due to an error in GPU implementation: {e}")
230
- else:
231
- warnings.warn("Insufficient GPU memory for single GPU MAPEM_STOP. Falling back to CPU.")
232
-
233
- if result is None:
234
- try:
235
- result = MAPEM._MAPEM_CPU_STOP(SMatrix=SMatrix, y=y, Omega=self.potentialFunction, numIterations=self.numIterations, beta=self.beta, delta=self.delta, gamma=self.gamma, sigma=self.sigma, isSavingEachIteration=self.isSavingEachIteration, withTumor=withTumor)
236
- except Exception as e:
237
- warnings.warn(f"An error occurred in CPU implementation: {e}")
238
- result = None
239
-
240
- return result
241
-
242
- def _MAPEM(self, SMatrix, y, withTumor):
243
- """
244
- This method implements the MAPEM algorithm using either CPU or single-GPU PyTorch acceleration.
245
- Multi-GPU and Multi-CPU modes are not implemented for this algorithm.
246
- """
247
- result = None
248
- required_memory = calculate_memory_requirement(SMatrix, y)
249
-
250
- if self.isGPU:
251
- if check_gpu_memory(config.select_best_gpu(), required_memory):
252
- try:
253
- result = MAPEM._MAPEM_GPU(SMatrix=SMatrix, y=y, Omega=self.potentialFunction, numIterations=self.numIterations, beta=self.beta, delta=self.delta, gamma=self.gamma, sigma=self.sigma, isSavingEachIteration=self.isSavingEachIteration, withTumor=withTumor)
254
- except Exception as e:
255
- warnings.warn(f"Falling back to CPU implementation due to an error in GPU implementation: {e}")
256
- else:
257
- warnings.warn("Insufficient GPU memory for single GPU MAPEM. Falling back to CPU.")
258
-
259
- if result is None:
260
- try:
261
- result = MAPEM._MAPEM_CPU(SMatrix=SMatrix, y=y, Omega=self.potentialFunction, numIterations=self.numIterations, beta=self.beta, delta=self.delta, gamma=self.gamma, sigma=self.sigma, isSavingEachIteration=self.isSavingEachIteration, withTumor=withTumor)
262
- except Exception as e:
263
- warnings.warn(f"An error occurred in CPU implementation: {e}")
264
- result = None
265
-
266
- return result
267
-
268
- def _DEPIERRO(self, SMatrix, y, withTumor):
269
- """
270
- This method implements the DEPIERRO algorithm using either CPU or single-GPU PyTorch acceleration.
271
- Multi-GPU and Multi-CPU modes are not implemented for this algorithm.
272
- """
273
- result = None
274
- required_memory = calculate_memory_requirement(SMatrix, y)
275
-
276
- if self.isGPU:
277
- if check_gpu_memory(config.select_best_gpu(), required_memory):
278
- try:
279
- result = DEPIERRO._DEPIERRO_GPU(SMatrix=SMatrix, y=y, numIterations=self.numIterations, beta=self.beta, sigma=self.sigma, isSavingEachIteration=self.isSavingEachIteration, withTumor=withTumor)
280
- except Exception as e:
281
- warnings.warn(f"Falling back to CPU implementation due to an error in GPU implementation: {e}")
228
+ self.reconLaser, self.indices = DEPIERRO(SMatrix=self.SMatrix, y=self.experiment.AOsignal_withoutTumor, withTumor=withTumor, show_logs=show_logs)
282
229
  else:
283
- warnings.warn("Insufficient GPU memory for single GPU DEPIERRO. Falling back to CPU.")
284
-
285
- if result is None:
286
- try:
287
- result = DEPIERRO._DEPIERRO_CPU(SMatrix=SMatrix, y=y, numIterations=self.numIterations, beta=self.beta, sigma=self.sigma, isSavingEachIteration=self.isSavingEachIteration, withTumor=withTumor)
288
- except Exception as e:
289
- warnings.warn(f"An error occurred in CPU implementation: {e}")
290
- result = None
291
-
292
- return result
293
-
230
+ raise ValueError(f"Unknown optimizer type: {self.optimizer.value}")
@@ -49,12 +49,12 @@ class PrimalDualRecon(AlgebraicRecon):
49
49
  )
50
50
  os.makedirs(results_dir, exist_ok=True)
51
51
 
52
- if os.path.exists(os.path.join(results_dir,"reconIndices.npy")):
52
+ if os.path.exists(os.path.join(results_dir,"indices.npy")):
53
53
  return (True, results_dir)
54
54
 
55
55
  return (False, results_dir)
56
56
 
57
- def load(self, withTumor=True, results_date=None, optimizer=None, filePath=None):
57
+ def load(self, withTumor=True, results_date=None, optimizer=None, filePath=None, show_logs=True):
58
58
  """
59
59
  Load the reconstruction results (reconPhantom or reconLaser) and indices as lists of 2D np arrays into self.
60
60
  If the loaded file is a 3D array, it is split into a list of 2D arrays.
@@ -85,7 +85,7 @@ class PrimalDualRecon(AlgebraicRecon):
85
85
  else:
86
86
  self.reconLaser = data
87
87
  # Essayer de charger les indices
88
- base_dir, file_name = os.path.split(recon_path)
88
+ base_dir, _ = os.path.split(recon_path)
89
89
  indices_path = os.path.join(base_dir, "indices.npy")
90
90
  if os.path.exists(indices_path):
91
91
  indices_data = np.load(indices_path, allow_pickle=True)
@@ -95,7 +95,8 @@ class PrimalDualRecon(AlgebraicRecon):
95
95
  self.indices = indices_data
96
96
  else:
97
97
  self.indices = None
98
- print(f"Loaded reconstruction results and indices from {recon_path}")
98
+ if show_logs:
99
+ print(f"Loaded reconstruction results and indices from {recon_path}")
99
100
  else:
100
101
  # Mode chargement depuis le répertoire de résultats
101
102
  if self.saveDir is None:
@@ -103,18 +104,19 @@ class PrimalDualRecon(AlgebraicRecon):
103
104
  # Determine optimizer name for path matching
104
105
  opt_name = optimizer.value if optimizer is not None else self.optimizer.value
105
106
  # Find the most recent results directory if no date is specified
107
+ dir_pattern = f'results_*_{opt_name}'
108
+ if opt_name == OptimizerType.CP_TV.value or opt_name == OptimizerType.CP_KL.value:
109
+ dir_pattern += f'_Alpha_{self.alpha}_Theta_{self.theta}_L_{self.L}'
106
110
  if results_date is None:
107
- dirs = [
108
- d for d in os.listdir(self.saveDir)
109
- if os.path.isdir(os.path.join(self.saveDir, d))
110
- and re.match(r'results_\d{4}_' + re.escape(opt_name) + r'($|_)', d)
111
- ]
111
+ dirs = [d for d in os.listdir(self.saveDir) if os.path.isdir(os.path.join(self.saveDir, d)) and dir_pattern in d]
112
112
  if not dirs:
113
- raise FileNotFoundError(f"No results directory found for optimizer '{opt_name}' in {self.saveDir}.")
113
+ raise FileNotFoundError(f"No matching results directory found for pattern '{dir_pattern}' in {self.saveDir}.")
114
114
  dirs.sort(reverse=True) # Most recent first
115
115
  results_dir = os.path.join(self.saveDir, dirs[0])
116
116
  else:
117
117
  results_dir = os.path.join(self.saveDir, f'results_{results_date}_{opt_name}')
118
+ if opt_name == OptimizerType.CP_TV.value or opt_name == OptimizerType.CP_KL.value:
119
+ results_dir += f'_Alpha_{self.alpha}_Theta_{self.theta}_L_{self.L}'
118
120
  if not os.path.exists(results_dir):
119
121
  raise FileNotFoundError(f"Directory {results_dir} does not exist.")
120
122
  # Load reconstruction results
@@ -144,16 +146,10 @@ class PrimalDualRecon(AlgebraicRecon):
144
146
  self.indices = indices_data
145
147
  else:
146
148
  self.indices = None
147
- print(f"Loaded reconstruction results and indices from {results_dir}")
148
-
149
+ if show_logs:
150
+ print(f"Loaded reconstruction results and indices from {results_dir}")
149
151
 
150
152
  def _convexReconPython(self, withTumor):
151
- if withTumor:
152
- y=self.experiment.AOsignal_withTumor
153
-
154
- else:
155
- y=self.experiment.AOsignal_withoutTumor
156
-
157
153
  if self.optimizer == OptimizerType.CP_TV:
158
154
  if withTumor:
159
155
  self.reconPhantom, self.indices = CP_TV(
@@ -359,3 +359,17 @@ class NoiseType(Enum):
359
359
  """Gaussian noise, typically used for transmission data."""
360
360
  None_ = 'none'
361
361
  """No noise is applied."""
362
+
363
+ class SparsingType(Enum):
364
+ """
365
+ Enum for different sparsing methods used in reconstructions.
366
+
367
+ Selection of sparsing methods:
368
+ - Thresholding: Sparsing based on a threshold value.
369
+ - TopK: Sparsing by retaining the top K values.
370
+ - None: No sparsing is applied.
371
+ """
372
+ CSR = 'CSR'
373
+ """Sparsing based on a threshold value."""
374
+ COO = 'COO'
375
+ """Sparsing by retaining the top K values."""
@@ -159,11 +159,12 @@ def calculate_memory_requirement(SMatrix, y):
159
159
  total_memory = (num_elements_SMatrix + num_elements_y + num_elements_theta) * 32 / 8 / 1024**3
160
160
  return total_memory
161
161
 
162
- def check_gpu_memory(device_index, required_memory):
162
+ def check_gpu_memory(device_index, required_memory, show_logs=True):
163
163
  """Check if enough memory is available on the specified GPU."""
164
- free_memory, total_memory = torch.cuda.mem_get_info(f"cuda:{device_index}")
164
+ free_memory, _ = torch.cuda.mem_get_info(f"cuda:{device_index}")
165
165
  free_memory_gb = free_memory / 1024**3
166
- print(f"Free memory on GPU {device_index}: {free_memory_gb:.2f} GB, Required memory: {required_memory:.2f} GB")
166
+ if show_logs:
167
+ print(f"Free memory on GPU {device_index}: {free_memory_gb:.2f} GB, Required memory: {required_memory:.2f} GB")
167
168
  return free_memory_gb >= required_memory
168
169
 
169
170
  @njit(parallel=True)
@@ -31,7 +31,7 @@ class Recon(ABC):
31
31
  def run(self,withTumor = True):
32
32
  pass
33
33
 
34
- def save(self, withTumor=True, overwrite=False, date=None):
34
+ def save(self, withTumor=True, overwrite=False, date=None, show_logs=True):
35
35
  """
36
36
  Save the reconstruction results (reconPhantom is with tumor, reconLaser is without tumor) and indices of the saved recon results, in numpy format.
37
37
 
@@ -62,7 +62,8 @@ class Recon(ABC):
62
62
  filepathIndices = os.path.join(filepath, "indices.npy")
63
63
  np.save(filepathIndices, np.array(self.indices))
64
64
 
65
- print(f"Reconstruction results saved to {os.path.dirname(filepath)}")
65
+ if show_logs:
66
+ print(f"Reconstruction results saved to {os.path.dirname(filepath)}")
66
67
 
67
68
  @abstractmethod
68
69
  def checkExistingFile(self, date = None):
AOT_biomaps/__init__.py CHANGED
@@ -82,7 +82,7 @@ from .AOT_Recon.AOT_PotentialFunctions.RelativeDifferences import *
82
82
  from .Config import config
83
83
  from .Settings import *
84
84
 
85
- __version__ = '2.9.212'
85
+ __version__ = '2.9.233'
86
86
  __process__ = config.get_process()
87
87
 
88
88
  def initialize(process=None):
@@ -229,6 +229,27 @@ def initialize(process=None):
229
229
 
230
230
 
231
231
 
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
232
253
 
233
254
 
234
255
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AOT_biomaps
3
- Version: 2.9.212
3
+ Version: 2.9.233
4
4
  Summary: Acousto-Optic Tomography
5
5
  Home-page: https://github.com/LucasDuclos/AcoustoOpticTomography
6
6
  Author: Lucas Duclos
@@ -1,6 +1,6 @@
1
1
  AOT_biomaps/Config.py,sha256=ghEOP1n8aO1pR-su13wMeAZAxZRfry5hH67NbtZ8SqI,3614
2
2
  AOT_biomaps/Settings.py,sha256=v8fPhnvvcfBJP29m1RLOTEr3jndGLGwbUiORXmsj2Bo,2853
3
- AOT_biomaps/__init__.py,sha256=lAKBmW4a9tsVTiKLRNUt1DcK7l-HGoJrc4zd-0DyKEE,4294
3
+ AOT_biomaps/__init__.py,sha256=mGXdd1sOEQC0Lvuyn1L1Gw7qSAxPsfWxrDcbUjgFwtg,4336
4
4
  AOT_biomaps/AOT_Acoustic/AcousticEnums.py,sha256=s5kXa6jKzbS4btwbubrVcynLOr0yg5tth5vL_FGfbMk,1802
5
5
  AOT_biomaps/AOT_Acoustic/AcousticTools.py,sha256=al7xXKMY5e-qQQ7nrQVPVAmqYiB320OluNlY6ti8iKc,7539
6
6
  AOT_biomaps/AOT_Acoustic/FocusedWave.py,sha256=3kGKKDx_3Msy5COYqIwzROPORGWvNjw8UsDanBfkMXE,11037
@@ -10,34 +10,34 @@ AOT_biomaps/AOT_Acoustic/StructuredWave.py,sha256=jTLVlOhYLWJb5MxZPxhq3OFVlz2Mco
10
10
  AOT_biomaps/AOT_Acoustic/__init__.py,sha256=t9M2rRqa_L9pk7W2FeELTkHEMuP4DBr4gBRldMqsQbg,491
11
11
  AOT_biomaps/AOT_Acoustic/_mainAcoustic.py,sha256=RdmhRF1i0KAlpsP7_wnZ7F4J27br3eUc4XR91Qq7C64,44158
12
12
  AOT_biomaps/AOT_Experiment/Focus.py,sha256=B2nBawmv-NG2AWJx9zgQ8GlN6aFB9FwTSqX-M-phKXg,3193
13
- AOT_biomaps/AOT_Experiment/Tomography.py,sha256=LoQ304X9pUwpGn_BqNx1JijRFBFtI5Vz2R7bFIKyYKM,20954
13
+ AOT_biomaps/AOT_Experiment/Tomography.py,sha256=Ri83b4GMrxJO60qWsK9JInS9a7HU2Q8uqpjD3Xkl9OY,24488
14
14
  AOT_biomaps/AOT_Experiment/__init__.py,sha256=H9zMLeBLA6uhbaHohAa-2u5mDDxqJi8oE5c6tShdQp8,308
15
- AOT_biomaps/AOT_Experiment/_mainExperiment.py,sha256=ZDd-H-hA4ZByMqsE1uwf0mMhihRveqgYGeSbUTS0RsM,23696
15
+ AOT_biomaps/AOT_Experiment/_mainExperiment.py,sha256=zSfuNrsz7nhiKrGIdK6CAXjlI2T6qYC5-JXHFgPNzhc,24674
16
16
  AOT_biomaps/AOT_Optic/Absorber.py,sha256=jEodzRy7gkEH-wbazVasRQiri0dU16BfapmR-qnTSvM,867
17
17
  AOT_biomaps/AOT_Optic/Laser.py,sha256=uzQwxswjU0kZWix3CmZLoWmhsBa3VhN27STprNv-xB8,2986
18
18
  AOT_biomaps/AOT_Optic/OpticEnums.py,sha256=b349_JyjHqQohmjK4Wke-A_HLGaqb3_BKbyUqFC4jxY,499
19
19
  AOT_biomaps/AOT_Optic/__init__.py,sha256=HSUVhfz0NzwHHZZ9KP9Xyfu33IgP_rYJX86J-gEROlo,321
20
20
  AOT_biomaps/AOT_Optic/_mainOptic.py,sha256=Wk63CcgWbU-ygMfjNK80islaUbGGJpTXgZY3_C2KQNY,8179
21
- AOT_biomaps/AOT_Recon/AlgebraicRecon.py,sha256=kebjUSqbyMGIZ-X57GV3zgkUunh2r41RxIbHaKY71w8,41412
21
+ AOT_biomaps/AOT_Recon/AlgebraicRecon.py,sha256=G3jET_uLMkaMuAKWeMZewU2lXPyPaXCHrehCRQfj2qs,49051
22
22
  AOT_biomaps/AOT_Recon/AnalyticRecon.py,sha256=vjeTUnaZrtnLHnx6goseeJsd165KbSugQYwUXJFXapU,7596
23
- AOT_biomaps/AOT_Recon/BayesianRecon.py,sha256=WeE_512cBVOB__72132Ifvgb0E40gkjmQTXnwY_cZtk,16357
23
+ AOT_biomaps/AOT_Recon/BayesianRecon.py,sha256=RnnPa-tTcvirwiNPnCRZnSM4NWeEEltYET-piBbp34g,12671
24
24
  AOT_biomaps/AOT_Recon/DeepLearningRecon.py,sha256=RfVcEsi4GeGqJn0_SPxwQPQx6IQjin79WKh2UarMRLI,1383
25
- AOT_biomaps/AOT_Recon/PrimalDualRecon.py,sha256=RM7yssmQkrNggU_RHZmgXp36ecu0nbLCTSh_G24ii8E,10090
26
- AOT_biomaps/AOT_Recon/ReconEnums.py,sha256=oyT9qIfEpE_ChPQihM8-6b0UOtNmuE4weUpO8lJCB38,18641
27
- AOT_biomaps/AOT_Recon/ReconTools.py,sha256=zPGwoDHX5H7v78onHAlFwZ8OdjZVsX6PAJFrTiikqEc,10608
25
+ AOT_biomaps/AOT_Recon/PrimalDualRecon.py,sha256=-7dqUxKXbHt7yR1I1kGcu1TOXn05ik6QoDDsuM0QvNU,10310
26
+ AOT_biomaps/AOT_Recon/ReconEnums.py,sha256=wKksIx_xGgGOq0DqFpMTjbnjbaneZhTKup2Z-3PhC5o,19077
27
+ AOT_biomaps/AOT_Recon/ReconTools.py,sha256=ApVZgztymdwuhbvoxdozo7oi3xyyZWxVuhKbzekuNBs,10636
28
28
  AOT_biomaps/AOT_Recon/__init__.py,sha256=LDbNpsjS8_TJrXMKzkpzSAj5trVuCW57AWQaJBrzd0I,244
29
- AOT_biomaps/AOT_Recon/_mainRecon.py,sha256=tvEk5kqRqkWz0bosA5TnX79zo407U0EZmbPBOw5eErg,13174
30
- AOT_biomaps/AOT_Recon/AOT_Optimizers/DEPIERRO.py,sha256=68nXzJPcb6jY6HxiOfu7vP4rHMSujJpPb3RI5aMQ7IA,7861
31
- AOT_biomaps/AOT_Recon/AOT_Optimizers/LS.py,sha256=DOaNHmyQNXBG2JbYpprKtoX9bnRT0DL_faKQqH1LNrs,4020
32
- AOT_biomaps/AOT_Recon/AOT_Optimizers/MAPEM.py,sha256=suH4bNq_DN7pZYOyV2kESAaFKA6guyxv1NoRQJbdkMc,22818
33
- AOT_biomaps/AOT_Recon/AOT_Optimizers/MLEM.py,sha256=QIowCEeTetIkxMeB-fe32vbamTXHNT2ycvVofgdun6U,11805
29
+ AOT_biomaps/AOT_Recon/_mainRecon.py,sha256=6yMQxj3IzBaicZbQlMtPh37E00GT1088__PGNCNPc4k,13217
30
+ AOT_biomaps/AOT_Recon/AOT_Optimizers/DEPIERRO.py,sha256=qA1n722GLQJH3V8HcLr5q_GxEwBS_NRlIT3E6JZk-Ag,9479
31
+ AOT_biomaps/AOT_Recon/AOT_Optimizers/LS.py,sha256=N7v1xN9I-adIe3c20LN9Drc4-fBSLc9SEmJS8B3Zmag,4343
32
+ AOT_biomaps/AOT_Recon/AOT_Optimizers/MAPEM.py,sha256=vQLCB0L4FSXJKn2_6kdIdWrI6WZ82KuqUh7CSqBGVuo,25766
33
+ AOT_biomaps/AOT_Recon/AOT_Optimizers/MLEM.py,sha256=TFyL4UNWmHkEPyjfutc5j_CsBrph675rEOGkIEFc_T4,13788
34
34
  AOT_biomaps/AOT_Recon/AOT_Optimizers/PDHG.py,sha256=5w4klYKAct9_gnlyocIiJfDrQUdz_VhXQVSpfjrjvNU,7927
35
35
  AOT_biomaps/AOT_Recon/AOT_Optimizers/__init__.py,sha256=tNGVulINaqQZzcs5cvCMAT5ypGdoFWRnxtl9y7ePECk,106
36
36
  AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/Huber.py,sha256=dRd1t5OBag_gVmfji3L0QrA1GJ_702LcCkLH32Bot0M,3285
37
37
  AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/Quadratic.py,sha256=wTbzcXxMdEl9ReEXrL43DOJQecokBwJYU_s2kQUASZY,2545
38
- AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/RelativeDifferences.py,sha256=dgB3Vt40S5D1VerHr-h-YnzB5xNCt6amE19-C0zyIpU,2253
38
+ AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/RelativeDifferences.py,sha256=ZlWaKsNPCMfy4fWxYFT2pSoKMbysQkJH4N1WbbWncq4,2493
39
39
  AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/__init__.py,sha256=RwrJdLOFbAFBFnRxo5xdlOyeZgtQRDaRWDN9-uCGUiY,84
40
- aot_biomaps-2.9.212.dist-info/METADATA,sha256=9Na6ArZdPSi9yp_NrWRIHhMEJ5S2LKqiZvqUecSNnrE,663
41
- aot_biomaps-2.9.212.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
42
- aot_biomaps-2.9.212.dist-info/top_level.txt,sha256=6STF-lT4kaAnBHJYCripmN5mZABoHjMuY689JdiDphk,12
43
- aot_biomaps-2.9.212.dist-info/RECORD,,
40
+ aot_biomaps-2.9.233.dist-info/METADATA,sha256=d5LWlR-zGNLI0gnyEC3Jbq_5b3KLPo5pn1trpc_LvWg,663
41
+ aot_biomaps-2.9.233.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
42
+ aot_biomaps-2.9.233.dist-info/top_level.txt,sha256=6STF-lT4kaAnBHJYCripmN5mZABoHjMuY689JdiDphk,12
43
+ aot_biomaps-2.9.233.dist-info/RECORD,,