defmodule Distribution.Constant do # Copyright 2019 Pieter Rijken # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. @moduledoc """ Distribution for constant numbers. """ @enforce_keys [:pars] defstruct [:pars] @type t() :: %__MODULE__{ } end defimpl Distribution, for: Distribution.Constant do import Distribution.Constant alias Distribution.Constant @spec constant(number | Keyword.t) :: ((...) -> number) defp constant([avg: average]), do: fn -> average end defp constant(average) when is_number(average), do: fn -> average end def skewness(%Constant{}), do: fn _ -> 0 end def kurtosis(%Constant{}), do: fn _ -> 0 end def size(%Constant{}), do: 1 def cdf(%Constant{}), do: raise Distribution.FunctionNotSupportedError, message: "cdf is not supported for the Constant distribution" def pdf(%Constant{}), do: raise Distribution.FunctionNotSupportedError, message: "pdf is not supported for the Constant distribution" @doc ~S""" ## Examples: iex> random %Distribution.Constant{pars: [5.0]} 5.0 """ def random(%Constant{pars: [avg]}), do: constant(avg).() end defimpl Inspect, for: Distribution.Constant do import Inspect.Algebra def inspect(dict, opts) do case dict.pars do nil -> "#Constant<>" [value] -> concat ["#Constant<", to_doc("value=#{value}", opts), ">"] pars -> concat ["#Constant<", to_doc("pars=#{inspect pars}", opts), ">"] end end end