packages feed

algebraic-edge-graphs-0.1.0: bench/Bench.hs

import Criterion.Main
import Data.Foldable

import EdgeGraph.Class
import EdgeGraph.Fold (Fold, deBruijn, gmap, edgeIntSet, edgeSet, nodeCount)

import qualified Data.IntSet as IntSet
import qualified Data.Set    as Set

digToInt :: [Int] -> Int
digToInt = foldl (\acc x -> acc * 10 + x) 0

-- | Count distinct edges in a Fold
el :: Ord a => Fold a -> Int
el = Set.size . edgeSet

-- | Count elements in the toList of a Fold
l :: Fold a -> Int
l = length . toList

-- | Count nodes in a Fold (via Incidence canonical form)
nc :: Ord a => Fold a -> Int
nc = nodeCount

-- | Count distinct edges in a Fold using IntSet
elInt :: Fold Int -> Int
elInt = IntSet.size . edgeIntSet

elDeBruijn :: Int -> Int
elDeBruijn n = el $ deBruijn n [0..9 :: Int]

lDeBruijn :: Int -> Int
lDeBruijn n = l $ deBruijn n [0..9 :: Int]

ncDeBruijn :: Int -> Int
ncDeBruijn n = nc $ deBruijn n [0..9 :: Int]

elIntDeBruijn :: Int -> Int
elIntDeBruijn n = elInt $ gmap digToInt $ deBruijn n [0..9 :: Int]

elClique :: Int -> Int
elClique n = el $ clique [1..n]

lClique :: Int -> Int
lClique n = l $ clique [1..n]

ncClique :: Int -> Int
ncClique n = nc $ clique [1..n]

elIntClique :: Int -> Int
elIntClique n = elInt $ clique [1..n]

main :: IO ()
main = defaultMain
  [ bgroup "elDeBruijn"
    [ bench "10^0" $ whnf elDeBruijn 0
    , bench "10^1" $ whnf elDeBruijn 1
    , bench "10^2" $ whnf elDeBruijn 2
    , bench "10^3" $ whnf elDeBruijn 3
    , bench "10^4" $ whnf elDeBruijn 4 ]
  , bgroup "lDeBruijn"
    [ bench "10^0" $ whnf lDeBruijn 0
    , bench "10^1" $ whnf lDeBruijn 1
    , bench "10^2" $ whnf lDeBruijn 2
    , bench "10^3" $ whnf lDeBruijn 3
    , bench "10^4" $ whnf lDeBruijn 4 ]
  , bgroup "ncDeBruijn"
    [ bench "10^0" $ whnf ncDeBruijn 0
    , bench "10^1" $ whnf ncDeBruijn 1
    , bench "10^2" $ whnf ncDeBruijn 2
    , bench "10^3" $ whnf ncDeBruijn 3
    , bench "10^4" $ whnf ncDeBruijn 4 ]
  , bgroup "elIntDeBruijn"
    [ bench "10^0" $ whnf elIntDeBruijn 0
    , bench "10^1" $ whnf elIntDeBruijn 1
    , bench "10^2" $ whnf elIntDeBruijn 2
    , bench "10^3" $ whnf elIntDeBruijn 3
    , bench "10^4" $ whnf elIntDeBruijn 4 ]
  , bgroup "elClique"
    [ bench "10^0" $ nf elClique 1
    , bench "10^1" $ nf elClique 10
    , bench "10^2" $ nf elClique 100
    , bench "10^3" $ nf elClique 1000]
  , bgroup "ncClique"
    [ bench "10^0" $ nf ncClique 1
    , bench "10^1" $ nf ncClique 10
    , bench "10^2" $ nf ncClique 100
    , bench "10^3" $ nf ncClique 1000]
  , bgroup "lClique"
    [ bench "10^0" $ nf lClique 1
    , bench "10^1" $ nf lClique 10
    , bench "10^2" $ nf lClique 100
    , bench "10^3" $ nf lClique 1000]
  , bgroup "elIntClique"
    [ bench "10^0" $ nf elIntClique 1
    , bench "10^1" $ nf elIntClique 10
    , bench "10^2" $ nf elIntClique 100
    , bench "10^3" $ nf elIntClique 1000] ]