Source code for pycbc.distributions.uniform

# Copyright (C) 2016  Collin Capano
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
This modules provides classes for evaluating uniform distributions.
import logging
import numpy

from pycbc.distributions import bounded

logger = logging.getLogger('pycbc.distributions.uniform')

[docs]class Uniform(bounded.BoundedDist): """ A uniform distribution on the given parameters. The parameters are independent of each other. Instances of this class can be called like a function. By default, logpdf will be called, but this can be changed by setting the class's __call__ method to its pdf method. Parameters ---------- \**params : The keyword arguments should provide the names of parameters and their corresponding bounds, as either tuples or a `boundaries.Bounds` instance. Examples -------- Create a 2 dimensional uniform distribution: >>> from pycbc import distributions >>> dist = distributions.Uniform(mass1=(10.,50.), mass2=(10.,50.)) Get the log of the pdf at a particular value: >>> dist.logpdf(mass1=25., mass2=10.) -7.3777589082278725 Do the same by calling the distribution: >>> dist(mass1=25., mass2=10.) -7.3777589082278725 Generate some random values: >>> dist.rvs(size=3) array([(36.90885758394699, 51.294212757995254), (39.109058546060346, 13.36220145743631), (34.49594465315212, 47.531953033719454)], dtype=[('mass1', '<f8'), ('mass2', '<f8')]) Initialize a uniform distribution using a boundaries.Bounds instance, with cyclic bounds: >>> dist = distributions.Uniform(phi=Bounds(10, 50, cyclic=True)) Apply boundary conditions to a value: >>> dist.apply_boundary_conditions(phi=60.) {'mass1': array(20.0)} The boundary conditions are applied to the value before evaluating the pdf; note that the following returns a non-zero pdf. If the bounds were not cyclic, the following would return 0: >>> dist.pdf(phi=60.) 0.025 """ name = 'uniform' def __init__(self, **params): super(Uniform, self).__init__(**params) # compute the norm and save # temporarily suppress numpy divide by 0 warning with numpy.errstate(divide="ignore"): self._lognorm = -sum([numpy.log(abs(bnd[1]-bnd[0])) for bnd in self._bounds.values()]) self._norm = numpy.exp(self._lognorm) @property def norm(self): """float: The normalization of the multi-dimensional pdf.""" return self._norm @property def lognorm(self): """float: The log of the normalization""" return self._lognorm def _cdfinv_param(self, param, value): """Return the inverse cdf to map the unit interval to parameter bounds. """ lower_bound = self._bounds[param][0] upper_bound = self._bounds[param][1] return (upper_bound - lower_bound) * value + lower_bound def _pdf(self, **kwargs): """Returns the pdf at the given values. The keyword arguments must contain all of parameters in self's params. Unrecognized arguments are ignored. """ if kwargs in self: return self._norm else: return 0. def _logpdf(self, **kwargs): """Returns the log of the pdf at the given values. The keyword arguments must contain all of parameters in self's params. Unrecognized arguments are ignored. """ if kwargs in self: return self._lognorm else: return -numpy.inf
[docs] @classmethod def from_config(cls, cp, section, variable_args): """Returns a distribution based on a configuration file. The parameters for the distribution are retrieved from the section titled "[`section`-`variable_args`]" in the config file. Parameters ---------- cp : pycbc.workflow.WorkflowConfigParser A parsed configuration file that contains the distribution options. section : str Name of the section in the configuration file. variable_args : str The names of the parameters for this distribution, separated by ``VARARGS_DELIM``. These must appear in the "tag" part of the section header. Returns ------- Uniform A distribution instance from the pycbc.inference.prior module. """ return super(Uniform, cls).from_config(cp, section, variable_args, bounds_required=True)
__all__ = ['Uniform']