sig
  module Features :
    sig
      module type S =
        sig
          type elt
          type t
          val mean :
            Distributions.Features.S.t -> Distributions.Features.S.elt
          val variance :
            Distributions.Features.S.t -> Distributions.Features.S.elt
          val skewness :
            Distributions.Features.S.t -> Distributions.Features.S.elt
          val kurtosis :
            Distributions.Features.S.t -> Distributions.Features.S.elt
        end
      module type Opt =
        sig
          type elt
          type t
          val mean_opt :
            Distributions.Features.Opt.t ->
            Distributions.Features.Opt.elt option
          val variance_opt :
            Distributions.Features.Opt.t ->
            Distributions.Features.Opt.elt option
          val skewness_opt :
            Distributions.Features.Opt.t ->
            Distributions.Features.Opt.elt option
          val kurtosis_opt :
            Distributions.Features.Opt.t ->
            Distributions.Features.Opt.elt option
        end
    end
  module type DiscreteDistribution =
    sig
      type elt
      type t
      val sample :
        ?rng:Gsl.Rng.t ->
        size:int ->
        Distributions.DiscreteDistribution.t ->
        Distributions.DiscreteDistribution.elt array
      val cumulative_probability :
        Distributions.DiscreteDistribution.t ->
        n:Distributions.DiscreteDistribution.elt -> float
      val probability :
        Distributions.DiscreteDistribution.t ->
        n:Distributions.DiscreteDistribution.elt -> float
    end
  module type ContinuousDistribution =
    sig
      type elt
      type t
      val sample :
        ?rng:Gsl.Rng.t ->
        size:int ->
        Distributions.ContinuousDistribution.t ->
        Distributions.ContinuousDistribution.elt array
      val cumulative_probability :
        Distributions.ContinuousDistribution.t ->
        x:Distributions.ContinuousDistribution.elt -> float
      val density :
        Distributions.ContinuousDistribution.t ->
        x:Distributions.ContinuousDistribution.elt -> float
      val quantile :
        Distributions.ContinuousDistribution.t ->
        p:float -> Distributions.ContinuousDistribution.elt
    end
  module Normal :
    sig
      type t = { normal_mean : float; normal_sd : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : mean:float -> sd:float -> Distributions.Normal.t
      val standard : Distributions.Normal.t
      val mle : float array -> Distributions.Normal.t
    end
  module LogNormal :
    sig
      type t = { lognormal_mean : float; lognormal_sd : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : mean:float -> sd:float -> Distributions.LogNormal.t
      val mle : float array -> Distributions.LogNormal.t
    end
  module Uniform :
    sig
      type t = { uniform_lower : float; uniform_upper : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : lower:float -> upper:float -> Distributions.Uniform.t
      val mle : float array -> Distributions.Uniform.t
    end
  module Exponential :
    sig
      type t = { exp_rate : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : rate:float -> Distributions.Exponential.t
      val mle : float array -> Distributions.Exponential.t
    end
  module ChiSquared :
    sig
      type t = { chisq_df : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : df:int -> Distributions.ChiSquared.t
      val mme : float array -> Distributions.ChiSquared.t
    end
  module F :
    sig
      type t = { f_df1 : float; f_df2 : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean_opt : t -> float option
      val variance_opt : t -> float option
      val skewness_opt : t -> float option
      val kurtosis_opt : t -> float option
      val create : df1:int -> df2:int -> Distributions.F.t
      val mme : float array -> Distributions.F.t
    end
  module T :
    sig
      type t = { t_df : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean_opt : t -> float option
      val variance_opt : t -> float option
      val skewness_opt : t -> float option
      val kurtosis_opt : t -> float option
      val create : df:float -> Distributions.T.t
      val mme : float array -> Distributions.T.t
    end
  module Gamma :
    sig
      type t = { gamma_shape : float; gamma_scale : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : shape:float -> scale:float -> Distributions.Gamma.t
      val mme : float array -> Distributions.Gamma.t
    end
  module Cauchy :
    sig
      type t = { cauchy_location : float; cauchy_scale : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val create : location:float -> scale:float -> Distributions.Cauchy.t
      val standard : Distributions.Cauchy.t
    end
  module Beta :
    sig
      type t = { beta_alpha : float; beta_beta : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : alpha:float -> beta:float -> Distributions.Beta.t
      val mme : float array -> Distributions.Beta.t
    end
  module Logistic :
    sig
      type t = { logistic_location : float; logistic_scale : float; }
      type elt = float
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> x:elt -> float
      val density : t -> x:elt -> float
      val quantile : t -> p:float -> elt
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : location:float -> scale:float -> Distributions.Logistic.t
      val mme : float array -> Distributions.Logistic.t
    end
  module Poisson :
    sig
      type t = { poisson_rate : float; }
      type elt = int
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> n:elt -> float
      val probability : t -> n:elt -> float
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : rate:float -> Distributions.Poisson.t
      val mle : int array -> Distributions.Poisson.t
    end
  module Bernoulli :
    sig
      type t = { bernoulli_p : float; }
      type elt = int
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> n:elt -> float
      val probability : t -> n:elt -> float
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : p:float -> Distributions.Bernoulli.t
      val mle : int array -> Distributions.Bernoulli.t
    end
  module Binomial :
    sig
      type t = { binomial_trials : int; binomial_p : float; }
      type elt = int
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> n:elt -> float
      val probability : t -> n:elt -> float
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : trials:int -> p:float -> Distributions.Binomial.t
      val mme : int array -> Distributions.Binomial.t
    end
  module Geometric :
    sig
      type t = { geometric_p : float; }
      type elt = int
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> n:elt -> float
      val probability : t -> n:elt -> float
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : p:float -> Distributions.Geometric.t
      val mme : int array -> Distributions.Geometric.t
    end
  module Hypergeometric :
    sig
      type t = { hyper_m : int; hyper_t : int; hyper_k : int; }
      type elt = int
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> n:elt -> float
      val probability : t -> n:elt -> float
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create : m:int -> t:int -> k:int -> Distributions.Hypergeometric.t
    end
  module NegativeBinomial :
    sig
      type t = { nbinomial_failures : int; nbinomial_p : float; }
      type elt = int
      val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
      val cumulative_probability : t -> n:elt -> float
      val probability : t -> n:elt -> float
      val mean : t -> float
      val variance : t -> float
      val skewness : t -> float
      val kurtosis : t -> float
      val create :
        failures:int -> p:float -> Distributions.NegativeBinomial.t
      val mme : int array -> Distributions.NegativeBinomial.t
    end
  module Categorical :
    sig
      module type OrderedType =
        sig
          type t
          val compare :
            Distributions.Categorical.OrderedType.t ->
            Distributions.Categorical.OrderedType.t -> int
        end
      module type S =
        sig
          type elt
          type t
          val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
          val cumulative_probability : t -> n:elt -> float
          val probability : t -> n:elt -> float
          val create : (elt * float) array -> t
          val mle : elt array -> t
        end
      module Make :
        functor (Elt : Map.OrderedType->
          sig
            type elt = Elt.t
            type t
            val sample : ?rng:Gsl.Rng.t -> size:int -> t -> elt array
            val cumulative_probability : t -> n:elt -> float
            val probability : t -> n:elt -> float
            val create : (elt * float) array -> t
            val mle : elt array -> t
          end
    end
  val normal : mean:float -> sd:float -> Distributions.Normal.t
  val log_normal : mean:float -> sd:float -> Distributions.LogNormal.t
  val uniform : lower:float -> upper:float -> Distributions.Uniform.t
  val exponential : rate:float -> Distributions.Exponential.t
  val chi_squared : df:int -> Distributions.ChiSquared.t
  val f : df1:int -> df2:int -> Distributions.F.t
  val t : df:float -> Distributions.T.t
  val gamma : shape:float -> scale:float -> Distributions.Gamma.t
  val cauchy : location:float -> scale:float -> Distributions.Cauchy.t
  val beta : alpha:float -> beta:float -> Distributions.Beta.t
  val logistic : location:float -> scale:float -> Distributions.Logistic.t
  val poisson : rate:float -> Distributions.Poisson.t
  val bernoulli : p:float -> Distributions.Bernoulli.t
  val binomial : trials:int -> p:float -> Distributions.Binomial.t
  val geometric : p:float -> Distributions.Geometric.t
  val hypergeometric :
    m:int -> t:int -> k:int -> Distributions.Hypergeometric.t
  val negative_binomial :
    failures:int -> p:float -> Distributions.NegativeBinomial.t
end