packages feed

moonlight-category-0.1.0.0: bench/abstract/Adhesive/Symbolic.hs

module Adhesive.Symbolic
  ( symbolicFixtureBenchmarks,
  )
where

import AbstractFixtures
  ( BenchCategory (..),
    BenchMorphism (..),
    benchLeftCospanLeg,
    benchMorphism,
    benchMorphismWeight,
    benchMonicMatch,
    benchObjectWeight,
    benchRuleLeg,
  )
import BenchSupport (batchWeight, boolWeight, sampleBatch512)
import Moonlight.Category.Pure.Adhesive
  ( PBPOComplementWitness,
    PushoutComplementWitness,
    monicMatchArrow,
    pbpoComplement,
    pbpoComplementBorrowedLeg,
    pbpoComplementPullbackObject,
    pbpoComplementPullbackToBorrowed,
    pbpoComplementPullbackToMatch,
    pbpoComplementPushoutFromComplement,
    pbpoComplementPushoutFromMatch,
    pbpoComplementPushoutObject,
    pbpoComplementResidualLeg,
    pbpoPullbackSquareCommutes,
    pbpoPushoutSquareCommutes,
    pushoutComplement,
    pushoutComplementBorrowedLeg,
    pushoutComplementObject,
    pushoutComplementResidualLeg,
    pushoutComplementSquareCommutes,
    witnessMonic,
  )
import Moonlight.Category.Pure.Limits (pullback, pullbackMediator, pushout)
import Test.Tasty.Bench (Benchmark, bench, bgroup, nf)

symbolicFixtureBenchmarks :: Benchmark
symbolicFixtureBenchmarks =
  bgroup
    "symbolic constant fixture"
    [ symbolicLimitBenchmarks,
      symbolicAdhesiveBenchmarks,
      symbolicPBPObenchmarks
    ]

symbolicLimitBenchmarks :: Benchmark
symbolicLimitBenchmarks =
  bgroup
    "limits"
    [ bench "pullback witness batch x512" (nf (batchWeight pullbackWeight) sampleBatch512),
      bench "pullback mediator batch x512" (nf (batchWeight pullbackMediatorWeight) sampleBatch512),
      bench "pushout witness batch x512" (nf (batchWeight pushoutWeight) sampleBatch512)
    ]

symbolicAdhesiveBenchmarks :: Benchmark
symbolicAdhesiveBenchmarks =
  bgroup
    "adhesive"
    [ bench "witnessMonic batch x512" (nf (batchWeight monicWitnessWeight) sampleBatch512),
      bench "pushoutComplement witness batch x512" (nf (batchWeight pushoutComplementWeight) sampleBatch512),
      bench "pushoutComplement square commute check batch x512" (nf (batchWeight pushoutComplementCommuteWeight) sampleBatch512)
    ]

symbolicPBPObenchmarks :: Benchmark
symbolicPBPObenchmarks =
  bgroup
    "PBPO"
    [ bench "pbpoComplement witness batch x512" (nf (batchWeight pbpoComplementWeight) sampleBatch512),
      bench "pbpo pullback square commute check batch x512" (nf (batchWeight pbpoPullbackCommuteWeight) sampleBatch512),
      bench "pbpo pushout square commute check batch x512" (nf (batchWeight pbpoPushoutCommuteWeight) sampleBatch512)
    ]

pullbackWeight :: Int -> Int
pullbackWeight seed =
  seed + maybe 0 pullbackTripleWeight (pullback BenchCategory benchMonicMatch borrowedLeg)

pullbackMediatorWeight :: Int -> Int
pullbackMediatorWeight seed =
  seed + maybe 0 benchMorphismWeight (pullbackMediator BenchCategory benchMonicMatch borrowedLeg benchRuleLeg benchLeftCospanLeg)

pushoutWeight :: Int -> Int
pushoutWeight seed =
  seed + maybe 0 pushoutTripleWeight (pushout BenchCategory benchRuleLeg benchLeftCospanLeg)

monicWitnessWeight :: Int -> Int
monicWitnessWeight seed =
  seed + maybe 0 (benchMorphismWeight . monicMatchArrow) (witnessMonic BenchCategory benchMonicMatch)

pushoutComplementWeight :: Int -> Int
pushoutComplementWeight seed =
  seed + maybe 0 pushoutComplementWitnessWeight pushoutComplementWitnessValue

pushoutComplementCommuteWeight :: Int -> Int
pushoutComplementCommuteWeight seed =
  seed + maybe 0 (boolWeight . pushoutComplementSquareCommutes BenchCategory) pushoutComplementWitnessValue

pbpoComplementWeight :: Int -> Int
pbpoComplementWeight seed =
  seed + maybe 0 pbpoComplementWitnessWeight pbpoComplementWitnessValue

pbpoPullbackCommuteWeight :: Int -> Int
pbpoPullbackCommuteWeight seed =
  seed + maybe 0 (boolWeight . pbpoPullbackSquareCommutes BenchCategory) pbpoComplementWitnessValue

pbpoPushoutCommuteWeight :: Int -> Int
pbpoPushoutCommuteWeight seed =
  seed + maybe 0 (boolWeight . pbpoPushoutSquareCommutes BenchCategory) pbpoComplementWitnessValue

borrowedLeg :: BenchMorphism
borrowedLeg = benchMorphism (benchMorphismTarget benchLeftCospanLeg) (benchMorphismTarget benchMonicMatch)

pushoutComplementWitnessValue :: Maybe (PushoutComplementWitness BenchCategory)
pushoutComplementWitnessValue = do
  monicWitness <- witnessMonic BenchCategory benchMonicMatch
  pushoutComplement BenchCategory benchRuleLeg monicWitness

pbpoComplementWitnessValue :: Maybe (PBPOComplementWitness BenchCategory)
pbpoComplementWitnessValue = do
  monicWitness <- witnessMonic BenchCategory benchMonicMatch
  pbpoComplement BenchCategory benchRuleLeg monicWitness

pullbackTripleWeight :: (a, BenchMorphism, BenchMorphism) -> Int
pullbackTripleWeight (_, leftLeg, rightLeg) =
  benchMorphismWeight leftLeg + benchMorphismWeight rightLeg

pushoutTripleWeight :: (a, BenchMorphism, BenchMorphism) -> Int
pushoutTripleWeight (_, leftLeg, rightLeg) =
  benchMorphismWeight leftLeg + benchMorphismWeight rightLeg

pushoutComplementWitnessWeight :: PushoutComplementWitness BenchCategory -> Int
pushoutComplementWitnessWeight witness =
  benchObjectWeight (pushoutComplementObject witness)
    + benchMorphismWeight (pushoutComplementBorrowedLeg witness)
    + benchMorphismWeight (pushoutComplementResidualLeg witness)

pbpoComplementWitnessWeight :: PBPOComplementWitness BenchCategory -> Int
pbpoComplementWitnessWeight witness =
  benchObjectWeight (pbpoComplementPullbackObject witness)
    + benchMorphismWeight (pbpoComplementPullbackToBorrowed witness)
    + benchMorphismWeight (pbpoComplementPullbackToMatch witness)
    + benchObjectWeight (pbpoComplementPushoutObject witness)
    + benchMorphismWeight (pbpoComplementPushoutFromComplement witness)
    + benchMorphismWeight (pbpoComplementPushoutFromMatch witness)
    + benchMorphismWeight (pbpoComplementBorrowedLeg witness)
    + benchMorphismWeight (pbpoComplementResidualLeg witness)