@@ -33,7 +33,10 @@ def test__fit_dataset__matching_point_name__positions_log_likelihood_correct(
3333 )
3434
3535 fit = al .FitPointDataset (
36- dataset = dataset , tracer = point_source_tracer , solver = mock_solver
36+ dataset = dataset ,
37+ tracer = point_source_tracer ,
38+ solver = mock_solver ,
39+ fit_positions_cls = al .FitPositionsImagePair ,
3740 )
3841
3942 assert fit .positions .log_likelihood == pytest .approx (- 22.14472 , 1.0e-4 )
@@ -111,13 +114,64 @@ def test__fit_dataset__positions_and_flux__both_log_likelihoods_correct_and_sum(
111114 fluxes_noise_map = flux_noise_map ,
112115 )
113116
114- fit = al .FitPointDataset (dataset = dataset , tracer = tracer , solver = solver )
117+ fit = al .FitPointDataset (
118+ dataset = dataset ,
119+ tracer = tracer ,
120+ solver = solver ,
121+ fit_positions_cls = al .FitPositionsImagePair ,
122+ )
115123
116124 assert fit .positions .log_likelihood == pytest .approx (- 22.14472 , 1.0e-4 )
117125 assert fit .flux .log_likelihood == pytest .approx (- 2.9920449 , 1.0e-4 )
118126 assert fit .log_likelihood == fit .positions .log_likelihood + fit .flux .log_likelihood
119127
120128
129+ def test__fit_dataset__default_positions_fit_is_all_to_all_solved (
130+ positions_and_noise , mock_solver
131+ ):
132+ """
133+ The #678 phase B evidence campaign moved the demonstrated defaults to
134+ solved centres with all-to-all pairing: the missing-image discriminator
135+ showed repeat pairing catastrophically mis-ranks truth when an observed
136+ image is absent, while the all-to-all Occam mixture absorbs it.
137+ """
138+ positions , noise_map = positions_and_noise
139+ dataset = al .PointDataset (
140+ name = "point_0" , positions = positions , positions_noise_map = noise_map
141+ )
142+
143+ solved_tracer = al .Tracer (
144+ galaxies = [
145+ al .Galaxy (redshift = 0.5 , mass = al .mp .IsothermalSph (einstein_radius = 1.0 )),
146+ al .Galaxy (redshift = 1.0 , point_0 = al .ps .PointSolved ()),
147+ ]
148+ )
149+
150+ fit = al .FitPointDataset (dataset = dataset , tracer = solved_tracer , solver = mock_solver )
151+
152+ assert fit .fit_positions_cls is al .FitPositionsImagePairAllSolved
153+ assert isinstance (fit .positions , al .FitPositionsImagePairAllSolved )
154+ assert np .isfinite (fit .log_likelihood )
155+
156+
157+ def test__fit_dataset__default_with_centre_bearing_profile_raises_loudly (
158+ point_source_tracer , positions_and_noise , mock_solver
159+ ):
160+ # A `ps.Point` centre would be silently ignored by a solved-centre fit, so
161+ # the mismatch must raise, pointing the user at the free-centre class.
162+ positions , noise_map = positions_and_noise
163+ dataset = al .PointDataset (
164+ name = "point_0" , positions = positions , positions_noise_map = noise_map
165+ )
166+
167+ fit = al .FitPointDataset (
168+ dataset = dataset , tracer = point_source_tracer , solver = mock_solver
169+ )
170+
171+ with pytest .raises (al .exc .PointProfileMismatchException ):
172+ fit .positions .log_likelihood
173+
174+
121175def test__fit_dataset__fit_flux_cls_and_fit_time_delays_cls_hooks_are_forwarded_and_default_unchanged (
122176 point_source_tracer , positions_and_noise , mock_solver
123177):
0 commit comments