Skip to content

Commit 5aa7d00

Browse files
committed
comps2fields working for covs
1 parent 40117f2 commit 5aa7d00

File tree

4 files changed

+283
-431
lines changed

4 files changed

+283
-431
lines changed

Diff for: examples/jackknife-covariance.ipynb

+189-361
Large diffs are not rendered by default.

Diff for: heracles/dices/io.py

+59-63
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,10 @@ def Fields2Components(results):
5555
comps2 = _split_comps(key2)
5656
for i, comp1 in enumerate(comps1):
5757
for j, comp2 in enumerate(comps2):
58-
#if i <= j:
59-
# Only save the upper triangle
6058
_a1, _b1, _i1, _j1 = comp1
6159
_a2, _b2, _i2, _j2 = comp2
62-
covkey = (_a1, _b1, _a2, _b2, _i1, _j1, _i2, _j2)
6360
_r = r.array
61+
covkey = (_a1, _b1, _a2, _b2, _i1, _j1, _i2, _j2)
6462
_results[covkey] = Result(_r[..., i, j, :, :], ell)
6563
else:
6664
raise ValueError(
@@ -69,6 +67,64 @@ def Fields2Components(results):
6967
return _results
7068

7169

70+
def Components2Fields(results):
71+
_results = {}
72+
keys = list(results.keys())
73+
naxis = np.unique([len(result.axis) for result in results.values()])
74+
if len(naxis) != 1:
75+
raise ValueError("Different types of results in the same dictionary.")
76+
naxis = naxis[0]
77+
if naxis == 1:
78+
# We are dealing with Cls
79+
# find unique fields in comps
80+
keys = set([_unsplit_comps(key) for key in keys])
81+
keys = sorted(keys)
82+
for key in keys:
83+
# get comps of each unique field
84+
comps = _split_comps(key)
85+
cls = np.array([results[format_key(comp)] for comp in comps])
86+
_results[key] = cls
87+
elif naxis == 2:
88+
# We are dealing with Covariance matrices
89+
keys = list(set([(k[0], k[1], k[4], k[5]) for k in keys]))
90+
keys = set([_unsplit_comps(key) for key in keys])
91+
keys = sorted(keys)
92+
for key1, key2 in itertools.combinations_with_replacement(keys, 2):
93+
a1, b1, i1, j1 = key1
94+
a2, b2, i2, j2 = key2
95+
field_covkey = (a1, b1, a2, b2, i1, j1, i2, j2)
96+
comps1 = _split_comps(key1)
97+
comps2 = _split_comps(key2)
98+
fields_cov = []
99+
for _key1, _key2 in itertools.product(comps1, comps2):
100+
_a1, _b1, _i1, _j1 = _key1
101+
_a2, _b2, _i2, _j2 = _key2
102+
comp_covkey = (_a1, _b1, _a2, _b2, _i1, _j1, _i2, _j2)
103+
if comp_covkey in results.keys():
104+
comp_cov = results[comp_covkey]
105+
fields_cov.append(comp_cov)
106+
if len(fields_cov) == 0:
107+
# Happens if the BBAA exists but not AABB
108+
comps1, comps2 = comps2, comps1
109+
field_covkey = (a2, b2, a1, b1, i2, j2, i1, j1)
110+
for _key1, _key2 in itertools.product(comps1, comps2):
111+
_a1, _b1, _i1, _j1 = _key1
112+
_a2, _b2, _i2, _j2 = _key2
113+
comp_covkey = (_a1, _b1, _a2, _b2, _i1, _j1, _i2, _j2)
114+
if comp_covkey in results.keys():
115+
comp_cov = results[comp_covkey]
116+
fields_cov.append(comp_cov)
117+
# format the covariance
118+
first, *rest = fields_cov
119+
ell = first.ell
120+
axis = first.axis
121+
nell1, nell2 = first.shape
122+
n, m = len(comps1), len(comps2)
123+
fields_cov = np.reshape(fields_cov, (n, m, nell1, nell2))
124+
_results[field_covkey] = Result(fields_cov, ell, axis=axis)
125+
return _results
126+
127+
72128
def Components2Data(results):
73129
keys = list(results.keys())
74130
ells = [results[key].ell for key in keys]
@@ -138,66 +194,6 @@ def Data2Components(cov):
138194
return Cl_cov_dict
139195

140196

141-
def Components2Fields(results):
142-
_results = {}
143-
keys = list(results.keys())
144-
naxis = np.unique([len(result.axis) for result in results.values()])
145-
if len(naxis) != 1:
146-
raise ValueError("Different types of results in the same dictionary.")
147-
naxis = naxis[0]
148-
if naxis == 1:
149-
# We are dealing with Cls
150-
# find unique fields in comps
151-
keys = set([_unsplit_comps(key) for key in keys])
152-
keys = sorted(keys)
153-
for key in keys:
154-
# get comps of each unique field
155-
comps = _split_comps(key)
156-
cls = np.array([results[format_key(comp)] for comp in comps])
157-
_results[key] = cls
158-
elif naxis == 2:
159-
# We are dealing with Covariance matrices
160-
keys = [(k[0], k[1], k[4], k[5]) for k in keys]
161-
keys = list(set(keys))
162-
for key1, key2 in itertools.combinations_with_replacement(keys, 2):
163-
a1, b1, i1, j1 = key1
164-
a2, b2, i2, j2 = key2
165-
covkey = (a1, b1, a2, b2, i1, j1, i2, j2)
166-
ells1, ells2 = results[covkey].ell
167-
nells1, nells2 = len(ells1), len(ells2)
168-
# Writes the covkeys of the spin components associated with covkey
169-
# it also returns what fields go in what axis
170-
# comps1/comp2 (E, E) (B, B) (E,B)
171-
# (POS, E)
172-
# (POS, B)
173-
comps1 = _split_comps(key1)
174-
comps2 = _split_comps(key2)
175-
# Save comps in dtype metadata
176-
dt = np.dtype(
177-
float,
178-
metadata={
179-
"fields1": comps1,
180-
"fields2": comps2,
181-
},
182-
)
183-
_cov = np.zeros((len(comps1), len(comps2), nells1, nells2), dtype=dt)
184-
for i in range(len(comps1)):
185-
for j in range(len(comps2)):
186-
comp1 = comps1[i]
187-
comp2 = comps2[j]
188-
_a1, _b1, _, _ = comp1
189-
_a2, _b2, _, _ = comp2
190-
_covkey = _a1, _b1, _a2, _b2, i1, j1, i2, j2
191-
if _covkey not in results.keys():
192-
# This triggers if the element doesn't exist
193-
# but the symmetrical term does
194-
_cov[i, j, :, :] = np.zeros((nells2, nells1))
195-
else:
196-
_cov[i, j, :, :] = results[_covkey]
197-
_results[covkey] = Result(_cov, ell=(ells1, ells2))
198-
return _results
199-
200-
201197
def _split_comps(key):
202198
_key = copy.deepcopy(key)
203199
a, b, i, j = _key

Diff for: heracles/dices/jackknife.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,15 @@ def correct_bias(cls, jkmaps, fields, jk=0, jk2=0):
187187
return cls
188188

189189

190-
def jackknife_covariance(samples, nd=1):
190+
def jackknife_covariance(dict, nd=1):
191+
"""
192+
Compute the jackknife covariance matrix from a sequence
193+
of spectra dictionaries *dict*.
194+
"""
195+
return _jackknife_covariance(dict.values(), nd=nd)
196+
197+
198+
def _jackknife_covariance(samples, nd=1):
191199
"""
192200
Compute the jackknife covariance matrix from a sequence
193201
of spectra dictionaries *samples*.
@@ -283,7 +291,7 @@ def delete2_correction(Cls0, Cls1, Cls2):
283291
_qii = Result(_qii, ell=Cls0[key].ell)
284292
qii[key] = _qii
285293
Q_ii.append(qii)
286-
Q = jackknife_covariance(Q_ii, nd=2)
294+
Q = _jackknife_covariance(Q_ii, nd=2)
287295
return Q
288296

289297

Diff for: tests/test_dices.py

+25-5
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ def test_dices(data_path):
247247
assert nells == len(lgrid)
248248

249249
# Delete1
250-
cov_jk = dices.jackknife_covariance(cqs1.values())
250+
cov_jk = dices.jackknife_covariance(cqs1)
251251
# Shrinkage
252252
# target_cov = dices.gaussian_covariance(cqs0)
253253
# shrinkage = dices.shrinkage_factor(cqs0, cqs1, target_cov)
@@ -315,7 +315,7 @@ def test_dices(data_path):
315315
# assert np.all(d == _d)
316316

317317

318-
def test_Fields2Components(data_path):
318+
def test_cls_io(data_path):
319319
data_maps = make_data_maps()
320320
fields = get_fields()
321321
jkmaps = make_jkmaps(data_path)
@@ -324,6 +324,26 @@ def test_Fields2Components(data_path):
324324
__cls = dices.Components2Fields(_cls)
325325
assert sorted(list(cls.keys())) == list(__cls.keys())
326326
for key in list(cls.keys()):
327-
cl = cls[key]
328-
__cl = __cls[key]
329-
assert np.all(cl == __cl)
327+
cl = cls[key].array
328+
__cl = __cls[key].array
329+
assert (cl == __cl).all()
330+
331+
332+
def test_cov_io(data_path):
333+
nside = 128
334+
data_maps = make_data_maps()
335+
vis_maps = make_vis_maps()
336+
fields = get_fields()
337+
jkmaps = make_jkmaps(data_path)
338+
cls1 = dices.jackknife_cls(data_maps, vis_maps, jkmaps, fields, nd=1)
339+
lbins = 5
340+
ledges = np.logspace(np.log10(10), np.log10(nside), lbins + 1)
341+
cqs1 = heracles.binned(cls1, ledges)
342+
cov_jk = dices.jackknife_covariance(cqs1)
343+
_cov_jk = dices.Fields2Components(cov_jk)
344+
__cov_jk = dices.Components2Fields(_cov_jk)
345+
assert sorted(list(cov_jk.keys())) == sorted(list(__cov_jk.keys()))
346+
for key in list(cov_jk.keys()):
347+
cov = cov_jk[key].array
348+
__cov = __cov_jk[key].array
349+
assert (cov == __cov).all()

0 commit comments

Comments
 (0)