packages feed

moonlight-category-0.1.0.0: bench/simplicial/SimplicialDelta.hs

module SimplicialDelta
  ( deltaBenchmarks,
  )
where

import Data.Function ((&))
import Moonlight.Category.Simplicial
  ( DeltaMorphism,
    allDeltaMorphisms,
    deltaCodomainDimension,
    deltaDomainDimension,
    deltaIdentity,
    deltaMapValues,
    normalInjection,
    normalSurjection,
    normalizeDeltaMorphism,
  )
import Numeric.Natural (Natural)
import SimplicialWeight (naturalListWeight, naturalWeight)
import Test.Tasty.Bench (Benchmark, bench, bgroup, nf)

deltaBenchmarks :: Benchmark
deltaBenchmarks =
  bgroup
    "operational Delta API"
    [ bgroup
        "allDeltaMorphisms"
        (dimensionPairs & fmap (\dimensions -> bench (dimensionPairLabel dimensions) (nf deltaEnumerationWeight dimensions))),
      bgroup
        "normalizeDeltaMorphism over allDeltaMorphisms"
        (dimensionPairs & fmap (\dimensions -> bench (dimensionPairLabel dimensions) (nf deltaNormalizationWeight dimensions))),
      bgroup
        "normalize identity"
        (identityDimensions & fmap (\dimension -> bench ("dimension=" <> show dimension) (nf normalizeIdentityWeight dimension)))
    ]

type DimensionPair = (Natural, Natural)

dimensionPairs :: [DimensionPair]
dimensionPairs =
  [ (3, 3),
    (4, 4),
    (5, 5),
    (6, 4)
  ]

identityDimensions :: [Natural]
identityDimensions =
  [ 128,
    512,
    2048
  ]

dimensionPairLabel :: DimensionPair -> String
dimensionPairLabel (domainDimension, codomainDimension) =
  "domain=" <> show domainDimension <> " codomain=" <> show codomainDimension

deltaEnumerationWeight :: DimensionPair -> Int
deltaEnumerationWeight (domainDimension, codomainDimension) =
  allDeltaMorphisms domainDimension codomainDimension
    & fmap deltaMorphismWeight
    & sum

deltaNormalizationWeight :: DimensionPair -> Int
deltaNormalizationWeight (domainDimension, codomainDimension) =
  allDeltaMorphisms domainDimension codomainDimension
    & fmap normalizedDeltaWeight
    & sum

normalizeIdentityWeight :: Natural -> Int
normalizeIdentityWeight =
  normalizedDeltaWeight . deltaIdentity

deltaMorphismWeight :: DeltaMorphism -> Int
deltaMorphismWeight morphism =
  naturalWeight (deltaDomainDimension morphism)
    + naturalWeight (deltaCodomainDimension morphism)
    + naturalListWeight (deltaMapValues morphism)

normalizedDeltaWeight :: DeltaMorphism -> Int
normalizedDeltaWeight morphism =
  maybe 0
    (\normalForm -> naturalListWeight (normalSurjection normalForm) + naturalListWeight (normalInjection normalForm))
    (normalizeDeltaMorphism morphism)