module Moo.GeneticAlgorithm.LinAlg
( minus
, plus
, scale
, dot
, norm2
, proj
, normalize
) where
minus :: Num a => [a] -> [a] -> [a]
minus :: [a] -> [a] -> [a]
minus [a]
xs [a]
ys = (a -> a -> a) -> [a] -> [a] -> [a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (-) [a]
xs [a]
ys
plus :: Num a => [a] -> [a] -> [a]
plus :: [a] -> [a] -> [a]
plus [a]
xs [a]
ys = (a -> a -> a) -> [a] -> [a] -> [a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> a -> a
forall a. Num a => a -> a -> a
(+) [a]
xs [a]
ys
scale :: Num a => a -> [a] -> [a]
scale :: a -> [a] -> [a]
scale a
a [a]
xs = (a -> a) -> [a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (a
aa -> a -> a
forall a. Num a => a -> a -> a
*) [a]
xs
dot :: Num a => [a] -> [a] -> a
dot :: [a] -> [a] -> a
dot [a]
xs [a]
ys = [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([a] -> a) -> [a] -> a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> [a] -> [a] -> [a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith a -> a -> a
forall a. Num a => a -> a -> a
(*) [a]
xs [a]
ys
norm2 :: (Num a, Floating a) => [a] -> a
norm2 :: [a] -> a
norm2 [a]
xs = a -> a
forall a. Floating a => a -> a
sqrt (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ [a] -> [a] -> a
forall a. Num a => [a] -> [a] -> a
dot [a]
xs [a]
xs
proj :: (Num a, Fractional a) => [a] -> [a] -> [a]
proj :: [a] -> [a] -> [a]
proj [a]
xs [a]
dir = ( [a] -> [a] -> a
forall a. Num a => [a] -> [a] -> a
dot [a]
xs [a]
dir a -> a -> a
forall a. Fractional a => a -> a -> a
/ [a] -> [a] -> a
forall a. Num a => [a] -> [a] -> a
dot [a]
dir [a]
dir ) a -> [a] -> [a]
forall a. Num a => a -> [a] -> [a]
`scale` [a]
dir
normalize :: (Num a, Floating a, Fractional a) => [a] -> [a]
normalize :: [a] -> [a]
normalize [a]
xs = let a :: a
a = [a] -> a
forall a. (Num a, Floating a) => [a] -> a
norm2 [a]
xs in (a
1.0a -> a -> a
forall a. Fractional a => a -> a -> a
/a
a) a -> [a] -> [a]
forall a. Num a => a -> [a] -> [a]
`scale` [a]
xs