flipcosmo 1.2.1__tar.gz → 1.2.2__tar.gz

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 (115) hide show
  1. {flipcosmo-1.2.1/flipcosmo.egg-info → flipcosmo-1.2.2}/PKG-INFO +2 -2
  2. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/README.md +1 -1
  3. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/__init__.py +1 -1
  4. flipcosmo-1.2.2/flip/data_vector/__init__.py +4 -0
  5. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data_vector/basic.py +115 -80
  6. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data_vector/galaxypv_vectors.py +131 -126
  7. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data_vector/snia_vectors.py +64 -65
  8. {flipcosmo-1.2.1 → flipcosmo-1.2.2/flipcosmo.egg-info}/PKG-INFO +2 -2
  9. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flipcosmo.egg-info/SOURCES.txt +2 -2
  10. flipcosmo-1.2.1/flip/data_vector/__init__.py +0 -4
  11. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/LICENSE +0 -0
  12. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/docs/conf.py +0 -0
  13. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/_config.py +0 -0
  14. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/__init__.py +0 -0
  15. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/__init__.py +0 -0
  16. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake17/__init__.py +0 -0
  17. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake17/coefficients.py +0 -0
  18. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake17/fisher_terms.py +0 -0
  19. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake17/flip_terms.py +0 -0
  20. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake17plane/__init__.py +0 -0
  21. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake17plane/coefficients.py +0 -0
  22. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake17plane/fisher_terms.py +0 -0
  23. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake17plane/flip_terms.py +0 -0
  24. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake17plane/generator.py +0 -0
  25. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake20/__init__.py +0 -0
  26. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake20/coefficients.py +0 -0
  27. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake20/fisher_terms.py +0 -0
  28. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/adamsblake20/flip_terms.py +0 -0
  29. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/carreres23/__init__.py +0 -0
  30. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/carreres23/coefficients.py +0 -0
  31. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/carreres23/fisher_terms.py +0 -0
  32. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/carreres23/flip_terms.py +0 -0
  33. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/carreres23/generator.py +0 -0
  34. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/genericzdep/__init__.py +0 -0
  35. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/genericzdep/coefficients.py +0 -0
  36. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/genericzdep/flip_terms.py +0 -0
  37. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/lai22/__init__.py +0 -0
  38. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/lai22/coefficients.py +0 -0
  39. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/lai22/fisher_terms.py +0 -0
  40. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/lai22/flip_terms.py +0 -0
  41. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/lai22/generator.py +0 -0
  42. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/lai22/h_terms.py +0 -0
  43. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/lai22/symbolic.py +0 -0
  44. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/ravouxcarreres/__init__.py +0 -0
  45. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/ravouxcarreres/coefficients.py +0 -0
  46. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/ravouxcarreres/fisher_terms.py +0 -0
  47. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/ravouxcarreres/flip_terms.py +0 -0
  48. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/ravouxcarreres/flip_terms_lmax.py +0 -0
  49. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/ravouxnoanchor25/__init__.py +0 -0
  50. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/ravouxnoanchor25/coefficients.py +0 -0
  51. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/ravouxnoanchor25/fisher_terms.py +0 -0
  52. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/ravouxnoanchor25/flip_terms.py +0 -0
  53. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/rcrk24/__init__.py +0 -0
  54. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/rcrk24/coefficients.py +0 -0
  55. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/rcrk24/fisher_terms.py +0 -0
  56. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/analytical/rcrk24/flip_terms.py +0 -0
  57. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/contraction.py +0 -0
  58. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/cov_utils.py +0 -0
  59. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/covariance.py +0 -0
  60. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/emulators/__init__.py +0 -0
  61. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/emulators/generator.py +0 -0
  62. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/emulators/gpmatrix.py +0 -0
  63. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/emulators/nnmatrix.py +0 -0
  64. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/emulators/skgpmatrix.py +0 -0
  65. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/fisher.py +0 -0
  66. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/fit_utils.py +0 -0
  67. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/fitter.py +0 -0
  68. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/generator.py +0 -0
  69. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/likelihood.py +0 -0
  70. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/plot_utils.py +0 -0
  71. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/covariance/symbolic.py +0 -0
  72. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/__init__.py +0 -0
  73. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/data_density.parquet +0 -0
  74. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/data_velocity.parquet +0 -0
  75. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/data_window_density.parquet +0 -0
  76. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/load_data_test.py +0 -0
  77. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/power_spectrum_mm.txt +0 -0
  78. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/power_spectrum_mt.txt +0 -0
  79. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/power_spectrum_tt.txt +0 -0
  80. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/style.mplstyle +0 -0
  81. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/test_covariance_reference_values.json +0 -0
  82. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data/test_e2e_reference_values.json +0 -0
  83. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data_vector/cosmo_utils.py +0 -0
  84. {flipcosmo-1.2.1/flip/data → flipcosmo-1.2.2/flip/data_vector}/gridding.py +0 -0
  85. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/data_vector/vector_utils.py +0 -0
  86. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/power_spectra/__init__.py +0 -0
  87. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/power_spectra/class_engine.py +0 -0
  88. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/power_spectra/cosmoprimo_engine.py +0 -0
  89. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/power_spectra/generator.py +0 -0
  90. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/power_spectra/models.py +0 -0
  91. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/power_spectra/pyccl_engine.py +0 -0
  92. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/simulation/__init__.py +0 -0
  93. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flip/utils.py +0 -0
  94. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flipcosmo.egg-info/dependency_links.txt +0 -0
  95. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flipcosmo.egg-info/requires.txt +0 -0
  96. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/flipcosmo.egg-info/top_level.txt +0 -0
  97. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/pyproject.toml +0 -0
  98. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/scripts/flip_compute_correlation_model.py +0 -0
  99. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/scripts/flip_compute_power_spectra.py +0 -0
  100. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/scripts/flip_fisher_forecast_velocity.py +0 -0
  101. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/scripts/flip_fisher_rcrk24.py +0 -0
  102. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/scripts/flip_launch_minuit_density_fit.py +0 -0
  103. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/scripts/flip_launch_minuit_full_fit.py +0 -0
  104. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/scripts/flip_launch_minuit_velocity_fit.py +0 -0
  105. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/scripts/flip_launch_minuit_velocity_fit_full.py +0 -0
  106. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/scripts/flip_launch_minuit_velocity_fit_interpolation.py +0 -0
  107. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/setup.cfg +0 -0
  108. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/test/refresh_reference_values.py +0 -0
  109. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/test/test_covariance_assembly.py +0 -0
  110. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/test/test_covariance_reference_values.py +0 -0
  111. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/test/test_covariance_utils.py +0 -0
  112. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/test/test_e2e_density.py +0 -0
  113. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/test/test_e2e_joint.py +0 -0
  114. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/test/test_e2e_velocity.py +0 -0
  115. {flipcosmo-1.2.1 → flipcosmo-1.2.2}/test/test_likelihood_inversions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flipcosmo
3
- Version: 1.2.1
3
+ Version: 1.2.2
4
4
  Summary: Field Level Inference Package
5
5
  Author-email: Corentin Ravoux <corentin.ravoux.research@gmail.com>, Bastien Carreres <bastien.carreres@duke.edu>
6
6
  License-Expression: MIT
@@ -30,7 +30,7 @@ Requires-Dist: sphinx-tabs; extra == "docs"
30
30
  Requires-Dist: sphinx-autoapi; extra == "docs"
31
31
  Dynamic: license-file
32
32
 
33
- <img src="docs/_static/flip_logo.webp" width=350>
33
+ <img src="https://github.com/corentinravoux/flip/blob/main/docs/_static/flip_logo.webp?raw=true" width=350>
34
34
 
35
35
  # flip: Field Level Inference Package
36
36
 
@@ -1,4 +1,4 @@
1
- <img src="docs/_static/flip_logo.webp" width=350>
1
+ <img src="https://github.com/corentinravoux/flip/blob/main/docs/_static/flip_logo.webp?raw=true" width=350>
2
2
 
3
3
  # flip: Field Level Inference Package
4
4
 
@@ -17,4 +17,4 @@ except:
17
17
 
18
18
  __flip_dir_path__ = os.path.dirname(__file__)
19
19
 
20
- __version__ = "1.2.1"
20
+ __version__ = "1.2.2"
@@ -0,0 +1,4 @@
1
+ """Init file of the flip.data_vector package."""
2
+
3
+ from . import cosmo_utils, galaxypv_vectors, gridding, snia_vectors, vector_utils
4
+ from .basic import *
@@ -43,8 +43,11 @@ class DataVector(abc.ABC):
43
43
  _kind (str): One of "velocity", "density" or "cross".
44
44
  """
45
45
 
46
- _free_par = []
47
46
  _kind = "" # 'velocity', 'density' or 'cross'
47
+ _needed_keys = []
48
+ _free_par = []
49
+ _number_dimension_observation_covariance = 0
50
+ _parameters_observation_covariance = []
48
51
 
49
52
  @property
50
53
  def conditional_free_par(self):
@@ -109,16 +112,6 @@ class DataVector(abc.ABC):
109
112
  """
110
113
  pass
111
114
 
112
- def _check_keys(self, data):
113
- """Validate that `data` contains all required keys.
114
-
115
- Raises:
116
- ValueError: When a required key is missing.
117
- """
118
- for k in self.needed_keys:
119
- if k not in data:
120
- raise ValueError(f"{k} field is needed in data")
121
-
122
115
  def __init__(self, data, covariance_observation=None, **kwargs):
123
116
  """Initialize data vector with data and optional observation covariance.
124
117
 
@@ -129,6 +122,8 @@ class DataVector(abc.ABC):
129
122
  """
130
123
  self._covariance_observation = covariance_observation
131
124
  self._check_keys(data)
125
+ self._number_datapoints = len(data[self.needed_keys[0]])
126
+ self.check_covariance_observation()
132
127
  self._data = copy.copy(data)
133
128
  self._kwargs = kwargs
134
129
 
@@ -138,6 +133,31 @@ class DataVector(abc.ABC):
138
133
  if jax_installed:
139
134
  self.give_data_and_variance_jit = jit(self.give_data_and_variance)
140
135
 
136
+ def check_covariance_observation(self):
137
+ if self._covariance_observation is not None:
138
+ if self._covariance_observation.shape != (
139
+ self._number_dimension_observation_covariance * self._number_datapoints,
140
+ self._number_dimension_observation_covariance * self._number_datapoints,
141
+ ):
142
+ raise ValueError(
143
+ f"Observation covariance matrix should be {self._number_dimension_observation_covariance}N "
144
+ f"x {self._number_dimension_observation_covariance}N"
145
+ )
146
+ log.add(
147
+ f"Loading observation covariance matrix, "
148
+ f"expecting {self._parameters_observation_covariance} parameters."
149
+ )
150
+
151
+ def _check_keys(self, data):
152
+ """Validate that `data` contains all required keys.
153
+
154
+ Raises:
155
+ ValueError: When a required key is missing.
156
+ """
157
+ for k in self.needed_keys:
158
+ if k not in data:
159
+ raise ValueError(f"{k} field is needed in data")
160
+
141
161
  def get_masked_data_and_cov(self, bool_mask):
142
162
  """Return masked data and corresponding masked observation covariance.
143
163
 
@@ -189,6 +209,9 @@ class DataVector(abc.ABC):
189
209
  class Dens(DataVector):
190
210
  _kind = "density"
191
211
  _needed_keys = ["density", "density_error"]
212
+ _free_par = []
213
+ _number_dimension_observation_covariance = 1
214
+ _parameters_observation_covariance = ["density"]
192
215
 
193
216
  def give_data_and_variance(self, *args):
194
217
  """Return density data and diagonal variance from `density_error`.
@@ -196,12 +219,21 @@ class Dens(DataVector):
196
219
  Returns:
197
220
  tuple: (density, density_error^2).
198
221
  """
222
+
223
+ if self._covariance_observation is not None:
224
+ return self._data["density"], self._covariance_observation
199
225
  return self._data["density"], self._data["density_error"] ** 2
200
226
 
227
+ def __init__(self, data, covariance_observation=None):
228
+ super().__init__(data, covariance_observation=covariance_observation)
229
+
201
230
 
202
231
  class DirectVel(DataVector):
203
232
  _kind = "velocity"
204
233
  _needed_keys = ["velocity"]
234
+ _free_par = []
235
+ _number_dimension_observation_covariance = 1
236
+ _parameters_observation_covariance = ["velocity"]
205
237
 
206
238
  @property
207
239
  def conditional_needed_keys(self):
@@ -253,66 +285,12 @@ class DirectVel(DataVector):
253
285
  self._covariance_observation = velocity_variance
254
286
 
255
287
 
256
- class DensVel(DataVector):
257
- _kind = "cross"
258
-
259
- @property
260
- def needed_keys(self):
261
- return self.densities.needed_keys + self.velocities.needed_keys
262
-
263
- @property
264
- def free_par(self):
265
- return self.densities.free_par + self.velocities.free_par
266
-
267
- def give_data_and_variance(self, *args):
268
- data_density, density_variance = self.densities.give_data_and_variance(*args)
269
- data_velocity, velocity_variance = self.velocities.give_data_and_variance(*args)
270
- data = jnp.hstack((data_density, data_velocity))
271
- variance = jnp.hstack((density_variance, velocity_variance))
272
- return data, variance
273
-
274
- def __init__(self, density_vector, velocity_vector):
275
- self.densities = density_vector
276
- self.velocities = velocity_vector
277
-
278
- if self.velocities._covariance_observation is not None:
279
- raise NotImplementedError(
280
- "Velocity with observed covariance + density not implemented yet"
281
- )
282
-
283
- if jax_installed:
284
- self.give_data_and_variance_jit = jit(self.give_data_and_variance)
285
-
286
- def compute_covariance(self, model, power_spectrum_dict, **kwargs):
287
-
288
- coords_dens = np.vstack(
289
- (
290
- self.densities.data["ra"],
291
- self.densities.data["dec"],
292
- self.densities.data["rcom_zobs"],
293
- )
294
- )
295
-
296
- coords_vel = np.vstack(
297
- (
298
- self.velocities.data["ra"],
299
- self.velocities.data["dec"],
300
- self.velocities.data["rcom_zobs"],
301
- )
302
- )
303
- return CovMatrix.init_from_flip(
304
- model,
305
- "full",
306
- power_spectrum_dict,
307
- coordinates_density=coords_dens,
308
- coordinates_velocity=coords_vel,
309
- **kwargs,
310
- )
311
-
312
-
313
288
  class VelFromHDres(DataVector):
289
+ _kind = "velocity"
314
290
  _needed_keys = ["dmu", "zobs"]
315
291
  _free_par = ["M_0"]
292
+ _number_dimension_observation_covariance = 1
293
+ _parameters_observation_covariance = ["dmu"]
316
294
 
317
295
  @property
318
296
  def conditional_needed_keys(self):
@@ -331,25 +309,23 @@ class VelFromHDres(DataVector):
331
309
  distance_modulus_difference_to_velocity * self._data["dmu"]
332
310
  - distance_modulus_difference_to_velocity * parameter_values_dict["M_0"]
333
311
  )
334
- if self._covariance_observation is None and "dmu_error" in self._data:
335
- velocity_error = (
336
- distance_modulus_difference_to_velocity * self._data["dmu_error"]
337
- )
338
- return velocity, velocity_error**2
339
312
 
340
- elif self._covariance_observation is not None:
341
- J = jnp.diag(self._distance_modulus_difference_to_velocity)
342
- velocity_variance = J @ self._covariance_observation @ J.T
343
- return velocity, velocity_variance
313
+ if self._covariance_observation is None:
314
+ velocity_variance = (
315
+ distance_modulus_difference_to_velocity * self._data["dmu_error"]
316
+ ) ** 2
344
317
  else:
345
- raise ValueError(
346
- "Cannot compute velocity variance without dmu_error or covariance_observation"
318
+ conversion_matrix = jnp.diag(distance_modulus_difference_to_velocity)
319
+
320
+ velocity_variance = (
321
+ conversion_matrix @ self._covariance_observation @ conversion_matrix.T
347
322
  )
348
323
 
324
+ return velocity, velocity_variance
325
+
349
326
  def __init__(
350
327
  self, data, covariance_observation=None, velocity_estimator="full", **kwargs
351
328
  ):
352
- # Compute conversion using provided input data, not uninitialized self._data
353
329
 
354
330
  self.velocity_estimator = velocity_estimator
355
331
 
@@ -360,6 +336,8 @@ class VelFromIntrinsicScatter(DataVector):
360
336
  _kind = "velocity"
361
337
  _needed_keys = ["zobs"]
362
338
  _free_par = ["sigma_M"]
339
+ _number_dimension_observation_covariance = 0
340
+ _parameters_observation_covariance = []
363
341
 
364
342
  def give_data_and_variance(self, parameter_values_dict):
365
343
  distance_modulus_difference_to_velocity = (
@@ -389,3 +367,60 @@ class VelFromIntrinsicScatter(DataVector):
389
367
  def __init__(self, data, velocity_estimator="full"):
390
368
  super().__init__(data)
391
369
  self.velocity_estimator = velocity_estimator
370
+
371
+
372
+ class DensVel(DataVector):
373
+ _kind = "cross"
374
+
375
+ @property
376
+ def needed_keys(self):
377
+ return self.densities.needed_keys + self.velocities.needed_keys
378
+
379
+ @property
380
+ def free_par(self):
381
+ return self.densities.free_par + self.velocities.free_par
382
+
383
+ def give_data_and_variance(self, *args):
384
+ data_density, density_variance = self.densities.give_data_and_variance(*args)
385
+ data_velocity, velocity_variance = self.velocities.give_data_and_variance(*args)
386
+ data = jnp.hstack((data_density, data_velocity))
387
+ variance = jnp.hstack((density_variance, velocity_variance))
388
+ return data, variance
389
+
390
+ def __init__(self, density_vector, velocity_vector):
391
+ self.densities = density_vector
392
+ self.velocities = velocity_vector
393
+
394
+ if self.velocities._covariance_observation is not None:
395
+ raise NotImplementedError(
396
+ "Velocity with observed covariance + density not implemented yet"
397
+ )
398
+
399
+ if jax_installed:
400
+ self.give_data_and_variance_jit = jit(self.give_data_and_variance)
401
+
402
+ def compute_covariance(self, model, power_spectrum_dict, **kwargs):
403
+
404
+ coords_dens = np.vstack(
405
+ (
406
+ self.densities.data["ra"],
407
+ self.densities.data["dec"],
408
+ self.densities.data["rcom_zobs"],
409
+ )
410
+ )
411
+
412
+ coords_vel = np.vstack(
413
+ (
414
+ self.velocities.data["ra"],
415
+ self.velocities.data["dec"],
416
+ self.velocities.data["rcom_zobs"],
417
+ )
418
+ )
419
+ return CovMatrix.init_from_flip(
420
+ model,
421
+ "full",
422
+ power_spectrum_dict,
423
+ coordinates_density=coords_dens,
424
+ coordinates_velocity=coords_vel,
425
+ **kwargs,
426
+ )
@@ -1,3 +1,5 @@
1
+ from flip.utils import create_log
2
+
1
3
  from .._config import __use_jax__
2
4
  from . import vector_utils
3
5
  from .basic import DataVector
@@ -19,10 +21,15 @@ else:
19
21
 
20
22
  jax_installed = False
21
23
 
24
+ log = create_log()
25
+
22
26
 
23
27
  class VelFromLogDist(DataVector):
24
28
  _kind = "velocity"
25
29
  _needed_keys = ["eta"]
30
+ _free_par = []
31
+ _number_dimension_observation_covariance = 1
32
+ _parameters_observation_covariance = ["eta"]
26
33
 
27
34
  @property
28
35
  def conditional_needed_keys(self):
@@ -36,6 +43,22 @@ class VelFromLogDist(DataVector):
36
43
  cond_keys += ["eta_error"]
37
44
  return self._needed_keys + cond_keys
38
45
 
46
+ def __init__(
47
+ self,
48
+ data,
49
+ covariance_observation=None,
50
+ velocity_estimator="full",
51
+ ):
52
+ """Initialize velocity from log-distance `eta`.
53
+
54
+ Args:
55
+ data (dict): Must include `eta` and optionally `eta_error`.
56
+ covariance_observation (ndarray|None): Observed covariance.
57
+ velocity_estimator (str): Estimator name, default `"full"`.
58
+ """
59
+ self.velocity_estimator = velocity_estimator
60
+ super().__init__(data, covariance_observation=covariance_observation)
61
+
39
62
  def give_data_and_variance(self, parameter_values_dict, *args):
40
63
  """Return velocity and variance for log-distance based estimator.
41
64
 
@@ -53,31 +76,19 @@ class VelFromLogDist(DataVector):
53
76
 
54
77
  velocity = log_distance_to_velocity * self._data["eta"]
55
78
 
56
- if self._covariance_observation is not None:
57
- J = jnp.diag(log_distance_to_velocity)
58
- velocity_variance = J @ self._covariance_observation @ J.T
59
- return velocity, velocity_variance
79
+ if self._covariance_observation is None:
80
+ velocity_variance = (
81
+ log_distance_to_velocity * self._data["eta_error"]
82
+ ) ** 2
60
83
 
61
- return velocity, (log_distance_to_velocity * self._data["eta_error"]) ** 2
84
+ else:
85
+ conversion_matrix = jnp.diag(log_distance_to_velocity)
62
86
 
63
- def __init__(
64
- self,
65
- data,
66
- covariance_observation=None,
67
- velocity_estimator="full",
68
- ):
69
- """Initialize velocity from log-distance `eta`.
87
+ velocity_variance = (
88
+ conversion_matrix @ self._covariance_observation @ conversion_matrix.T
89
+ )
70
90
 
71
- Args:
72
- data (dict): Must include `eta` and optionally `eta_error`.
73
- covariance_observation (ndarray|None): Observed covariance.
74
- velocity_estimator (str): Estimator name, default `"full"`.
75
- """
76
- self.velocity_estimator = velocity_estimator
77
- super().__init__(
78
- data,
79
- covariance_observation=covariance_observation,
80
- )
91
+ return velocity, velocity_variance
81
92
 
82
93
 
83
94
  class VelFromTullyFisher(DataVector):
@@ -85,6 +96,8 @@ class VelFromTullyFisher(DataVector):
85
96
  _kind = "velocity"
86
97
  _needed_keys = ["zobs", "logW", "m_mean", "rcom_zobs"]
87
98
  _free_par = ["a", "b"]
99
+ _number_dimension_observation_covariance = 2
100
+ _parameters_observation_covariance = ["logW", "m_mean"]
88
101
 
89
102
  @property
90
103
  def conditional_needed_keys(self):
@@ -98,6 +111,39 @@ class VelFromTullyFisher(DataVector):
98
111
  cond_keys += ["e_logW", "e_m_mean"]
99
112
  return cond_keys
100
113
 
114
+ def __init__(
115
+ self,
116
+ data,
117
+ h,
118
+ covariance_observation=None,
119
+ velocity_estimator="full",
120
+ ):
121
+ """Initialize Tully–Fisher velocity vector.
122
+
123
+ Args:
124
+ data (dict): Includes `logW`, `m_mean`, redshifts and distances.
125
+ h (float): Little-h scaling for distances.
126
+ covariance_observation (ndarray|None): Optional observation covariance.
127
+ velocity_estimator (str): Estimator name.
128
+
129
+ Raises:
130
+ ValueError: If covariance shape is not `2N x 2N` when provided.
131
+ """
132
+ super().__init__(data, covariance_observation=covariance_observation)
133
+ self.velocity_estimator = velocity_estimator
134
+ self.h = h
135
+ self._host_matrix = None
136
+
137
+ if "host_group_id" in data:
138
+ self._host_matrix, self._data_to_group_mapping = (
139
+ vector_utils.compute_host_matrix(self._data["host_group_id"])
140
+ )
141
+ self._data = vector_utils.format_data_multiple_host(
142
+ self._data, self._host_matrix
143
+ )
144
+ if jax_installed:
145
+ self._host_matrix = BCOO.from_scipy_sparse(self._host_matrix)
146
+
101
147
  def compute_observed_distance_modulus(self, parameter_values_dict):
102
148
  """Compute observed distance modulus from Tully–Fisher relation.
103
149
 
@@ -159,11 +205,23 @@ class VelFromTullyFisher(DataVector):
159
205
  )
160
206
  variance_distance_modulus += parameter_values_dict["sigma_M"] ** 2
161
207
  else:
208
+ weights_observation_covariance = jnp.array(
209
+ [
210
+ 1.0,
211
+ parameter_values_dict["a"],
212
+ ]
213
+ )
214
+ jacobian = jnp.kron(
215
+ weights_observation_covariance,
216
+ jnp.eye(self._number_datapoints),
217
+ )
162
218
  variance_distance_modulus = (
163
- self._covariance_observation
164
- + jnp.eye(self._covariance_observation.shape[0])
165
- * parameter_values_dict["sigma_M"] ** 2
219
+ jacobian @ self._covariance_observation @ jacobian.T
220
+ )
221
+ variance_distance_modulus += (
222
+ jnp.eye(self._number_datapoints) * parameter_values_dict["sigma_M"] ** 2
166
223
  )
224
+
167
225
  return variance_distance_modulus
168
226
 
169
227
  def give_data_and_variance(self, parameter_values_dict):
@@ -190,10 +248,13 @@ class VelFromTullyFisher(DataVector):
190
248
  * distance_modulus_difference_to_velocity**2
191
249
  )
192
250
  else:
193
- A = self._init_A()
194
- J = A[0] + parameter_values_dict["a"] * A[1]
195
- J = jnp.diag(distance_modulus_difference_to_velocity) @ J
196
- velocity_variance = J @ observed_distance_modulus_variance @ J.T
251
+ conversion_matrix = jnp.diag(distance_modulus_difference_to_velocity)
252
+
253
+ velocity_variance = (
254
+ conversion_matrix
255
+ @ observed_distance_modulus_variance
256
+ @ conversion_matrix.T
257
+ )
197
258
 
198
259
  velocities = (
199
260
  distance_modulus_difference_to_velocity
@@ -207,18 +268,25 @@ class VelFromTullyFisher(DataVector):
207
268
 
208
269
  return velocities, velocity_variance
209
270
 
210
- def _init_A(self):
211
- """Initialize design matrices for linear propagation with covariance.
271
+
272
+ class VelFromFundamentalPlane(DataVector):
273
+ _kind = "velocity"
274
+ _needed_keys = ["zobs", "logRe", "logsig", "logI", "rcom_zobs"]
275
+ _free_par = ["a", "b", "c"]
276
+ _number_dimension_observation_covariance = 3
277
+ _parameters_observation_covariance = ["logRe", "logsig", "logI"]
278
+
279
+ @property
280
+ def conditional_needed_keys(self):
281
+ """Conditionally required keys when covariance is absent.
212
282
 
213
283
  Returns:
214
- ndarray: Matrix A blocks.
284
+ list[str]: Includes `e_logRe`, `e_logsig`, `e_logI` when needed.
215
285
  """
216
- N = len(self._data)
217
- A = jnp.ones((2, N, 2 * N))
218
- ij = jnp.ogrid[:N, : 2 * N]
219
- for k in range(2):
220
- A[k][ij[1] == 2 * ij[0] + k] = 1
221
- return A
286
+ cond_keys = []
287
+ if self._covariance_observation is None:
288
+ cond_keys += ["e_logRe", "e_logsig", "e_logI"]
289
+ return cond_keys
222
290
 
223
291
  def __init__(
224
292
  self,
@@ -227,21 +295,20 @@ class VelFromTullyFisher(DataVector):
227
295
  covariance_observation=None,
228
296
  velocity_estimator="full",
229
297
  ):
230
- """Initialize Tully–Fisher velocity vector.
298
+ """Initialize Fundamental Plane velocity vector.
231
299
 
232
300
  Args:
233
- data (dict): Includes `logW`, `m_mean`, redshifts and distances.
301
+ data (dict): Includes `logRe`, `logsig`, `logI`, redshifts and distances.
234
302
  h (float): Little-h scaling for distances.
235
303
  covariance_observation (ndarray|None): Optional observation covariance.
236
304
  velocity_estimator (str): Estimator name.
237
305
 
238
306
  Raises:
239
- ValueError: If covariance shape is not `2N x 2N` when provided.
307
+ ValueError: If covariance shape is not `3N x 3N` when provided.
240
308
  """
241
309
  super().__init__(data, covariance_observation=covariance_observation)
242
310
  self.velocity_estimator = velocity_estimator
243
311
  self.h = h
244
- self._A = None
245
312
  self._host_matrix = None
246
313
 
247
314
  if "host_group_id" in data:
@@ -254,29 +321,6 @@ class VelFromTullyFisher(DataVector):
254
321
  if jax_installed:
255
322
  self._host_matrix = BCOO.from_scipy_sparse(self._host_matrix)
256
323
 
257
- if self._covariance_observation is not None:
258
- if self._covariance_observation.shape != (2 * len(data), 2 * len(data)):
259
- raise ValueError("Cov should be 2N x 2N")
260
-
261
-
262
- class VelFromFundamentalPlane(DataVector):
263
-
264
- _kind = "velocity"
265
- _needed_keys = ["zobs", "logRe", "logsig", "logI", "rcom_zobs"]
266
- _free_par = ["a", "b", "c"]
267
-
268
- @property
269
- def conditional_needed_keys(self):
270
- """Conditionally required keys when covariance is absent.
271
-
272
- Returns:
273
- list[str]: Includes `e_logRe`, `e_logsig`, `e_logI` when needed.
274
- """
275
- cond_keys = []
276
- if self._covariance_observation is None:
277
- cond_keys += ["e_logRe", "e_logsig", "e_logI"]
278
- return cond_keys
279
-
280
324
  def compute_observed_distance_modulus(self, parameter_values_dict):
281
325
  """Compute observed distance modulus from Fundamental Plane relation.
282
326
 
@@ -340,11 +384,24 @@ class VelFromFundamentalPlane(DataVector):
340
384
  )
341
385
  variance_distance_modulus += parameter_values_dict["sigma_M"] ** 2
342
386
  else:
387
+ weights_observation_covariance = jnp.array(
388
+ [
389
+ 1.0,
390
+ parameter_values_dict["a"],
391
+ parameter_values_dict["b"],
392
+ ]
393
+ )
394
+ jacobian = jnp.kron(
395
+ weights_observation_covariance,
396
+ jnp.eye(self._number_datapoints),
397
+ )
343
398
  variance_distance_modulus = (
344
- self._covariance_observation
345
- + jnp.eye(self._covariance_observation.shape[0])
346
- * parameter_values_dict["sigma_M"] ** 2
399
+ jacobian @ self._covariance_observation @ jacobian.T
347
400
  )
401
+ variance_distance_modulus += (
402
+ jnp.eye(self._number_datapoints) * parameter_values_dict["sigma_M"] ** 2
403
+ )
404
+
348
405
  return variance_distance_modulus
349
406
 
350
407
  def give_data_and_variance(self, parameter_values_dict):
@@ -371,14 +428,13 @@ class VelFromFundamentalPlane(DataVector):
371
428
  * distance_modulus_difference_to_velocity**2
372
429
  )
373
430
  else:
374
- A = self._init_A()
375
- J = (
376
- A[0]
377
- + parameter_values_dict["a"] * A[1]
378
- + parameter_values_dict["b"] * A[2]
431
+ conversion_matrix = jnp.diag(distance_modulus_difference_to_velocity)
432
+
433
+ velocity_variance = (
434
+ conversion_matrix
435
+ @ observed_distance_modulus_variance
436
+ @ conversion_matrix.T
379
437
  )
380
- J = jnp.diag(distance_modulus_difference_to_velocity) @ J
381
- velocity_variance = J @ observed_distance_modulus_variance @ J.T
382
438
 
383
439
  velocities = (
384
440
  distance_modulus_difference_to_velocity
@@ -391,54 +447,3 @@ class VelFromFundamentalPlane(DataVector):
391
447
  )
392
448
 
393
449
  return velocities, velocity_variance
394
-
395
- def _init_A(self):
396
- """Initialize design matrices for linear propagation with covariance.
397
-
398
- Returns:
399
- ndarray: Matrix A blocks.
400
- """
401
- N = len(self._data)
402
- A = jnp.ones((3, N, 3 * N))
403
- ij = jnp.ogrid[:N, : 3 * N]
404
- for k in range(3):
405
- A[k][ij[1] == 3 * ij[0] + k] = 1
406
- return A
407
-
408
- def __init__(
409
- self,
410
- data,
411
- h,
412
- covariance_observation=None,
413
- velocity_estimator="full",
414
- ):
415
- """Initialize Fundamental Plane velocity vector.
416
-
417
- Args:
418
- data (dict): Includes `logRe`, `logsig`, `logI`, redshifts and distances.
419
- h (float): Little-h scaling for distances.
420
- covariance_observation (ndarray|None): Optional observation covariance.
421
- velocity_estimator (str): Estimator name.
422
-
423
- Raises:
424
- ValueError: If covariance shape is not `3N x 3N` when provided.
425
- """
426
- super().__init__(data, covariance_observation=covariance_observation)
427
- self.velocity_estimator = velocity_estimator
428
- self.h = h
429
- self._A = None
430
- self._host_matrix = None
431
-
432
- if "host_group_id" in data:
433
- self._host_matrix, self._data_to_group_mapping = (
434
- vector_utils.compute_host_matrix(self._data["host_group_id"])
435
- )
436
- self._data = vector_utils.format_data_multiple_host(
437
- self._data, self._host_matrix
438
- )
439
- if jax_installed:
440
- self._host_matrix = BCOO.from_scipy_sparse(self._host_matrix)
441
-
442
- if self._covariance_observation is not None:
443
- if self._covariance_observation.shape != (3 * len(data), 3 * len(data)):
444
- raise ValueError("Cov should be 3N x 3N")