ciemss / pyciemss

Causal and probabilistic reasoning with continuous time dynamical systems
Other
12 stars 4 forks source link

tight population distribution raises ValueError #554

Closed djinnome closed 2 months ago

djinnome commented 3 months ago
'StandardUniform1' parameters={'minimum': 150000000.0, 'maximum': 150000001.0}

Results in this error:

ValueError: Uniform is not defined when low>= high
djinnome commented 3 months ago

Apparently, 8 is not great:

import pyro
import pyro.distributions as dist
population = dist.Uniform(low=150000000.0, high=150000008.001)

works, but

import pyro
import pyro.distributions as dist
population = dist.Uniform(low=150000000.0, high=150000008.000)

results in :

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[21], line 3
      1 import pyro
      2 import pyro.distributions as dist
----> 3 population = dist.Uniform(low=150000000.0, high=150000008.000)

File ~/.pyenv/versions/pyciemss-main/lib/python3.10/site-packages/pyro/distributions/distribution.py:24, in DistributionMeta.__call__(cls, *args, **kwargs)
     22     if result is not None:
     23         return result
---> 24 return super().__call__(*args, **kwargs)

File ~/.pyenv/versions/pyciemss-main/lib/python3.10/site-packages/pyro/distributions/torch.py:325, in Uniform.__init__(self, low, high, validate_args)
    323 self._unbroadcasted_low = low
    324 self._unbroadcasted_high = high
--> 325 super().__init__(low, high, validate_args=validate_args)

File ~/.pyenv/versions/pyciemss-main/lib/python3.10/site-packages/torch/distributions/uniform.py:61, in Uniform.__init__(self, low, high, validate_args)
     58 super().__init__(batch_shape, validate_args=validate_args)
     60 if self._validate_args and not torch.lt(self.low, self.high).all():
---> 61     raise ValueError("Uniform is not defined when low>= high")

ValueError: Uniform is not defined when low>= high
djinnome commented 3 months ago
population = dist.Uniform(low=150000000.0, high=150000008.000000014901161194)

works, but

population = dist.Uniform(low=150000000.0, high=150000008.000000014901161193)

fails

SamWitty commented 2 months ago

Closing, as this ended up just being a problem with floating point arithmetic. The solution is to not use a distribution between numbers that map to the same binary encoding of a floating point number.