packages feed

FiniteCategories-0.6.5.1: src/Math/FiniteCategories/CompositionGraph/Examples.hs

{-| Module  : FiniteCategories
Description : Examples of 'CompositionGraph's.
Copyright   : Guillaume Sabbagh 2023
License     : GPL-3
Maintainer  : guillaumesabbagh@protonmail.com
Stability   : experimental
Portability : portable

Examples of 'CompositionGraph's, other categories transformed into 'CompositionGraph's, a random example of 'CompositionGraph', a 'CompositionGraph' created from a string and a colimit of 'CompositionGraph's.

See also 'exampleCgdString' in Math.FiniteCategories.FunctorCategory.Examples for constructing diagrams of 'CompositionGraph's.
-}
module Math.FiniteCategories.CompositionGraph.Examples
(
    exampleCompositionGraph,
    exampleCompositionGraph2,
    exampleSetTransformedIntoACompositionGraph,
    example4TransformedIntoACompositionGraph,
    exampleRandomCompositionGraph,
    exampleCgString,
    exampleCgString2,
    exampleDiagramToCompositionGraphs,
    exampleColimitOfCompositionGraphs,
)
where
    import qualified Data.WeakSet as Set
    import Data.WeakSet.Safe
    import Data.WeakMap.Safe
    
    import Math.FiniteCategory
    import Math.Categories
    import Math.CocompleteCategory
    import Math.FiniteCategories
    import Math.FiniteCategories.FunctorCategory
    import Math.Categories.FinCat
    
    import Data.Text (pack , Text)
    
    import System.Random
    import Numeric.Natural
    
    -- | An example of 'CompositionGraph' constructed with the smart constructor 'compositionGraph'.
    exampleCompositionGraph :: CompositionGraph Int Char
    exampleCompositionGraph = result
        where
            Just underlyingGraph = graph (set [1,2,3]) (set [Arrow{sourceArrow=1,targetArrow=1,labelArrow='a'},Arrow{sourceArrow=1,targetArrow=2,labelArrow='b'},Arrow{sourceArrow=2,targetArrow=3,labelArrow='c'}])
            compositionLaw = weakMap [([Arrow{sourceArrow=1,targetArrow=1,labelArrow='a'},Arrow{sourceArrow=1,targetArrow=1,labelArrow='a'}],[Arrow{sourceArrow=1,targetArrow=1,labelArrow='a'}])]
            Right result = compositionGraph underlyingGraph compositionLaw
            
    -- | An example of 'CompositionGraph' constructed with the smart constructor 'unsafeCompositionGraph'.
    exampleCompositionGraph2 :: CompositionGraph Int Char
    exampleCompositionGraph2 = result
        where
            underlyingGraph = unsafeGraph (set [1,2]) (set [Arrow{sourceArrow=1,targetArrow=2,labelArrow='f'}])
            compositionLaw = weakMap []
            result = unsafeCompositionGraph underlyingGraph compositionLaw
            
    
    -- | The insertion diagram from S (the subcategory of Set containing all subsets of the set {'A','B'} as objects)  to the same category transformed into a 'CompositionGraph'.
    exampleSetTransformedIntoACompositionGraph :: Diagram (Ens Char) (Function Char) (Set.Set Char) (CompositionGraph (Set.Set Char) (Function Char)) (CGMorphism (Set.Set Char) (Function Char)) (Set.Set Char)
    exampleSetTransformedIntoACompositionGraph = finiteCategoryToCompositionGraph2 s
        where
            s = ens.(Set.powerSet).set $ "AB"
            
    -- | The insertion diagram from 4 to the same category transformed into a 'CompositionGraph'.
    example4TransformedIntoACompositionGraph :: Diagram NumberCategory NumberCategoryMorphism NumberCategoryObject (CompositionGraph NumberCategoryObject NumberCategoryMorphism) (CGMorphism NumberCategoryObject NumberCategoryMorphism) NumberCategoryObject
    example4TransformedIntoACompositionGraph = finiteCategoryToCompositionGraph2 (numberCategory 4)
    
    -- | An example of random 'CompositionGraph'.
    exampleRandomCompositionGraph :: CompositionGraph Int Int
    exampleRandomCompositionGraph = result
        where
            randomGen = mkStdGen 123456
            (result,newRandomGen) = defaultConstructRandomCompositionGraph randomGen
            
    -- | An example of 'CompositionGraph' read from a .cg string.
    exampleCgString :: CompositionGraph Text Text
    exampleCgString = cg
        where
            Right cg = readCGString "A -f-> B -g-> C = A -h-> C"
            
    -- | A second example of 'CompositionGraph' read from a .cg string.
    exampleCgString2 :: CompositionGraph Text Text
    exampleCgString2 = cg
        where
            Right cg = readCGString "A -f-> B\nB -g-> C\nC -h-> B\nB -g-> C -h-> B = <ID>\nC -h-> B -g-> C -h-> B -g-> C = C -h-> B -g-> C"
            
    -- | An example of 'Diagram' from 'Hat' to 'FinCat' of 'CompositionGraph's.  
    exampleDiagramToCompositionGraphs :: Diagram Hat HatAr HatOb (FinCat (CompositionGraph Text Text) (CGMorphism Text Text) Text) (FinFunctor (CompositionGraph Text Text) (CGMorphism Text Text) Text) (CompositionGraph Text Text)
    exampleDiagramToCompositionGraphs = completeDiagram diag
        where
            (Right cg1) = readCGString "A"
            (Right cg2) = readCGString "A\nB"
            (Right cg3) = readCGString "A\nC"
            f = completeDiagram Diagram{src = cg1, tgt = cg2, omap = weakMap [(pack "A", pack "A")], mmap = weakMap []}
            g = completeDiagram Diagram{src = cg1, tgt = cg3, omap = weakMap [(pack "A", pack "A")], mmap = weakMap []}
            diag = Diagram{src = Hat, tgt = FinCat, omap = weakMap [(HatA,cg1) , (HatB,cg2), (HatC, cg3)], mmap = weakMap [(HatF, f), (HatG, g)]}
            
    -- | An example of colimit of 'CompositionGraph's.
    exampleColimitOfCompositionGraphs = result
        where
            (Right cg1) = readCGString "A -f-> B\nB -g-> C"
            (Right cg2) = readCGString "1 -a-> 2\n 2 -b-> 3"
            (Right cg3) = readCGString "A1 -(gof)a-> C2"
            f = completeDiagram Diagram{src = cg3, tgt = cg1, omap = weakMap [(pack "A1", pack "A"),(pack "C2", pack "C")], mmap = weakMap [(anElement $ genAr cg3 (pack "A1") (pack "C2"), anElement $ ar cg1 (pack "A") (pack "C"))]}
            g = completeDiagram Diagram{src = cg3, tgt = cg2, omap = weakMap [(pack "A1", pack "1"),(pack "C2", pack "2")], mmap = weakMap [(anElement $ genAr cg3 (pack "A1") (pack "C2"), anElement $ ar cg2 (pack "1") (pack "2"))]}
            diag = completeDiagram Diagram{src = Hat, tgt = FinCat, omap = weakMap [(HatA,cg3) , (HatB,cg2), (HatC, cg1)], mmap = weakMap [(HatF, g), (HatG, f)]}
            result = colimitOfCompositionGraphs diag