{- | Ersatz linear algebra. -} module Moo.GeneticAlgorithm.LinAlg ( minus , plus , scale , dot , norm2 , proj , normalize ) where minus :: Num a => [a] -> [a] -> [a] minus xs ys = zipWith (-) xs ys plus :: Num a => [a] -> [a] -> [a] plus xs ys = zipWith (+) xs ys scale :: Num a => a -> [a] -> [a] scale a xs = map (a*) xs dot :: Num a => [a] -> [a] -> a dot xs ys = sum $ zipWith (*) xs ys norm2 :: (Num a, Floating a) => [a] -> a norm2 xs = sqrt $ dot xs xs proj :: (Num a, Fractional a) => [a] -> [a] -> [a] proj xs dir = ( dot xs dir / dot dir dir ) `scale` dir normalize :: (Num a, Floating a, Fractional a) => [a] -> [a] normalize xs = let a = norm2 xs in (1.0/a) `scale` xs