foscat 3.6.0__tar.gz → 3.6.1__tar.gz
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.
- {foscat-3.6.0/src/foscat.egg-info → foscat-3.6.1}/PKG-INFO +2 -9
- {foscat-3.6.0 → foscat-3.6.1}/pyproject.toml +1 -1
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/FoCUS.py +1 -1
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/alm.py +109 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/backend.py +10 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov.py +77 -10
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov_map.py +2 -2
- {foscat-3.6.0 → foscat-3.6.1/src/foscat.egg-info}/PKG-INFO +2 -9
- {foscat-3.6.0 → foscat-3.6.1}/LICENCE +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/README.md +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/setup.cfg +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/CNN.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/CircSpline.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/GCNN.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/Softmax.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/Spline1D.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/Synthesis.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/__init__.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/alm_tools.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/backend_tens.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/loss_backend_tens.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/loss_backend_torch.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat1D.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat2D.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov1D.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov2D.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov_map2D.py +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat.egg-info/SOURCES.txt +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat.egg-info/dependency_links.txt +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat.egg-info/requires.txt +0 -0
- {foscat-3.6.0 → foscat-3.6.1}/src/foscat.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: foscat
|
|
3
|
-
Version: 3.6.
|
|
3
|
+
Version: 3.6.1
|
|
4
4
|
Summary: Generate synthetic Healpix or 2D data using Cross Scattering Transform
|
|
5
5
|
Author-email: Jean-Marc DELOUIS <jean.marc.delouis@ifremer.fr>
|
|
6
6
|
Maintainer-email: Theo Foulquier <theo.foulquier@ifremer.fr>
|
|
@@ -19,13 +19,6 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
19
19
|
Requires-Python: >=3.9
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENCE
|
|
22
|
-
Requires-Dist: imageio
|
|
23
|
-
Requires-Dist: imagecodecs
|
|
24
|
-
Requires-Dist: matplotlib
|
|
25
|
-
Requires-Dist: numpy
|
|
26
|
-
Requires-Dist: tensorflow
|
|
27
|
-
Requires-Dist: healpy
|
|
28
|
-
Requires-Dist: spherical
|
|
29
22
|
|
|
30
23
|
# foscat
|
|
31
24
|
|
|
@@ -377,8 +377,15 @@ class alm():
|
|
|
377
377
|
r_inv=self.backend.bk_reverse(self.backend.bk_conjugate(r[:,1:-1]),axis=axis)
|
|
378
378
|
return self.backend.bk_concat([r,r_inv],axis=axis)
|
|
379
379
|
|
|
380
|
+
def irfft2fft(self,val,N,axis=0):
|
|
381
|
+
if axis==0:
|
|
382
|
+
return self.backend.bk_irfft(val[0:N//2+1])
|
|
383
|
+
else:
|
|
384
|
+
return self.backend.bk_irfft(val[:,0:N//2+1])
|
|
385
|
+
|
|
380
386
|
def comp_tf(self,im,nside,realfft=False):
|
|
381
387
|
|
|
388
|
+
self.shift_ph(nside)
|
|
382
389
|
n=0
|
|
383
390
|
|
|
384
391
|
ft_im=[]
|
|
@@ -438,6 +445,61 @@ class alm():
|
|
|
438
445
|
return self.backend.bk_concat([result,lastresult],axis=0)*self.matrix_shift_ph[nside]
|
|
439
446
|
else:
|
|
440
447
|
return result*self.matrix_shift_ph[nside]
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
def icomp_tf(self,i_im,nside,realfft=False):
|
|
451
|
+
|
|
452
|
+
self.shift_ph(nside)
|
|
453
|
+
|
|
454
|
+
n=0
|
|
455
|
+
im=[]
|
|
456
|
+
ft_im=i_im*self.backend.bk_conjugate(self.matrix_shift_ph[nside])
|
|
457
|
+
|
|
458
|
+
for k in range(nside-1):
|
|
459
|
+
N=4*(k+1)
|
|
460
|
+
|
|
461
|
+
if realfft:
|
|
462
|
+
tmp=self.irfft2fft(ft_im[k],N)
|
|
463
|
+
else:
|
|
464
|
+
tmp=self.backend.bk_ifft(im[k],N)
|
|
465
|
+
|
|
466
|
+
im.append(tmp[0:N])
|
|
467
|
+
|
|
468
|
+
n+=N
|
|
469
|
+
|
|
470
|
+
if nside>1:
|
|
471
|
+
result=self.backend.bk_concat(im,axis=0)
|
|
472
|
+
|
|
473
|
+
N=4*nside*(2*nside+1)
|
|
474
|
+
v=ft_im[nside-1:3*nside,0:2*nside+1]
|
|
475
|
+
if realfft:
|
|
476
|
+
v_fft=self.backend.bk_reshape(self.irfft2fft(v,N,axis=1),[4*nside*(2*nside+1)])
|
|
477
|
+
else:
|
|
478
|
+
v_fft=self.backend.bk_ifft(v)
|
|
479
|
+
|
|
480
|
+
n+=N
|
|
481
|
+
if nside>1:
|
|
482
|
+
result=self.backend.bk_concat([result,v_fft],axis=0)
|
|
483
|
+
else:
|
|
484
|
+
result=v_fft
|
|
485
|
+
|
|
486
|
+
if nside>1:
|
|
487
|
+
im=[]
|
|
488
|
+
for k in range(nside-1):
|
|
489
|
+
N=4*(nside-1-k)
|
|
490
|
+
|
|
491
|
+
if realfft:
|
|
492
|
+
tmp=self.irfft2fft(ft_im[k+3*nside],N)
|
|
493
|
+
else:
|
|
494
|
+
tmp=self.backend.bk_ifft(im[k+3*nside],N)
|
|
495
|
+
|
|
496
|
+
im.append(tmp[0:N])
|
|
497
|
+
|
|
498
|
+
n+=N
|
|
499
|
+
|
|
500
|
+
return self.backend.bk_concat([result]+im,axis=0)
|
|
501
|
+
else:
|
|
502
|
+
return result
|
|
441
503
|
|
|
442
504
|
def anafast(self,im,map2=None,nest=False,spin=2):
|
|
443
505
|
|
|
@@ -621,6 +683,8 @@ class alm():
|
|
|
621
683
|
def map2alm(self,im,nest=False):
|
|
622
684
|
nside=int(np.sqrt(im.shape[0]//12))
|
|
623
685
|
|
|
686
|
+
ph=self.shift_ph(nside)
|
|
687
|
+
|
|
624
688
|
if nest:
|
|
625
689
|
idx=hp.ring2nest(nside,np.arange(12*nside**2))
|
|
626
690
|
ft_im=self.comp_tf(self.backend.bk_cast(self.backend.bk_gather(im,idx)),nside,realfft=True)
|
|
@@ -645,6 +709,51 @@ class alm():
|
|
|
645
709
|
|
|
646
710
|
return alm
|
|
647
711
|
|
|
712
|
+
|
|
713
|
+
def alm2map(self,nside,alm):
|
|
714
|
+
|
|
715
|
+
lth=self.ring_th(nside)
|
|
716
|
+
|
|
717
|
+
co_th=np.cos(lth)
|
|
718
|
+
|
|
719
|
+
ft_im=[]
|
|
720
|
+
|
|
721
|
+
n=0
|
|
722
|
+
|
|
723
|
+
lmax=3*nside-1
|
|
724
|
+
|
|
725
|
+
for m in range(lmax+1):
|
|
726
|
+
plm=self.compute_legendre_m(co_th,m,3*nside-1,nside)/(12*nside**2)
|
|
727
|
+
|
|
728
|
+
print(alm[n:n+lmax-m+1].shape,plm.shape)
|
|
729
|
+
ft_im.append(self.backend.bk_reduce_sum(self.backend.bk_reshape(alm[n:n+lmax-m+1],[lmax-m+1,1])*plm,0))
|
|
730
|
+
|
|
731
|
+
n=n+lmax-m+1
|
|
732
|
+
|
|
733
|
+
return self.backend.bk_reshape(self.backend.bk_concat(ft_im,0),[lmax+1,4*nside-1])
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
if nest:
|
|
737
|
+
idx=hp.ring2nest(nside,np.arange(12*nside**2))
|
|
738
|
+
ft_im=self.comp_tf(self.backend.bk_cast(self.backend.bk_gather(im,idx)),nside,realfft=True)
|
|
739
|
+
else:
|
|
740
|
+
ft_im=self.comp_tf(self.backend.bk_cast(im),nside,realfft=True)
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
lmax=3*nside-1
|
|
744
|
+
|
|
745
|
+
alm=None
|
|
746
|
+
for m in range(lmax+1):
|
|
747
|
+
plm=self.compute_legendre_m(co_th,m,3*nside-1,nside)/(12*nside**2)
|
|
748
|
+
|
|
749
|
+
tmp=self.backend.bk_reduce_sum(plm*ft_im[:,m],1)
|
|
750
|
+
if m==0:
|
|
751
|
+
alm=tmp
|
|
752
|
+
else:
|
|
753
|
+
alm=self.backend.bk_concat([alm,tmp],axis=0)
|
|
754
|
+
|
|
755
|
+
return o_map
|
|
756
|
+
|
|
648
757
|
def map2alm_spin(self,im_Q,im_U,spin=2,nest=False):
|
|
649
758
|
|
|
650
759
|
if spin==0:
|
|
@@ -978,6 +978,16 @@ class foscat_backend:
|
|
|
978
978
|
return self.backend.rfft(data)
|
|
979
979
|
if self.BACKEND == self.NUMPY:
|
|
980
980
|
return self.backend.fft.rfft(data)
|
|
981
|
+
|
|
982
|
+
|
|
983
|
+
def bk_irfft(self, data):
|
|
984
|
+
if self.BACKEND == self.TENSORFLOW:
|
|
985
|
+
return self.backend.signal.irfft(data)
|
|
986
|
+
if self.BACKEND == self.TORCH:
|
|
987
|
+
return self.backend.irfft(data)
|
|
988
|
+
if self.BACKEND == self.NUMPY:
|
|
989
|
+
return self.backend.fft.irfft(data)
|
|
990
|
+
|
|
981
991
|
def bk_conjugate(self, data):
|
|
982
992
|
|
|
983
993
|
if self.BACKEND == self.TENSORFLOW:
|
|
@@ -2488,15 +2488,16 @@ class funct(FOC.FoCUS):
|
|
|
2488
2488
|
)
|
|
2489
2489
|
|
|
2490
2490
|
def eval(
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2491
|
+
self,
|
|
2492
|
+
image1,
|
|
2493
|
+
image2=None,
|
|
2494
|
+
mask=None,
|
|
2495
|
+
norm=None,
|
|
2496
|
+
Auto=True,
|
|
2497
|
+
calc_var=False,
|
|
2498
|
+
cmat=None,
|
|
2499
|
+
cmat2=None,
|
|
2500
|
+
out_nside=None
|
|
2500
2501
|
):
|
|
2501
2502
|
"""
|
|
2502
2503
|
Calculates the scattering correlations for a batch of images. Mean are done over pixels.
|
|
@@ -2708,6 +2709,8 @@ class funct(FOC.FoCUS):
|
|
|
2708
2709
|
|
|
2709
2710
|
if return_data:
|
|
2710
2711
|
s0 = I1
|
|
2712
|
+
if out_nside is not None:
|
|
2713
|
+
s0 = self.backend.bk_reduce_mean(self.backend.bk_reshape(s0,[s0.shape[0],12*out_nside**2,(nside//out_nside)**2]),2)
|
|
2711
2714
|
else:
|
|
2712
2715
|
if not cross:
|
|
2713
2716
|
s0, l_vs0 = self.masked_mean(I1, vmask, axis=1, calc_var=True)
|
|
@@ -2778,6 +2781,12 @@ class funct(FOC.FoCUS):
|
|
|
2778
2781
|
if return_data:
|
|
2779
2782
|
if S2 is None:
|
|
2780
2783
|
S2 = {}
|
|
2784
|
+
if out_nside is not None and out_nside<nside_j3:
|
|
2785
|
+
s2 = self.backend.bk_reduce_mean(
|
|
2786
|
+
self.backend.bk_reshape(s2,[s2.shape[0],
|
|
2787
|
+
12*out_nside**2,
|
|
2788
|
+
(nside_j3//out_nside)**2,
|
|
2789
|
+
s2.shape[2]]),2)
|
|
2781
2790
|
S2[j3] = s2
|
|
2782
2791
|
else:
|
|
2783
2792
|
if norm == "auto": # Normalize S2
|
|
@@ -2818,6 +2827,12 @@ class funct(FOC.FoCUS):
|
|
|
2818
2827
|
if return_data:
|
|
2819
2828
|
if S1 is None:
|
|
2820
2829
|
S1 = {}
|
|
2830
|
+
if out_nside is not None and out_nside<nside_j3:
|
|
2831
|
+
s1 = self.backend.bk_reduce_mean(
|
|
2832
|
+
self.backend.bk_reshape(s1,[s1.shape[0],
|
|
2833
|
+
12*out_nside**2,
|
|
2834
|
+
(nside_j3//out_nside)**2,
|
|
2835
|
+
s1.shape[2]]),2)
|
|
2821
2836
|
S1[j3] = s1
|
|
2822
2837
|
else:
|
|
2823
2838
|
### Normalize S1
|
|
@@ -2904,6 +2919,12 @@ class funct(FOC.FoCUS):
|
|
|
2904
2919
|
if return_data:
|
|
2905
2920
|
if S2 is None:
|
|
2906
2921
|
S2 = {}
|
|
2922
|
+
if out_nside is not None and out_nside<nside_j3:
|
|
2923
|
+
s2 = self.backend.bk_reduce_mean(
|
|
2924
|
+
self.backend.bk_reshape(s2,[s2.shape[0],
|
|
2925
|
+
12*out_nside**2,
|
|
2926
|
+
(nside_j3//out_nside)**2,
|
|
2927
|
+
s2.shape[2]]),2)
|
|
2907
2928
|
S2[j3] = s2
|
|
2908
2929
|
else:
|
|
2909
2930
|
### Normalize S2_cross
|
|
@@ -2949,6 +2970,12 @@ class funct(FOC.FoCUS):
|
|
|
2949
2970
|
if return_data:
|
|
2950
2971
|
if S1 is None:
|
|
2951
2972
|
S1 = {}
|
|
2973
|
+
if out_nside is not None and out_nside<nside_j3:
|
|
2974
|
+
s1 = self.backend.bk_reduce_mean(
|
|
2975
|
+
self.backend.bk_reshape(s1,[s1.shape[0],
|
|
2976
|
+
12*out_nside**2,
|
|
2977
|
+
(nside_j3//out_nside)**2,
|
|
2978
|
+
s1.shape[2]]),2)
|
|
2952
2979
|
S1[j3] = s1
|
|
2953
2980
|
else:
|
|
2954
2981
|
### Normalize S1
|
|
@@ -2979,6 +3006,7 @@ class funct(FOC.FoCUS):
|
|
|
2979
3006
|
M2convPsi_dic = {}
|
|
2980
3007
|
|
|
2981
3008
|
###### S3
|
|
3009
|
+
nside_j2=nside_j3
|
|
2982
3010
|
for j2 in range(0, j3 + 1): # j2 <= j3
|
|
2983
3011
|
if return_data:
|
|
2984
3012
|
if S4[j3] is None:
|
|
@@ -3013,6 +3041,13 @@ class funct(FOC.FoCUS):
|
|
|
3013
3041
|
if return_data:
|
|
3014
3042
|
if S3[j3] is None:
|
|
3015
3043
|
S3[j3] = {}
|
|
3044
|
+
if out_nside is not None and out_nside<nside_j2:
|
|
3045
|
+
s3 = self.backend.bk_reduce_mean(
|
|
3046
|
+
self.backend.bk_reshape(s3,[s3.shape[0],
|
|
3047
|
+
12*out_nside**2,
|
|
3048
|
+
(nside_j2//out_nside)**2,
|
|
3049
|
+
s3.shape[2],
|
|
3050
|
+
s3.shape[3]]),2)
|
|
3016
3051
|
S3[j3][j2] = s3
|
|
3017
3052
|
else:
|
|
3018
3053
|
### Normalize S3 with S2_j [Nbatch, Nmask, Norient_j]
|
|
@@ -3095,6 +3130,19 @@ class funct(FOC.FoCUS):
|
|
|
3095
3130
|
if S3[j3] is None:
|
|
3096
3131
|
S3[j3] = {}
|
|
3097
3132
|
S3P[j3] = {}
|
|
3133
|
+
if out_nside is not None and out_nside<nside_j2:
|
|
3134
|
+
s3 = self.backend.bk_reduce_mean(
|
|
3135
|
+
self.backend.bk_reshape(s3,[s3.shape[0],
|
|
3136
|
+
12*out_nside**2,
|
|
3137
|
+
(nside_j2//out_nside)**2,
|
|
3138
|
+
s3.shape[2],
|
|
3139
|
+
s3.shape[3]]),2)
|
|
3140
|
+
s3p = self.backend.bk_reduce_mean(
|
|
3141
|
+
self.backend.bk_reshape(s3p,[s3.shape[0],
|
|
3142
|
+
12*out_nside**2,
|
|
3143
|
+
(nside_j2//out_nside)**2,
|
|
3144
|
+
s3.shape[2],
|
|
3145
|
+
s3.shape[3]]),2)
|
|
3098
3146
|
S3[j3][j2] = s3
|
|
3099
3147
|
S3P[j3][j2] = s3p
|
|
3100
3148
|
else:
|
|
@@ -3154,6 +3202,7 @@ class funct(FOC.FoCUS):
|
|
|
3154
3202
|
) # Add a dimension for NS3
|
|
3155
3203
|
|
|
3156
3204
|
##### S4
|
|
3205
|
+
nside_j1=nside_j2
|
|
3157
3206
|
for j1 in range(0, j2 + 1): # j1 <= j2
|
|
3158
3207
|
### S4_auto = <(|I1 * psi1| * psi3)(|I1 * psi2| * psi3)^*>
|
|
3159
3208
|
if not cross:
|
|
@@ -3179,6 +3228,14 @@ class funct(FOC.FoCUS):
|
|
|
3179
3228
|
if return_data:
|
|
3180
3229
|
if S4[j3][j2] is None:
|
|
3181
3230
|
S4[j3][j2] = {}
|
|
3231
|
+
if out_nside is not None and out_nside<nside_j1:
|
|
3232
|
+
s4 = self.backend.bk_reduce_mean(
|
|
3233
|
+
self.backend.bk_reshape(s4,[s4.shape[0],
|
|
3234
|
+
12*out_nside**2,
|
|
3235
|
+
(nside_j1//out_nside)**2,
|
|
3236
|
+
s4.shape[2],
|
|
3237
|
+
s4.shape[3],
|
|
3238
|
+
s4.shape[4]]),2)
|
|
3182
3239
|
S4[j3][j2][j1] = s4
|
|
3183
3240
|
else:
|
|
3184
3241
|
### Normalize S4 with S2_j [Nbatch, Nmask, Norient_j]
|
|
@@ -3248,6 +3305,14 @@ class funct(FOC.FoCUS):
|
|
|
3248
3305
|
if return_data:
|
|
3249
3306
|
if S4[j3][j2] is None:
|
|
3250
3307
|
S4[j3][j2] = {}
|
|
3308
|
+
if out_nside is not None and out_nside<nside_j1:
|
|
3309
|
+
s4 = self.backend.bk_reduce_mean(
|
|
3310
|
+
self.backend.bk_reshape(s4,[s4.shape[0],
|
|
3311
|
+
12*out_nside**2,
|
|
3312
|
+
(nside_j1//out_nside)**2,
|
|
3313
|
+
s4.shape[2],
|
|
3314
|
+
s4.shape[3],
|
|
3315
|
+
s4.shape[4]]),2)
|
|
3251
3316
|
S4[j3][j2][j1] = s4
|
|
3252
3317
|
else:
|
|
3253
3318
|
### Normalize S4 with S2_j [Nbatch, Nmask, Norient_j]
|
|
@@ -3292,7 +3357,9 @@ class funct(FOC.FoCUS):
|
|
|
3292
3357
|
],
|
|
3293
3358
|
axis=2,
|
|
3294
3359
|
) # Add a dimension for NS4
|
|
3295
|
-
|
|
3360
|
+
nside_j1=nside_j1 // 2
|
|
3361
|
+
nside_j2=nside_j2 // 2
|
|
3362
|
+
|
|
3296
3363
|
###### Reshape for next iteration on j3
|
|
3297
3364
|
### Image I1,
|
|
3298
3365
|
# downscale the I1 [Nbatch, Npix_j3]
|
|
@@ -24,10 +24,10 @@ class funct(scat.funct):
|
|
|
24
24
|
super().__init__(return_data=True, *args, **kwargs)
|
|
25
25
|
|
|
26
26
|
def eval(
|
|
27
|
-
|
|
27
|
+
self, image1, image2=None, mask=None, norm=None, Auto=True, calc_var=False,out_nside=None
|
|
28
28
|
):
|
|
29
29
|
r = super().eval(
|
|
30
|
-
image1, image2=image2, mask=mask, norm=norm, Auto=Auto, calc_var=calc_var
|
|
30
|
+
image1, image2=image2, mask=mask, norm=norm, Auto=Auto, calc_var=calc_var,out_nside=out_nside
|
|
31
31
|
)
|
|
32
32
|
return scat_cov_map(
|
|
33
33
|
r.S2, r.S0, r.S3, r.S4, S1=r.S1, S3P=r.S3P, backend=r.backend
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: foscat
|
|
3
|
-
Version: 3.6.
|
|
3
|
+
Version: 3.6.1
|
|
4
4
|
Summary: Generate synthetic Healpix or 2D data using Cross Scattering Transform
|
|
5
5
|
Author-email: Jean-Marc DELOUIS <jean.marc.delouis@ifremer.fr>
|
|
6
6
|
Maintainer-email: Theo Foulquier <theo.foulquier@ifremer.fr>
|
|
@@ -19,13 +19,6 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
19
19
|
Requires-Python: >=3.9
|
|
20
20
|
Description-Content-Type: text/markdown
|
|
21
21
|
License-File: LICENCE
|
|
22
|
-
Requires-Dist: imageio
|
|
23
|
-
Requires-Dist: imagecodecs
|
|
24
|
-
Requires-Dist: matplotlib
|
|
25
|
-
Requires-Dist: numpy
|
|
26
|
-
Requires-Dist: tensorflow
|
|
27
|
-
Requires-Dist: healpy
|
|
28
|
-
Requires-Dist: spherical
|
|
29
22
|
|
|
30
23
|
# foscat
|
|
31
24
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|