module Sibe.Utils ( similarity , ordNub , onehot , average ) where import qualified Data.Vector.Storable as V import qualified Data.Set as Set import Numeric.LinearAlgebra similarity :: Vector Double -> Vector Double -> Double similarity a b = (V.sum $ a * b) / (magnitude a * magnitude b) where magnitude :: Vector Double -> Double magnitude v = sqrt $ V.sum (cmap (^2) v) onehot :: Int -> Int -> Vector Double onehot len i = vector $ replicate i 0 ++ [1] ++ replicate (len - i - 1) 0 ordNub :: (Ord a) => [a] -> [a] ordNub = go Set.empty where go _ [] = [] go s (x:xs) = if x `Set.member` s then go s xs else x : go (Set.insert x s) xs average :: Vector Double -> Vector Double average v = cmap (/ (V.sum v)) v