packages feed

heatitup-0.5.3.3: src/Diffusion.hs

{- Diffusion
Gregory W. Schwartz

Collections the functions pertaining to the discrete general diffusion
equation, or the discrete Gaussian kernel
-}

{-# LANGUAGE BangPatterns #-}

module Diffusion
    ( diffuse
    , mutationSignal
    ) where

-- Standard
import Data.Maybe

-- Cabal
import qualified Data.Vector as V
import qualified Data.ByteString.Char8 as C

-- Local
import Types
import Utility

-- | Diffuse a 1 dimensional discrete signal
diffuse :: Window -> Time -> Signal -> Signal
diffuse _ _ (Signal []) = Signal []
diffuse (Window w) (Time t) (Signal xs) = Signal . V.toList . V.imap go $ vec
  where
    vec    = V.fromList xs
    go i x =
        sum
            . map ( \n -> (* g (fromIntegral n))
                          . fromMaybe 0
                          . (V.!?) vec
                          . fromIntegral
                          $ i - n
                  )
            $ [(- w) .. w]
    g n    = (1 / (sqrt (2 * pi * t))) * (exp ((- n ^ 2) / (2 * t)))

-- | Convert a hamming comparison to a signal
mutationSignal :: C.ByteString -> Substring -> Signal
mutationSignal base = Signal
                    . fmap (\x -> if x then 0 else 1)
                    . hammingList base
                    . unSubstring