Skip to content

Commit 1b407ea

Browse files
gh-509: inv_triangle_number -> nfields_from_nspectra (plus make it public) (#527)
Co-authored-by: Nicolas Tessore <[email protected]>
1 parent 84dff24 commit 1b407ea

File tree

4 files changed

+23
-34
lines changed

4 files changed

+23
-34
lines changed

examples/2-advanced/legacy-mode.ipynb

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
"source": [
6565
"def plot_spectra(*spectra, labels=[], log=True):\n",
6666
" nspec = max(len(cls) for cls in spectra)\n",
67-
" nfields = glass.fields.inv_triangle_number(nspec)\n",
67+
" nfields = glass.nfields_from_nspectra(nspec)\n",
6868
" fig, ax = plt.subplots(\n",
6969
" nfields, nfields, figsize=(1.1 * nfields, 1.0 * nfields), sharex=True, sharey=True, layout=\"constrained\",\n",
7070
" )\n",

glass/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"multalm",
4747
"multi_plane_matrix",
4848
"multi_plane_weights",
49+
"nfields_from_nspectra",
4950
"partition",
5051
"position_weights",
5152
"positions_from_delta",
@@ -97,6 +98,7 @@
9798
lognormal_gls,
9899
lognormal_shift_hilbert2011,
99100
multalm,
101+
nfields_from_nspectra,
100102
regularized_spectra,
101103
solve_gaussian_spectra,
102104
spectra_indices,

glass/fields.py

+14-25
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,16 @@
2626
Cls = Sequence[NDArray[Any]]
2727

2828

29-
def inv_triangle_number(triangle_number: int) -> int:
29+
def nfields_from_nspectra(nspectra: int) -> int:
3030
r"""
31-
The :math:`n`-th triangle number is :math:`T_n = n \, (n+1)/2`. If
32-
the argument is :math:`T_n`, then :math:`n` is returned. Otherwise,
33-
a :class:`ValueError` is raised.
31+
Returns the number of fields for a number of spectra.
32+
33+
Given the number of spectra *nspectra*, returns the number of
34+
fields *n* such that ``n * (n + 1) // 2 == nspectra``.
3435
"""
35-
n = math.floor(math.sqrt(2 * triangle_number))
36-
if n * (n + 1) // 2 != triangle_number:
37-
msg = f"not a triangle number: {triangle_number}"
36+
n = math.floor(math.sqrt(2 * nspectra))
37+
if n * (n + 1) // 2 != nspectra:
38+
msg = f"invalid number of spectra: {nspectra}"
3839
raise ValueError(msg)
3940
return n
4041

@@ -274,11 +275,7 @@ def discretized_cls(
274275
275276
"""
276277
if ncorr is not None:
277-
try:
278-
n = inv_triangle_number(len(cls))
279-
except ValueError:
280-
msg = "length of cls array is not a triangle number"
281-
raise ValueError(msg) from None
278+
n = nfields_from_nspectra(len(cls))
282279
cls = [
283280
cls[i * (i + 1) // 2 + j] if j <= ncorr else np.asarray([])
284281
for i in range(n)
@@ -371,7 +368,7 @@ def generate_gaussian(
371368

372369
# number of gls and number of fields
373370
ngls = len(gls)
374-
ngrf = inv_triangle_number(ngls)
371+
ngrf = nfields_from_nspectra(ngls)
375372

376373
# number of correlated fields if not specified
377374
if ncorr is None:
@@ -591,11 +588,7 @@ def effective_cls(
591588
592589
"""
593590
# this is the number of fields
594-
try:
595-
n = inv_triangle_number(len(cls))
596-
except ValueError:
597-
msg = "length of cls is not a triangle number"
598-
raise ValueError(msg) from None
591+
n = nfields_from_nspectra(len(cls))
599592

600593
# find lmax if not given
601594
if lmax is None:
@@ -844,7 +837,7 @@ def glass_to_healpix_spectra(spectra: Cls) -> Cls:
844837
Sequence of spectra in HEALPix order.
845838
846839
"""
847-
n = inv_triangle_number(len(spectra))
840+
n = nfields_from_nspectra(len(spectra))
848841

849842
comb = [(i, j) for i, j in spectra_indices(n)]
850843
return [spectra[comb.index((i + k, i))] for k in range(n) for i in range(n - k)]
@@ -867,7 +860,7 @@ def healpix_to_glass_spectra(spectra: Cls) -> Cls:
867860
Sequence of spectra in GLASS order.
868861
869862
"""
870-
n = inv_triangle_number(len(spectra))
863+
n = nfields_from_nspectra(len(spectra))
871864

872865
comb = [(i + k, i) for k in range(n) for i in range(n - k)]
873866
return [spectra[comb.index((i, j))] for i, j in spectra_indices(n)]
@@ -914,11 +907,7 @@ def cov_from_spectra(spectra: Cls, *, lmax: int | None = None) -> NDArray[Any]:
914907
915908
"""
916909
# recover the number of fields from the number of spectra
917-
try:
918-
n = inv_triangle_number(len(spectra))
919-
except ValueError:
920-
msg = "invalid number of spectra"
921-
raise ValueError(msg) from None
910+
n = nfields_from_nspectra(len(spectra))
922911

923912
if lmax is None: # noqa: SIM108
924913
# maximum length in input spectra

tests/test_fields.py

+6-8
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,7 @@ def test_discretized_cls() -> None:
270270

271271
# check ValueError for triangle number
272272

273-
with pytest.raises(
274-
ValueError, match="length of cls array is not a triangle number"
275-
):
273+
with pytest.raises(ValueError, match="invalid number of spectra:"):
276274
glass.discretized_cls([np.arange(10), np.arange(10)], ncorr=1)
277275

278276
# ncorr not None
@@ -307,7 +305,7 @@ def test_effective_cls() -> None:
307305

308306
# check ValueError for triangle number
309307

310-
with pytest.raises(ValueError, match="length of cls is not a triangle number"):
308+
with pytest.raises(ValueError, match="invalid number of spectra:"):
311309
glass.effective_cls([np.arange(10), np.arange(10)], np.ones((2, 1)))
312310

313311
# check ValueError for triangle number
@@ -418,15 +416,15 @@ def test_getcl() -> None:
418416
np.testing.assert_array_equal(result[2:], expected)
419417

420418

421-
def test_inv_triangle_number():
419+
def test_nfields_from_nspectra():
422420
for n in range(10_000):
423-
assert glass.fields.inv_triangle_number(n * (n + 1) // 2) == n
421+
assert glass.nfields_from_nspectra(n * (n + 1) // 2) == n
424422

425423
not_triangle_numbers = [2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 20]
426424

427425
for t in not_triangle_numbers:
428-
with pytest.raises(ValueError, match="not a triangle number"):
429-
glass.fields.inv_triangle_number(t)
426+
with pytest.raises(ValueError, match=f"invalid number of spectra: {t}"):
427+
glass.nfields_from_nspectra(t)
430428

431429

432430
def test_enumerate_spectra():

0 commit comments

Comments
 (0)