{-# 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