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.
Files changed (32) hide show
  1. {foscat-3.6.0/src/foscat.egg-info → foscat-3.6.1}/PKG-INFO +2 -9
  2. {foscat-3.6.0 → foscat-3.6.1}/pyproject.toml +1 -1
  3. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/FoCUS.py +1 -1
  4. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/alm.py +109 -0
  5. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/backend.py +10 -0
  6. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov.py +77 -10
  7. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov_map.py +2 -2
  8. {foscat-3.6.0 → foscat-3.6.1/src/foscat.egg-info}/PKG-INFO +2 -9
  9. {foscat-3.6.0 → foscat-3.6.1}/LICENCE +0 -0
  10. {foscat-3.6.0 → foscat-3.6.1}/README.md +0 -0
  11. {foscat-3.6.0 → foscat-3.6.1}/setup.cfg +0 -0
  12. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/CNN.py +0 -0
  13. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/CircSpline.py +0 -0
  14. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/GCNN.py +0 -0
  15. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/Softmax.py +0 -0
  16. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/Spline1D.py +0 -0
  17. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/Synthesis.py +0 -0
  18. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/__init__.py +0 -0
  19. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/alm_tools.py +0 -0
  20. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/backend_tens.py +0 -0
  21. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/loss_backend_tens.py +0 -0
  22. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/loss_backend_torch.py +0 -0
  23. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat.py +0 -0
  24. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat1D.py +0 -0
  25. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat2D.py +0 -0
  26. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov1D.py +0 -0
  27. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov2D.py +0 -0
  28. {foscat-3.6.0 → foscat-3.6.1}/src/foscat/scat_cov_map2D.py +0 -0
  29. {foscat-3.6.0 → foscat-3.6.1}/src/foscat.egg-info/SOURCES.txt +0 -0
  30. {foscat-3.6.0 → foscat-3.6.1}/src/foscat.egg-info/dependency_links.txt +0 -0
  31. {foscat-3.6.0 → foscat-3.6.1}/src/foscat.egg-info/requires.txt +0 -0
  32. {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.2
1
+ Metadata-Version: 2.1
2
2
  Name: foscat
3
- Version: 3.6.0
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
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "foscat"
3
- version = "3.6.0"
3
+ version = "3.6.1"
4
4
  description = "Generate synthetic Healpix or 2D data using Cross Scattering Transform"
5
5
  readme = "README.md"
6
6
  license = { text = "BSD-3-Clause" }
@@ -38,7 +38,7 @@ class FoCUS:
38
38
  mpi_rank=0,
39
39
  ):
40
40
 
41
- self.__version__ = "3.6.0"
41
+ self.__version__ = "3.6.1"
42
42
  # P00 coeff for normalization for scat_cov
43
43
  self.TMPFILE_VERSION = TMPFILE_VERSION
44
44
  self.P1_dic = None
@@ -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
- 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,
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
- self, image1, image2=None, mask=None, norm=None, Auto=True, calc_var=False
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.2
1
+ Metadata-Version: 2.1
2
2
  Name: foscat
3
- Version: 3.6.0
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