HaskellForMaths-0.4.5: Math/Test/TCombinatorics/TCombinatorialHopfAlgebra.hs
-- Copyright (c) 2012, David Amos. All rights reserved.
{-# LANGUAGE FlexibleInstances #-}
module Math.Test.TCombinatorics.TCombinatorialHopfAlgebra where
import Data.List as L
import Math.Core.Field
import Math.Combinatorics.Poset (integerPartitions)
import Math.Algebras.VectorSpace hiding (E)
import Math.Algebras.TensorProduct -- for ghci
import Math.Algebras.Structures
import Math.Combinatorics.CombinatorialHopfAlgebra
import Math.Test.TAlgebras.TVectorSpace hiding (T, f)
import Math.Test.TAlgebras.TTensorProduct
import Math.Test.TAlgebras.TStructures
import Test.QuickCheck
import Test.HUnit
quickCheckCombinatorialHopfAlgebra = do
quickCheckShuffleAlgebra
quickCheckSSymF
quickCheckSSymM
quickCheckYSymF
quickCheckYSymM
quickCheckQSymM
quickCheckQSymF
quickCheckSymM
quickCheckSymE
quickCheckSymH
quickCheckNSym
quickCheckCHAIsomorphism
quickCheckCHAMorphism
instance Arbitrary a => Arbitrary (Shuffle a) where
arbitrary = fmap (Sh . take 3) arbitrary
quickCheckShuffleAlgebra = do
putStrLn "Checking shuffle algebra"
-- quickCheck (prop_Algebra :: (Q, Vect Q (Shuffle Int), Vect Q (Shuffle Int), Vect Q (Shuffle Int)) -> Bool) -- too slow
quickCheck (prop_Coalgebra :: Vect Q (Shuffle Int) -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q (Shuffle Int), Vect Q (Shuffle Int)) -> Bool) -- slow
quickCheck (prop_HopfAlgebra :: Vect Q (Shuffle Int) -> Bool)
quickCheck (prop_Commutative :: (Vect Q (Shuffle Int), Vect Q (Shuffle Int)) -> Bool)
instance Arbitrary SSymF where
arbitrary = do xs <- elements permsTo3
return (SSymF xs)
where permsTo3 = concatMap (\n -> L.permutations [1..n]) [0..3]
instance Arbitrary SSymM where
arbitrary = do xs <- elements permsTo3
return (SSymM xs)
where permsTo3 = concatMap (\n -> L.permutations [1..n]) [0..3]
quickCheckSSymF = do
putStrLn "Checking SSymF"
-- quickCheck (prop_Algebra :: (Q, Vect Q SSymF, Vect Q SSymF, Vect Q SSymF) -> Bool) -- too slow
quickCheck (prop_Coalgebra :: Vect Q SSymF -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q SSymF, Vect Q SSymF) -> Bool)
quickCheck (prop_HopfAlgebra :: Vect Q SSymF -> Bool)
quickCheckSSymM = do
putStrLn "Checking SSymM"
-- quickCheck (prop_Algebra :: (Q, Vect Q SSymM, Vect Q SSymM, Vect Q SSymM) -> Bool) -- too slow
quickCheck (prop_Coalgebra :: Vect Q SSymM -> Bool)
-- quickCheck (prop_Bialgebra :: (Q, Vect Q SSymM, Vect Q SSymM) -> Bool) -- too slow
quickCheck (prop_HopfAlgebra :: Vect Q SSymM -> Bool)
quickCheckDualSSymF = do
putStrLn "Checking Dual(SSymF)"
-- quickCheck (prop_Algebra :: (Q, Vect Q (Dual SSymF), Vect Q (Dual SSymF), Vect Q (Dual SSymF)) -> Bool) -- too slow
quickCheck (prop_Coalgebra :: Vect Q (Dual SSymF) -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q (Dual SSymF), Vect Q (Dual SSymF)) -> Bool)
quickCheck (prop_HopfAlgebra :: Vect Q (Dual SSymF) -> Bool)
instance Arbitrary (YSymF ()) where
arbitrary = fmap YSymF (elements (concatMap trees [0..3]))
-- arbitrary = fmap (YSymF . shape . descendingTree . take 3) (arbitrary :: Gen [Int])
-- We use descendingTree because it can make trees of interesting shapes from a given list
-- but we could equally have used other tree construction methods such as binary search tree
instance Arbitrary (YSymF Int) where
arbitrary = fmap (YSymF . descendingTree . take 3) (arbitrary :: Gen [Int])
-- It seems to all work even if we leave the labels on. Perhaps we should really put random labels on though,
-- rather than leaving the descendingTree labels
instance Arbitrary (YSymM) where
arbitrary = fmap YSymM (elements (concatMap trees [0..3]))
-- arbitrary = fmap (YSymM . shape . descendingTree . take 3) (arbitrary :: Gen [Int])
quickCheckYSymF = do
putStrLn "Checking YSymF"
-- quickCheck (prop_Algebra :: (Q, Vect Q (YSymF ()), Vect Q (YSymF ()), Vect Q (YSymF ())) -> Bool) -- too slow
quickCheck (prop_Coalgebra :: Vect Q (YSymF ()) -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q (YSymF ()), Vect Q (YSymF ())) -> Bool)
quickCheck (prop_HopfAlgebra :: Vect Q (YSymF ()) -> Bool)
quickCheckYSymM = do
putStrLn "Checking YSymM"
-- quickCheck (prop_Algebra :: (Q, Vect Q YSymM, Vect Q YSymM, Vect Q YSymM) -> Bool) -- too slow
quickCheck (prop_Coalgebra :: Vect Q YSymM -> Bool)
-- quickCheck (prop_Bialgebra :: (Q, Vect Q YSymM, Vect Q YSymM) -> Bool)
quickCheck (prop_HopfAlgebra :: Vect Q YSymM -> Bool)
instance Arbitrary QSymM where
arbitrary = do xs <- elements compositionsTo3
return (QSymM xs)
where compositionsTo3 = concatMap compositions [0..3]
instance Arbitrary QSymF where
arbitrary = do xs <- elements compositionsTo3
return (QSymF xs)
where compositionsTo3 = concatMap compositions [0..3]
quickCheckQSymM = do
putStrLn "Checking QSymM"
quickCheck (prop_Algebra :: (Q, Vect Q QSymM, Vect Q QSymM, Vect Q QSymM) -> Bool) -- too slow
quickCheck (prop_Coalgebra :: Vect Q QSymM -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q QSymM, Vect Q QSymM) -> Bool)
quickCheck (prop_HopfAlgebra :: (Vect Q QSymM) -> Bool)
quickCheck (prop_Commutative :: (Vect Q QSymM, Vect Q QSymM) -> Bool)
quickCheckQSymF = do
putStrLn "Checking QSymF"
quickCheck (prop_Algebra :: (Q, Vect Q QSymF, Vect Q QSymF, Vect Q QSymF) -> Bool) -- too slow
quickCheck (prop_Coalgebra :: Vect Q QSymF -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q QSymF, Vect Q QSymF) -> Bool)
quickCheck (prop_HopfAlgebra :: (Vect Q QSymF) -> Bool)
quickCheck (prop_Commutative :: (Vect Q QSymF, Vect Q QSymF) -> Bool)
instance Arbitrary SymM where
arbitrary = do xs <- elements (concatMap integerPartitions [0..4])
return (SymM xs)
quickCheckSymM = do
putStrLn "Checking SymM"
quickCheck (prop_Algebra :: (Q, Vect Q SymM, Vect Q SymM, Vect Q SymM) -> Bool)
quickCheck (prop_Coalgebra :: Vect Q SymM -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q SymM, Vect Q SymM) -> Bool)
quickCheck (prop_HopfAlgebra :: Vect Q SymM -> Bool)
quickCheck (prop_Commutative :: (Vect Q SymM, Vect Q SymM) -> Bool)
quickCheck (prop_Cocommutative :: Vect Q SymM -> Bool)
instance Arbitrary SymE where
arbitrary = do xs <- elements (concatMap integerPartitions [0..4])
return (SymE xs)
quickCheckSymE = do
putStrLn "Checking SymE"
quickCheck (prop_Algebra :: (Q, Vect Q SymE, Vect Q SymE, Vect Q SymE) -> Bool)
quickCheck (prop_Coalgebra :: Vect Q SymE -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q SymE, Vect Q SymE) -> Bool)
-- quickCheck (prop_HopfAlgebra :: Vect Q SymE -> Bool)
quickCheck (prop_Commutative :: (Vect Q SymE, Vect Q SymE) -> Bool)
quickCheck (prop_Cocommutative :: Vect Q SymE -> Bool)
instance Arbitrary SymH where
arbitrary = do xs <- elements (concatMap integerPartitions [0..4])
return (SymH xs)
quickCheckSymH = do
putStrLn "Checking SymH"
quickCheck (prop_Algebra :: (Q, Vect Q SymH, Vect Q SymH, Vect Q SymH) -> Bool)
quickCheck (prop_Coalgebra :: Vect Q SymH -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q SymH, Vect Q SymH) -> Bool)
-- quickCheck (prop_HopfAlgebra :: (Vect Q SymH) -> Bool)
quickCheck (prop_Commutative :: (Vect Q SymH, Vect Q SymH) -> Bool)
quickCheck (prop_Cocommutative :: Vect Q SymH -> Bool)
-- The basis isn't indexed by compositions, but using compositions is an easy way to ensure
-- that we have positive ints and that they're bounded (to keep the comult manageable)
instance Arbitrary NSym where
arbitrary = do xs <- elements compositionsTo4
return (NSym xs)
where compositionsTo4 = concatMap compositions [0..4]
quickCheckNSym = do
putStrLn "Checking NSym"
quickCheck (prop_Algebra :: (Q, Vect Q NSym, Vect Q NSym, Vect Q NSym) -> Bool)
quickCheck (prop_Coalgebra :: Vect Q NSym -> Bool)
quickCheck (prop_Bialgebra :: (Q, Vect Q NSym, Vect Q NSym) -> Bool)
quickCheck (prop_HopfAlgebra :: Vect Q NSym -> Bool)
quickCheckCHAIsomorphism = do
putStrLn "Checking CHA isomorphism (change of basis)"
putStrLn "Checking bijections"
quickCheck (prop_Id (ssymMtoF . ssymFtoM) :: Vect Q SSymF -> Bool)
quickCheck (prop_Id (ssymFtoM . ssymMtoF) :: Vect Q SSymM -> Bool)
quickCheck (prop_Id (ysymMtoF . ysymFtoM) :: Vect Q (YSymF ()) -> Bool)
quickCheck (prop_Id (ysymFtoM . ysymMtoF) :: Vect Q YSymM -> Bool)
quickCheck (prop_Id (qsymMtoF . qsymFtoM) :: Vect Q QSymF -> Bool)
quickCheck (prop_Id (qsymFtoM . qsymMtoF) :: Vect Q QSymM -> Bool)
putStrLn "Checking morphisms"
putStrLn "SSym"
-- quickCheck (prop_AlgebraMorphism ssymMtoF :: (Q, Vect Q SSymM, Vect Q SSymM) -> Bool) -- too slow
-- quickCheck (prop_AlgebraMorphism ssymFtoM :: (Q, Vect Q SSymF, Vect Q SSymF) -> Bool) -- too slow
quickCheck (prop_CoalgebraMorphism ssymMtoF :: Vect Q SSymM -> Bool)
quickCheck (prop_CoalgebraMorphism ssymFtoM :: Vect Q SSymF -> Bool)
quickCheck (prop_HopfAlgebraMorphism ssymFtoM :: Vect Q SSymF -> Bool)
quickCheck (prop_HopfAlgebraMorphism ssymMtoF :: Vect Q SSymM -> Bool)
quickCheck (prop_AlgebraMorphism ssymFtoDual :: (Q, Vect Q SSymF, Vect Q SSymF) -> Bool)
quickCheck (prop_CoalgebraMorphism ssymFtoDual :: Vect Q SSymF -> Bool)
quickCheck (prop_HopfAlgebraMorphism ssymFtoDual :: Vect Q SSymF -> Bool)
putStrLn "YSym"
-- quickCheck (prop_AlgebraMorphism ysymMtoF :: (Q, Vect Q YSymM, Vect Q YSymM) -> Bool) -- too slow
quickCheck (prop_AlgebraMorphism ysymFtoM :: (Q, Vect Q (YSymF ()), Vect Q (YSymF ())) -> Bool)
quickCheck (prop_CoalgebraMorphism ysymMtoF :: Vect Q YSymM -> Bool)
quickCheck (prop_CoalgebraMorphism ysymFtoM :: Vect Q (YSymF ()) -> Bool)
quickCheck (prop_HopfAlgebraMorphism ysymMtoF :: Vect Q YSymM -> Bool)
quickCheck (prop_HopfAlgebraMorphism ysymFtoM :: Vect Q (YSymF ()) -> Bool)
putStrLn "QSym"
quickCheck (prop_AlgebraMorphism qsymMtoF :: (Q, Vect Q QSymM, Vect Q QSymM) -> Bool)
quickCheck (prop_AlgebraMorphism qsymFtoM :: (Q, Vect Q QSymF, Vect Q QSymF) -> Bool)
quickCheck (prop_CoalgebraMorphism qsymMtoF :: Vect Q QSymM -> Bool)
quickCheck (prop_CoalgebraMorphism qsymFtoM :: Vect Q QSymF -> Bool)
quickCheck (prop_HopfAlgebraMorphism qsymFtoM :: Vect Q QSymF -> Bool)
quickCheck (prop_HopfAlgebraMorphism qsymMtoF :: Vect Q QSymM -> Bool)
putStrLn "Sym"
quickCheck (prop_AlgebraMorphism symEtoM :: (Q, Vect Q SymE, Vect Q SymE) -> Bool)
quickCheck (prop_AlgebraMorphism symHtoM :: (Q, Vect Q SymH, Vect Q SymH) -> Bool)
quickCheck (prop_CoalgebraMorphism symEtoM :: Vect Q SymE -> Bool)
quickCheck (prop_CoalgebraMorphism symHtoM :: Vect Q SymH -> Bool)
where prop_Id f x = f x == x
quickCheckCHAMorphism = do
putStrLn "Checking morphisms between CHAs"
quickCheck (prop_AlgebraMorphism descendingTreeMap :: (Q, Vect Q SSymF, Vect Q SSymF) -> Bool)
quickCheck (prop_CoalgebraMorphism descendingTreeMap :: Vect Q SSymF -> Bool)
quickCheck (prop_HopfAlgebraMorphism descendingTreeMap :: Vect Q SSymF -> Bool)
quickCheck (prop_AlgebraMorphism descentMap :: (Q, Vect Q SSymF, Vect Q SSymF) -> Bool)
quickCheck (prop_CoalgebraMorphism descentMap :: Vect Q SSymF -> Bool)
quickCheck (prop_HopfAlgebraMorphism descentMap :: Vect Q SSymF -> Bool)
quickCheck (prop_AlgebraMorphism leftLeafCompositionMap :: (Q, Vect Q (YSymF ()), Vect Q (YSymF ())) -> Bool)
quickCheck (prop_CoalgebraMorphism leftLeafCompositionMap :: Vect Q (YSymF ()) -> Bool)
quickCheck (prop_HopfAlgebraMorphism leftLeafCompositionMap :: Vect Q (YSymF ()) -> Bool)
quickCheck (\x -> descentMap x == (leftLeafCompositionMap . descendingTreeMap) (x :: Vect Q SSymF))
quickCheck (prop_AlgebraMorphism symToQSymM :: (Q, Vect Q SymM, Vect Q SymM) -> Bool)
quickCheck (prop_CoalgebraMorphism symToQSymM :: Vect Q SymM -> Bool)
quickCheck (prop_HopfAlgebraMorphism symToQSymM :: Vect Q SymM -> Bool)
-- quickCheck (prop_AlgebraMorphism nsymToSSym :: (Q, Vect Q NSym, Vect Q NSym) -> Bool) -- too slow
quickCheck (prop_CoalgebraMorphism nsymToSSym :: Vect Q NSym -> Bool)
quickCheck (prop_HopfAlgebraMorphism nsymToSSym :: Vect Q NSym -> Bool)
quickCheck (prop_AlgebraMorphism nsymToSymH :: (Q, Vect Q NSym, Vect Q NSym) -> Bool)
quickCheck (prop_CoalgebraMorphism nsymToSymH :: Vect Q NSym -> Bool)
-- The map NSym -> Sym factors through the descent map SSym -> (YSym ->) QSym
quickCheck (\x -> (symToQSymM . symHtoM . nsymToSymH) x == (qsymFtoM . descentMap . nsymToSSym) (x :: Vect Q NSym))
-- Coalgebra morphisms showing that various Hopf algebras are cofree
quickCheck (prop_CoalgebraMorphism ysymmToSh :: Vect Q YSymM -> Bool)
-- Duality pairings
quickCheck (prop_HopfPairing :: (Vect Q SSymF, Vect Q SSymF, Vect Q (Dual SSymF), Vect Q (Dual SSymF)) -> Bool)
quickCheck (prop_HopfPairing :: (Vect Q SSymF, Vect Q SSymF, Vect Q SSymF, Vect Q SSymF) -> Bool)
quickCheck (prop_BialgebraPairing :: (Vect Q SymH, Vect Q SymH, Vect Q SymM, Vect Q SymM) -> Bool)
-- The above is in fact a Hopf pairing, but need to define a Hopf algebra instance for SymH
quickCheck (prop_HopfPairing :: (Vect Q NSym, Vect Q NSym, Vect Q QSymM, Vect Q QSymM) -> Bool)
-- A bialgebra pairing <A,B> gives a map A -> B*, u -> <u,.>
-- However, require that the pairing is non-degenerate in order to be injective, and also need to prove surjective
testlistCHA = TestList [
TestCase $ assertEqual "ysymMtoF" (ysymMtoF $ ysymM $ T (T E () E) () (T (T E () E) () E))
( ysymF (T (T E () E) () (T (T E () E) () E)) - ysymF (T (T E () E) () (T E () (T E () E)))
- ysymF (T E () (T E () (T (T E () E) () E))) + ysymF (T E () (T E () (T E () (T E () E)))) ), -- Loday.pdf, p10
TestCase $ assertEqual "leftLeafComposition" [2,3,2,1]
(leftLeafComposition $ T (T (T E 1 E) 2 (T (T E 3 E) 4 E)) 5 (T (T E 6 E) 7 (T E 8 E))), -- Loday.pdf, p6
TestCase $ assertEqual "mult QSymM" (qsymM [1,3] + qsymM [3,1] + qsymM [1,1,2] + qsymM [1,2,1] + qsymM [2,1,1])
(qsymM [2] * qsymM [1,1]), -- SSym.pdf, p5
TestCase $ assertEqual "mult QSymM" (qsymM [1,3] + qsymM [2,2] + 2*qsymM [1,1,2] + qsymM [1,2,1])
(qsymM [1] * qsymM [1,2]), -- SSym.pdf, p31
TestCase $ assertEqual "mult SSymF" (ssymM [1,2,4,3]+ssymM [1,3,4,2]+ssymM [1,4,2,3]+3*ssymM [1,4,3,2]+ssymM [2,3,4,1]+2*ssymM [2,4,3,1]
+ssymM [3,4,2,1]+ssymM [4,1,2,3]+2*ssymM [4,1,3,2]+ssymM [4,2,3,1]+ssymM [4,3,1,2])
(ssymM [1,2] * ssymM [2,1]), -- SSym.pdf, p15
TestCase $ assertEqual "ssymMtoF" (ssymF [4,1,2,3] - ssymF [4,1,3,2] - ssymF [4,2,1,3] + ssymF [4,3,2,1])
(ssymMtoF (ssymM [4,1,2,3])), -- SSym.pdf, p7
TestCase $ assertEqual "antipode NSym" (- nsym [1,1,1] + nsym [1,2] + nsym [2,1] - nsym [3])
(antipode $ nsym [3]) -- Hazewinkel p142
]