{- |
Interpolation basis functions using all given nodes.
The represented functions are equivalent to the ones from
"Numeric.Interpolation.Basis.Compact"
but less efficient for evaluation.
-}
module Numeric.Interpolation.Basis.Full (linear, hermite1) where

import qualified Numeric.Interpolation.NodeList as Nodes

import qualified Data.List.Match as Match


generic :: ny -> ny -> [x] -> [Nodes.T x ny]
generic :: ny -> ny -> [x] -> [T x ny]
generic ny
nz ny
ny [x]
xs =
   ([ny] -> T x ny) -> [[ny]] -> [T x ny]
forall a b. (a -> b) -> [a] -> [b]
map ([(x, ny)] -> T x ny
forall x y. [(x, y)] -> T x y
Nodes.fromList ([(x, ny)] -> T x ny) -> ([ny] -> [(x, ny)]) -> [ny] -> T x ny
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [x] -> [ny] -> [(x, ny)]
forall a b. [a] -> [b] -> [(a, b)]
zip [x]
xs) ([[ny]] -> [T x ny]) -> [[ny]] -> [T x ny]
forall a b. (a -> b) -> a -> b
$
   [x] -> [[ny]] -> [[ny]]
forall b a. [b] -> [a] -> [a]
Match.take [x]
xs ([[ny]] -> [[ny]]) -> [[ny]] -> [[ny]]
forall a b. (a -> b) -> a -> b
$ ([ny] -> [ny]) -> [ny] -> [[ny]]
forall a. (a -> a) -> a -> [a]
iterate (ny
nzny -> [ny] -> [ny]
forall a. a -> [a] -> [a]
:) ([ny] -> [[ny]]) -> [ny] -> [[ny]]
forall a b. (a -> b) -> a -> b
$ ny
ny ny -> [ny] -> [ny]
forall a. a -> [a] -> [a]
: ny -> [ny]
forall a. a -> [a]
repeat ny
nz

linear :: (Num b) => [a] -> [Nodes.T a b]
linear :: [a] -> [T a b]
linear = b -> b -> [a] -> [T a b]
forall ny x. ny -> ny -> [x] -> [T x ny]
generic b
0 b
1

hermite1 :: (Num b) => [a] -> [Nodes.T a (b, b)]
hermite1 :: [a] -> [T a (b, b)]
hermite1 [a]
xs =
   (b, b) -> (b, b) -> [a] -> [T a (b, b)]
forall ny x. ny -> ny -> [x] -> [T x ny]
generic (b
0,b
0) (b
1,b
0) [a]
xs
   [T a (b, b)] -> [T a (b, b)] -> [T a (b, b)]
forall a. [a] -> [a] -> [a]
++
   (b, b) -> (b, b) -> [a] -> [T a (b, b)]
forall ny x. ny -> ny -> [x] -> [T x ny]
generic (b
0,b
0) (b
0,b
1) [a]
xs