packages feed

smcdel-1.3.0: sizeExperiments/diningcryptographers.hs

{-# LANGUAGE AllowAmbiguousTypes, TypeApplications, ScopedTypeVariables #-}
module Main (main) where

import Data.List
import System.IO

import SMCDEL.Language
import SMCDEL.Symbolic.S5_CUDD as S5_CUDD
import SMCDEL.Symbolic.S5 as S5
import SMCDEL.Examples.DiningCrypto
import qualified SMCDEL.Examples.DiningCrypto.General as DC_Gen
import qualified SMCDEL.Internal.MyHaskCUDD as MyHaskCUDD
import SMCDEL.Internal.MyHaskCUDD

main :: IO ()
main = do
  hSetBuffering stdout NoBuffering
  gatherSizeData [3,5,7,9,11,13] [1]

genDcSizeCudd :: forall a b c . DdCtx a b c => Int -> Int -> IO [Int]
genDcSizeCudd n m = do
  startKns <- DC_Gen.genDcKnsInitCudd @a @b @c n m
  return $ map (\(S5_CUDD.KnS mgr _ lawb _) -> MyHaskCUDD.size mgr lawb) $
    updateSequence startKns [ genDcReveal n i | i <- [1..(n-1)] ]

genDcSizeCac :: Int -> Int -> [Int]
genDcSizeCac n m = map info $ updateSequence start fs  where
  start = DC_Gen.genDcKnsInit n m
  info (S5.KnS _ lawb _) = S5.size lawb
  fs = [ genDcReveal n i | i <- [1..(n-1)] ]

gatherSizeData :: [Int] -> [Int] -> IO ()
gatherSizeData ns ms = do
  putStrLn $ "Running DC benchmark for ns=" ++ show ns ++ " and ms=" ++ show ms ++ " and writing results to dining.dat ..."
  writeFile "dining.dat" $ "# Note: round -1 indicates the average.\n" ++ firstLine ++ "\n"
  mapM_ linesFor cases
  putStrLn "Done."
  where
    cases = [ (n, m) | n <- ns -- n many dining cryptographers
                     , m <- ms -- of which m are payers
                     , m <= n -- cannot have more payers than n
                     ]
    firstLine = intercalate "\t" $ ["n","m","round"] ++ map fst variants
    variants =
      -- label result columns with elimination rules, not i/o complements:
      [ ("BDD", \ n m -> return $ genDcSizeCac n m)
      , ("BDDc",  genDcSizeCudd @B @O1 @I1)
      , ("T0", genDcSizeCudd @Z @O1 @I1)
      , ("T1", genDcSizeCudd @Z @O0 @I1)
      , ("E0", genDcSizeCudd @Z @O1 @I0)
      , ("E1", genDcSizeCudd @Z @O0 @I0)
      ]
    linesFor (n,m) = do
      putStrLn $ "Running for (n,m) = " ++ show (n,m)
      results <- mapM ((\f -> f n m) . snd) variants
      appendFile "dining.dat" $ unlines $
        [ intercalate "\t" (show n : show m : show k : map (\xs -> show (xs !! k)) results)
        | k <- [0..(length (head results) - 1)] ]
        ++
        [ intercalate "\t" (show n : show m : "-1" : map (\xs -> show (fromIntegral (sum xs) / 4 :: Double)) results) ]