-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Base types and classes for statistics, sciences and humanities
--
-- This library provides a set of basic types and classes for statistics,
-- sciences, and the humanities.
@package SciBaseTypes
@version 0.0.0.1
-- | Discretized floating point numbers, where the scaling factor is kept
-- as two phantom types denoting the rational number used for scaling.
module Numeric.Discretized
-- | A discretized value takes a floating point number n and
-- produces n * fromIntegral l / fromIntegral u where both
-- u and l are given as TypeLits. I.e. a
-- scaling factor of (u l) = (1 100) does all
-- calculations in subdivisions of 100.
--
-- The main use of a Discretized value is to enable calculations
-- with Int while somewhat pretending to use floating point
-- values.
--
-- Be careful with certain operations like (*) as they will
-- easily cause the numbers to arbitrarily wrong. (+) and
-- (-) are fine, however.
--
-- NOTE Export and import of data is in the form of floating points,
-- which can lead to additional loss of precision if one is careless!
--
-- TODO fast Show methods required!
--
-- TODO blaze stuff?
--
-- TODO We might want to discretize LogDomain style values. This
-- requires some thought on in which direction to wrap. Maybe, we want to
-- log-domain Discretized values, which probably just works.
newtype Discretized (u :: Nat) (l :: Nat)
Discretized :: Int -> Discretized
[getDiscretized] :: Discretized -> Int
-- | Discretizes any Real a into the Discretized value.
-- This conversion is lossy!
discretize :: forall a u l. (Real a, KnownNat u, KnownNat l) => a -> Discretized u l
instance GHC.Read.Read (Numeric.Discretized.Discretized u l)
instance GHC.Show.Show (Numeric.Discretized.Discretized u l)
instance GHC.Generics.Generic (Numeric.Discretized.Discretized u l)
instance GHC.Classes.Ord (Numeric.Discretized.Discretized u l)
instance GHC.Classes.Eq (Numeric.Discretized.Discretized u l)
instance (GHC.TypeNats.KnownNat u, GHC.TypeNats.KnownNat l) => GHC.Num.Num (Numeric.Discretized.Discretized u l)
instance GHC.Enum.Enum (Numeric.Discretized.Discretized u l)
instance (GHC.Enum.Enum (Numeric.Discretized.Discretized u l), GHC.TypeNats.KnownNat u, GHC.TypeNats.KnownNat l) => GHC.Real.Integral (Numeric.Discretized.Discretized u l)
instance (GHC.TypeNats.KnownNat u, GHC.TypeNats.KnownNat l) => GHC.Real.Fractional (Numeric.Discretized.Discretized u l)
instance (GHC.TypeNats.KnownNat u, GHC.TypeNats.KnownNat l) => GHC.Real.Real (Numeric.Discretized.Discretized u l)
-- | Approximate and exact limits around 0 and towards transfinite numbers.
module Numeric.Limits
-- | The class of limits into the transfinite.
class NumericLimits x
minFinite :: NumericLimits x => x
maxFinite :: NumericLimits x => x
-- | The smallest value /= 0 for numeric values.
class NumericEpsilon x
-- | Numeric epsilon.
epsilon :: NumericEpsilon x => x
instance Numeric.Limits.NumericEpsilon GHC.Types.Double
instance Numeric.Limits.NumericLimits GHC.Types.Word
instance Numeric.Limits.NumericLimits GHC.Types.Int
instance Numeric.Limits.NumericLimits GHC.Types.Double
-- | A set with two binary operations, one for addition (srplus),
-- one for multiplication (srmul). Together with a neutral
-- element for srplus, named srzero, and one for
-- srmul, named srone.
module Algebra.Structure.SemiRing
-- | The semiring operations and neutral elements.
class SemiRing a
srplus :: SemiRing a => a -> a -> a
srmul :: SemiRing a => a -> a -> a
srzero :: SemiRing a => a
srone :: SemiRing a => a
infixl 7 `srmul`
infixl 6 `srplus`
-- | Unicode variant of srplus.
(⊕) :: SemiRing a => a -> a -> a
infixl 6 ⊕
-- | Unicode variant of srmul.
(⊗) :: SemiRing a => a -> a -> a
infixl 7 ⊗
-- | The Viterbi SemiRing. It maximizes over the product.
newtype Viterbi x
Viterbi :: x -> Viterbi x
[getViterbi] :: Viterbi x -> x
-- | The tropical MinPlus SemiRing. It minimizes over the sum.
newtype MinPlus x
MinPlus :: x -> MinPlus x
[getMinPlus] :: MinPlus x -> x
-- | The tropical MaxPlus SemiRing. It maximizes over the sum.
newtype MaxPlus x
MaxPlus :: x -> MaxPlus x
[getMaxPlus] :: MaxPlus x -> x
-- | The generic semiring, defined over two Semigroup and
-- Monoid constructions.
--
-- It can be used like this: srzero ∷ GSemiRing Min Sum Int ==
-- maxBound srone ∷ GSemiRing Min Sum Int == 0
--
-- It is generally useful to still provide explicit instances, since
-- Min requires a Bounded instance.
newtype GSemiRing (zeroMonoid :: * -> *) (oneMonoid :: * -> *) (x :: *)
GSemiRing :: x -> GSemiRing
[getSemiRing] :: GSemiRing -> x
instance GHC.Generics.Generic (Algebra.Structure.SemiRing.GSemiRing zeroMonoid oneMonoid x)
instance GHC.Show.Show x => GHC.Show.Show (Algebra.Structure.SemiRing.GSemiRing zeroMonoid oneMonoid x)
instance GHC.Read.Read x => GHC.Read.Read (Algebra.Structure.SemiRing.GSemiRing zeroMonoid oneMonoid x)
instance GHC.Classes.Ord x => GHC.Classes.Ord (Algebra.Structure.SemiRing.GSemiRing zeroMonoid oneMonoid x)
instance GHC.Classes.Eq x => GHC.Classes.Eq (Algebra.Structure.SemiRing.GSemiRing zeroMonoid oneMonoid x)
instance (GHC.Base.Semigroup (zeroMonoid x), GHC.Base.Monoid (zeroMonoid x), GHC.Base.Semigroup (oneMonoid x), GHC.Base.Monoid (oneMonoid x)) => Algebra.Structure.SemiRing.SemiRing (Algebra.Structure.SemiRing.GSemiRing zeroMonoid oneMonoid x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Unboxed.Base.Unbox (Algebra.Structure.SemiRing.MaxPlus x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector (Algebra.Structure.SemiRing.MaxPlus x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector (Algebra.Structure.SemiRing.MaxPlus x)
instance Control.DeepSeq.NFData x => Control.DeepSeq.NFData (Algebra.Structure.SemiRing.MaxPlus x)
instance Numeric.Limits.NumericLimits x => Numeric.Limits.NumericLimits (Algebra.Structure.SemiRing.MaxPlus x)
instance (GHC.Classes.Ord x, GHC.Num.Num x, Numeric.Limits.NumericLimits x) => Algebra.Structure.SemiRing.SemiRing (Algebra.Structure.SemiRing.MaxPlus x)
instance GHC.Num.Num x => GHC.Num.Num (Algebra.Structure.SemiRing.MaxPlus x)
instance GHC.Generics.Generic1 Algebra.Structure.SemiRing.MaxPlus
instance GHC.Generics.Generic (Algebra.Structure.SemiRing.MaxPlus x)
instance GHC.Enum.Bounded x => GHC.Enum.Bounded (Algebra.Structure.SemiRing.MaxPlus x)
instance GHC.Show.Show x => GHC.Show.Show (Algebra.Structure.SemiRing.MaxPlus x)
instance GHC.Read.Read x => GHC.Read.Read (Algebra.Structure.SemiRing.MaxPlus x)
instance GHC.Classes.Ord x => GHC.Classes.Ord (Algebra.Structure.SemiRing.MaxPlus x)
instance GHC.Classes.Eq x => GHC.Classes.Eq (Algebra.Structure.SemiRing.MaxPlus x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Unboxed.Base.Unbox (Algebra.Structure.SemiRing.MinPlus x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector (Algebra.Structure.SemiRing.MinPlus x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector (Algebra.Structure.SemiRing.MinPlus x)
instance Control.DeepSeq.NFData x => Control.DeepSeq.NFData (Algebra.Structure.SemiRing.MinPlus x)
instance (GHC.Classes.Ord x, GHC.Num.Num x, Numeric.Limits.NumericLimits x) => Algebra.Structure.SemiRing.SemiRing (Algebra.Structure.SemiRing.MinPlus x)
instance GHC.Num.Num x => GHC.Num.Num (Algebra.Structure.SemiRing.MinPlus x)
instance GHC.Generics.Generic1 Algebra.Structure.SemiRing.MinPlus
instance GHC.Generics.Generic (Algebra.Structure.SemiRing.MinPlus x)
instance GHC.Enum.Bounded x => GHC.Enum.Bounded (Algebra.Structure.SemiRing.MinPlus x)
instance GHC.Show.Show x => GHC.Show.Show (Algebra.Structure.SemiRing.MinPlus x)
instance GHC.Read.Read x => GHC.Read.Read (Algebra.Structure.SemiRing.MinPlus x)
instance GHC.Classes.Ord x => GHC.Classes.Ord (Algebra.Structure.SemiRing.MinPlus x)
instance GHC.Classes.Eq x => GHC.Classes.Eq (Algebra.Structure.SemiRing.MinPlus x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Unboxed.Base.Unbox (Algebra.Structure.SemiRing.Viterbi x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector (Algebra.Structure.SemiRing.Viterbi x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector (Algebra.Structure.SemiRing.Viterbi x)
instance Control.DeepSeq.NFData x => Control.DeepSeq.NFData (Algebra.Structure.SemiRing.Viterbi x)
instance (GHC.Classes.Ord x, GHC.Num.Num x) => Algebra.Structure.SemiRing.SemiRing (Algebra.Structure.SemiRing.Viterbi x)
instance GHC.Num.Num x => GHC.Num.Num (Algebra.Structure.SemiRing.Viterbi x)
instance GHC.Generics.Generic1 Algebra.Structure.SemiRing.Viterbi
instance GHC.Generics.Generic (Algebra.Structure.SemiRing.Viterbi x)
instance GHC.Enum.Bounded x => GHC.Enum.Bounded (Algebra.Structure.SemiRing.Viterbi x)
instance GHC.Show.Show x => GHC.Show.Show (Algebra.Structure.SemiRing.Viterbi x)
instance GHC.Read.Read x => GHC.Read.Read (Algebra.Structure.SemiRing.Viterbi x)
instance GHC.Classes.Ord x => GHC.Classes.Ord (Algebra.Structure.SemiRing.Viterbi x)
instance GHC.Classes.Eq x => GHC.Classes.Eq (Algebra.Structure.SemiRing.Viterbi x)
-- | This module provides log-domain functionality. Ed Kmett provides, with
-- log-domain, a generic way to handle numbers in the
-- log-domain, some which is used under the hood here. We want some
-- additional type safety and also connect with the SemiRing
-- module.
module Numeric.LogDomain
-- | Instances for LogDomain x should be for specific types.
class LogDomain x where {
-- | The data family to connect a type x with the type Ln
-- x in the log-domain.
data family Ln x :: *;
}
-- | Transport a value in x into the log-domain. logdom
-- should throw an exception if log x is not valid.
logdom :: (LogDomain x, MonadError String m) => x -> m (Ln x)
-- | Unsafely transport x into the log-domain.
unsafelogdom :: LogDomain x => x -> Ln x
-- | Transport a value Ln x back into the linear domain
-- x.
lindom :: LogDomain x => Ln x -> x
-- | This module provides generic functionality to deal with ensembles in
-- statistical mechanics.
module StatisticalMechanics.Ensemble
-- | The state probability functions provide conversion from some types
-- a into non-normalized probabilities. For "real" applications,
-- using the logProbability function is preferred. This
-- functions allows for easy abstraction when types a are given
-- as fractions of some actual value (say: deka-cal), or are discretized.
--
-- The returned values are not normalized, because we do not now the
-- total evidence Z until integration over all states has
-- happened -- which is not feasible in a number of problems.
--
-- TODO replace () with temperature and results with
-- non-normalized P or LogP, depending.
class StateProbability a
-- | Given a temperature and a state "energy", return the corresponding
-- non-normalized probability.
stateProbability :: StateProbability a => () -> a -> ()
stateLogProbability :: StateProbability a => () -> a -> ()
-- | Provides newtypes for odds, log-odds, and discretized versions.
module Statistics.Odds
-- | Odds.
newtype Odds
Odds :: Double -> Odds
[getOdds] :: Odds -> Double
-- | Encodes log-odds that have been rounded or clamped to integral
-- numbers. One advantage this provides is more efficient
-- "maximum/minimum" calculations compared to using Doubles.
--
-- Note that these are "explicit" log-odds. Each numeric operation uses
-- the underlying operation on Int.
newtype DiscLogOdds
DiscLogOdds :: Int -> DiscLogOdds
[getDiscLogOdds] :: DiscLogOdds -> Int
instance Data.Vector.Unboxed.Base.Unbox Statistics.Odds.DiscLogOdds
instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector Statistics.Odds.DiscLogOdds
instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector Statistics.Odds.DiscLogOdds
instance Data.Binary.Class.Binary Statistics.Odds.DiscLogOdds
instance Data.Serialize.Serialize Statistics.Odds.DiscLogOdds
instance Data.Aeson.Types.FromJSON.FromJSON Statistics.Odds.DiscLogOdds
instance Data.Aeson.Types.ToJSON.ToJSON Statistics.Odds.DiscLogOdds
instance Data.Hashable.Class.Hashable Statistics.Odds.DiscLogOdds
instance Control.DeepSeq.NFData Statistics.Odds.DiscLogOdds
instance Numeric.Limits.NumericLimits Statistics.Odds.DiscLogOdds
instance GHC.Num.Num Statistics.Odds.DiscLogOdds
instance GHC.Read.Read Statistics.Odds.DiscLogOdds
instance GHC.Show.Show Statistics.Odds.DiscLogOdds
instance GHC.Classes.Ord Statistics.Odds.DiscLogOdds
instance GHC.Classes.Eq Statistics.Odds.DiscLogOdds
instance GHC.Generics.Generic Statistics.Odds.DiscLogOdds
instance GHC.Num.Num Statistics.Odds.Odds
instance GHC.Read.Read Statistics.Odds.Odds
instance GHC.Show.Show Statistics.Odds.Odds
instance GHC.Classes.Ord Statistics.Odds.Odds
instance GHC.Classes.Eq Statistics.Odds.Odds
instance GHC.Generics.Generic Statistics.Odds.Odds
-- | Probability-related types.
--
-- TODO instances for serialization and further stuff TODO vector
-- instances
module Statistics.Probability
data IsNormalized
Normalized :: IsNormalized
NotNormalized :: IsNormalized
-- | Prob wraps a Double that encodes probabilities. If
-- Prob is tagged as Normalized, the contained values
-- are in the range [0,...,1], otherwise they are in the range
-- [0,...,∞].
newtype Prob (n :: IsNormalized) x
Prob :: x -> Prob x
[getProb] :: Prob x -> x
-- | Turns a value into a normalized probability. error if the
-- value is not in the range [0,...,1].
prob :: (Ord x, Num x, Show x) => x -> Prob Normalized x
-- | Simple wrapper around Prob that fixes non-normalization.
prob' :: (Ord x, Num x, Show x) => x -> Prob NotNormalized x
newtype LogProb (n :: IsNormalized) x
LogProb :: x -> LogProb x
[getLogProb] :: LogProb x -> x
withLog1 :: (Log x -> Log y) -> LogProb n x -> LogProb n y
withLog2 :: (Log x -> Log y -> Log z) -> LogProb n x -> LogProb n y -> LogProb n z
-- | Turn probability into log-probability.
p2lp :: Floating x => Prob n x -> LogProb n x
-- | Turn log-probability into probability.
lp2p :: Floating x => LogProb n x -> Prob n x
-- | An isomorphism between Prob and LogProb.
aslp :: Floating x => Iso' (Prob n x) (LogProb n x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Unboxed.Base.Unbox (Statistics.Probability.LogProb n x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector (Statistics.Probability.LogProb n x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector (Statistics.Probability.LogProb n x)
instance (Numeric.Log.Precise x, GHC.Float.RealFloat x) => GHC.Num.Num (Statistics.Probability.LogProb n x)
instance (GHC.Num.Num d, GHC.Real.Fractional d) => Numeric.Limits.NumericLimits (Statistics.Probability.LogProb n d)
instance GHC.Show.Show x => GHC.Show.Show (Statistics.Probability.LogProb n x)
instance GHC.Classes.Ord x => GHC.Classes.Ord (Statistics.Probability.LogProb n x)
instance GHC.Classes.Eq x => GHC.Classes.Eq (Statistics.Probability.LogProb n x)
instance GHC.Enum.Enum x => GHC.Enum.Enum (Statistics.Probability.Prob n x)
instance GHC.Num.Num x => GHC.Num.Num (Statistics.Probability.Prob n x)
instance GHC.Real.Fractional x => GHC.Real.Fractional (Statistics.Probability.Prob n x)
instance GHC.Float.Floating x => GHC.Float.Floating (Statistics.Probability.Prob n x)
instance GHC.Real.Real x => GHC.Real.Real (Statistics.Probability.Prob n x)
instance GHC.Real.RealFrac x => GHC.Real.RealFrac (Statistics.Probability.Prob n x)
instance GHC.Float.RealFloat x => GHC.Float.RealFloat (Statistics.Probability.Prob n x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Unboxed.Base.Unbox (Statistics.Probability.Prob n x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector (Statistics.Probability.Prob n x)
instance Data.Vector.Unboxed.Base.Unbox x => Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector (Statistics.Probability.Prob n x)
instance GHC.Num.Num r => Algebra.Structure.SemiRing.SemiRing (Statistics.Probability.Prob n r)
instance GHC.Read.Read x => GHC.Read.Read (Statistics.Probability.Prob n x)
instance GHC.Show.Show x => GHC.Show.Show (Statistics.Probability.Prob n x)
instance GHC.Classes.Ord x => GHC.Classes.Ord (Statistics.Probability.Prob n x)
instance GHC.Classes.Eq x => GHC.Classes.Eq (Statistics.Probability.Prob n x)