Source code for chaospy.distributions.collection.wrapped_cauchy

"""Wrapped Cauchy distribution."""
import numpy
from scipy import special

from ..baseclass import SimpleDistribution, ShiftScaleDistribution


class wrapped_cauchy(SimpleDistribution):
    """Wrapped Cauchy distribution."""

    def __init__(self, c):
        super(wrapped_cauchy, self).__init__(dict(c=c))

    def _pdf(self, x, c):
        return (1.0 - c * c) / (2 * numpy.pi * (1 + c * c - 2 * c * numpy.cos(x)))

    def _cdf(self, x, c):
        output = 0.0 * x
        val = (1.0 + c) / (1.0 - c)
        c1 = x < numpy.pi
        c2 = 1 - c1

        xn = numpy.extract(c2, x)
        if any(xn):
            valn = numpy.extract(c2, numpy.ones_like(x) * val)
            xn = 2 * numpy.pi - xn
            yn = numpy.tan(xn / 2.0)
            on = 1.0 - 1.0 / numpy.pi * numpy.arctan(valn * yn)
            numpy.place(output, c2, on)

        xp = numpy.extract(c1, x)
        if any(xp):
            valp = numpy.extract(c1, numpy.ones_like(x) * val)
            yp = numpy.tan(xp / 2.0)
            op = 1.0 / numpy.pi * numpy.arctan(valp * yp)
            numpy.place(output, c1, op)

        return output

    def _ppf(self, qloc, c):
        val = (1.0 - c) / (1.0 + c)
        rcq = 2 * numpy.arctan(val * numpy.tan(numpy.pi * qloc))
        rcmq = 2 * numpy.pi - 2 * numpy.arctan(val * numpy.tan(numpy.pi * (1 - qloc)))
        return numpy.where(qloc < 0.5, rcq, rcmq)

    def _lower(self, c):
        return 0.0

    def _upper(self, c):
        return 2 * numpy.pi


[docs]class WrappedCauchy(ShiftScaleDistribution): """ Wrapped Cauchy distribution Args: shape (float, Distribution): Shape parameter scale (float, Distribution): Scaling parameter shift (float, Distribution): Location parameter Examples: >>> distribution = chaospy.WrappedCauchy(0.5) >>> distribution WrappedCauchy(0.5) >>> uloc = numpy.linspace(0, 1, 6) >>> uloc array([0. , 0.2, 0.4, 0.6, 0.8, 1. ]) >>> xloc = distribution.inv(uloc) >>> xloc.round(3) array([0. , 0.475, 1.596, 4.687, 5.808, 6.283]) >>> numpy.allclose(distribution.fwd(xloc), uloc) True >>> distribution.pdf(xloc).round(3) array([0.477, 0.331, 0.094, 0.094, 0.331, 0.477]) >>> distribution.sample(4).round(3) array([5.15 , 0.251, 6.178, 2.809]) """
[docs] def __init__(self, shape=0.5, scale=1, shift=0): super(WrappedCauchy, self).__init__( dist=wrapped_cauchy(shape), scale=scale, shift=shift, repr_args=[shape], )