jaxspec 0.2.2__py3-none-any.whl → 0.3.0__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.
@@ -0,0 +1,81 @@
1
+ from abc import ABC, abstractmethod
2
+ from collections.abc import Callable
3
+
4
+ import numpyro
5
+
6
+ from flax import nnx
7
+ from numpyro.distributions import Distribution
8
+
9
+
10
+ class GainModel(ABC, nnx.Module):
11
+ @abstractmethod
12
+ def numpyro_model(self, observation_name: str):
13
+ pass
14
+
15
+
16
+ class ConstantGain(GainModel):
17
+ def __init__(self, prior_distribution: Distribution):
18
+ self.prior_distribution = prior_distribution
19
+
20
+ def numpyro_model(self, observation_name: str):
21
+ factor = numpyro.sample(f"ins/~/gain_{observation_name}", self.prior_distribution)
22
+
23
+ def gain(energy):
24
+ return factor
25
+
26
+ return gain
27
+
28
+
29
+ class ShiftModel(ABC, nnx.Module):
30
+ @abstractmethod
31
+ def numpyro_model(self, observation_name: str):
32
+ pass
33
+
34
+
35
+ class ConstantShift(ShiftModel):
36
+ def __init__(self, prior_distribution: Distribution):
37
+ self.prior_distribution = prior_distribution
38
+
39
+ def numpyro_model(self, observation_name: str):
40
+ shift_offset = numpyro.sample(f"ins/~/shift_{observation_name}", self.prior_distribution)
41
+
42
+ def shift(energy):
43
+ return energy + shift_offset
44
+
45
+ return shift
46
+
47
+
48
+ class InstrumentModel(nnx.Module):
49
+ def __init__(
50
+ self,
51
+ reference_observation_name: str,
52
+ gain_model: GainModel | None = None,
53
+ shift_model: ShiftModel | None = None,
54
+ ):
55
+ self.reference = reference_observation_name
56
+ self.gain_model = gain_model
57
+ self.shift_model = shift_model
58
+
59
+ def get_gain_and_shift_model(
60
+ self, observation_name: str
61
+ ) -> tuple[Callable | None, Callable | None]:
62
+ """
63
+ Return the gain and shift models for the given observation. It should be called within a numpyro model.
64
+ """
65
+
66
+ if observation_name == self.reference:
67
+ return None, None
68
+
69
+ else:
70
+ gain = (
71
+ self.gain_model.numpyro_model(observation_name)
72
+ if self.gain_model is not None
73
+ else None
74
+ )
75
+ shift = (
76
+ self.shift_model.numpyro_model(observation_name)
77
+ if self.shift_model is not None
78
+ else None
79
+ )
80
+
81
+ return gain, shift
jaxspec/model/list.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import inspect
2
+
2
3
  from .abc import ModelComponent
3
4
  from .additive import * # noqa: F403
4
5
  from .multiplicative import * # noqa: F403
@@ -8,7 +9,9 @@ def all_models(cls: ModelComponent) -> list[ModelComponent]:
8
9
  """
9
10
  Return a list of all the subclasses of a given ModelComponent class
10
11
  """
11
- subclasses = list(set(cls.__subclasses__()).union([s for c in cls.__subclasses__() for s in all_models(c)]))
12
+ subclasses = list(
13
+ set(cls.__subclasses__()).union([s for c in cls.__subclasses__() for s in all_models(c)])
14
+ )
12
15
 
13
16
  return [s for s in subclasses if not inspect.isabstract(s)]
14
17
 
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import flax.nnx as nnx
4
4
  import jax.numpy as jnp
5
+ import jax.scipy.special as jsp
5
6
  import numpy as np
6
7
 
7
8
  from astropy.table import Table
@@ -72,12 +73,20 @@ class Tbabs(MultiplicativeComponent):
72
73
 
73
74
  def __init__(self):
74
75
  table = Table.read(table_manager.fetch("xsect_tbabs_wilm.fits"))
75
- self.energy = nnx.Variable(np.asarray(table["ENERGY"], dtype=np.float64))
76
- self.sigma = nnx.Variable(np.asarray(table["SIGMA"], dtype=np.float64))
76
+ self._energy = np.asarray(table["ENERGY"], dtype=np.float64)
77
+ self._sigma = np.asarray(table["SIGMA"], dtype=np.float64)
77
78
  self.nh = nnx.Param(1.0)
78
79
 
79
80
  def factor(self, energy):
80
- sigma = jnp.interp(energy, self.energy, self.sigma, left=1e9, right=0.0)
81
+ sigma = jnp.exp(
82
+ jnp.interp(
83
+ jnp.log(energy),
84
+ jnp.log(self._energy),
85
+ jnp.log(self._sigma),
86
+ left="extrapolate",
87
+ right="extrapolate",
88
+ )
89
+ )
81
90
 
82
91
  return jnp.exp(-self.nh * sigma)
83
92
 
@@ -89,7 +98,6 @@ class Phabs(MultiplicativeComponent):
89
98
  !!! abstract "Parameters"
90
99
  * $N_{\text{H}}$ (`nh`) $\left[\frac{\text{atoms}~10^{22}}{\text{cm}^2}\right]$ : Equivalent hydrogen column density
91
100
 
92
-
93
101
  """
94
102
 
95
103
  def __init__(self):
@@ -148,13 +156,20 @@ class Gabs(MultiplicativeComponent):
148
156
  self.sigma = nnx.Param(1.0)
149
157
  self.E0 = nnx.Param(1.0)
150
158
 
151
- def factor(self, energy):
152
- return jnp.exp(
153
- -self.tau
154
- / (jnp.sqrt(2 * jnp.pi) * self.sigma)
155
- * jnp.exp(-0.5 * ((energy - self.E0) / self.sigma) ** 2)
159
+ def g(self, E):
160
+ return (
161
+ 2
162
+ / (
163
+ self.sigma
164
+ * jnp.sqrt(2 * jnp.pi)
165
+ * (1 - jsp.erf(-self.E0 / (self.sigma * jnp.sqrt(2))))
166
+ )
167
+ * jnp.exp(-((E - self.E0) ** 2) / (2 * self.sigma**2))
156
168
  )
157
169
 
170
+ def factor(self, energy):
171
+ return jnp.exp(-self.tau * self.g(energy))
172
+
158
173
 
159
174
  class Highecut(MultiplicativeComponent):
160
175
  r"""
@@ -223,13 +238,18 @@ class Tbpcf(MultiplicativeComponent):
223
238
 
224
239
  def __init__(self):
225
240
  table = Table.read(table_manager.fetch("xsect_tbabs_wilm.fits"))
226
- self.energy = nnx.Variable(np.asarray(table["ENERGY"], dtype=np.float64))
227
- self.sigma = nnx.Variable(np.asarray(table["SIGMA"], dtype=np.float64))
241
+ self._energy = nnx.Variable(np.asarray(table["ENERGY"], dtype=np.float64))
242
+ self._sigma = nnx.Variable(np.asarray(table["SIGMA"], dtype=np.float64))
228
243
  self.nh = nnx.Param(1.0)
229
244
  self.f = nnx.Param(0.2)
230
245
 
231
246
  def factor(self, energy):
232
- sigma = jnp.interp(energy, self.energy, self.sigma, left=1e9, right=0.0)
247
+ sigma = jnp.exp(
248
+ jnp.interp(
249
+ energy, self._energy, jnp.log(self._sigma), left="extrapolate", right="extrapolate"
250
+ )
251
+ )
252
+
233
253
  return self.f * jnp.exp(-self.nh * sigma) + (1.0 - self.f)
234
254
 
235
255
 
jaxspec/util/integrate.py CHANGED
@@ -9,11 +9,13 @@ It mainly relies on tanh-sinh (or double exponential) quadrature to perform the
9
9
  * [Tanh-sinh quadrature](https://en.wikipedia.org/wiki/Tanh-sinh_quadrature) from Wikipedia
10
10
  """
11
11
 
12
+ from collections.abc import Callable
13
+
12
14
  import jax
13
15
  import jax.numpy as jnp
16
+
14
17
  from jax import Array
15
18
  from jax.scipy.integrate import trapezoid
16
- from typing import Callable
17
19
 
18
20
 
19
21
  def interval_weights(a: float, b: float, n: int) -> tuple[Array, Array, Array]:
@@ -93,9 +95,15 @@ def integrate_interval(integrand: Callable, n: int = 51) -> Callable:
93
95
  primal_out = f(a, b, *args)
94
96
 
95
97
  # Partial derivatives along other parameters
96
- jac = trapezoid(jnp.nan_to_num(jnp.asarray(jax.jacfwd(lambda args: integrand(x, *args))(args)) * dx), x=t, axis=-1)
97
-
98
- tangent_out = -integrand(a, *args) * a_dot + integrand(b, *args) * b_dot + jac @ jnp.asarray(args_dot)
98
+ jac = trapezoid(
99
+ jnp.nan_to_num(jnp.asarray(jax.jacfwd(lambda args: integrand(x, *args))(args)) * dx),
100
+ x=t,
101
+ axis=-1,
102
+ )
103
+
104
+ tangent_out = (
105
+ -integrand(a, *args) * a_dot + integrand(b, *args) * b_dot + jac @ jnp.asarray(args_dot)
106
+ )
99
107
  return primal_out, tangent_out
100
108
 
101
109
  return f
@@ -142,7 +150,11 @@ def integrate_positive(integrand: Callable, n: int = 51) -> Callable:
142
150
  primal_out = f(*args)
143
151
 
144
152
  # Partial derivatives along other parameters
145
- jac = trapezoid(jnp.nan_to_num(jnp.asarray(jax.jacfwd(lambda args: integrand(x, *args))(args)) * dx), x=t, axis=-1)
153
+ jac = trapezoid(
154
+ jnp.nan_to_num(jnp.asarray(jax.jacfwd(lambda args: integrand(x, *args))(args)) * dx),
155
+ x=t,
156
+ axis=-1,
157
+ )
146
158
 
147
159
  tangent_out = jac @ jnp.asarray(args_dot)
148
160
  return primal_out, tangent_out
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jaxspec
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: jaxspec is a bayesian spectral fitting library for X-ray astronomy.
5
5
  Project-URL: Homepage, https://github.com/renecotyfanboy/jaxspec
6
6
  Project-URL: Documentation, https://jaxspec.readthedocs.io/en/latest/
@@ -8,28 +8,28 @@ Author-email: sdupourque <sdupourque@irap.omp.eu>
8
8
  License-Expression: MIT
9
9
  License-File: LICENSE.md
10
10
  Requires-Python: <3.13,>=3.10
11
- Requires-Dist: arviz<0.21.0,>=0.17.1
12
- Requires-Dist: astropy<7,>=6.0.0
11
+ Requires-Dist: arviz<0.23.0,>=0.17.1
12
+ Requires-Dist: astropy<8,>=6.0.0
13
13
  Requires-Dist: catppuccin<3,>=2.3.4
14
14
  Requires-Dist: chainconsumer<2,>=1.1.2
15
15
  Requires-Dist: cmasher<2,>=1.6.3
16
- Requires-Dist: flax<0.11,>=0.10.3
16
+ Requires-Dist: flax>0.10.5
17
17
  Requires-Dist: interpax<0.4,>=0.3.5
18
18
  Requires-Dist: jax<0.6,>=0.5.0
19
19
  Requires-Dist: jaxns<3,>=2.6.7
20
20
  Requires-Dist: jaxopt<0.9,>=0.8.3
21
21
  Requires-Dist: matplotlib<4,>=3.8.0
22
- Requires-Dist: mendeleev<0.20,>=0.15
22
+ Requires-Dist: mendeleev<1.2,>=0.15
23
23
  Requires-Dist: networkx~=3.1
24
- Requires-Dist: numpy<2.0.0
25
- Requires-Dist: numpyro<0.18,>=0.17.0
24
+ Requires-Dist: numpy<3.0.0
25
+ Requires-Dist: numpyro<0.19,>=0.17.0
26
26
  Requires-Dist: optimistix<0.0.11,>=0.0.10
27
27
  Requires-Dist: pandas<3,>=2.2.0
28
28
  Requires-Dist: pooch<2,>=1.8.2
29
29
  Requires-Dist: scipy<1.15
30
30
  Requires-Dist: seaborn<0.14,>=0.13.1
31
31
  Requires-Dist: simpleeval<1.1.0,>=0.9.13
32
- Requires-Dist: sparse<0.16,>=0.15.4
32
+ Requires-Dist: sparse>0.15
33
33
  Requires-Dist: tinygp<0.4,>=0.3.0
34
34
  Requires-Dist: watermark<3,>=2.4.3
35
35
  Description-Content-Type: text/markdown
@@ -44,7 +44,7 @@ Description-Content-Type: text/markdown
44
44
 
45
45
 
46
46
  [![PyPI - Version](https://img.shields.io/pypi/v/jaxspec?style=for-the-badge&logo=pypi&color=rgb(37%2C%20150%2C%20190))](https://pypi.org/project/jaxspec/)
47
- [![Python package](https://img.shields.io/pypi/pyversions/jaxspec?style=for-the-badge)](https://pypi.org/project/jaxspec/)
47
+ ![Python Version from PEP 621 TOML](https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2Frenecotyfanboy%2Fjaxspec%2Frefs%2Fheads%2Fmain%2Fpyproject.toml&style=for-the-badge)
48
48
  [![Read the Docs](https://img.shields.io/readthedocs/jaxspec?style=for-the-badge)](https://jaxspec.readthedocs.io/en/latest/)
49
49
  [![Codecov](https://img.shields.io/codecov/c/github/renecotyfanboy/jaxspec?style=for-the-badge)](https://app.codecov.io/gh/renecotyfanboy/jaxspec)
50
50
  [![Slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge&logo=slack&logoColor=white)](https://join.slack.com/t/jaxspec/shared_invite/zt-2cuxkdl2f-t0EEAKP~HBEHKvIUZJL2sg)
@@ -0,0 +1,42 @@
1
+ jaxspec/__init__.py,sha256=Sbn02lX6Y-zNXk17N8dec22c5jeypiS0LkHmGfz7lWA,126
2
+ jaxspec/analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ jaxspec/analysis/_plot.py,sha256=0xEz-e_xk7XvU6PUfbNwxaWg1-SxAF2XAqhkxWEhIFs,6239
4
+ jaxspec/analysis/compare.py,sha256=g2UFhmR9Zt-7cz5gQFOB6lXuklXB3yTyUvjTypOzoSY,725
5
+ jaxspec/analysis/results.py,sha256=_qwDSsThI7FOAR6nMaJltGWlKO5Sz2wc1EQ73Y0Ghho,26013
6
+ jaxspec/data/__init__.py,sha256=aantcYKC9kZFvaE-V2SIwSuLhIld17Kjrd9CIUu___Y,415
7
+ jaxspec/data/instrument.py,sha256=RDiG_LkucvnF2XE_ghTFME6d_2YirgQUcEY0gEle6dk,4775
8
+ jaxspec/data/obsconf.py,sha256=G0RwNshvbDQzw_ba8Y8NdI-cRsgEj-OlSNdeYCANqVM,10484
9
+ jaxspec/data/observation.py,sha256=OHXfs7ApC8JAiG6h1teEmXu3iaNyhrqI5BCwl-qFvoM,7820
10
+ jaxspec/data/ogip.py,sha256=eMmBuROW4eMRxRHkPPyGHf933e0IcREqB8WMQFMS2lY,9810
11
+ jaxspec/data/util.py,sha256=4_f6ByGjUEZXTwrB37dCyYaTB1pjF10Z0ho7-4GrQuc,9761
12
+ jaxspec/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ jaxspec/experimental/interpolator.py,sha256=mJRdCB4B71le3dQL_S_E6Wkqpb6QLT7Wdzlok-rU6Ok,2652
14
+ jaxspec/experimental/interpolator_jax.py,sha256=13lflsjbImDRZTObSRDtZnujrXBvEP367Rn20eByONs,2967
15
+ jaxspec/experimental/intrument_models.py,sha256=vuRw7xypPI9YV-Hv8chVNP4ti24dCGjbtDBNbtoVBZQ,5283
16
+ jaxspec/experimental/nested_sampler.py,sha256=8jCAXQAe2mD5YSNSF0jia_rFWES_MzwRM3FrQQS_x7w,2807
17
+ jaxspec/experimental/tabulated.py,sha256=H0llUiso2KGH4xUzTUSVPy-6I8D3wm707lU_Z1P5uq4,9429
18
+ jaxspec/fit/__init__.py,sha256=OaS0-Hkb3Hd-AkE2o-KWfoWMX0NSCPY-_FP2znHf9l0,153
19
+ jaxspec/fit/_bayesian_model.py,sha256=BeYukXr86Y1kEmSyiv-6QC4M2rM78Kx_MgGecu4ML98,15179
20
+ jaxspec/fit/_build_model.py,sha256=pNZVuVfwOq3Pg23opH7xRv28DsSkQZpvy2Z-1hQSfNs,3219
21
+ jaxspec/fit/_fitter.py,sha256=doBTJqTP5CN1OJhZHVlS3oMVOzPJyH4YqOnGevIIU68,8893
22
+ jaxspec/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ jaxspec/model/_graph_util.py,sha256=hPvHYmAxb7P3nyIecaZ7RqWOjwcZ1WvUByt_yNANiaY,4552
24
+ jaxspec/model/abc.py,sha256=RGrqDrXVNjCy7GYBZL-l1PZ3Lpr37SsMIw7L9_B8WJ4,14773
25
+ jaxspec/model/additive.py,sha256=rEONSy7b7lwfXIhuPqtI4y2Yhq55EqrlEtEckEe6TA0,20538
26
+ jaxspec/model/background.py,sha256=VLSrU0YCW9GSHCtaEdcth-sp74aPyEVSizIMFkTpM7M,7759
27
+ jaxspec/model/instrument.py,sha256=FSGgWCQjUfSVOzJ3YfrbQQ2abPlZ4P4ndtLL9Axcl-g,2217
28
+ jaxspec/model/list.py,sha256=uC9rLEEeph10q6shat86WLACVuTSx73RGMl8Ij0jqQY,875
29
+ jaxspec/model/multiplicative.py,sha256=odaOlF0K1KjzUDstPtWAk95ScHoZ7_XveOew6l3tbeU,8337
30
+ jaxspec/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ jaxspec/scripts/debug.py,sha256=qhyDtX4G5UdChmTLCM-5Wti4XZU-sU5S-wDb6TZjrvM,292
32
+ jaxspec/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ jaxspec/util/abundance.py,sha256=fsC313taIlGzQsZNwbYsJupDWm7ZbqzGhY66Ku394Mw,8546
34
+ jaxspec/util/integrate.py,sha256=7GwBSagmDzsF3P53tPs-oakeq0zHEwmZZS2zQlXngbE,4634
35
+ jaxspec/util/misc.py,sha256=O3qorCL1Y2X1BS2jdd36C1eDHK9QDXTSOr9kj3uqcJo,654
36
+ jaxspec/util/online_storage.py,sha256=vm56RfcbFKpkRVfr0bXO7J9aQxuBq-I_oEgA26YIhCo,2469
37
+ jaxspec/util/typing.py,sha256=ZQM_l68qyYnIBZPz_1mKvwPMx64jvVBD8Uj6bx9sHv0,140
38
+ jaxspec-0.3.0.dist-info/METADATA,sha256=92shp3kcwQIbKTSVSD7SU68InowsGVZXST0uJYvRwnQ,4199
39
+ jaxspec-0.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
40
+ jaxspec-0.3.0.dist-info/entry_points.txt,sha256=4ffU5AImfcEBxgWTqopQll2YffpFldOswXRh16pd0Dc,72
41
+ jaxspec-0.3.0.dist-info/licenses/LICENSE.md,sha256=2q5XoWzddts5IqzIcgYYMOL21puU3MfO8gvT3Ype1eQ,1073
42
+ jaxspec-0.3.0.dist-info/RECORD,,
@@ -1,34 +0,0 @@
1
- jaxspec/__init__.py,sha256=Sbn02lX6Y-zNXk17N8dec22c5jeypiS0LkHmGfz7lWA,126
2
- jaxspec/fit.py,sha256=gO0H8CR76WP7lrG2X-Z3HLMndOSkCulzrp2jll1b4ow,24337
3
- jaxspec/_fit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- jaxspec/_fit/_build_model.py,sha256=NgLobtysyhCoiRguAazYGRIpG75iW-pG0Ss_hQGuCT4,2019
5
- jaxspec/analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- jaxspec/analysis/_plot.py,sha256=1VbWentCLHR8XzM3jZtGyppbQRFWnChNztrwpZ2reA4,6185
7
- jaxspec/analysis/compare.py,sha256=g2UFhmR9Zt-7cz5gQFOB6lXuklXB3yTyUvjTypOzoSY,725
8
- jaxspec/analysis/results.py,sha256=9ybhWMtwXD_f9reTt_UcSUKQaY4Raxm0Fi7QBv7fqow,25448
9
- jaxspec/data/__init__.py,sha256=aantcYKC9kZFvaE-V2SIwSuLhIld17Kjrd9CIUu___Y,415
10
- jaxspec/data/instrument.py,sha256=RDiG_LkucvnF2XE_ghTFME6d_2YirgQUcEY0gEle6dk,4775
11
- jaxspec/data/obsconf.py,sha256=r0deDgzpfKJZFMeiKQYUnkqQEmoDYTzl3eQFjb5xYjo,10263
12
- jaxspec/data/observation.py,sha256=dfb-hJFpeSPMS52oNmQl39CB9GD_MK1gG9vHlQXhhwU,7741
13
- jaxspec/data/ogip.py,sha256=57lfUgvMhM4j5tdfnOmwLI0ehx09pG7SvJx6VNIJFHE,9543
14
- jaxspec/data/util.py,sha256=FnIqrnwm29WsFV3FayeLXpjJDS10FcZ613B3SzGQCTk,9331
15
- jaxspec/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- jaxspec/model/_graph_util.py,sha256=hPvHYmAxb7P3nyIecaZ7RqWOjwcZ1WvUByt_yNANiaY,4552
17
- jaxspec/model/abc.py,sha256=sHaFKOGfpD1ocXKlzEMdsmGLluikmBSmX8FAu7duFMQ,15489
18
- jaxspec/model/additive.py,sha256=2MXttFw7eZ6dZ2yWyNpMGDDFFE0kNo6yAP-G-YtL2Qk,20276
19
- jaxspec/model/background.py,sha256=INRuuHIYgfu2E1a8Ddqpr_gF1wnhPtOpciWCteZfVVg,7687
20
- jaxspec/model/list.py,sha256=0RPAoscVz_zM1CWdx_Gd5wfrQWV5Nv4Kd4bSXu2ayUA,860
21
- jaxspec/model/multiplicative.py,sha256=5LHBAXCV9EQO1BGm1HzAI56dqjVbafBdV8Eq7_qXdbM,7890
22
- jaxspec/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- jaxspec/scripts/debug.py,sha256=qhyDtX4G5UdChmTLCM-5Wti4XZU-sU5S-wDb6TZjrvM,292
24
- jaxspec/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- jaxspec/util/abundance.py,sha256=fsC313taIlGzQsZNwbYsJupDWm7ZbqzGhY66Ku394Mw,8546
26
- jaxspec/util/integrate.py,sha256=_Ax_knpC7d4et2-QFkOUzVtNeQLX1-cwLvm-FRBxYcw,4505
27
- jaxspec/util/misc.py,sha256=O3qorCL1Y2X1BS2jdd36C1eDHK9QDXTSOr9kj3uqcJo,654
28
- jaxspec/util/online_storage.py,sha256=vm56RfcbFKpkRVfr0bXO7J9aQxuBq-I_oEgA26YIhCo,2469
29
- jaxspec/util/typing.py,sha256=ZQM_l68qyYnIBZPz_1mKvwPMx64jvVBD8Uj6bx9sHv0,140
30
- jaxspec-0.2.2.dist-info/METADATA,sha256=mKdmXpp8G1qug5j2-LEIrQQDbbjvVmleZkY1Pnq0O0c,4111
31
- jaxspec-0.2.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
32
- jaxspec-0.2.2.dist-info/entry_points.txt,sha256=4ffU5AImfcEBxgWTqopQll2YffpFldOswXRh16pd0Dc,72
33
- jaxspec-0.2.2.dist-info/licenses/LICENSE.md,sha256=2q5XoWzddts5IqzIcgYYMOL21puU3MfO8gvT3Ype1eQ,1073
34
- jaxspec-0.2.2.dist-info/RECORD,,
File without changes