@@ -19,6 +19,7 @@ module LeiosProtocol.Short.VizSimP2P where
1919import Chan.Driver
2020import Control.Arrow ((&&&) )
2121import Control.Exception
22+ import Control.Monad
2223import Data.Aeson
2324import Data.Array.Unboxed (Ix , UArray , accumArray , (!) )
2425import Data.Bifunctor
@@ -84,7 +85,6 @@ import PraosProtocol.ExamplesPraosP2P ()
8485import PraosProtocol.PraosNode (PraosMessage (.. ))
8586import Sample
8687import SimTypes (LabelLink (LabelLink ), LabelNode (LabelNode ), NodeId (.. ), Point (.. ), World (.. ))
87- import System.FilePath (dropExtension , (<.>) )
8888import System.Random (StdGen , uniformR )
8989import System.Random.Stateful (mkStdGen )
9090import Text.Printf (printf )
@@ -988,51 +988,75 @@ data LeiosData = LeiosData
988988 }
989989 deriving (Generic , ToJSON , FromJSON )
990990
991- exampleSim :: Bool -> StdGen -> OnDisk. Config -> P2PNetwork -> Bool -> Time -> FilePath -> IO ()
992- exampleSim doLog seed cfg p2pNetwork@ P2PNetwork {.. } emitControl stop@ (Time stop') fp = do
993- let trace = exampleTrace2 seed cfg p2pNetwork
994- let sampleModel =
991+ data SimOutputConfig = SimOutputConfig
992+ { logFile :: Maybe FilePath
993+ , emitControl :: Bool
994+ , dataFile :: Maybe FilePath
995+ , analize :: Bool
996+ , stop :: Time
997+ }
998+
999+ exampleSim :: StdGen -> OnDisk. Config -> P2PNetwork -> SimOutputConfig -> IO ()
1000+ exampleSim seed cfg p2pNetwork@ P2PNetwork {.. } SimOutputConfig {stop = stop@ (Time stop'), .. } = do
1001+ case dataFile of
1002+ Just fp ->
1003+ runModel
9951004 SampleModel
9961005 { initState = LeiosSimState IMap. empty Map. empty Map. empty Map. empty Map. empty Map. empty Map. empty
9971006 , accumState = \ t e s -> accumLeiosSimState t e s{chains = accumChains t e s. chains}
998- , renderState
1007+ , renderState = renderState fp
1008+ }
1009+ Nothing ->
1010+ runModel
1011+ SampleModel
1012+ { initState = ()
1013+ , accumState = \ _ _ s -> s
1014+ , renderState = const (return () )
9991015 }
1000- runSampleModel' traceFile (logLeiosEvent p2pNodeNames emitControl) sampleModel stop trace
10011016 where
1002- traceFile
1003- | doLog = Just (dropExtension fp <.> " log" )
1004- | otherwise = Nothing
1005- renderState LeiosSimState {.. } = do
1017+ runModel :: SampleModel LeiosEvent state -> IO ()
1018+ runModel model =
1019+ runSampleModel' logFile (logLeiosEvent p2pNodeNames emitControl) model stop $
1020+ exampleTrace2 seed cfg p2pNetwork
1021+ renderState fp LeiosSimState {.. } = do
10061022 let
1007- ib_diffusion = diffusionDataFromMap p2pNodeStakes ibDiffusionLatency
1008- eb_diffusion = diffusionDataFromMap p2pNodeStakes ebDiffusionLatency
1009- vt_diffusion = diffusionDataFromMap p2pNodeStakes voteDiffusionLatency
1010- rb_diffusion = coerce $ diffusionDataFromMap p2pNodeStakes rbDiffusionLatency
1023+ ib_diffusion = diffusionDataFromMap analize p2pNodeStakes ibDiffusionLatency
1024+ eb_diffusion = diffusionDataFromMap analize p2pNodeStakes ebDiffusionLatency
1025+ vt_diffusion = diffusionDataFromMap analize p2pNodeStakes voteDiffusionLatency
1026+ rb_diffusion = coerce $ diffusionDataFromMap analize p2pNodeStakes rbDiffusionLatency
10111027 stable_chain_hashes = coerce $ stableChainHashes chains
10121028 network = p2pNetworkToSomeTopology (fromIntegral $ Map. size p2pNodeStakes * 1000 ) p2pNetwork
1013- (cpuUseSegments, Map. toAscList -> cpuUseCdfAvg) =
1014- intervalsToSegmentsAndCdfAvg
1015- Set. toList
1016- (sum . ILMap. elems . fst )
1017- (realToFrac stop')
1018- nodeCpuUsage
10191029 config = cfg
1020- (transmittedBpsSegments, Map. toAscList -> transmittedBpsCdfAvg) =
1021- intervalsToSegmentsAndCdfAvg
1022- (uniformBins 20 )
1023- (\ (im, i) -> assert (all (`ILMap.subsumes` i) $ ILMap. keys im) $ msgsTransmittedToBps . fst $ (im, i))
1024- stop'
1025- (Map. map (. messagesTransmitted) dataTransmittedPerNode)
1026- (transmittedMsgsSegments, Map. toAscList -> transmittedMsgsCdfAvg) =
1027- intervalsToSegmentsAndCdfAvg
1028- Set. toList
1029- (length . ILMap. elems . fst )
1030- stop'
1031- (Map. map (. messagesTransmitted) dataTransmittedPerNode)
1030+ maybeDoAnalysis :: (b , [a ]) -> (b , [a ])
1031+ maybeDoAnalysis = if analize then id else second (const [] )
1032+ (cpuUseSegments, cpuUseCdfAvg) =
1033+ maybeDoAnalysis $
1034+ second Map. toAscList $
1035+ intervalsToSegmentsAndCdfAvg
1036+ Set. toList
1037+ (sum . ILMap. elems . fst )
1038+ (realToFrac stop')
1039+ nodeCpuUsage
1040+ (transmittedBpsSegments, transmittedBpsCdfAvg) =
1041+ maybeDoAnalysis $
1042+ second Map. toAscList $
1043+ intervalsToSegmentsAndCdfAvg
1044+ (uniformBins 20 )
1045+ (\ (im, i) -> assert (all (`ILMap.subsumes` i) $ ILMap. keys im) $ msgsTransmittedToBps . fst $ (im, i))
1046+ stop'
1047+ (Map. map (. messagesTransmitted) dataTransmittedPerNode)
1048+ (transmittedMsgsSegments, transmittedMsgsCdfAvg) =
1049+ maybeDoAnalysis $
1050+ second Map. toAscList $
1051+ intervalsToSegmentsAndCdfAvg
1052+ Set. toList
1053+ (length . ILMap. elems . fst )
1054+ stop'
1055+ (Map. map (. messagesTransmitted) dataTransmittedPerNode)
10321056 let diffusionData = LeiosData {.. }
10331057 encodeFile fp diffusionData
10341058 putStrLn $ " Data written to " ++ fp
1035- reportAll diffusionData
1059+ when analize $ reportAll diffusionData
10361060 reportAll LeiosData {.. } = do
10371061 sequence_ $
10381062 [ uncurry report (" IB" , ib_diffusion)
0 commit comments