multilinear-0.2.2: src/Multilinear/NVector.hs
{-|
Module : Multilinear.NVector
Description : N-Vectors constructors (finitely- or infinitely-dimensional)
Copyright : (c) Artur M. Brodzki, 2018
License : BSD3
Maintainer : artur@brodzki.org
Stability : experimental
Portability : Windows/POSIX
- This module provides convenient constructors that generate a n-vector (tensor with n upper indices with finite or infinite size).
- Finitely-dimensional n-vectors provide much greater performance than infinitely-dimensional
-}
module Multilinear.NVector (
-- * Generators
Multilinear.NVector.fromIndices,
Multilinear.NVector.const,
Multilinear.NVector.randomDouble,
Multilinear.NVector.randomDoubleSeed,
Multilinear.NVector.randomInt,
Multilinear.NVector.randomIntSeed,
) where
import Control.Monad.Primitive
import Multilinear.Generic
import Multilinear.Tensor as Tensor
import Statistics.Distribution
{-| Generate n-vector as function of its indices -}
{-# INLINE fromIndices #-}
fromIndices :: (
Num a
) => String -- ^ Indices names (one characted per index)
-> [Int] -- ^ Indices sizes
-> ([Int] -> a) -- ^ Generator function
-> Tensor a -- ^ Generated n-vector
fromIndices u us f = Tensor.fromIndices (u,us) ([],[]) $ \uis [] -> f uis
{-| Generate n-vector with all components equal to @v@ -}
{-# INLINE Multilinear.NForm.const #-}
const :: (
Num a
) => String -- ^ Indices names (one characted per index)
-> [Int] -- ^ Indices sizes
-> a -- ^ n-vector elements value
-> Tensor a -- ^ Generated n-vector
const u us = Tensor.const (u,us) ([],[])
{-| Generate n-vector with random real components with given probability distribution.
The n-vector is wrapped in the IO monad. -}
{-| Available probability distributions: -}
{-| - Beta : "Statistics.Distribution.BetaDistribution" -}
{-| - Cauchy : "Statistics.Distribution.CauchyLorentz" -}
{-| - Chi-squared : "Statistics.Distribution.ChiSquared" -}
{-| - Exponential : "Statistics.Distribution.Exponential" -}
{-| - Gamma : "Statistics.Distribution.Gamma" -}
{-| - Geometric : "Statistics.Distribution.Geometric" -}
{-| - Normal : "Statistics.Distribution.Normal" -}
{-| - StudentT : "Statistics.Distribution.StudentT" -}
{-| - Uniform : "Statistics.Distribution.Uniform" -}
{-| - F : "Statistics.Distribution.FDistribution" -}
{-| - Laplace : "Statistics.Distribution.Laplace" -}
{-# INLINE randomDouble #-}
randomDouble :: (
ContGen d
) => String -- ^ Indices names (one character per index)
-> [Int] -- ^ Indices sizes
-> d -- ^ Continuous probability distribution (as from "Statistics.Distribution")
-> IO (Tensor Double) -- ^ Generated linear functional
randomDouble u us = Tensor.randomDouble (u,us) ([],[])
{-| Generate n-vector with random integer components with given probability distribution.
The n-vector is wrapped in the IO monad. -}
{-| Available probability distributions: -}
{-| - Binomial : "Statistics.Distribution.Binomial" -}
{-| - Poisson : "Statistics.Distribution.Poisson" -}
{-| - Geometric : "Statistics.Distribution.Geometric" -}
{-| - Hypergeometric: "Statistics.Distribution.Hypergeometric" -}
{-# INLINE randomInt #-}
randomInt :: (
DiscreteGen d
) => String -- ^ Indices names (one character per index)
-> [Int] -- ^ Indices sizes
-> d -- ^ Discrete probability distribution (as from "Statistics.Distribution")
-> IO (Tensor Int) -- ^ Generated n-vector
randomInt u us = Tensor.randomInt (u,us) ([],[])
{-| Generate n-vector with random real components with given probability distribution and given seed.
The form is wrapped in a monad. -}
{-| Available probability distributions: -}
{-| - Beta : "Statistics.Distribution.BetaDistribution" -}
{-| - Cauchy : "Statistics.Distribution.CauchyLorentz" -}
{-| - Chi-squared : "Statistics.Distribution.ChiSquared" -}
{-| - Exponential : "Statistics.Distribution.Exponential" -}
{-| - Gamma : "Statistics.Distribution.Gamma" -}
{-| - Geometric : "Statistics.Distribution.Geometric" -}
{-| - Normal : "Statistics.Distribution.Normal" -}
{-| - StudentT : "Statistics.Distribution.StudentT" -}
{-| - Uniform : "Statistics.Distribution.Uniform" -}
{-| - F : "Statistics.Distribution.FDistribution" -}
{-| - Laplace : "Statistics.Distribution.Laplace" -}
{-# INLINE randomDoubleSeed #-}
randomDoubleSeed :: (
ContGen d, PrimMonad m
) => String -- ^ Index name (one character)
-> [Int] -- ^ Number of elements
-> d -- ^ Continuous probability distribution (as from "Statistics.Distribution")
-> Int -- ^ Randomness seed
-> m (Tensor Double) -- ^ Generated n-vector
randomDoubleSeed u us = Tensor.randomDoubleSeed (u,us) ([],[])
{-| Generate n-vector with random integer components with given probability distribution and given seed.
The form is wrapped in a monad. -}
{-| Available probability distributions: -}
{-| - Binomial : "Statistics.Distribution.Binomial" -}
{-| - Poisson : "Statistics.Distribution.Poisson" -}
{-| - Geometric : "Statistics.Distribution.Geometric" -}
{-| - Hypergeometric: "Statistics.Distribution.Hypergeometric" -}
{-# INLINE randomIntSeed #-}
randomIntSeed :: (
DiscreteGen d, PrimMonad m
) => String -- ^ Index name (one character)
-> [Int] -- ^ Number of elements
-> d -- ^ Discrete probability distribution (as from "Statistics.Distribution")
-> Int -- ^ Randomness seed
-> m (Tensor Int) -- ^ Generated n-vector
randomIntSeed u us = Tensor.randomIntSeed (u,us) ([],[])