@@ -317,7 +317,7 @@ vizOptionsToViz VizCommandWithOptions{..} = case vizSubCommand of
317317 VizPraosP2P1 {.. } -> do
318318 let rng0 = Random. mkStdGen seed
319319 let (rng1, rng2) = Random. split rng0
320- p2pNetwork <- execTopologyOptions rng1 topologyOptions
320+ p2pNetwork <- execTopologyOptions def rng1 topologyOptions
321321 cfg <- execConfigOptions configOptions
322322 pure $ VizPraosP2P. example1 rng2 cfg p2pNetwork
323323 VizPraosP2P2 -> pure VizPraosP2P. example2
@@ -328,7 +328,7 @@ vizOptionsToViz VizCommandWithOptions{..} = case vizSubCommand of
328328 VizShortLeiosP2P1 {.. } -> do
329329 let rng0 = Random. mkStdGen seed
330330 let (rng1, rng2) = Random. split rng0
331- p2pNetwork <- execTopologyOptions rng1 topologyOptions
331+ p2pNetwork <- execTopologyOptions def rng1 topologyOptions
332332 cfg <- execConfigOptions configOptions
333333 pure $ VizShortLeiosP2P. example2 rng2 cfg p2pNetwork
334334
@@ -361,6 +361,7 @@ data SimOptions = SimOptions
361361 { simCommand :: SimCommand
362362 , simOutputSeconds :: Time
363363 , simOutputFile :: FilePath
364+ , simCheckTriangles :: WhetherToCheckTriangleInequality
364365 }
365366
366367runSimOptions :: SimOptions -> IO ()
@@ -369,14 +370,14 @@ runSimOptions SimOptions{..} = case simCommand of
369370 let rng0 = Random. mkStdGen seed
370371 let (rng1, rng2) = Random. split rng0
371372 config <- execConfigOptions configOptions
372- p2pNetwork <- execTopologyOptions rng1 topologyOptions
373+ p2pNetwork <- execTopologyOptions def rng1 topologyOptions
373374 -- let bandwidth = 10 * 125_000_000 :: Bytes -- 10 Gbps TODO: set in config
374375 VizPraosP2P. example1000Diffusion rng2 config p2pNetwork simOutputSeconds simOutputFile
375376 SimShortLeios {.. } -> do
376377 let rng0 = Random. mkStdGen seed
377378 let (rng1, rng2) = Random. split rng0
378379 config <- execConfigOptions configOptions
379- p2pNetwork <- execTopologyOptions rng1 topologyOptions
380+ p2pNetwork <- execTopologyOptions def rng1 topologyOptions
380381 let outputCfg =
381382 DataShortLeiosP2P. SimOutputConfig
382383 { logFile = do
@@ -413,6 +414,10 @@ parserSimOptions =
413414 <> metavar " FILE"
414415 <> help " Output simulation data to file."
415416 )
417+ <*> (fmap (WhetherToCheckTriangleInequality . not ) . switch)
418+ ( long " skip-triangle-inequality-check"
419+ <> help " Do not check the topology's latencies for the triangle inequality."
420+ )
416421
417422data SimCommand
418423 = SimPraosDiffusion
@@ -552,7 +557,7 @@ runCliOptions = \case
552557 -- Generate a random topology using the topology characteristics
553558 CliGenerateTopology {.. } -> do
554559 let rng = Random. mkStdGen seed
555- p2pNetwork@ P2PNetwork {.. } <- execTopologyGenerationOptions rng topologyGenerationOptions
560+ p2pNetwork@ P2PNetwork {.. } <- execTopologyGenerationOptions def rng topologyGenerationOptions
556561 let totalStake = fromIntegral $ 100 * Map. size p2pNodes
557562 writeTopology outputTopologyFile $ p2pNetworkToSomeTopology totalStake p2pNetwork
558563 CliReportData {.. } -> do
@@ -622,20 +627,21 @@ parserReportData =
622627-- Parsing Topography Options
623628--------------------------------------------------------------------------------
624629
625- execTopologyOptions :: Random. RandomGen g => g -> TopologyOptions -> IO P2PNetwork
626- execTopologyOptions rng = \ case
630+ execTopologyOptions :: Random. RandomGen g => WhetherToCheckTriangleInequality -> g -> TopologyOptions -> IO P2PNetwork
631+ execTopologyOptions skipTriangleInequalityCheck rng = \ case
627632 TopologyFile simpleTopologyFile -> do
628633 -- TODO: infer world size from latencies
629634 let world = World (1200 , 1000 ) Rectangle
630- validateP2PNetwork =<< readP2PTopographyFromSomeTopology defaultParams world simpleTopologyFile
631- TopologyGenerationOptions topologyGenerationOptions -> execTopologyGenerationOptions rng topologyGenerationOptions
635+ applyValidateP2PNetwork skipTriangleInequalityCheck =<< readP2PTopographyFromSomeTopology defaultParams world simpleTopologyFile
636+ TopologyGenerationOptions topologyGenerationOptions -> execTopologyGenerationOptions skipTriangleInequalityCheck rng topologyGenerationOptions
637+ where
632638
633- execTopologyGenerationOptions :: Random. RandomGen g => g -> TopologyGenerationOptions -> IO P2PNetwork
634- execTopologyGenerationOptions rng =
635- validateP2PNetwork <=< \ case
639+ execTopologyGenerationOptions :: Random. RandomGen g => WhetherToCheckTriangleInequality -> g -> TopologyGenerationOptions -> IO P2PNetwork
640+ execTopologyGenerationOptions skipTriangleInequalityCheck rng =
641+ applyValidateP2PNetwork skipTriangleInequalityCheck <=< \ case
636642 TopologyGenerationStrategyFile topologyGenerationStrategyFile ->
637643 eitherDecodeFileStrict' topologyGenerationStrategyFile >>= \ case
638- Right topologyGenerationStrategy -> execTopologyGenerationOptions rng (TopologyGenerationStrategy topologyGenerationStrategy)
644+ Right topologyGenerationStrategy -> execTopologyGenerationOptions skipTriangleInequalityCheck rng (TopologyGenerationStrategy topologyGenerationStrategy)
639645 Left errorMessage -> fail $ " Could not decode P2PTopographyCharacteristics from '" <> topologyGenerationStrategyFile <> " ':\n " <> errorMessage
640646 TopologyGenerationStrategy topologyGenerationStrategy -> generateTopology rng topologyGenerationStrategy
641647
@@ -646,6 +652,17 @@ data TopologyOptions
646652instance Default TopologyOptions where
647653 def = TopologyGenerationOptions def
648654
655+ -- | The check scales very poorly and is not critical, so it's sometimes very
656+ -- useful to skip
657+ newtype WhetherToCheckTriangleInequality = WhetherToCheckTriangleInequality Bool
658+
659+ instance Default WhetherToCheckTriangleInequality where
660+ def = WhetherToCheckTriangleInequality True
661+
662+ applyValidateP2PNetwork :: WhetherToCheckTriangleInequality -> P2PNetwork -> IO P2PNetwork
663+ applyValidateP2PNetwork (WhetherToCheckTriangleInequality flag) =
664+ if flag then validateP2PNetwork else pure
665+
649666parserTopologyOptions :: Parser TopologyOptions
650667parserTopologyOptions =
651668 asum
0 commit comments