foscat 2025.5.2__py3-none-any.whl → 2025.6.3__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.
foscat/GCNN.py CHANGED
@@ -9,22 +9,17 @@ class GCNN:
9
9
 
10
10
  def __init__(
11
11
  self,
12
- scat_operator=None,
13
12
  nparam=1,
14
- nscale=1,
13
+ KERNELSZ=3,
14
+ NORIENT=4,
15
15
  chanlist=[],
16
16
  in_nside=1,
17
- n_chan_out=1,
18
- nbatch=1,
19
17
  SEED=1234,
20
- hidden=None,
21
18
  filename=None,
22
19
  ):
23
20
 
24
21
  if filename is not None:
25
-
26
22
  outlist = pickle.load(open("%s.pkl" % (filename), "rb"))
27
-
28
23
  self.scat_operator = sc.funct(KERNELSZ=outlist[3], all_type=outlist[7])
29
24
  self.KERNELSZ = self.scat_operator.KERNELSZ
30
25
  self.all_type = self.scat_operator.all_type
@@ -33,51 +28,34 @@ class GCNN:
33
28
  self.chanlist = outlist[0]
34
29
  self.in_nside = outlist[4]
35
30
  self.nbatch = outlist[1]
36
- self.n_chan_out = outlist[8]
37
- if len(outlist[9]) > 0:
38
- self.hidden = outlist[9]
39
- else:
40
- self.hidden = None
41
-
31
+ self.NORIENT = outlist[8]
42
32
  self.x = self.scat_operator.backend.bk_cast(outlist[6])
33
+ self.out_nside = self.in_nside // (2**self.nscale)
43
34
  else:
44
- self.nscale = nscale
45
- self.nbatch = nbatch
35
+ self.nscale = len(chanlist)-1
46
36
  self.npar = nparam
47
- self.n_chan_out = n_chan_out
37
+ self.n_chan_in = n_chan_in
48
38
  self.scat_operator = scat_operator
49
-
50
- if len(chanlist) != nscale + 1:
51
- print(
52
- "len of chanlist (here %d) should of nscale+1 (here %d)"
53
- % (len(chanlist), nscale + 1)
54
- )
55
- return None
39
+ if self.scat_operator is None:
40
+ self.scat_operator = sc.funct(
41
+ KERNELSZ=KERNELSZ,
42
+ NORIENT=NORIENT)
56
43
 
57
44
  self.chanlist = chanlist
58
- self.KERNELSZ = scat_operator.KERNELSZ
59
- self.all_type = scat_operator.all_type
45
+ self.KERNELSZ = self.scat_operator.KERNELSZ
46
+ self.NORIENT = self.scat_operator.NORIENT
47
+ self.all_type = self.scat_operator.all_type
60
48
  self.in_nside = in_nside
61
- self.hidden = hidden
62
-
49
+ self.out_nside = self.in_nside * (2**self.nscale)
50
+ self.backend = self.scat_operator.backend
63
51
  np.random.seed(SEED)
64
- self.x = scat_operator.backend.bk_cast(
65
- np.random.randn(self.get_number_of_weights())
66
- / (self.KERNELSZ * self.KERNELSZ)
52
+ self.x = self.scat_operator.backend.bk_cast(
53
+ np.random.rand(self.get_number_of_weights())
54
+ / (self.KERNELSZ * (self.KERNELSZ//2+1)*self.NORIENT)
67
55
  )
68
56
 
69
57
  def save(self, filename):
70
58
 
71
- if self.hidden is None:
72
- tabh = []
73
- else:
74
- tabh = self.hidden
75
-
76
- www = self.get_weights()
77
-
78
- if not isinstance(www, np.ndarray):
79
- www = www.numpy()
80
-
81
59
  outlist = [
82
60
  self.chanlist,
83
61
  self.nbatch,
@@ -85,10 +63,9 @@ class GCNN:
85
63
  self.KERNELSZ,
86
64
  self.in_nside,
87
65
  self.nscale,
88
- www,
66
+ self.get_weights().numpy(),
89
67
  self.all_type,
90
- self.n_chan_out,
91
- tabh,
68
+ self.NORIENT,
92
69
  ]
93
70
 
94
71
  myout = open("%s.pkl" % (filename), "wb")
@@ -97,25 +74,13 @@ class GCNN:
97
74
 
98
75
  def get_number_of_weights(self):
99
76
  totnchan = 0
100
- szk = self.KERNELSZ * self.KERNELSZ
101
- if self.hidden is not None:
102
- totnchan = totnchan + self.hidden[0] * self.npar
103
- for i in range(1, len(self.hidden)):
104
- totnchan = totnchan + self.hidden[i] * self.hidden[i - 1]
105
- totnchan = (
106
- totnchan
107
- + self.hidden[len(self.hidden) - 1]
108
- * 12
109
- * self.in_nside**2
110
- * self.chanlist[0]
111
- )
112
- else:
113
- totnchan = self.npar * 12 * self.in_nside**2 * self.chanlist[0]
114
-
115
77
  for i in range(self.nscale):
116
- totnchan = totnchan + self.chanlist[i] * self.chanlist[i + 1] * szk
117
-
118
- return totnchan + self.chanlist[i + 1] * self.n_chan_out * szk
78
+ totnchan = totnchan + self.chanlist[i] * self.chanlist[i + 1]
79
+ return (
80
+ self.npar * 12 * self.in_nside**2 * self.chanlist[0]
81
+ + totnchan * self.KERNELSZ * (self.KERNELSZ//2+1)
82
+ + self.KERNELSZ * (self.KERNELSZ//2+1) * self.chanlist[nscale]
83
+ )
119
84
 
120
85
  def set_weights(self, x):
121
86
  self.x = x
@@ -123,117 +88,50 @@ class GCNN:
123
88
  def get_weights(self):
124
89
  return self.x
125
90
 
126
- def eval(self, param, indices=None, weights=None, axis=0):
91
+ def eval(self, im, indices=None, weights=None):
127
92
 
128
93
  x = self.x
94
+
95
+ ww = self.backend.bk_reshape(
96
+ x[0:self.npar * 12 * self.in_nside**2 * self.chanlist[0]],
97
+ [self.npar,12 * self.in_nside**2 * self.chanlist[0]],
98
+ )
129
99
 
130
- if axis == 0:
131
- nval = 1
132
- else:
133
- nval = param.shape[0]
134
-
135
- nn = 0
136
- im = self.scat_operator.backend.bk_reshape(param, [nval, self.npar])
137
- if self.hidden is not None:
138
- ww = self.scat_operator.backend.bk_reshape(
139
- x[nn : nn + self.npar * self.hidden[0]], [self.npar, self.hidden[0]]
140
- )
141
- im = self.scat_operator.backend.bk_matmul(im, ww)
142
- im = self.scat_operator.backend.bk_relu(im)
143
- nn += self.npar * self.hidden[0]
144
-
145
- for i in range(1, len(self.hidden)):
146
- ww = self.scat_operator.backend.bk_reshape(
147
- x[nn : nn + self.hidden[i] * self.hidden[i - 1]],
148
- [self.hidden[i - 1], self.hidden[i]],
149
- )
150
- im = self.scat_operator.backend.bk_matmul(im, ww)
151
- im = self.scat_operator.backend.bk_relu(im)
152
- nn += self.hidden[i] * self.hidden[i - 1]
153
-
154
- ww = self.scat_operator.backend.bk_reshape(
155
- x[
156
- nn : nn
157
- + self.hidden[len(self.hidden) - 1]
158
- * 12
159
- * self.in_nside**2
160
- * self.chanlist[0]
161
- ],
162
- [
163
- self.hidden[len(self.hidden) - 1],
164
- 12 * self.in_nside**2 * self.chanlist[0],
165
- ],
166
- )
167
- im = self.scat_operator.backend.bk_matmul(im, ww)
168
- im = self.scat_operator.backend.bk_reshape(
169
- im, [nval, 12 * self.in_nside**2, self.chanlist[0]]
170
- )
171
- im = self.scat_operator.backend.bk_relu(im)
172
- nn += (
173
- self.hidden[len(self.hidden) - 1]
174
- * 12
175
- * self.in_nside**2
176
- * self.chanlist[0]
177
- )
178
-
179
- else:
180
- ww = self.scat_operator.backend.bk_reshape(
181
- x[0 : self.npar * 12 * self.in_nside**2 * self.chanlist[0]],
182
- [self.npar, 12 * self.in_nside**2 * self.chanlist[0]],
183
- )
184
- im = self.scat_operator.backend.bk_matmul(im, ww)
185
- im = self.scat_operator.backend.bk_reshape(
186
- im, [nval, 12 * self.in_nside**2, self.chanlist[0]]
187
- )
188
- im = self.scat_operator.backend.bk_relu(im)
189
-
190
- nn = self.npar * 12 * self.chanlist[0] * self.in_nside**2
191
-
100
+ im = self.scat_operator.backend.bk_matmul(im,ww)
101
+
102
+ im = self.backend.bk_reshape(im,[im.shape[0],self.chanlist[0],12 * self.in_nside**2])
103
+
104
+ nn = self.npar * 12 * self.in_nside**2 * self.chanlist[0]
105
+
192
106
  for k in range(self.nscale):
193
107
  ww = self.scat_operator.backend.bk_reshape(
194
108
  x[
195
109
  nn : nn
196
110
  + self.KERNELSZ
197
- * self.KERNELSZ
111
+ * (self.KERNELSZ//2+1)
198
112
  * self.chanlist[k]
199
113
  * self.chanlist[k + 1]
200
114
  ],
201
- [self.KERNELSZ * self.KERNELSZ, self.chanlist[k], self.chanlist[k + 1]],
115
+ [self.chanlist[k], self.KERNELSZ * (self.KERNELSZ//2+1), self.chanlist[k + 1]],
202
116
  )
203
117
  nn = (
204
118
  nn
205
119
  + self.KERNELSZ
206
- * self.KERNELSZ
120
+ * (self.KERNELSZ//2)
207
121
  * self.chanlist[k]
208
122
  * self.chanlist[k + 1]
209
123
  )
210
124
  if indices is None:
211
- im = self.scat_operator.healpix_layer_transpose(im, ww, axis=1)
125
+ im = self.scat_operator.healpix_layer(im, ww)
212
126
  else:
213
- im = self.scat_operator.healpix_layer_transpose(
214
- im, ww, indices=indices[k], weights=weights[k], axis=1
127
+ im = self.scat_operator.healpix_layer(
128
+ im, ww, indices=indices[k], weights=weights[k]
215
129
  )
216
130
  im = self.scat_operator.backend.bk_relu(im)
131
+
132
+ im = self.backend.bk_reshape(self.scat_operator.backend.bk_repeat(im,4),[im.shape[0],im.shape[1],im.shape[2]*4])
217
133
 
218
- ww = self.scat_operator.backend.bk_reshape(
219
- x[nn:],
220
- [
221
- self.KERNELSZ * self.KERNELSZ,
222
- self.chanlist[self.nscale],
223
- self.n_chan_out,
224
- ],
225
- )
226
- if indices is None:
227
- im = self.scat_operator.healpix_layer(im, ww, axis=1)
228
- else:
229
- im = self.scat_operator.healpix_layer(
230
- im,
231
- ww,
232
- indices=indices[self.nscale],
233
- weights=weights[self.nscale],
234
- axis=1,
235
- )
134
+ #im = self.scat_operator.backend.bk_reshape(im, [self.npar])
135
+ #im = self.scat_operator.backend.bk_relu(im)
236
136
 
237
- if axis == 0:
238
- im = self.scat_operator.backend.bk_reshape(im, [im.shape[1], im.shape[2]])
239
137
  return im
foscat/Softmax.py CHANGED
@@ -60,6 +60,7 @@ class SoftmaxClassifier:
60
60
  epochs (int, optional): Number of epochs to train the model. Defaults to 10.
61
61
  """
62
62
  # Train the model
63
+ self.model.build(input_shape=(None, x_train.shape[1]))
63
64
  self.model.fit(x_train, y_train, epochs=epochs)
64
65
 
65
66
  def predict(self, x_train):
foscat/alm.py CHANGED
@@ -558,8 +558,8 @@ class alm:
558
558
  Nonetheless, it utilizes TensorFlow and can be integrated into gradient computations.
559
559
 
560
560
  Input:
561
- - `im`: a vector of size ([12 \times \text{Nside}^2]) for scalar data, or of size ([2, 12 \times \text{Nside}^2]) for Q,U polar data,
562
- or of size ([3, 12 \times \text{Nside}^2]) for I,Q,U polar data.
561
+ - `im`: a vector of size ([N_image, 12 \times \text{Nside}^2]) for scalar data, or of size ([N_image, 2, 12 \times \text{Nside}^2]) for Q,U polar data,
562
+ or of size ([N_image,3, 12 \times \text{Nside}^2]) for I,Q,U polar data.
563
563
  - `map2` (optional): a vector of size ([12 \times \text{Nside}^2]) for scalar data, or of size
564
564
  ([3, 12 \times \text{Nside}^2]) for polar data. If provided, cross power spectra will be computed.
565
565
  - `nest=True`: alters the ordering of the input maps.