defmodule Chi2fit.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, name: "constant"] @type t() :: %__MODULE__{ name: String.t } end defimpl Chi2fit.Distribution, for: Chi2fit.Distribution.Constant do alias Chi2fit.Distribution, as: D import Chi2fit.Distribution.Constant alias Chi2fit.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(D.FunctionNotSupportedError, message: "cdf is not supported for the Constant distribution") def pdf(%Constant{}), do: raise(D.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).() def name(model), do: model.name end defimpl Inspect, for: Chi2fit.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