flipcosmo 1.0.0__py3-none-any.whl → 1.2.1__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.
- docs/conf.py +154 -0
- flip/__init__.py +4 -11
- flip/covariance/__init__.py +7 -8
- flip/covariance/analytical/__init__.py +11 -0
- flip/covariance/{adamsblake17plane → analytical/adamsblake17}/coefficients.py +1 -1
- flip/covariance/{adamsblake17plane → analytical/adamsblake17}/fisher_terms.py +1 -1
- flip/covariance/{adamsblake17 → analytical/adamsblake17}/flip_terms.py +0 -1
- flip/covariance/{adamsblake17 → analytical/adamsblake17plane}/coefficients.py +1 -1
- flip/covariance/{adamsblake17 → analytical/adamsblake17plane}/fisher_terms.py +1 -1
- flip/covariance/{adamsblake17plane → analytical/adamsblake17plane}/flip_terms.py +0 -1
- flip/covariance/{adamsblake17plane → analytical/adamsblake17plane}/generator.py +103 -19
- flip/covariance/{adamsblake20 → analytical/adamsblake20}/coefficients.py +1 -1
- flip/covariance/{adamsblake20 → analytical/adamsblake20}/fisher_terms.py +1 -1
- flip/covariance/{adamsblake20 → analytical/adamsblake20}/flip_terms.py +0 -1
- flip/covariance/{carreres23 → analytical/carreres23}/coefficients.py +1 -4
- flip/covariance/{ravouxnoanchor25 → analytical/carreres23}/fisher_terms.py +1 -1
- flip/covariance/{carreres23 → analytical/carreres23}/flip_terms.py +0 -1
- flip/covariance/analytical/carreres23/generator.py +198 -0
- flip/covariance/analytical/genericzdep/__init__.py +5 -0
- flip/covariance/analytical/genericzdep/coefficients.py +53 -0
- flip/covariance/analytical/genericzdep/flip_terms.py +99 -0
- flip/covariance/{lai22 → analytical/lai22}/coefficients.py +2 -3
- flip/covariance/{lai22 → analytical/lai22}/fisher_terms.py +1 -1
- flip/covariance/{lai22 → analytical/lai22}/flip_terms.py +0 -1
- flip/covariance/{lai22 → analytical/lai22}/generator.py +263 -58
- flip/covariance/{lai22 → analytical/lai22}/symbolic.py +55 -19
- flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/coefficients.py +1 -1
- flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/fisher_terms.py +1 -1
- flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/flip_terms.py +0 -1
- flip/covariance/{ravouxnoanchor25 → analytical/ravouxnoanchor25}/coefficients.py +3 -2
- flip/covariance/{carreres23 → analytical/ravouxnoanchor25}/fisher_terms.py +1 -1
- flip/covariance/{ravouxnoanchor25 → analytical/ravouxnoanchor25}/flip_terms.py +0 -9
- flip/covariance/{rcrk24 → analytical/rcrk24}/coefficients.py +6 -6
- flip/covariance/{rcrk24 → analytical/rcrk24}/fisher_terms.py +7 -9
- flip/covariance/{rcrk24 → analytical/rcrk24}/flip_terms.py +0 -8
- flip/covariance/contraction.py +82 -40
- flip/covariance/cov_utils.py +89 -81
- flip/covariance/covariance.py +172 -141
- flip/covariance/emulators/__init__.py +1 -1
- flip/covariance/emulators/generator.py +73 -3
- flip/covariance/emulators/gpmatrix.py +40 -1
- flip/covariance/emulators/nnmatrix.py +57 -1
- flip/covariance/emulators/skgpmatrix.py +125 -0
- flip/covariance/fisher.py +307 -0
- flip/{fit_utils.py → covariance/fit_utils.py} +185 -10
- flip/{fitter.py → covariance/fitter.py} +151 -125
- flip/covariance/generator.py +82 -106
- flip/{likelihood.py → covariance/likelihood.py} +286 -64
- flip/{plot_utils.py → covariance/plot_utils.py} +79 -4
- flip/covariance/symbolic.py +89 -44
- flip/data/__init__.py +1 -1
- flip/data/data_density.parquet +0 -0
- flip/data/data_velocity.parquet +0 -0
- flip/data/{grid_window_m.parquet → data_window_density.parquet} +0 -0
- flip/{gridding.py → data/gridding.py} +125 -130
- flip/data/load_data_test.py +102 -0
- flip/data/power_spectrum_mm.txt +2 -2
- flip/data/power_spectrum_mt.txt +2 -2
- flip/data/power_spectrum_tt.txt +2 -2
- flip/data/test_covariance_reference_values.json +145 -0
- flip/data/test_e2e_reference_values.json +14 -0
- flip/data_vector/basic.py +118 -101
- flip/data_vector/cosmo_utils.py +18 -0
- flip/data_vector/galaxypv_vectors.py +58 -94
- flip/data_vector/snia_vectors.py +60 -3
- flip/data_vector/vector_utils.py +47 -1
- flip/power_spectra/class_engine.py +36 -1
- flip/power_spectra/cosmoprimo_engine.py +37 -2
- flip/power_spectra/generator.py +47 -25
- flip/power_spectra/models.py +30 -31
- flip/power_spectra/pyccl_engine.py +36 -1
- flip/simulation/__init__.py +0 -0
- flip/utils.py +62 -91
- flipcosmo-1.2.1.dist-info/METADATA +78 -0
- flipcosmo-1.2.1.dist-info/RECORD +109 -0
- {flipcosmo-1.0.0.dist-info → flipcosmo-1.2.1.dist-info}/WHEEL +1 -1
- flipcosmo-1.2.1.dist-info/top_level.txt +7 -0
- scripts/flip_compute_correlation_model.py +70 -0
- scripts/flip_compute_power_spectra.py +50 -0
- scripts/flip_fisher_forecast_velocity.py +70 -0
- scripts/flip_fisher_rcrk24.py +164 -0
- scripts/flip_launch_minuit_density_fit.py +91 -0
- scripts/flip_launch_minuit_full_fit.py +117 -0
- scripts/flip_launch_minuit_velocity_fit.py +78 -0
- scripts/flip_launch_minuit_velocity_fit_full.py +107 -0
- scripts/flip_launch_minuit_velocity_fit_interpolation.py +93 -0
- test/refresh_reference_values.py +43 -0
- test/test_covariance_assembly.py +102 -0
- test/test_covariance_reference_values.py +125 -0
- test/test_covariance_utils.py +34 -0
- test/test_e2e_density.py +50 -0
- test/test_e2e_joint.py +65 -0
- test/test_e2e_velocity.py +53 -0
- test/test_likelihood_inversions.py +31 -0
- flip/covariance/carreres23/generator.py +0 -132
- flip/data/density_data.parquet +0 -0
- flip/data/velocity_data.parquet +0 -0
- flip/fisher.py +0 -190
- flipcosmo-1.0.0.dist-info/METADATA +0 -32
- flipcosmo-1.0.0.dist-info/RECORD +0 -82
- flipcosmo-1.0.0.dist-info/top_level.txt +0 -1
- /flip/{config.py → _config.py} +0 -0
- /flip/covariance/{adamsblake17 → analytical/adamsblake17}/__init__.py +0 -0
- /flip/covariance/{adamsblake17plane → analytical/adamsblake17plane}/__init__.py +0 -0
- /flip/covariance/{adamsblake20 → analytical/adamsblake20}/__init__.py +0 -0
- /flip/covariance/{carreres23 → analytical/carreres23}/__init__.py +0 -0
- /flip/covariance/{lai22 → analytical/lai22}/__init__.py +0 -0
- /flip/covariance/{lai22 → analytical/lai22}/h_terms.py +0 -0
- /flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/__init__.py +0 -0
- /flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/flip_terms_lmax.py +0 -0
- /flip/covariance/{ravouxnoanchor25 → analytical/ravouxnoanchor25}/__init__.py +0 -0
- /flip/covariance/{rcrk24 → analytical/rcrk24}/__init__.py +0 -0
- {flipcosmo-1.0.0.dist-info → flipcosmo-1.2.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
|
|
3
|
+
from flip.utils import create_log
|
|
4
|
+
|
|
5
|
+
from .._config import __use_jax__
|
|
6
|
+
|
|
7
|
+
if __use_jax__:
|
|
8
|
+
try:
|
|
9
|
+
import jax.numpy as jnp
|
|
10
|
+
|
|
11
|
+
jax_installed = True
|
|
12
|
+
|
|
13
|
+
except ImportError:
|
|
14
|
+
import numpy as jnp
|
|
15
|
+
|
|
16
|
+
jax_installed = False
|
|
17
|
+
else:
|
|
18
|
+
import numpy as jnp
|
|
19
|
+
|
|
20
|
+
jax_installed = False
|
|
21
|
+
|
|
22
|
+
log = create_log()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def inverse_covariance_inverse(covariance):
|
|
26
|
+
"""Return the explicit inverse of a covariance matrix.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
covariance (array-like): Positive-definite covariance matrix of shape `(N, N)`.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
numpy.ndarray: The matrix inverse `covariance^{-1}`.
|
|
33
|
+
|
|
34
|
+
Notes:
|
|
35
|
+
For Fisher computations, explicit inversion is acceptable on modest sizes,
|
|
36
|
+
but Cholesky-based solves are usually more stable for ill-conditioned matrices.
|
|
37
|
+
"""
|
|
38
|
+
return jnp.linalg.inv(covariance)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def inverse_covariance_cholesky(covariance):
|
|
42
|
+
"""Return the explicit inverse of a covariance matrix.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
covariance (array-like): Positive-definite covariance matrix of shape `(N, N)`.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
numpy.ndarray: The matrix inverse `covariance^{-1}`.
|
|
49
|
+
|
|
50
|
+
Notes:
|
|
51
|
+
For Fisher computations, explicit inversion is acceptable on modest sizes,
|
|
52
|
+
but Cholesky-based solves are usually more stable for ill-conditioned matrices.
|
|
53
|
+
"""
|
|
54
|
+
c = jnp.linalg.inv(jnp.linalg.cholesky(covariance))
|
|
55
|
+
inverse = jnp.dot(c.T, c)
|
|
56
|
+
return inverse
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def inverse_covariance_cholesky_inverse(covariance):
|
|
60
|
+
"""Return the explicit inverse of a covariance matrix.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
covariance (array-like): Positive-definite covariance matrix of shape `(N, N)`.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
numpy.ndarray: The matrix inverse `covariance^{-1}`.
|
|
67
|
+
|
|
68
|
+
Notes:
|
|
69
|
+
For Fisher computations, explicit inversion is acceptable on modest sizes,
|
|
70
|
+
but Cholesky-based solves are usually more stable for ill-conditioned matrices.
|
|
71
|
+
"""
|
|
72
|
+
c = jnp.linalg.inv(jnp.linalg.cholesky(covariance))
|
|
73
|
+
inverse = jnp.dot(c.T, c)
|
|
74
|
+
return inverse
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class FisherMatrix:
|
|
78
|
+
"""Compute Fisher information matrix from covariance derivatives.
|
|
79
|
+
|
|
80
|
+
Builds the Fisher matrix $F_{ij} = \tfrac{1}{2}\,\mathrm{Tr}[C^{-1} \partial_i C\, C^{-1} \partial_j C]$
|
|
81
|
+
using model-specific derivative coefficients and a provided inverse covariance.
|
|
82
|
+
|
|
83
|
+
Attributes:
|
|
84
|
+
covariance (CovMatrix): Covariance model describing blocks gg/gv/vv.
|
|
85
|
+
inverse_covariance_sum (numpy.ndarray): Precomputed `C^{-1}` used in traces.
|
|
86
|
+
parameter_values_dict (dict): Parameter values for computing coefficients.
|
|
87
|
+
free_par (list[str]): Combined free parameters from covariance and data.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
_default_fisher_properties = {
|
|
91
|
+
"inversion_method": "inverse",
|
|
92
|
+
"negative_log_likelihood": True,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
def __init__(
|
|
96
|
+
self,
|
|
97
|
+
covariance=None,
|
|
98
|
+
inverse_covariance_sum=None,
|
|
99
|
+
data_free_par=None,
|
|
100
|
+
parameter_values_dict=None,
|
|
101
|
+
):
|
|
102
|
+
|
|
103
|
+
self.covariance = covariance
|
|
104
|
+
self.inverse_covariance_sum = inverse_covariance_sum
|
|
105
|
+
self.parameter_values_dict = parameter_values_dict
|
|
106
|
+
self.free_par = self.covariance.free_par[:]
|
|
107
|
+
if data_free_par is not None:
|
|
108
|
+
self.free_par += data_free_par
|
|
109
|
+
|
|
110
|
+
@classmethod
|
|
111
|
+
def init_from_covariance(
|
|
112
|
+
cls,
|
|
113
|
+
covariance,
|
|
114
|
+
data,
|
|
115
|
+
parameter_values_dict,
|
|
116
|
+
fisher_properties={},
|
|
117
|
+
covariance_prefactor_dict=None,
|
|
118
|
+
):
|
|
119
|
+
"""Initialize a FisherMatrix instance from a covariance and data model.
|
|
120
|
+
|
|
121
|
+
Ensures the covariance is in matrix form, prepares the `compute_covariance_sum`
|
|
122
|
+
functions, computes the data variance and the full covariance sum, and inverts
|
|
123
|
+
it according to the selected method.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
covariance (CovMatrix): Covariance model to use.
|
|
127
|
+
data (object): Data model; called to obtain vector errors given parameters.
|
|
128
|
+
parameter_values_dict (dict): Parameter values for coefficient evaluation.
|
|
129
|
+
fisher_properties (dict, optional): Options including `inversion_method`.
|
|
130
|
+
covariance_prefactor_dict (dict, optional): Prefactors per block (gg/gv/vv).
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
FisherMatrix: Ready-to-use Fisher matrix builder instance.
|
|
134
|
+
"""
|
|
135
|
+
if covariance.matrix_form is False and covariance.emulator_flag is False:
|
|
136
|
+
covariance.compute_matrix_covariance()
|
|
137
|
+
if (
|
|
138
|
+
covariance.compute_covariance_sum is None
|
|
139
|
+
or covariance.compute_covariance_sum_jit is None
|
|
140
|
+
):
|
|
141
|
+
covariance.init_compute_covariance_sum()
|
|
142
|
+
|
|
143
|
+
fisher_properties = {
|
|
144
|
+
**cls._default_fisher_properties,
|
|
145
|
+
**fisher_properties,
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
_, vector_variance = data.give_data_and_variance(
|
|
149
|
+
parameter_values_dict,
|
|
150
|
+
)
|
|
151
|
+
covariance_sum = covariance.compute_covariance_sum(
|
|
152
|
+
parameter_values_dict,
|
|
153
|
+
vector_variance,
|
|
154
|
+
covariance_prefactor_dict=covariance_prefactor_dict,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
inverse_covariance_sum = eval(
|
|
158
|
+
f"inverse_covariance_{fisher_properties['inversion_method']}"
|
|
159
|
+
)(covariance_sum)
|
|
160
|
+
|
|
161
|
+
return cls(
|
|
162
|
+
covariance=covariance,
|
|
163
|
+
inverse_covariance_sum=inverse_covariance_sum,
|
|
164
|
+
data_free_par=data.free_par,
|
|
165
|
+
parameter_values_dict=parameter_values_dict,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
def compute_covariance_derivative(
|
|
169
|
+
self,
|
|
170
|
+
partial_coefficients_dict_param,
|
|
171
|
+
):
|
|
172
|
+
"""Assemble covariance derivative matrix for a single parameter.
|
|
173
|
+
|
|
174
|
+
Uses model-kind-specific blocks and partial derivative coefficients to form
|
|
175
|
+
$\partial_i C$ for the parameter `i`.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
partial_coefficients_dict_param (dict): Coefficients for blocks `gg/gv/vv`.
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
numpy.ndarray: Covariance derivative matrix $\partial_i C$.
|
|
182
|
+
|
|
183
|
+
Raises:
|
|
184
|
+
ValueError: If the covariance model kind is unsupported.
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
if self.covariance.model_kind == "density":
|
|
188
|
+
covariance_derivative_sum = jnp.sum(
|
|
189
|
+
jnp.array(
|
|
190
|
+
[
|
|
191
|
+
partial_coefficients_dict_param["gg"][i] * cov
|
|
192
|
+
for i, cov in enumerate(self.covariance.covariance_dict["gg"])
|
|
193
|
+
]
|
|
194
|
+
),
|
|
195
|
+
axis=0,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
elif self.covariance.model_kind == "velocity":
|
|
199
|
+
covariance_derivative_sum = jnp.sum(
|
|
200
|
+
jnp.array(
|
|
201
|
+
[
|
|
202
|
+
partial_coefficients_dict_param["vv"][i] * cov
|
|
203
|
+
for i, cov in enumerate(self.covariance.covariance_dict["vv"])
|
|
204
|
+
]
|
|
205
|
+
),
|
|
206
|
+
axis=0,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
elif self.covariance.model_kind in ["density_velocity", "full"]:
|
|
210
|
+
number_densities = self.covariance.number_densities
|
|
211
|
+
number_velocities = self.covariance.number_velocities
|
|
212
|
+
|
|
213
|
+
if self.covariance.model_kind == "density_velocity":
|
|
214
|
+
covariance_derivative_sum_gv = jnp.zeros(
|
|
215
|
+
(number_densities, number_velocities)
|
|
216
|
+
)
|
|
217
|
+
elif self.covariance.model_kind == "full":
|
|
218
|
+
covariance_derivative_sum_gv = jnp.sum(
|
|
219
|
+
[
|
|
220
|
+
partial_coefficients_dict_param["gv"][i] * cov
|
|
221
|
+
for i, cov in enumerate(self.covariance.covariance_dict["gv"])
|
|
222
|
+
],
|
|
223
|
+
axis=0,
|
|
224
|
+
)
|
|
225
|
+
covariance_derivative_sum_gg = jnp.sum(
|
|
226
|
+
[
|
|
227
|
+
partial_coefficients_dict_param["gg"][i] * cov
|
|
228
|
+
for i, cov in enumerate(self.covariance.covariance_dict["gg"])
|
|
229
|
+
],
|
|
230
|
+
axis=0,
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
covariance_derivative_sum_vv = jnp.sum(
|
|
234
|
+
[
|
|
235
|
+
partial_coefficients_dict_param["vv"][i] * cov
|
|
236
|
+
for i, cov in enumerate(self.covariance.covariance_dict["vv"])
|
|
237
|
+
],
|
|
238
|
+
axis=0,
|
|
239
|
+
)
|
|
240
|
+
covariance_derivative_sum_vg = covariance_derivative_sum_gv.T
|
|
241
|
+
|
|
242
|
+
covariance_derivative_sum = jnp.block(
|
|
243
|
+
[
|
|
244
|
+
[covariance_derivative_sum_gg, covariance_derivative_sum_gv],
|
|
245
|
+
[covariance_derivative_sum_vg, covariance_derivative_sum_vv],
|
|
246
|
+
]
|
|
247
|
+
)
|
|
248
|
+
else:
|
|
249
|
+
log.add("Wrong model type in the loaded covariance.")
|
|
250
|
+
|
|
251
|
+
return covariance_derivative_sum
|
|
252
|
+
|
|
253
|
+
def compute_fisher_matrix(self, covariance_prefactor_dict=None):
|
|
254
|
+
"""Compute the Fisher matrix using covariance derivatives.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
tuple[list[str], numpy.ndarray]: Parameter names list and Fisher matrix
|
|
258
|
+
of shape `(n_params, n_params)`.
|
|
259
|
+
"""
|
|
260
|
+
coefficients = importlib.import_module(
|
|
261
|
+
f"flip.covariance.analytical.{self.covariance.model_name}.fisher_terms"
|
|
262
|
+
)
|
|
263
|
+
partial_coefficients_dict = coefficients.get_partial_derivative_coefficients(
|
|
264
|
+
self.covariance.model_kind,
|
|
265
|
+
self.parameter_values_dict,
|
|
266
|
+
variant=self.covariance.variant,
|
|
267
|
+
covariance_prefactor_dict=covariance_prefactor_dict,
|
|
268
|
+
)
|
|
269
|
+
parameter_name_list = []
|
|
270
|
+
covariance_derivative_sum_list = []
|
|
271
|
+
|
|
272
|
+
for (
|
|
273
|
+
parameter_name,
|
|
274
|
+
partial_coefficients_dict_param,
|
|
275
|
+
) in partial_coefficients_dict.items():
|
|
276
|
+
parameter_name_list.append(parameter_name)
|
|
277
|
+
covariance_derivative_sum_list.append(
|
|
278
|
+
jnp.dot(
|
|
279
|
+
self.inverse_covariance_sum,
|
|
280
|
+
self.compute_covariance_derivative(
|
|
281
|
+
partial_coefficients_dict_param,
|
|
282
|
+
),
|
|
283
|
+
)
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
fisher_matrix_size = len(partial_coefficients_dict.keys())
|
|
287
|
+
fisher_matrix = jnp.zeros((fisher_matrix_size, fisher_matrix_size))
|
|
288
|
+
tri_i, tri_j = jnp.triu_indices_from(fisher_matrix)
|
|
289
|
+
|
|
290
|
+
for i, j in zip(tri_i, tri_j):
|
|
291
|
+
if jax_installed:
|
|
292
|
+
fisher_matrix = fisher_matrix.at[i, j].set(
|
|
293
|
+
0.5
|
|
294
|
+
* jnp.trace(
|
|
295
|
+
covariance_derivative_sum_list[i]
|
|
296
|
+
@ covariance_derivative_sum_list[j]
|
|
297
|
+
)
|
|
298
|
+
)
|
|
299
|
+
fisher_matrix = fisher_matrix.at[j, i].set(fisher_matrix[i, j])
|
|
300
|
+
else:
|
|
301
|
+
fisher_matrix[i][j] = 0.5 * jnp.trace(
|
|
302
|
+
covariance_derivative_sum_list[i]
|
|
303
|
+
@ covariance_derivative_sum_list[j]
|
|
304
|
+
)
|
|
305
|
+
fisher_matrix[j, i] = fisher_matrix[i, j]
|
|
306
|
+
|
|
307
|
+
return parameter_name_list, fisher_matrix
|
|
@@ -7,8 +7,7 @@ import snsim
|
|
|
7
7
|
import snutils
|
|
8
8
|
from astropy.cosmology import FlatLambdaCDM
|
|
9
9
|
|
|
10
|
-
from flip import fitter
|
|
11
|
-
from flip.covariance import covariance
|
|
10
|
+
from flip.covariance import covariance, fitter
|
|
12
11
|
from flip.utils import create_log
|
|
13
12
|
|
|
14
13
|
log = create_log()
|
|
@@ -26,6 +25,26 @@ def fit_density_minuit(
|
|
|
26
25
|
additional_parameters_values=(),
|
|
27
26
|
maximum_number_coordinates=None,
|
|
28
27
|
):
|
|
28
|
+
"""Fit density field parameters with Minuit.
|
|
29
|
+
|
|
30
|
+
Loads a grid from parquet, builds a density covariance via `flip.covariance`,
|
|
31
|
+
constructs the likelihood, runs Minuit, and pickle-dumps fit results.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
parameter_dict (dict): Parameter specs with values/errors/limits.
|
|
35
|
+
model_name (str): Covariance model name.
|
|
36
|
+
likelihood_type (str): Likelihood variant key.
|
|
37
|
+
likelihood_properties (dict): Likelihood options.
|
|
38
|
+
parameter_fit (tuple): `(grid_name, power_spectrum_dict, name_out_fit, str_fit)`.
|
|
39
|
+
overwrite (bool): Overwrite existing pickle output.
|
|
40
|
+
size_batch (int): Batch size for covariance generation.
|
|
41
|
+
number_worker (int): Parallel workers for covariance generation.
|
|
42
|
+
additional_parameters_values (tuple): Extra parameters for covariance.
|
|
43
|
+
maximum_number_coordinates (int, optional): Early stop if grid too large.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
None: Writes results to `name_out_fit`.
|
|
47
|
+
"""
|
|
29
48
|
grid_name = parameter_fit[0]
|
|
30
49
|
power_spectrum_dict = parameter_fit[1]
|
|
31
50
|
name_out_fit = parameter_fit[2]
|
|
@@ -45,10 +64,10 @@ def fit_density_minuit(
|
|
|
45
64
|
for i in range(len(str_fit)):
|
|
46
65
|
log.add(str_fit[i])
|
|
47
66
|
|
|
48
|
-
coordinates_density = np.array([grid["ra"], grid["dec"], grid["
|
|
67
|
+
coordinates_density = np.array([grid["ra"], grid["dec"], grid["rcom_zobs"]])
|
|
49
68
|
data_density = {
|
|
50
69
|
"density": np.array(grid["density"]),
|
|
51
|
-
"density_error": np.array(grid["
|
|
70
|
+
"density_error": np.array(grid["density_error"]),
|
|
52
71
|
}
|
|
53
72
|
|
|
54
73
|
covariance_fit = covariance.CovMatrix.init_from_flip(
|
|
@@ -96,6 +115,27 @@ def fit_density_interp_sigg_minuit(
|
|
|
96
115
|
number_worker=32,
|
|
97
116
|
maximum_number_coordinates=None,
|
|
98
117
|
):
|
|
118
|
+
"""Fit density with 1D interpolation over `sigg` using Minuit.
|
|
119
|
+
|
|
120
|
+
Precomputes covariances over `interpolation_value_range`, interpolates during
|
|
121
|
+
likelihood evaluation, and runs Minuit.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
parameter_dict (dict): Parameter specs.
|
|
125
|
+
model_name (str): Covariance model name.
|
|
126
|
+
likelihood_type (str): Likelihood variant key.
|
|
127
|
+
likelihood_properties (dict): Likelihood options.
|
|
128
|
+
interpolation_value_name (str): Interpolation parameter name.
|
|
129
|
+
interpolation_value_range (array-like): Grid of `sigg` values.
|
|
130
|
+
parameter_fit (tuple): `(grid_name, power_spectrum_dict, name_out_fit, str_fit)`.
|
|
131
|
+
overwrite (bool): Overwrite existing output.
|
|
132
|
+
size_batch (int): Covariance generation batch size.
|
|
133
|
+
number_worker (int): Parallel workers for covariance.
|
|
134
|
+
maximum_number_coordinates (int, optional): Early stop if grid too large.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
None: Writes results to `name_out_fit`.
|
|
138
|
+
"""
|
|
99
139
|
grid_name = parameter_fit[0]
|
|
100
140
|
power_spectrum_dict = parameter_fit[1]
|
|
101
141
|
name_out_fit = parameter_fit[2]
|
|
@@ -115,10 +155,10 @@ def fit_density_interp_sigg_minuit(
|
|
|
115
155
|
for i in range(len(str_fit)):
|
|
116
156
|
log.add(str_fit[i])
|
|
117
157
|
|
|
118
|
-
coordinates_density = np.array([grid["ra"], grid["dec"], grid["
|
|
158
|
+
coordinates_density = np.array([grid["ra"], grid["dec"], grid["rcom_zobs"]])
|
|
119
159
|
data_density = {
|
|
120
160
|
"density": np.array(grid["density"]),
|
|
121
|
-
"density_error": np.array(grid["
|
|
161
|
+
"density_error": np.array(grid["density_error"]),
|
|
122
162
|
}
|
|
123
163
|
|
|
124
164
|
covariance_list = []
|
|
@@ -172,6 +212,27 @@ def fit_velocity_true_minuit(
|
|
|
172
212
|
size_batch=10_000,
|
|
173
213
|
number_worker=32,
|
|
174
214
|
):
|
|
215
|
+
"""Fit true peculiar velocities (no measurement error) with Minuit.
|
|
216
|
+
|
|
217
|
+
Extracts light curves from simulation, applies selection masks, builds the
|
|
218
|
+
velocity covariance with appropriate cosmological scaling, and runs Minuit.
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
parameter_dict (dict): Parameter specs.
|
|
222
|
+
likelihood_type (str): Likelihood variant key.
|
|
223
|
+
likelihood_properties (dict): Likelihood options.
|
|
224
|
+
zmin (float): Minimum redshift for selection.
|
|
225
|
+
z_simu (float): Simulation redshift for scaling.
|
|
226
|
+
photo_type (str): Phototyping mode for selection.
|
|
227
|
+
completeness_file (str): Path to completeness table.
|
|
228
|
+
parameter_fit (tuple): `(sim_name, fit_name, zmax, power_spectrum_dict, name_out_fit, str_fit)`.
|
|
229
|
+
overwrite (bool): Overwrite existing output.
|
|
230
|
+
size_batch (int): Covariance generation batch size.
|
|
231
|
+
number_worker (int): Parallel workers for covariance.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
None: Writes results to `name_out_fit`.
|
|
235
|
+
"""
|
|
175
236
|
|
|
176
237
|
sim_name = parameter_fit[0]
|
|
177
238
|
fit_name = parameter_fit[1]
|
|
@@ -283,6 +344,29 @@ def fit_velocity_true_interp_sigu_minuit(
|
|
|
283
344
|
size_batch=10_000,
|
|
284
345
|
number_worker=32,
|
|
285
346
|
):
|
|
347
|
+
"""Fit true velocities with 1D interpolation over `sigu` using Minuit.
|
|
348
|
+
|
|
349
|
+
Precomputes velocity covariances for multiple `sigu` values and interpolates
|
|
350
|
+
during likelihood evaluation.
|
|
351
|
+
|
|
352
|
+
Args:
|
|
353
|
+
parameter_dict (dict): Parameter specs.
|
|
354
|
+
likelihood_type (str): Likelihood variant key.
|
|
355
|
+
likelihood_properties (dict): Likelihood options.
|
|
356
|
+
interpolation_value_name (str): Name of interpolation parameter.
|
|
357
|
+
interpolation_value_range (array-like): Grid of `sigu` values.
|
|
358
|
+
zmin (float): Minimum redshift.
|
|
359
|
+
z_simu (float): Simulation redshift for scaling.
|
|
360
|
+
photo_type (str): Phototyping mode.
|
|
361
|
+
completeness_file (str): Path to completeness table.
|
|
362
|
+
parameter_fit (tuple): `(sim_name, fit_name, zmax, power_spectrum_dict_list, name_out_fit, str_fit)`.
|
|
363
|
+
overwrite (bool): Overwrite existing output.
|
|
364
|
+
size_batch (int): Covariance generation batch size.
|
|
365
|
+
number_worker (int): Parallel workers for covariance.
|
|
366
|
+
|
|
367
|
+
Returns:
|
|
368
|
+
None
|
|
369
|
+
"""
|
|
286
370
|
|
|
287
371
|
sim_name = parameter_fit[0]
|
|
288
372
|
fit_name = parameter_fit[1]
|
|
@@ -400,6 +484,26 @@ def fit_velocity_estimated_minuit(
|
|
|
400
484
|
size_batch=10_000,
|
|
401
485
|
number_worker=32,
|
|
402
486
|
):
|
|
487
|
+
"""Fit estimated peculiar velocities (with measurement error) using Minuit.
|
|
488
|
+
|
|
489
|
+
Similar to true velocity fit but uses observed velocity estimates with errors.
|
|
490
|
+
|
|
491
|
+
Args:
|
|
492
|
+
parameter_dict (dict): Parameter specs.
|
|
493
|
+
likelihood_type (str): Likelihood variant key.
|
|
494
|
+
likelihood_properties (dict): Likelihood options.
|
|
495
|
+
zmin (float): Minimum redshift.
|
|
496
|
+
z_simu (float): Simulation redshift for scaling.
|
|
497
|
+
photo_type (str): Phototyping mode.
|
|
498
|
+
completeness_file (str): Path to completeness table.
|
|
499
|
+
parameter_fit (tuple): `(sim_name, fit_name, zmax, power_spectrum_dict, name_out_fit, str_fit)`.
|
|
500
|
+
overwrite (bool): Overwrite existing output.
|
|
501
|
+
size_batch (int): Covariance generation batch size.
|
|
502
|
+
number_worker (int): Parallel workers for covariance.
|
|
503
|
+
|
|
504
|
+
Returns:
|
|
505
|
+
None
|
|
506
|
+
"""
|
|
403
507
|
|
|
404
508
|
sim_name = parameter_fit[0]
|
|
405
509
|
fit_name = parameter_fit[1]
|
|
@@ -507,6 +611,28 @@ def fit_velocity_estimated_interp_sigu_minuit(
|
|
|
507
611
|
size_batch=10_000,
|
|
508
612
|
number_worker=32,
|
|
509
613
|
):
|
|
614
|
+
"""Fit estimated velocities with 1D interpolation over `sigu` using Minuit.
|
|
615
|
+
|
|
616
|
+
Args follow the non-interpolated version, with additional interpolation controls.
|
|
617
|
+
|
|
618
|
+
Args:
|
|
619
|
+
parameter_dict (dict): Parameter specs.
|
|
620
|
+
likelihood_type (str): Likelihood variant key.
|
|
621
|
+
likelihood_properties (dict): Likelihood options.
|
|
622
|
+
interpolation_value_name (str): Interpolation parameter name.
|
|
623
|
+
interpolation_value_range (array-like): Grid of `sigu` values.
|
|
624
|
+
zmin (float): Minimum redshift.
|
|
625
|
+
z_simu (float): Simulation redshift for scaling.
|
|
626
|
+
photo_type (str): Phototyping mode.
|
|
627
|
+
completeness_file (str): Path to completeness.
|
|
628
|
+
parameter_fit (tuple): `(sim_name, fit_name, zmax, power_spectrum_dict_list, name_out_fit, str_fit)`.
|
|
629
|
+
overwrite (bool): Overwrite existing output.
|
|
630
|
+
size_batch (int): Covariance generation batch size.
|
|
631
|
+
number_worker (int): Parallel workers.
|
|
632
|
+
|
|
633
|
+
Returns:
|
|
634
|
+
None
|
|
635
|
+
"""
|
|
510
636
|
|
|
511
637
|
sim_name = parameter_fit[0]
|
|
512
638
|
fit_name = parameter_fit[1]
|
|
@@ -623,6 +749,30 @@ def fit_full_velocity_estimated_minuit(
|
|
|
623
749
|
additional_parameters_values=(),
|
|
624
750
|
maximum_number_coordinates=None,
|
|
625
751
|
):
|
|
752
|
+
"""Joint density-velocity fit with cross-terms using Minuit.
|
|
753
|
+
|
|
754
|
+
Builds full covariance blocks (gg, gv, vv), applies cosmological scaling
|
|
755
|
+
to velocity terms, and runs Minuit.
|
|
756
|
+
|
|
757
|
+
Args:
|
|
758
|
+
parameter_dict (dict): Parameter specs.
|
|
759
|
+
model_name (str): Covariance model name.
|
|
760
|
+
likelihood_type (str): Likelihood variant key.
|
|
761
|
+
likelihood_properties (dict): Likelihood options.
|
|
762
|
+
zmin (float): Minimum redshift for SN selection.
|
|
763
|
+
z_simu (float): Simulation redshift for scaling.
|
|
764
|
+
photo_type (str): Phototyping mode.
|
|
765
|
+
completeness_file (str): Path to completeness table.
|
|
766
|
+
parameter_fit (tuple): `(sim_name, fit_name, grid_name, zmax, power_spectrum_dict, name_out_fit, str_fit)`.
|
|
767
|
+
overwrite (bool): Overwrite existing output.
|
|
768
|
+
size_batch (int): Covariance generation batch size.
|
|
769
|
+
number_worker (int): Parallel workers for covariance.
|
|
770
|
+
additional_parameters_values (tuple): Extra parameters for covariance.
|
|
771
|
+
maximum_number_coordinates (int, optional): Early stop for large grids.
|
|
772
|
+
|
|
773
|
+
Returns:
|
|
774
|
+
None
|
|
775
|
+
"""
|
|
626
776
|
|
|
627
777
|
sim_name = parameter_fit[0]
|
|
628
778
|
fit_name = parameter_fit[1]
|
|
@@ -646,10 +796,10 @@ def fit_full_velocity_estimated_minuit(
|
|
|
646
796
|
for i in range(len(str_fit)):
|
|
647
797
|
log.add(str_fit[i])
|
|
648
798
|
|
|
649
|
-
coordinates_density = np.array([grid["ra"], grid["dec"], grid["
|
|
799
|
+
coordinates_density = np.array([grid["ra"], grid["dec"], grid["rcom_zobs"]])
|
|
650
800
|
data_density = {
|
|
651
801
|
"density": np.array(grid["density"]),
|
|
652
|
-
"density_error": np.array(grid["
|
|
802
|
+
"density_error": np.array(grid["density_error"]),
|
|
653
803
|
}
|
|
654
804
|
|
|
655
805
|
fit = snsim.io_utils.open_fit(fit_name)
|
|
@@ -757,6 +907,31 @@ def fit_full_velocity_estimated_interp_sigu_minuit(
|
|
|
757
907
|
additional_parameters_values=(),
|
|
758
908
|
maximum_number_coordinates=None,
|
|
759
909
|
):
|
|
910
|
+
"""Joint density-velocity fit with 1D interpolation over `sigu` using Minuit.
|
|
911
|
+
|
|
912
|
+
Args mirror the non-interpolated full fit plus interpolation controls.
|
|
913
|
+
|
|
914
|
+
Args:
|
|
915
|
+
parameter_dict (dict): Parameter specs.
|
|
916
|
+
model_name (str): Covariance model name.
|
|
917
|
+
likelihood_type (str): Likelihood variant key.
|
|
918
|
+
likelihood_properties (dict): Likelihood options.
|
|
919
|
+
interpolation_value_name (str): Interpolation parameter name.
|
|
920
|
+
interpolation_value_range (array-like): Grid of values.
|
|
921
|
+
zmin (float): Minimum redshift.
|
|
922
|
+
z_simu (float): Simulation redshift for scaling.
|
|
923
|
+
photo_type (str): Phototyping mode.
|
|
924
|
+
completeness_file (str): Path to completeness.
|
|
925
|
+
parameter_fit (tuple): `(sim_name, fit_name, grid_name, zmax, power_spectrum_dict_list, name_out_fit, str_fit)`.
|
|
926
|
+
overwrite (bool): Overwrite existing output.
|
|
927
|
+
size_batch (int): Covariance generation batch size.
|
|
928
|
+
number_worker (int): Parallel workers.
|
|
929
|
+
additional_parameters_values (tuple): Extra parameters for covariance.
|
|
930
|
+
maximum_number_coordinates (int, optional): Early stop.
|
|
931
|
+
|
|
932
|
+
Returns:
|
|
933
|
+
None
|
|
934
|
+
"""
|
|
760
935
|
|
|
761
936
|
sim_name = parameter_fit[0]
|
|
762
937
|
fit_name = parameter_fit[1]
|
|
@@ -780,10 +955,10 @@ def fit_full_velocity_estimated_interp_sigu_minuit(
|
|
|
780
955
|
for i in range(len(str_fit)):
|
|
781
956
|
log.add(str_fit[i])
|
|
782
957
|
|
|
783
|
-
coordinates_density = np.array([grid["ra"], grid["dec"], grid["
|
|
958
|
+
coordinates_density = np.array([grid["ra"], grid["dec"], grid["rcom_zobs"]])
|
|
784
959
|
data_density = {
|
|
785
960
|
"density": np.array(grid["density"]),
|
|
786
|
-
"density_error": np.array(grid["
|
|
961
|
+
"density_error": np.array(grid["density_error"]),
|
|
787
962
|
}
|
|
788
963
|
|
|
789
964
|
fit = snsim.io_utils.open_fit(fit_name)
|