Skip to content

Commit 1d2553a

Browse files
committed
simulation: sim stats calculations now opt-in with --analize flag
1 parent 7d3fb4a commit 1d2553a

File tree

4 files changed

+87
-46
lines changed

4 files changed

+87
-46
lines changed

simulation/ouroboros-leios-sim.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ executable ols
178178
, base
179179
, containers
180180
, data-default
181+
, filepath
181182
, optparse-applicative
182183
, ouroboros-leios-sim
183184
, random

simulation/src/Diffusion.hs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,28 @@ stableChainHashes chains =
9393
in map blockHash $ Chain.toNewestFirst stable_chain
9494

9595
diffusionDataFromMap ::
96+
Bool ->
9697
Map NodeId StakeFraction ->
9798
Map id (msg, NodeId, Time, [(NodeId, Time)]) ->
9899
DiffusionData id
99-
diffusionDataFromMap stakes arrivals = DiffusionData{..}
100+
diffusionDataFromMap analize stakes arrivals = DiffusionData{..}
100101
where
101102
entries =
102103
[ DiffusionEntry{..}
103104
| (block_id, (_, NodeId node_id, Time created, ts)) <- Map.toList arrivals
104105
, let adoptions = map (second (\(Time t) -> t)) ts
105106
]
106-
latency_per_stake = map (diffusionEntryToLatencyPerStake stakes) entries
107+
latency_per_stake
108+
| analize = map (diffusionEntryToLatencyPerStake stakes) entries
109+
| otherwise = []
107110
avg ts = sum ts / fromIntegral (length ts)
108-
average_latencies =
109-
Map.map avg $
110-
Map.fromListWith
111-
(++)
112-
[ (p, [d])
113-
| l <- latency_per_stake
114-
, (Just d, p) <- l.latencies
115-
]
111+
average_latencies
112+
| analize =
113+
Map.map avg $
114+
Map.fromListWith
115+
(++)
116+
[ (p, [d])
117+
| l <- latency_per_stake
118+
, (Just d, p) <- l.latencies
119+
]
120+
| otherwise = Map.empty

simulation/src/LeiosProtocol/Short/VizSimP2P.hs

Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ module LeiosProtocol.Short.VizSimP2P where
1919
import Chan.Driver
2020
import Control.Arrow ((&&&))
2121
import Control.Exception
22+
import Control.Monad
2223
import Data.Aeson
2324
import Data.Array.Unboxed (Ix, UArray, accumArray, (!))
2425
import Data.Bifunctor
@@ -84,7 +85,6 @@ import PraosProtocol.ExamplesPraosP2P ()
8485
import PraosProtocol.PraosNode (PraosMessage (..))
8586
import Sample
8687
import SimTypes (LabelLink (LabelLink), LabelNode (LabelNode), NodeId (..), Point (..), World (..))
87-
import System.FilePath (dropExtension, (<.>))
8888
import System.Random (StdGen, uniformR)
8989
import System.Random.Stateful (mkStdGen)
9090
import 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)

simulation/src/Main.hs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Data.Aeson (eitherDecodeFileStrict')
1313
import Data.Default (Default (..))
1414
import Data.List (find)
1515
import qualified Data.Map as Map
16-
import Data.Maybe (fromMaybe)
16+
import Data.Maybe (fromMaybe, listToMaybe)
1717
import qualified ExamplesRelay
1818
import qualified ExamplesRelayP2P
1919
import qualified ExamplesTCP
@@ -64,6 +64,7 @@ import qualified PraosProtocol.VizSimChainSync as VizChainSync
6464
import qualified PraosProtocol.VizSimPraos as VizPraos
6565
import SimTypes
6666
import System.Exit (exitFailure)
67+
import System.FilePath
6768
import System.IO (hPutStrLn, stderr)
6869
import qualified System.Random as Random
6970
import TimeCompat
@@ -366,7 +367,15 @@ runSimOptions SimOptions{..} = case simCommand of
366367
let (rng1, rng2) = Random.split rng0
367368
config <- execConfigOptions configOptions
368369
p2pNetwork <- execTopologyOptions rng1 topologyOptions
369-
VizShortLeiosP2P.exampleSim (not skipLog) rng2 config p2pNetwork emitControl simOutputSeconds simOutputFile
370+
let outputCfg =
371+
VizShortLeiosP2P.SimOutputConfig
372+
{ logFile = listToMaybe [dropExtension simOutputFile <.> "log" | not skipLog]
373+
, emitControl
374+
, dataFile = Just simOutputFile
375+
, analize
376+
, stop = simOutputSeconds
377+
}
378+
VizShortLeiosP2P.exampleSim rng2 config p2pNetwork outputCfg
370379

371380
parserSimOptions :: Parser SimOptions
372381
parserSimOptions =
@@ -400,6 +409,7 @@ data SimCommand
400409
, topologyOptions :: TopologyOptions
401410
, emitControl :: Bool
402411
, skipLog :: Bool
412+
, analize :: Bool
403413
}
404414

405415
parserSimCommand :: Parser SimCommand
@@ -427,6 +437,7 @@ parserShortLeios =
427437
<*> parserTopologyOptions
428438
<*> switch (long "log-control" <> help "Include control messages in log.")
429439
<*> switch (long "no-log" <> help "Do not output event log.")
440+
<*> switch (long "analize" <> help "Calculate metrics and statistics.")
430441

431442
data ConfigOptions
432443
= LeiosConfigFile FilePath

0 commit comments

Comments
 (0)