rhayes777 / PyAutoFit

PyAutoFit: Classy Probabilistic Programming
https://pyautofit.readthedocs.io/
MIT License
59 stars 11 forks source link

Assertions Break due to Derived Quantities #937

Closed Jammy2211 closed 7 months ago

Jammy2211 commented 7 months ago

If you run the following modeling example:

https://github.com/Jammy2211/autogalaxy_workspace/blob/release/scripts/imaging/modeling/start_here.py

And manually input an add_assertion in the model you need to do this youself, the script above does not include this assertoion:

bulge = af.Model(ag.lp.Sersic)
disk = af.Model(ag.lp.Exponential)
bulge.centre = disk.centre

bulge.add_assertion(
    bulge.effective_radius < bulge.sersic_index
)

galaxy = af.Model(ag.Galaxy, redshift=0.5, bulge=bulge, disk=disk)

model = af.Collection(galaxies=af.Collection(galaxy=galaxy))

The following error is raised:

Total Free Parameters = 11

model                                                                           Collection (N=11)
    galaxies                                                                    Collection (N=11)
        galaxy                                                                  Galaxy (N=11)
            bulge                                                               Sersic (N=7)
            disk                                                                Exponential (N=6)

galaxies
    galaxy
        redshift                                                                0.5
        bulge
            centre
                centre_0                                                        GaussianPrior [7], mean = 0.0, sigma = 0.3
                centre_1                                                        GaussianPrior [8], mean = 0.0, sigma = 0.3
            ell_comps
                ell_comps_0                                                     GaussianPrior [2], mean = 0.0, sigma = 0.3
                ell_comps_1                                                     GaussianPrior [3], mean = 0.0, sigma = 0.3
            intensity                                                           LogUniformPrior [4], lower_limit = 1e-06, upper_limit = 1000000.0
            effective_radius                                                    UniformPrior [5], lower_limit = 0.0, upper_limit = 30.0
            sersic_index                                                        UniformPrior [6], lower_limit = 0.8, upper_limit = 5.0
        disk
            centre
                centre_0                                                        GaussianPrior [7], mean = 0.0, sigma = 0.3
                centre_1                                                        GaussianPrior [8], mean = 0.0, sigma = 0.3
            ell_comps
                ell_comps_0                                                     GaussianPrior [9], mean = 0.0, sigma = 0.3
                ell_comps_1                                                     GaussianPrior [10], mean = 0.0, sigma = 0.3
            intensity                                                           LogUniformPrior [11], lower_limit = 1e-06, upper_limit = 1000000.0
            effective_radius                                                    UniformPrior [12], lower_limit = 0.0, upper_limit = 30.0
Traceback (most recent call last):
  File "/mnt/c/Users/Jammy/Code/PyAuto/autogalaxy_workspace/scripts/imaging/modeling/start_here.py", line 282, in <module>
    instance=model.random_instance()
  File "/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/mapper/prior_model/abstract.py", line 1102, in random_instance
    return self.instance_for_arguments(
  File "/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/mapper/prior_model/abstract.py", line 1321, in instance_for_arguments
    instance = self._instance_for_arguments(
  File "/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/mapper/prior_model/collection.py", line 249, in _instance_for_arguments
    value = value.instance_for_arguments(arguments)
  File "/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/mapper/prior_model/abstract.py", line 1321, in instance_for_arguments
    instance = self._instance_for_arguments(
  File "/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/mapper/prior_model/collection.py", line 249, in _instance_for_arguments
    value = value.instance_for_arguments(arguments)
  File "/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/mapper/prior_model/abstract.py", line 1321, in instance_for_arguments
    instance = self._instance_for_arguments(
  File "/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/mapper/prior_model/prior_model.py", line 445, in _instance_for_arguments
    ] = prior_model.instance_for_arguments(
  File "/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/mapper/prior_model/abstract.py", line 1318, in instance_for_arguments
    self.check_assertions(arguments)
  File "/mnt/c/Users/Jammy/Code/PyAuto/PyAutoFit/autofit/mapper/prior_model/abstract.py", line 209, in check_assertions
    raise exc.FitException(
autofit.exc.FitException: 1 assertions failed!
GreaterThanLessThanAssertion
rhayes777 commented 7 months ago

This is because effective_radius is a UniformPrior between 0 and 30 and bulge is a UniformPrior between 0.8 and 5. When a random instance is created it is probable that the value of bulge is greater than the value of effective_radius. I don't think that has anything to do with DerivedQuantities?