"""Alpha probability distribution."""
import numpy
from scipy import special

from ..baseclass import Dist
from ..operators.addition import Add


class alpha(Dist):
    """Standard Alpha distribution."""

    def __init__(self, a=1):
        Dist.__init__(self, a=a)

    def _cdf(self, x, a):
        return special.ndtr(a-1./x) / special.ndtr(a)

    def _ppf(self, q, a):
        return 1.0/(a-special.ndtri(q*special.ndtr(a)))

    def _pdf(self, x, a):
        return (1.0/(x**2)/special.ndtr(a)*
            numpy.e**(.5*(a-1.0/x)**2)/numpy.sqrt(2*numpy.pi))

    def _lower(self, a):
        return 0.


class Alpha(Add):
    """
    Alpha distribution.

    Args:
        shape (float, Dist):
            Shape parameter
        scale (float, Dist):
            Scale Parameter
        shift (float, Dist):
            Location of lower threshold

    Examples:
        >>> distribution = chaospy.Alpha(2, 0.5, 4)
        >>> distribution
        Alpha(scale=0.5, shape=2, shift=4)
        >>> q = numpy.linspace(0, 1, 7)[1:-1]
        >>> distribution.inv(q).round(4)
        array([4.1676, 4.2039, 4.2465, 4.3104, 4.4521])
        >>> distribution.fwd(distribution.inv(q)).round(4)
        array([0.1667, 0.3333, 0.5   , 0.6667, 0.8333])
        >>> distribution.pdf(distribution.inv(q)).round(4)
        array([11.7723,  5.4345,  3.361 ,  2.2848,  1.4892])
        >>> distribution.sample(4).round(4)
        array([4.304 , 4.1556, 4.9362, 4.2413])
    """

    def __init__(self, shape=1, scale=1, shift=0):
        self._repr = {"shape": shape, "scale": scale, "shift": shift}
        Add.__init__(self, left=alpha(shape)*scale, right=shift)