# -*- coding:utf-8 -*-
#
# Copyright (C) 2019-2021, Saarland University
# Copyright (C) 2019-2021, Maximilian Köhl <koehl@cs.uni-saarland.de>
from __future__ import annotations
import typing as t
import enum
from . import types
_JANI_NAME_MAP: t.Dict[str, DistributionType] = {}
[docs]
class DistributionType(enum.Enum):
    """
    An enum of distribution type.
    """
    DISCRETE_UNIFORM = (
        "DiscreteUniform",
        (
            types.INT,
            types.INT,
        ),
        types.INT,
    )
    """ Discrete uniform distribution. """
    BERNOULLI = "Bernoulli", (types.REAL,)
    """ Bernoulli distribution. """
    BINOMIAL = "Binomial", (types.REAL,)
    """ Binomial distribution. """
    NEGATIVE_BINOMIAL = (
        "NegativeBinomial",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Negative binomial distribution. """
    POISSON = "Poisson", (types.REAL,)
    """ Poisson distribution. """
    GEOMETRIC = "Geometric", (types.REAL,)
    """ Geometric distribution. """
    HYPERGEOMETRIC = (
        "Hypergeometric",
        (
            types.INT,
            types.INT,
            types.INT,
        ),
    )
    """ Hypergeometric distribution. """
    CONWAY_MAXWELL_POISSON = (
        "ConwayMaxwellPoisson",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Conway Maxwell Poisson distribution. """
    ZIPF = "ZipF", (types.REAL,)
    """ ZipF distribution. """
    UNIFORM = (
        "Uniform",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Uniform distribution. """
    NORMAL = (
        "Normal",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Normal distribution. """
    LOG_NORMAL = (
        "LogNormal",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Logarithmic normal distribution. """
    BETA = (
        "Beta",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Beta distribution. """
    CAUCHY = (
        "Cauchy",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Cauchy distribution. """
    CHI = "Chi", (types.INT,)
    """ Chi distribution. """
    CHI_SQUARED = "ChiSquared", (types.INT,)
    """ Chi squared distribution. """
    ERLANG = (
        "Erlang",
        (
            types.INT,
            types.REAL,
        ),
    )
    """ Erlang distribution. """
    EXPONENTIAL = "Exponential", (types.REAL,)
    """ Exponential distribution. """
    FISHER_SNEDECOR = (
        "FisherSnedecor",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Fisher Snedecor distribution. """
    GAMMA = (
        "Gamma",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Gamma distribution. """
    INVERSE_GAMMA = (
        "InverseGamma",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Inverse gamma distribution. """
    LAPLACE = (
        "Laplace",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Laplace distribution. """
    PARETO = (
        "Pareto",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Pareto distribution. """
    RAYLEIGH = "Rayleigh", (types.REAL,)
    """ Rayleigh distribution. """
    STABLE = (
        "Stable",
        (
            types.REAL,
            types.REAL,
            types.REAL,
            types.REAL,
        ),
    )
    """ Stable distribution. """
    STUDENT_T = (
        "StudentT",
        (
            types.REAL,
            types.REAL,
            types.REAL,
        ),
    )
    """ StudentT distribution. """
    WEIBULL = (
        "Weibull",
        (
            types.REAL,
            types.REAL,
        ),
    )
    """ Weibull distribution. """
    TRIANGULAR = (
        "Triangular",
        (
            types.REAL,
            types.REAL,
            types.REAL,
        ),
    )
    """ Triangular distribution. """
    jani_name: str
    parameter_types: t.Tuple[types.Type, ...]
    result_type: types.Type
    def __init__(
        self,
        jani_name: str,
        parameter_types: t.Tuple[types.Type, ...],
        result_type: types.Type = types.REAL,
    ) -> None:
        _JANI_NAME_MAP[jani_name] = self
        self.jani_name = jani_name
        self.parameter_types = parameter_types
        self.result_type = result_type
    @property
    def arity(self) -> int:
        return len(self.parameter_types)
    @staticmethod
    def by_name(jani_name: str) -> DistributionType:
        return _JANI_NAME_MAP[jani_name]