import numpy as np
from popsynth.auxiliary_sampler import AuxiliaryParameter, NonObservedAuxSampler
[docs]class ViewingAngleSampler(NonObservedAuxSampler):
    _auxiliary_sampler_name = "ViewingAngleSampler"
    max_angle = AuxiliaryParameter(default=90, vmin=0, vmax=180)
[docs]    def __init__(self):
        """
        A viewing angle sampler that samples
        from 0 to ``max_angle``. Unlike other samplers,
        it assumes that this is NOT an observed property
        :param max_angle: The maximum angle to which to
            sample in degrees
        :type max_angle: :class:`AuxiliaryParameter`
        """
        super(ViewingAngleSampler, self).__init__(
            name="va",
        ) 
[docs]    def true_sampler(self, size: int) -> None:
        """
        Sample the viewing angle by inverse CDF
        :param size: Number of samples
        :type size: int
        """
        theta_inverse = np.random.uniform(
            0.0, 1 - np.cos(np.deg2rad(self.max_angle)), size=size
        )
        self._true_values = np.arccos(1.0 - theta_inverse) 
    def _compute_probability(self):
        return np.sin(self._true_values) / (
            1 - np.cos(np.deg2rad(self.max_angle))
        )