{-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} module Q.Interpolation where import qualified Q.SortedVector as SV import Numeric.GSL.Interpolation import qualified Numeric.LinearAlgebra as V (Vector, fromList) import Foreign (Storable) import Data.List class (Ord k, Storable k, Storable v) => Interpolator a k v where interpolate :: a -> [(k, v)] -> k -> v class (Ord k, Storable k, Storable v) => InterpolatorV a k v where interpolateV :: a -> SV.SortedVector k -> V.Vector v -> k -> v instance (Ord k, Storable k, Storable v, InterpolatorV a k v) => Interpolator a k v where interpolate :: a -> [(k, v)] -> k -> v interpolate a a [(k, v)] pts = a -> SortedVector k -> Vector v -> k -> v forall a k v. InterpolatorV a k v => a -> SortedVector k -> Vector v -> k -> v interpolateV a a SortedVector k xs' Vector v ys' where ([k] xs, [v] ys) = ([(k, v)] -> ([k], [v]) forall a b. [(a, b)] -> ([a], [b]) unzip ([(k, v)] -> ([k], [v])) -> ([(k, v)] -> [(k, v)]) -> [(k, v)] -> ([k], [v]) forall b c a. (b -> c) -> (a -> b) -> a -> c . ((k, v) -> k) -> [(k, v)] -> [(k, v)] forall b a. Ord b => (a -> b) -> [a] -> [a] sortOn (k, v) -> k forall a b. (a, b) -> a fst) [(k, v)] pts xs' :: SortedVector k xs' = [k] -> SortedVector k forall a. Storable a => [a] -> SortedVector a SV.fromSortedList [k] xs ys' :: Vector v ys' = [v] -> Vector v forall a. Storable a => [a] -> Vector a V.fromList [v] ys