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.
Files changed (113) hide show
  1. docs/conf.py +154 -0
  2. flip/__init__.py +4 -11
  3. flip/covariance/__init__.py +7 -8
  4. flip/covariance/analytical/__init__.py +11 -0
  5. flip/covariance/{adamsblake17plane → analytical/adamsblake17}/coefficients.py +1 -1
  6. flip/covariance/{adamsblake17plane → analytical/adamsblake17}/fisher_terms.py +1 -1
  7. flip/covariance/{adamsblake17 → analytical/adamsblake17}/flip_terms.py +0 -1
  8. flip/covariance/{adamsblake17 → analytical/adamsblake17plane}/coefficients.py +1 -1
  9. flip/covariance/{adamsblake17 → analytical/adamsblake17plane}/fisher_terms.py +1 -1
  10. flip/covariance/{adamsblake17plane → analytical/adamsblake17plane}/flip_terms.py +0 -1
  11. flip/covariance/{adamsblake17plane → analytical/adamsblake17plane}/generator.py +103 -19
  12. flip/covariance/{adamsblake20 → analytical/adamsblake20}/coefficients.py +1 -1
  13. flip/covariance/{adamsblake20 → analytical/adamsblake20}/fisher_terms.py +1 -1
  14. flip/covariance/{adamsblake20 → analytical/adamsblake20}/flip_terms.py +0 -1
  15. flip/covariance/{carreres23 → analytical/carreres23}/coefficients.py +1 -4
  16. flip/covariance/{ravouxnoanchor25 → analytical/carreres23}/fisher_terms.py +1 -1
  17. flip/covariance/{carreres23 → analytical/carreres23}/flip_terms.py +0 -1
  18. flip/covariance/analytical/carreres23/generator.py +198 -0
  19. flip/covariance/analytical/genericzdep/__init__.py +5 -0
  20. flip/covariance/analytical/genericzdep/coefficients.py +53 -0
  21. flip/covariance/analytical/genericzdep/flip_terms.py +99 -0
  22. flip/covariance/{lai22 → analytical/lai22}/coefficients.py +2 -3
  23. flip/covariance/{lai22 → analytical/lai22}/fisher_terms.py +1 -1
  24. flip/covariance/{lai22 → analytical/lai22}/flip_terms.py +0 -1
  25. flip/covariance/{lai22 → analytical/lai22}/generator.py +263 -58
  26. flip/covariance/{lai22 → analytical/lai22}/symbolic.py +55 -19
  27. flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/coefficients.py +1 -1
  28. flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/fisher_terms.py +1 -1
  29. flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/flip_terms.py +0 -1
  30. flip/covariance/{ravouxnoanchor25 → analytical/ravouxnoanchor25}/coefficients.py +3 -2
  31. flip/covariance/{carreres23 → analytical/ravouxnoanchor25}/fisher_terms.py +1 -1
  32. flip/covariance/{ravouxnoanchor25 → analytical/ravouxnoanchor25}/flip_terms.py +0 -9
  33. flip/covariance/{rcrk24 → analytical/rcrk24}/coefficients.py +6 -6
  34. flip/covariance/{rcrk24 → analytical/rcrk24}/fisher_terms.py +7 -9
  35. flip/covariance/{rcrk24 → analytical/rcrk24}/flip_terms.py +0 -8
  36. flip/covariance/contraction.py +82 -40
  37. flip/covariance/cov_utils.py +89 -81
  38. flip/covariance/covariance.py +172 -141
  39. flip/covariance/emulators/__init__.py +1 -1
  40. flip/covariance/emulators/generator.py +73 -3
  41. flip/covariance/emulators/gpmatrix.py +40 -1
  42. flip/covariance/emulators/nnmatrix.py +57 -1
  43. flip/covariance/emulators/skgpmatrix.py +125 -0
  44. flip/covariance/fisher.py +307 -0
  45. flip/{fit_utils.py → covariance/fit_utils.py} +185 -10
  46. flip/{fitter.py → covariance/fitter.py} +151 -125
  47. flip/covariance/generator.py +82 -106
  48. flip/{likelihood.py → covariance/likelihood.py} +286 -64
  49. flip/{plot_utils.py → covariance/plot_utils.py} +79 -4
  50. flip/covariance/symbolic.py +89 -44
  51. flip/data/__init__.py +1 -1
  52. flip/data/data_density.parquet +0 -0
  53. flip/data/data_velocity.parquet +0 -0
  54. flip/data/{grid_window_m.parquet → data_window_density.parquet} +0 -0
  55. flip/{gridding.py → data/gridding.py} +125 -130
  56. flip/data/load_data_test.py +102 -0
  57. flip/data/power_spectrum_mm.txt +2 -2
  58. flip/data/power_spectrum_mt.txt +2 -2
  59. flip/data/power_spectrum_tt.txt +2 -2
  60. flip/data/test_covariance_reference_values.json +145 -0
  61. flip/data/test_e2e_reference_values.json +14 -0
  62. flip/data_vector/basic.py +118 -101
  63. flip/data_vector/cosmo_utils.py +18 -0
  64. flip/data_vector/galaxypv_vectors.py +58 -94
  65. flip/data_vector/snia_vectors.py +60 -3
  66. flip/data_vector/vector_utils.py +47 -1
  67. flip/power_spectra/class_engine.py +36 -1
  68. flip/power_spectra/cosmoprimo_engine.py +37 -2
  69. flip/power_spectra/generator.py +47 -25
  70. flip/power_spectra/models.py +30 -31
  71. flip/power_spectra/pyccl_engine.py +36 -1
  72. flip/simulation/__init__.py +0 -0
  73. flip/utils.py +62 -91
  74. flipcosmo-1.2.1.dist-info/METADATA +78 -0
  75. flipcosmo-1.2.1.dist-info/RECORD +109 -0
  76. {flipcosmo-1.0.0.dist-info → flipcosmo-1.2.1.dist-info}/WHEEL +1 -1
  77. flipcosmo-1.2.1.dist-info/top_level.txt +7 -0
  78. scripts/flip_compute_correlation_model.py +70 -0
  79. scripts/flip_compute_power_spectra.py +50 -0
  80. scripts/flip_fisher_forecast_velocity.py +70 -0
  81. scripts/flip_fisher_rcrk24.py +164 -0
  82. scripts/flip_launch_minuit_density_fit.py +91 -0
  83. scripts/flip_launch_minuit_full_fit.py +117 -0
  84. scripts/flip_launch_minuit_velocity_fit.py +78 -0
  85. scripts/flip_launch_minuit_velocity_fit_full.py +107 -0
  86. scripts/flip_launch_minuit_velocity_fit_interpolation.py +93 -0
  87. test/refresh_reference_values.py +43 -0
  88. test/test_covariance_assembly.py +102 -0
  89. test/test_covariance_reference_values.py +125 -0
  90. test/test_covariance_utils.py +34 -0
  91. test/test_e2e_density.py +50 -0
  92. test/test_e2e_joint.py +65 -0
  93. test/test_e2e_velocity.py +53 -0
  94. test/test_likelihood_inversions.py +31 -0
  95. flip/covariance/carreres23/generator.py +0 -132
  96. flip/data/density_data.parquet +0 -0
  97. flip/data/velocity_data.parquet +0 -0
  98. flip/fisher.py +0 -190
  99. flipcosmo-1.0.0.dist-info/METADATA +0 -32
  100. flipcosmo-1.0.0.dist-info/RECORD +0 -82
  101. flipcosmo-1.0.0.dist-info/top_level.txt +0 -1
  102. /flip/{config.py → _config.py} +0 -0
  103. /flip/covariance/{adamsblake17 → analytical/adamsblake17}/__init__.py +0 -0
  104. /flip/covariance/{adamsblake17plane → analytical/adamsblake17plane}/__init__.py +0 -0
  105. /flip/covariance/{adamsblake20 → analytical/adamsblake20}/__init__.py +0 -0
  106. /flip/covariance/{carreres23 → analytical/carreres23}/__init__.py +0 -0
  107. /flip/covariance/{lai22 → analytical/lai22}/__init__.py +0 -0
  108. /flip/covariance/{lai22 → analytical/lai22}/h_terms.py +0 -0
  109. /flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/__init__.py +0 -0
  110. /flip/covariance/{ravouxcarreres → analytical/ravouxcarreres}/flip_terms_lmax.py +0 -0
  111. /flip/covariance/{ravouxnoanchor25 → analytical/ravouxnoanchor25}/__init__.py +0 -0
  112. /flip/covariance/{rcrk24 → analytical/rcrk24}/__init__.py +0 -0
  113. {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["rcom"]])
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["density_err"]),
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["rcom"]])
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["density_err"]),
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["rcom"]])
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["density_err"]),
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["rcom"]])
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["density_err"]),
961
+ "density_error": np.array(grid["density_error"]),
787
962
  }
788
963
 
789
964
  fit = snsim.io_utils.open_fit(fit_name)