module Main where -- Some test on Kernels -- -----------------kernels--LA--csse--Monash--.au--7/2005-- class Kernel t where k :: t -> t -> Double --kernel function d :: t -> t -> Double --distance d x y = sqrt( k x x - 2 * k x y + k y y ) --default -- --------------------------------------some-standard-fns-- matching x y = if x==y then 1.0 else 0.0 innerProduct2 (x1,x2) (y1,y2) = x1*x2 + y1*y2 -- x.y innerProduct3 (x1,x2,x3) (y1,y2,y3) = x1*x2 + y1*y2 + x2*y3 poly l p k x y = ( k x y + l ) ** p --the "polynomial" kernel normalise k x y = k x y / sqrt( k x x * k y y ) -- ----------------------------------------------instances-- instance Kernel Bool where k = matching -- Bool instance Kernel Int where k = matching -- Int instance Kernel Char where k = matching -- Char instance Kernel Double where k x y = x*y -- Double -- ghc doesn't like the next alternative without -- ghc -fglasgow-exts -- instance Kernel (Double,Double) where k = innerProduct2 -- (D,D) -- but... -- ghc (plain) accepts this alternative... instance (Kernel t, Kernel u) => Kernel (t,u) where -- pair (t,u) k (x1,x2) (y1,y2) = k x1 y1 + k x2 y2 instance (Kernel t) => Kernel [t] where -- [t], i.e. list of t k [] [] = 1.0 k [] _ = 0.0 k _ [] = 0.0 k (x:xs) (y:ys) = 1.0 + k x y + k xs ys data Coord = Coord Double Double -- e.g. 2-D coordinates instance Kernel Coord where -- make up something k (Coord x1 x2) (Coord y1 y2) = normalise (poly 1.0 2 innerProduct2) (x1,x2) (y1,y2) -- say -- --------------------------------------------------tests-- l1 = [1::Int, 2, 3] l2 = [1, 4] r1 = (1.0, 2.0) :: (Double,Double) r2 = (3.0, 4.0) :: (Double,Double) c1 = Coord 1.0 2.0 c2 = Coord 3.0 4.0 main = putStrLn "Kernel tests, L.Allison, CSSE, Monash, .au, 7/2005" >> putStrLn( "[Bool] : " ++ show( k [True] [True,False] ) ) >> putStrLn( "[Int] : " ++ show( [(k l1 l1, d l1 l1), (k l1 l2, d l1 l2), (k l2 l2, d l2 l2)] ) ) >> putStrLn( "Strings: " ++ show( [k ("John", "Smith") ("Jon", "Smythe"), k ("John", "Smith") ("Fred", "Bloggs") ] ) ) >> putStrLn( "(Double,Double) : " ++ show( [(k r1 r1, d r1 r1), (k r1 r2, d r1 r2), (k r2 r2, d r2 r2)] ) ) >> putStrLn( "Coord : " ++ show[ k c1 c1, k c1 c2, k c2 c2] ) -- ---------------------------------------------------------- -- for use with: L.Allison, J.Func.Prog. 15(1) pp.15-32 2005 -- http://dx.doi.org/10.1017/S0956796804005301 -- ----------------------------------------------------------