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

@@ -45,8 +45,6 @@ class AlgebraicRecon(Recon):
45
45
 
46
46
  self.sparseThreshold = sparseThreshold
47
47
 
48
- self.Z_dim = None # Used for sparse matrix reconstruction
49
-
50
48
  if self.numIterations <= 0:
51
49
  raise ValueError("Number of iterations must be greater than 0.")
52
50
  if self.numSubsets <= 0:
@@ -760,7 +758,6 @@ class AlgebraicRecon(Recon):
760
758
  max_saves=self.maxSaves,
761
759
  show_logs=show_logs,
762
760
  smatrixType=self.smatrixType,
763
- Z=self.Z_dim
764
761
  )
765
762
  else:
766
763
  self.reconLaser, self.indices = MLEM(SMatrix=self.SMatrix,
@@ -774,7 +771,6 @@ class AlgebraicRecon(Recon):
774
771
  max_saves=self.maxSaves,
775
772
  show_logs=show_logs,
776
773
  smatrixType=self.smatrixType,
777
- Z=self.Z_dim
778
774
  )
779
775
  elif self.optimizer.value == OptimizerType.LS.value:
780
776
  if self.alpha is None:
@@ -790,8 +786,7 @@ class AlgebraicRecon(Recon):
790
786
  denominator_threshold=self.denominatorThreshold,
791
787
  max_saves=self.maxSaves,
792
788
  show_logs=show_logs,
793
- smatrixType=self.smatrixType,
794
- Z=self.Z_dim
789
+ smatrixType=self.smatrixType
795
790
  )
796
791
  else:
797
792
  self.reconLaser, self.indices = LS(SMatrix=self.SMatrix,
@@ -805,8 +800,7 @@ class AlgebraicRecon(Recon):
805
800
  denominator_threshold=self.denominatorThreshold,
806
801
  max_saves=self.maxSaves,
807
802
  show_logs=show_logs,
808
- smatrixType=self.smatrixType,
809
- Z=self.Z_dim
803
+ smatrixType=self.smatrixType
810
804
  )
811
805
  else:
812
806
  raise ValueError(f"Only MLEM and LS are supported for simple algebraic reconstruction. {self.optimizer.value} need Bayesian reconstruction")
@@ -1,5 +1,5 @@
1
1
  from AOT_biomaps.AOT_Recon.AlgebraicRecon import AlgebraicRecon
2
- from AOT_biomaps.AOT_Recon.ReconEnums import ReconType, ProcessType
2
+ from AOT_biomaps.AOT_Recon.ReconEnums import ReconType, ProcessType, SMatrixType
3
3
  from AOT_biomaps.AOT_Recon.AOT_Optimizers import CP_KL, CP_TV
4
4
  from AOT_biomaps.AOT_Recon.ReconEnums import OptimizerType
5
5
 
@@ -13,11 +13,20 @@ class PrimalDualRecon(AlgebraicRecon):
13
13
  This class implements the convex reconstruction process.
14
14
  It currently does not perform any operations but serves as a template for future implementations.
15
15
  """
16
- def __init__(self, theta=1.0, L=None, **kwargs):
16
+ def __init__(self, alpha, beta, theta=1.0, L=None, k_security=0.8, use_power_method=True, auto_alpha_gamma=0.05, apply_positivity_clamp=True, tikhonov_as_gradient=False, use_laplacian=True, laplacian_beta_scale=1.0, **kwargs):
17
17
  super().__init__(**kwargs)
18
18
  self.reconType = ReconType.Convex
19
+ self.alpha = alpha # TV regularization parameter (if None, alpha is auto-scaled)
20
+ self.beta=beta # Tikhonov regularization parameter
19
21
  self.theta = theta # relaxation parameter (between 1 and 2)
20
22
  self.L = L # norme spectrale de l'opérateur linéaire défini par les matrices P et P^T
23
+ self.k_security=k_security
24
+ self.use_power_method=use_power_method
25
+ self.auto_alpha_gamma=auto_alpha_gamma # gamma for auto alpha: alpha = gamma * data_term / tv_term
26
+ self.apply_positivity_clamp=apply_positivity_clamp
27
+ self.tikhonov_as_gradient=tikhonov_as_gradient # if True, apply -tau*2*beta*x instead of prox multiplicative
28
+ self.use_laplacian=use_laplacian # enable Laplacian (Hessian scalar) penalty
29
+ self.laplacian_beta_scale=laplacian_beta_scale # multiply beta for laplacian term if you want separate scaling
21
30
 
22
31
  def run(self, processType=ProcessType.PYTHON, withTumor=True):
23
32
  """
@@ -149,56 +158,100 @@ class PrimalDualRecon(AlgebraicRecon):
149
158
  if show_logs:
150
159
  print(f"Loaded reconstruction results and indices from {results_dir}")
151
160
 
152
- def _convexReconPython(self, withTumor):
161
+ def _convexReconPython(self, withTumor,show_logs=True):
153
162
  if self.optimizer == OptimizerType.CP_TV:
154
163
  if withTumor:
155
164
  self.reconPhantom, self.indices = CP_TV(
156
- self.SMatrix,
157
- y=self.experiment.AOsignal_withTumor,
158
- alpha=self.alpha,
159
- theta=self.theta,
160
- numIterations=self.numIterations,
161
- isSavingEachIteration=self.isSavingEachIteration,
162
- L=self.L,
163
- withTumor=withTumor,
164
- device=None
165
- )
165
+ SMatrix = self.SMatrix,
166
+ y = self.experiment.AOsignal_withTumor,
167
+ alpha=self.alpha,
168
+ beta=self.beta,
169
+ theta=self.theta,
170
+ numIterations=self.numIterations,
171
+ isSavingEachIteration=self.isSavingEachIteration,
172
+ L=self.L,
173
+ withTumor=withTumor,
174
+ device=self.device,
175
+ max_saves=self.maxSaves,
176
+ show_logs=show_logs,
177
+ smatrixType= self.smatrixType,
178
+ k_security=self.k_security,
179
+ use_power_method=self.use_power_method,
180
+ auto_alpha_gamma=self.auto_alpha_gamma,
181
+ apply_positivity_clamp=self.apply_positivity_clamp,
182
+ tikhonov_as_gradient=self.tikhonov_as_gradient,
183
+ use_laplacian=self.use_laplacian,
184
+ laplacian_beta_scale=self.laplacian_beta_scale
185
+ )
166
186
  else:
167
187
  self.reconLaser, self.indices = CP_TV(
168
- self.SMatrix,
169
- y=self.experiment.AOsignal_withoutTumor,
170
- alpha=self.alpha,
171
- theta=self.theta,
172
- numIterations=self.numIterations,
173
- isSavingEachIteration=self.isSavingEachIteration,
174
- L=self.L,
175
- withTumor=withTumor,
176
- device=None
177
- )
188
+ SMatrix = self.SMatrix,
189
+ y = self.experiment.AOsignal_withoutTumor,
190
+ alpha=self.alpha,
191
+ beta=self.beta,
192
+ theta=self.theta,
193
+ numIterations=self.numIterations,
194
+ isSavingEachIteration=self.isSavingEachIteration,
195
+ L=self.L,
196
+ withTumor=withTumor,
197
+ device=self.device,
198
+ max_saves=self.maxSaves,
199
+ show_logs=show_logs,
200
+ smatrixType= self.smatrixType,
201
+ k_security=self.k_security,
202
+ use_power_method=self.use_power_method,
203
+ auto_alpha_gamma=self.auto_alpha_gamma,
204
+ apply_positivity_clamp=self.apply_positivity_clamp,
205
+ tikhonov_as_gradient=self.tikhonov_as_gradient,
206
+ use_laplacian=self.use_laplacian,
207
+ laplacian_beta_scale=self.laplacian_beta_scale
208
+ )
178
209
  elif self.optimizer == OptimizerType.CP_KL:
179
210
  if withTumor:
180
211
  self.reconPhantom, self.indices = CP_KL(
181
- self.SMatrix,
182
- y=self.experiment.AOsignal_withTumor,
183
- alpha=self.alpha,
184
- theta=self.theta,
185
- numIterations=self.numIterations,
186
- isSavingEachIteration=self.isSavingEachIteration,
187
- L=self.L,
188
- withTumor=withTumor,
189
- device=None
212
+ SMatrix = self.SMatrix,
213
+ y = self.experiment.AOsignal_withTumor,
214
+ alpha=self.alpha,
215
+ beta=self.beta,
216
+ theta=self.theta,
217
+ numIterations=self.numIterations,
218
+ isSavingEachIteration=self.isSavingEachIteration,
219
+ L=self.L,
220
+ withTumor=withTumor,
221
+ device=self.device,
222
+ max_saves=self.maxSaves,
223
+ show_logs=show_logs,
224
+ smatrixType= self.smatrixType,
225
+ k_security=self.k_security,
226
+ use_power_method=self.use_power_method,
227
+ auto_alpha_gamma=self.auto_alpha_gamma,
228
+ apply_positivity_clamp=self.apply_positivity_clamp,
229
+ tikhonov_as_gradient=self.tikhonov_as_gradient,
230
+ use_laplacian=self.use_laplacian,
231
+ laplacian_beta_scale=self.laplacian_beta_scale
190
232
  )
191
233
  else:
192
234
  self.reconLaser, self.indices = CP_KL(
193
- self.SMatrix,
194
- y=self.experiment.AOsignal_withoutTumor,
195
- alpha=self.alpha,
196
- theta=self.theta,
197
- numIterations=self.numIterations,
198
- isSavingEachIteration=self.isSavingEachIteration,
199
- L=self.L,
200
- withTumor=withTumor,
201
- device=None
235
+ SMatrix = self.SMatrix,
236
+ y = self.experiment.AOsignal_withoutTumor,
237
+ alpha=self.alpha,
238
+ beta=self.beta,
239
+ theta=self.theta,
240
+ numIterations=self.numIterations,
241
+ isSavingEachIteration=self.isSavingEachIteration,
242
+ L=self.L,
243
+ withTumor=withTumor,
244
+ device=self.device,
245
+ max_saves=self.maxSaves,
246
+ show_logs=show_logs,
247
+ smatrixType= self.smatrixType,
248
+ k_security=self.k_security,
249
+ use_power_method=self.use_power_method,
250
+ auto_alpha_gamma=self.auto_alpha_gamma,
251
+ apply_positivity_clamp=self.apply_positivity_clamp,
252
+ tikhonov_as_gradient=self.tikhonov_as_gradient,
253
+ use_laplacian=self.use_laplacian,
254
+ laplacian_beta_scale=self.laplacian_beta_scale
202
255
  )
203
256
  else:
204
257
  raise ValueError(f"Optimizer value must be CP_TV or CP_KL, got {self.optimizer}")
@@ -380,6 +380,21 @@ def filter_radon(f, N, filter_type, Fc):
380
380
 
381
381
  return FILTER
382
382
 
383
+ def compute_TV_cpu(x, Z, X, isotropic=False):
384
+ """
385
+ Compute total variation of x (1D flattened of shape Z*X).
386
+ isotropic=False -> anisotropic (sum |dx| + |dy|)
387
+ isotropic=True -> isotropic sqrt(dx^2 + dy^2)
388
+ """
389
+ x2d = x.reshape(Z, X)
390
+ dx = np.diff(x2d, axis=1)
391
+ dy = np.diff(x2d, axis=0)
392
+ if isotropic:
393
+ # pad to original size for consistent measure (we only need sum of norms)
394
+ mags = np.sqrt(dx**2 + dy**2)
395
+ return float(np.sum(mags))
396
+ else:
397
+ return float(np.sum(np.abs(dx)) + np.sum(np.abs(dy)))
383
398
 
384
399
  def get_apodization_vector_gpu(matrix_sparse_obj):
385
400
  """
@@ -409,4 +424,66 @@ def get_apodization_vector_gpu(matrix_sparse_obj):
409
424
 
410
425
  print(f"✅ Vecteur de fenêtrage (Z*X={Z*X}) généré et transféré sur GPU.")
411
426
 
412
- return fenetre_gpu
427
+ return fenetre_gpu
428
+
429
+ def _call_axpby(axpby_kernel, out_ptr, x_ptr, y_ptr, a, b, N, stream, block):
430
+ grid = ((int(N) + block - 1) // block, 1, 1)
431
+ axpby_kernel(out_ptr, x_ptr, y_ptr,
432
+ np.float32(a), np.float32(b),
433
+ np.int32(N),
434
+ block=(block, 1, 1), grid=grid, stream=stream)
435
+
436
+ def _call_minus_axpy(minus_kernel, out_ptr, z_ptr, a, N, stream, block):
437
+ grid = ((int(N) + block - 1) // block, 1, 1)
438
+ minus_kernel(out_ptr, z_ptr, np.float32(a), np.int32(N),
439
+ block=(block, 1, 1), grid=grid, stream=stream)
440
+
441
+ def power_method_estimate_L__SELL(SMatrix, stream, n_it=20, block_size=256):
442
+ """Estimate ||A||^2 using power method (uses your projection/backprojection kernels)."""
443
+ TN = int(SMatrix.N * SMatrix.T)
444
+ ZX = int(SMatrix.Z * SMatrix.X)
445
+ proj = SMatrix.sparse_mod.get_function("projection_kernel__SELL")
446
+ back = SMatrix.sparse_mod.get_function("backprojection_kernel__SELL")
447
+ TN_i = np.int32(TN)
448
+ ZX_i = np.int32(ZX)
449
+ slice_h = np.int32(SMatrix.slice_height)
450
+ grid_rows = ((TN + block_size - 1) // block_size, 1, 1)
451
+ block_1D = (block_size, 1, 1)
452
+
453
+ dtype = np.float32
454
+ x_host = np.random.randn(ZX).astype(dtype)
455
+ x_host /= np.linalg.norm(x_host) + 1e-12
456
+ x_gpu = drv.mem_alloc(x_host.nbytes)
457
+ drv.memcpy_htod_async(x_gpu, x_host, stream)
458
+ q_gpu = drv.mem_alloc(TN * np.dtype(dtype).itemsize)
459
+ ATq_gpu = drv.mem_alloc(ZX * np.dtype(dtype).itemsize)
460
+ ATq_host = np.empty(ZX, dtype=dtype)
461
+
462
+ for _ in range(n_it):
463
+ proj(q_gpu, SMatrix.sell_values_gpu, SMatrix.sell_colinds_gpu, SMatrix.slice_ptr_gpu, SMatrix.slice_len_gpu,
464
+ x_gpu, TN_i, slice_h, block=block_1D, grid=grid_rows, stream=stream)
465
+ drv.memset_d32_async(ATq_gpu, 0, ZX, stream)
466
+ back(SMatrix.sell_values_gpu, SMatrix.sell_colinds_gpu, SMatrix.slice_ptr_gpu, SMatrix.slice_len_gpu,
467
+ q_gpu, ATq_gpu, TN_i, slice_h, block=block_1D, grid=grid_rows, stream=stream)
468
+ stream.synchronize()
469
+ drv.memcpy_dtoh(ATq_host, ATq_gpu)
470
+ norm = np.linalg.norm(ATq_host)
471
+ if norm < 1e-12:
472
+ break
473
+ x_host = ATq_host / norm
474
+ drv.memcpy_htod_async(x_gpu, x_host, stream)
475
+ # final Rayleigh quotient
476
+ proj(q_gpu, SMatrix.sell_values_gpu, SMatrix.sell_colinds_gpu, SMatrix.slice_ptr_gpu, SMatrix.slice_len_gpu,
477
+ x_gpu, TN_i, slice_h, block=block_1D, grid=grid_rows, stream=stream)
478
+ drv.memset_d32_async(ATq_gpu, 0, ZX, stream)
479
+ back(SMatrix.sell_values_gpu, SMatrix.sell_colinds_gpu, SMatrix.slice_ptr_gpu, SMatrix.slice_len_gpu,
480
+ q_gpu, ATq_gpu, TN_i, slice_h, block=block_1D, grid=grid_rows, stream=stream)
481
+ stream.synchronize()
482
+ drv.memcpy_dtoh(ATq_host, ATq_gpu)
483
+ L_sq = float(np.dot(x_host, ATq_host))
484
+ for g in (x_gpu, q_gpu, ATq_gpu):
485
+ try:
486
+ g.free()
487
+ except:
488
+ pass
489
+ return max(L_sq, 1e-6)
AOT_biomaps/__init__.py CHANGED
@@ -85,7 +85,7 @@ from .AOT_Recon.AOT_PotentialFunctions.RelativeDifferences import *
85
85
  from .Config import config
86
86
  from .Settings import *
87
87
 
88
- __version__ = '2.9.279'
88
+ __version__ = '2.9.300'
89
89
  __process__ = config.get_process()
90
90
 
91
91
  def initialize(process=None):
@@ -135,6 +135,27 @@ def initialize(process=None):
135
135
 
136
136
 
137
137
 
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
138
159
 
139
160
 
140
161
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AOT_biomaps
3
- Version: 2.9.279
3
+ Version: 2.9.300
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=RfEi98jeLI6dtUnjRISgt1myI41kJwTXMkpSpf2VkH4,4220
3
+ AOT_biomaps/__init__.py,sha256=GMzj8PLP9_pgyMqMfNa2NB6nka1mq-xDKBhb3hxBw8Q,4262
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
@@ -18,30 +18,30 @@ AOT_biomaps/AOT_Optic/Laser.py,sha256=uzQwxswjU0kZWix3CmZLoWmhsBa3VhN27STprNv-xB
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/AOT_biomaps_kernels.cubin,sha256=iIp_WxETL4_BCJ0zErD4xm_Kpeey3ymjafdg9kmLd-s,82528
22
- AOT_biomaps/AOT_Recon/AlgebraicRecon.py,sha256=ZroHGhk6Yod4_6yNSlcB5Ew5XLAGO8Bc0dW_xCVJaig,47184
21
+ AOT_biomaps/AOT_Recon/AOT_biomaps_kernels.cubin,sha256=Li4HdWpr65ONf82FqFAjZ8w3ob9UuJucDWGAAvBF77Q,83680
22
+ AOT_biomaps/AOT_Recon/AlgebraicRecon.py,sha256=CGBXZyYEZ3TOTFOKSt-h7NGuFbuI9PNr3YTWTbSLxDo,46832
23
23
  AOT_biomaps/AOT_Recon/AnalyticRecon.py,sha256=RaQ5AJ1HUmSct0BgjZ0GWSJg7SALCn3Q0laqj1yyhAE,7123
24
24
  AOT_biomaps/AOT_Recon/BayesianRecon.py,sha256=RnnPa-tTcvirwiNPnCRZnSM4NWeEEltYET-piBbp34g,12671
25
25
  AOT_biomaps/AOT_Recon/DeepLearningRecon.py,sha256=RfVcEsi4GeGqJn0_SPxwQPQx6IQjin79WKh2UarMRLI,1383
26
- AOT_biomaps/AOT_Recon/PrimalDualRecon.py,sha256=-7dqUxKXbHt7yR1I1kGcu1TOXn05ik6QoDDsuM0QvNU,10310
26
+ AOT_biomaps/AOT_Recon/PrimalDualRecon.py,sha256=JbFhxiyUoSTnlJgHbOWIfUUwhwfZoi39RJMnfkagegY,16504
27
27
  AOT_biomaps/AOT_Recon/ReconEnums.py,sha256=KAf55RqHAr2ilt6pxFrUBGQOn-7HA8NP6TyL-1FNiXo,19714
28
- AOT_biomaps/AOT_Recon/ReconTools.py,sha256=RQbtK6aR0fIfIQ4wSRPIro8LEvjFG4uVCYwYSepxp44,16302
28
+ AOT_biomaps/AOT_Recon/ReconTools.py,sha256=A4IQV7IETu9MgYr7hjLNPTImzjf8CEU4cZ2e0EgJNWA,19878
29
29
  AOT_biomaps/AOT_Recon/__init__.py,sha256=xs_argJqXKFl76xP7-jiUc1ynOEEtY7XZ0gDxD5uVZc,246
30
30
  AOT_biomaps/AOT_Recon/_mainRecon.py,sha256=exoa2UBMfMHjemxAU9dW0mhEfsP6Oe1qjSfrTrgbIcY,13125
31
31
  AOT_biomaps/AOT_Recon/AOT_Optimizers/DEPIERRO.py,sha256=qA1n722GLQJH3V8HcLr5q_GxEwBS_NRlIT3E6JZk-Ag,9479
32
- AOT_biomaps/AOT_Recon/AOT_Optimizers/LS.py,sha256=SvUXNnavusUFuJSPZ-Au4BQZaV2z_aRyx6w5-TpRJ9E,22719
32
+ AOT_biomaps/AOT_Recon/AOT_Optimizers/LS.py,sha256=bCu1rKzFXPbYQ7jV3L3E_jVQpb6LIEC5MIlN1-mCNdY,22814
33
33
  AOT_biomaps/AOT_Recon/AOT_Optimizers/MAPEM.py,sha256=vQLCB0L4FSXJKn2_6kdIdWrI6WZ82KuqUh7CSqBGVuo,25766
34
- AOT_biomaps/AOT_Recon/AOT_Optimizers/MLEM.py,sha256=n_YYZ8NbubpTe5dn_6UjCBsW6Koa0OkF5VdKzseWQeU,21279
35
- AOT_biomaps/AOT_Recon/AOT_Optimizers/PDHG.py,sha256=5w4klYKAct9_gnlyocIiJfDrQUdz_VhXQVSpfjrjvNU,7927
34
+ AOT_biomaps/AOT_Recon/AOT_Optimizers/MLEM.py,sha256=TK-yE3zNLzGoau2dXALy__s5mavKt213HAaJ-gYfbzg,22427
35
+ AOT_biomaps/AOT_Recon/AOT_Optimizers/PDHG.py,sha256=oSojwug5mcZedKOWAV7YPMlCp0Qy_Aed0fjHRuyZWpo,28622
36
36
  AOT_biomaps/AOT_Recon/AOT_Optimizers/__init__.py,sha256=tNGVulINaqQZzcs5cvCMAT5ypGdoFWRnxtl9y7ePECk,106
37
37
  AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/Huber.py,sha256=dRd1t5OBag_gVmfji3L0QrA1GJ_702LcCkLH32Bot0M,3285
38
38
  AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/Quadratic.py,sha256=wTbzcXxMdEl9ReEXrL43DOJQecokBwJYU_s2kQUASZY,2545
39
39
  AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/RelativeDifferences.py,sha256=ZlWaKsNPCMfy4fWxYFT2pSoKMbysQkJH4N1WbbWncq4,2493
40
40
  AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/__init__.py,sha256=RwrJdLOFbAFBFnRxo5xdlOyeZgtQRDaRWDN9-uCGUiY,84
41
- AOT_biomaps/AOT_Recon/AOT_SparseSMatrix/SparseSMatrix_CSR.py,sha256=rZigEUe0d1reCBU-IT4LexbO5uUyps-ZkzhdH3j0PLc,12408
42
- AOT_biomaps/AOT_Recon/AOT_SparseSMatrix/SparseSMatrix_SELL.py,sha256=WTqHBeglUxRx-jy6CcoETgqYSSHYTwi2zR5NrJcPXGU,14449
41
+ AOT_biomaps/AOT_Recon/AOT_SparseSMatrix/SparseSMatrix_CSR.py,sha256=RACc2P5oxmp0uPLAGnNj9mEtAxa_OlepNgCawKij3jI,12062
42
+ AOT_biomaps/AOT_Recon/AOT_SparseSMatrix/SparseSMatrix_SELL.py,sha256=leJcC1dsWlvHqsZFJqdGD49w28AHIAVbUAVBumw0OIA,14378
43
43
  AOT_biomaps/AOT_Recon/AOT_SparseSMatrix/__init__.py,sha256=8nou-hqjQjuCTLhoL5qv4EM_lMPFviAZAZKSPhi84jE,67
44
- aot_biomaps-2.9.279.dist-info/METADATA,sha256=cMJJ5rqoscZbvoGZ27y57VZ0aGzT7-2DLp_O4CFLyRI,700
45
- aot_biomaps-2.9.279.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
- aot_biomaps-2.9.279.dist-info/top_level.txt,sha256=6STF-lT4kaAnBHJYCripmN5mZABoHjMuY689JdiDphk,12
47
- aot_biomaps-2.9.279.dist-info/RECORD,,
44
+ aot_biomaps-2.9.300.dist-info/METADATA,sha256=2J-56TTNn-gQSZ0idm0PTSNQWc1KSmzvNXrfoH27O50,700
45
+ aot_biomaps-2.9.300.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
+ aot_biomaps-2.9.300.dist-info/top_level.txt,sha256=6STF-lT4kaAnBHJYCripmN5mZABoHjMuY689JdiDphk,12
47
+ aot_biomaps-2.9.300.dist-info/RECORD,,