calipy.dist.distributions  (API)

class calipy.dist.distributions.CalipyDistribution(node_structure=None, node_name=None)

Bases: CalipyNode

Base class for all auto-generated Calipy distributions. It wraps a Pyro distribution class and associates a NodeStructure (or any additional dimension-aware info). CalipyDistributions are Subclasses of CalipyNode and therefore come together with a method forward(input_vars, observations, subsample_index, **kwargs) method. The forward() method of distributions can be seen as a way of passing parameters and sampling; the format of inputs and observations is documented within the methods create_input_vars or create_observations that help turn data into the DataTuples needed as input for .forward(). Al CalipyDistributions come with a default_nodestructure consisting of just batch_dims and event_dims being a single dimension with either size 10 or 2.

CalipyDistribution is not usually called by the user, it is called by an script __init__.py in calipy.dist automatically executed during package import. The subclasses of CalipyDistribution are e.g. CalipyDistribution.Normal or CalipyDistribution.Gamma which can be accessed via calipy.dist.Normal or calipy.dist.Gamma

Example usage: Run line by line to investigate Class

# CalipyDistribution objects are CalipyNodes --------------------------
#
# i) Imports and definitions
import torch
import calipy
from calipy.base import NodeStructure
from calipy.tensor import CalipyTensor
from calipy.data import DataTuple
#
# ii) Invoke and investigate CalipyDistribution
CalipyNormal = calipy.dist.Normal
CalipyNormal.dists
CalipyNormal.input_vars
CalipyNormal.input_vars_schema

# iii) Build a concrete Node
normal_ns = NodeStructure(CalipyNormal)
print(normal_ns)
calipy_normal = CalipyNormal(node_structure = normal_ns, node_name = 'Normal')

calipy_normal.id
calipy_normal.node_structure
CalipyNormal.default_nodestructure

# Calling the forward method
normal_dims = normal_ns.dims['batch_dims'] + normal_ns.dims['event_dims']
normal_ns_sizes = normal_dims.sizes
mean = CalipyTensor(torch.zeros(normal_ns_sizes), normal_dims)
standard_deviation = CalipyTensor(torch.ones(normal_ns_sizes), normal_dims)
input_vars_normal = DataTuple(['loc', 'scale'], [mean, standard_deviation])
samples_normal = calipy_normal.forward(input_vars_normal)
samples_normal
samples_normal.dims

# A more convenient way of creating the input_vars and observations data or
# at least getting the info on the input signatures
create_input_vars = CalipyNormal.create_input_vars
help(create_input_vars)
input_vars_normal_alt = create_input_vars(loc = mean, scale = standard_deviation)
samples_normal_alt = calipy_normal.forward(input_vars_normal_alt)

# Since distributions are nodes, we can illustrate them
calipy_normal.dtype_chain
calipy_normal.id
render_1 = calipy_normal.render(input_vars_normal)
render_1
render_2 = calipy_normal.render_comp_graph(input_vars_normal)
render_2
classmethod create_distribution_class(pyro_dist_cls)

Dynamically creates a subclass for a Pyro distribution.

create_pyro_dist()

Instantiate the underlying Pyro distribution with stored parameters. (Sampling or dimension logic can be added later.)

dists = {'AVFMultivariateNormal': <class 'calipy.dist.distributions.CalipyDistribution.AVFMultivariateNormal'>, 'AffineBeta': <class 'calipy.dist.distributions.CalipyDistribution.AffineBeta'>, 'AsymmetricLaplace': <class 'calipy.dist.distributions.CalipyDistribution.AsymmetricLaplace'>, 'Bernoulli': <class 'calipy.dist.distributions.CalipyDistribution.Bernoulli'>, 'Beta': <class 'calipy.dist.distributions.CalipyDistribution.Beta'>, 'BetaBinomial': <class 'calipy.dist.distributions.CalipyDistribution.BetaBinomial'>, 'Binomial': <class 'calipy.dist.distributions.CalipyDistribution.Binomial'>, 'Categorical': <class 'calipy.dist.distributions.CalipyDistribution.Categorical'>, 'Cauchy': <class 'calipy.dist.distributions.CalipyDistribution.Cauchy'>, 'Chi2': <class 'calipy.dist.distributions.CalipyDistribution.Chi2'>, 'CoalescentTimes': <class 'calipy.dist.distributions.CalipyDistribution.CoalescentTimes'>, 'CoalescentTimesWithRate': <class 'calipy.dist.distributions.CalipyDistribution.CoalescentTimesWithRate'>, 'ContinuousBernoulli': <class 'calipy.dist.distributions.CalipyDistribution.ContinuousBernoulli'>, 'Delta': <class 'calipy.dist.distributions.CalipyDistribution.Delta'>, 'Dirichlet': <class 'calipy.dist.distributions.CalipyDistribution.Dirichlet'>, 'DirichletMultinomial': <class 'calipy.dist.distributions.CalipyDistribution.DirichletMultinomial'>, 'DiscreteHMM': <class 'calipy.dist.distributions.CalipyDistribution.DiscreteHMM'>, 'Distribution': <class 'calipy.dist.distributions.CalipyDistribution.Distribution'>, 'Empirical': <class 'calipy.dist.distributions.CalipyDistribution.Empirical'>, 'ExpandedDistribution': <class 'calipy.dist.distributions.CalipyDistribution.ExpandedDistribution'>, 'Exponential': <class 'calipy.dist.distributions.CalipyDistribution.Exponential'>, 'ExponentialFamily': <class 'calipy.dist.distributions.CalipyDistribution.ExponentialFamily'>, 'ExtendedBetaBinomial': <class 'calipy.dist.distributions.CalipyDistribution.ExtendedBetaBinomial'>, 'ExtendedBinomial': <class 'calipy.dist.distributions.CalipyDistribution.ExtendedBinomial'>, 'FisherSnedecor': <class 'calipy.dist.distributions.CalipyDistribution.FisherSnedecor'>, 'FoldedDistribution': <class 'calipy.dist.distributions.CalipyDistribution.FoldedDistribution'>, 'Gamma': <class 'calipy.dist.distributions.CalipyDistribution.Gamma'>, 'GammaGaussianHMM': <class 'calipy.dist.distributions.CalipyDistribution.GammaGaussianHMM'>, 'GammaPoisson': <class 'calipy.dist.distributions.CalipyDistribution.GammaPoisson'>, 'GaussianHMM': <class 'calipy.dist.distributions.CalipyDistribution.GaussianHMM'>, 'GaussianMRF': <class 'calipy.dist.distributions.CalipyDistribution.GaussianMRF'>, 'GaussianScaleMixture': <class 'calipy.dist.distributions.CalipyDistribution.GaussianScaleMixture'>, 'Geometric': <class 'calipy.dist.distributions.CalipyDistribution.Geometric'>, 'GroupedNormalNormal': <class 'calipy.dist.distributions.CalipyDistribution.GroupedNormalNormal'>, 'Gumbel': <class 'calipy.dist.distributions.CalipyDistribution.Gumbel'>, 'HalfCauchy': <class 'calipy.dist.distributions.CalipyDistribution.HalfCauchy'>, 'HalfNormal': <class 'calipy.dist.distributions.CalipyDistribution.HalfNormal'>, 'ImproperUniform': <class 'calipy.dist.distributions.CalipyDistribution.ImproperUniform'>, 'Independent': <class 'calipy.dist.distributions.CalipyDistribution.Independent'>, 'IndependentHMM': <class 'calipy.dist.distributions.CalipyDistribution.IndependentHMM'>, 'InverseGamma': <class 'calipy.dist.distributions.CalipyDistribution.InverseGamma'>, 'Kumaraswamy': <class 'calipy.dist.distributions.CalipyDistribution.Kumaraswamy'>, 'LKJ': <class 'calipy.dist.distributions.CalipyDistribution.LKJ'>, 'LKJCholesky': <class 'calipy.dist.distributions.CalipyDistribution.LKJCholesky'>, 'LKJCorrCholesky': <class 'calipy.dist.distributions.CalipyDistribution.LKJCorrCholesky'>, 'Laplace': <class 'calipy.dist.distributions.CalipyDistribution.Laplace'>, 'LinearHMM': <class 'calipy.dist.distributions.CalipyDistribution.LinearHMM'>, 'LogNormal': <class 'calipy.dist.distributions.CalipyDistribution.LogNormal'>, 'LogNormalNegativeBinomial': <class 'calipy.dist.distributions.CalipyDistribution.LogNormalNegativeBinomial'>, 'Logistic': <class 'calipy.dist.distributions.CalipyDistribution.Logistic'>, 'LogisticNormal': <class 'calipy.dist.distributions.CalipyDistribution.LogisticNormal'>, 'LowRankMultivariateNormal': <class 'calipy.dist.distributions.CalipyDistribution.LowRankMultivariateNormal'>, 'MaskedDistribution': <class 'calipy.dist.distributions.CalipyDistribution.MaskedDistribution'>, 'MaskedMixture': <class 'calipy.dist.distributions.CalipyDistribution.MaskedMixture'>, 'MixtureOfDiagNormals': <class 'calipy.dist.distributions.CalipyDistribution.MixtureOfDiagNormals'>, 'MixtureOfDiagNormalsSharedCovariance': <class 'calipy.dist.distributions.CalipyDistribution.MixtureOfDiagNormalsSharedCovariance'>, 'MixtureSameFamily': <class 'calipy.dist.distributions.CalipyDistribution.MixtureSameFamily'>, 'Multinomial': <class 'calipy.dist.distributions.CalipyDistribution.Multinomial'>, 'MultivariateNormal': <class 'calipy.dist.distributions.CalipyDistribution.MultivariateNormal'>, 'MultivariateStudentT': <class 'calipy.dist.distributions.CalipyDistribution.MultivariateStudentT'>, 'NanMaskedMultivariateNormal': <class 'calipy.dist.distributions.CalipyDistribution.NanMaskedMultivariateNormal'>, 'NanMaskedNormal': <class 'calipy.dist.distributions.CalipyDistribution.NanMaskedNormal'>, 'NegativeBinomial': <class 'calipy.dist.distributions.CalipyDistribution.NegativeBinomial'>, 'Normal': <class 'calipy.dist.distributions.CalipyDistribution.Normal'>, 'OMTMultivariateNormal': <class 'calipy.dist.distributions.CalipyDistribution.OMTMultivariateNormal'>, 'OneHotCategorical': <class 'calipy.dist.distributions.CalipyDistribution.OneHotCategorical'>, 'OneHotCategoricalStraightThrough': <class 'calipy.dist.distributions.CalipyDistribution.OneHotCategoricalStraightThrough'>, 'OneOneMatching': <class 'calipy.dist.distributions.CalipyDistribution.OneOneMatching'>, 'OneTwoMatching': <class 'calipy.dist.distributions.CalipyDistribution.OneTwoMatching'>, 'OrderedLogistic': <class 'calipy.dist.distributions.CalipyDistribution.OrderedLogistic'>, 'Pareto': <class 'calipy.dist.distributions.CalipyDistribution.Pareto'>, 'Poisson': <class 'calipy.dist.distributions.CalipyDistribution.Poisson'>, 'ProjectedNormal': <class 'calipy.dist.distributions.CalipyDistribution.ProjectedNormal'>, 'Rejector': <class 'calipy.dist.distributions.CalipyDistribution.Rejector'>, 'RelaxedBernoulli': <class 'calipy.dist.distributions.CalipyDistribution.RelaxedBernoulli'>, 'RelaxedBernoulliStraightThrough': <class 'calipy.dist.distributions.CalipyDistribution.RelaxedBernoulliStraightThrough'>, 'RelaxedOneHotCategorical': <class 'calipy.dist.distributions.CalipyDistribution.RelaxedOneHotCategorical'>, 'RelaxedOneHotCategoricalStraightThrough': <class 'calipy.dist.distributions.CalipyDistribution.RelaxedOneHotCategoricalStraightThrough'>, 'SineBivariateVonMises': <class 'calipy.dist.distributions.CalipyDistribution.SineBivariateVonMises'>, 'SineSkewed': <class 'calipy.dist.distributions.CalipyDistribution.SineSkewed'>, 'SkewLogistic': <class 'calipy.dist.distributions.CalipyDistribution.SkewLogistic'>, 'SoftAsymmetricLaplace': <class 'calipy.dist.distributions.CalipyDistribution.SoftAsymmetricLaplace'>, 'SoftLaplace': <class 'calipy.dist.distributions.CalipyDistribution.SoftLaplace'>, 'SpanningTree': <class 'calipy.dist.distributions.CalipyDistribution.SpanningTree'>, 'Stable': <class 'calipy.dist.distributions.CalipyDistribution.Stable'>, 'StudentT': <class 'calipy.dist.distributions.CalipyDistribution.StudentT'>, 'TorchDistribution': <class 'calipy.dist.distributions.CalipyDistribution.TorchDistribution'>, 'TransformedDistribution': <class 'calipy.dist.distributions.CalipyDistribution.TransformedDistribution'>, 'TruncatedPolyaGamma': <class 'calipy.dist.distributions.CalipyDistribution.TruncatedPolyaGamma'>, 'Uniform': <class 'calipy.dist.distributions.CalipyDistribution.Uniform'>, 'Unit': <class 'calipy.dist.distributions.CalipyDistribution.Unit'>, 'VonMises': <class 'calipy.dist.distributions.CalipyDistribution.VonMises'>, 'VonMises3D': <class 'calipy.dist.distributions.CalipyDistribution.VonMises3D'>, 'Weibull': <class 'calipy.dist.distributions.CalipyDistribution.Weibull'>, 'Wishart': <class 'calipy.dist.distributions.CalipyDistribution.Wishart'>, 'ZeroInflatedDistribution': <class 'calipy.dist.distributions.CalipyDistribution.ZeroInflatedDistribution'>, 'ZeroInflatedNegativeBinomial': <class 'calipy.dist.distributions.CalipyDistribution.ZeroInflatedNegativeBinomial'>, 'ZeroInflatedPoisson': <class 'calipy.dist.distributions.CalipyDistribution.ZeroInflatedPoisson'>}
input_vars_schema: InputSchema | None = None
name = 'CalipyDistribution'
observation_schema: InputSchema | None = None
calipy.dist.distributions.build_default_nodestructure(class_name)
calipy.dist.distributions.generate_init_for_distribution(dist_cls, base_cls)
calipy.dist.distributions.generate_schemas_from_pyro(pyro_dist_cls: type) tuple

Generates input_vars and observation schemas from a Pyro distribution class.