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/BkTorch.py +11 -12
- foscat/CNN.py +31 -30
- foscat/FoCUS.py +784 -780
- foscat/GCNN.py +48 -150
- foscat/Softmax.py +1 -0
- foscat/alm.py +2 -2
- foscat/heal_NN.py +451 -0
- foscat/scat_cov.py +186 -155
- {foscat-2025.5.2.dist-info → foscat-2025.6.3.dist-info}/METADATA +1 -1
- {foscat-2025.5.2.dist-info → foscat-2025.6.3.dist-info}/RECORD +13 -12
- {foscat-2025.5.2.dist-info → foscat-2025.6.3.dist-info}/WHEEL +0 -0
- {foscat-2025.5.2.dist-info → foscat-2025.6.3.dist-info}/licenses/LICENSE +0 -0
- {foscat-2025.5.2.dist-info → foscat-2025.6.3.dist-info}/top_level.txt +0 -0
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
|
-
|
|
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.
|
|
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 =
|
|
45
|
-
self.nbatch = nbatch
|
|
35
|
+
self.nscale = len(chanlist)-1
|
|
46
36
|
self.npar = nparam
|
|
47
|
-
self.
|
|
37
|
+
self.n_chan_in = n_chan_in
|
|
48
38
|
self.scat_operator = scat_operator
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
66
|
+
self.get_weights().numpy(),
|
|
89
67
|
self.all_type,
|
|
90
|
-
self.
|
|
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]
|
|
117
|
-
|
|
118
|
-
|
|
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,
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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,
|
|
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.
|
|
125
|
+
im = self.scat_operator.healpix_layer(im, ww)
|
|
212
126
|
else:
|
|
213
|
-
im = self.scat_operator.
|
|
214
|
-
im, ww, indices=indices[k], weights=weights[k]
|
|
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
|
-
|
|
219
|
-
|
|
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.
|