diff options
Diffstat (limited to 'doc/design')
-rw-r--r-- | doc/design/assistant/syncing/simroutes.hs | 143 |
1 files changed, 117 insertions, 26 deletions
diff --git a/doc/design/assistant/syncing/simroutes.hs b/doc/design/assistant/syncing/simroutes.hs index 87e8781ba..b5e446b0b 100644 --- a/doc/design/assistant/syncing/simroutes.hs +++ b/doc/design/assistant/syncing/simroutes.hs @@ -17,7 +17,7 @@ import qualified Data.Map.Strict as M -} totalFiles :: Int -totalFiles = 10 +totalFiles = 100 -- How likely is a given file to be wanted by any particular node? probabilityFilesWanted :: Probability @@ -26,7 +26,7 @@ probabilityFilesWanted = 0.10 -- How many different locations can each transfer node move between? -- (Min, Max) transferDestinationsRange :: (Int, Int) -transferDestinationsRange = (2, 5) +transferDestinationsRange = (2, 3) -- Controls how likely transfer nodes are to move around in a given step -- of the simulation. @@ -54,7 +54,8 @@ numSteps :: Int numSteps = 100 -- IO code -main = putStrLn . summarize =<< evalRandIO (simulate numSteps =<< genNetwork) +--main = putStrLn . summarize =<< evalRandIO (simulate numSteps =<< genNetwork) +main = putStrLn . summarize =<< evalRandIO (simulate numSteps =<< mocambos) -- Only pure code below :) data Network = Network (M.Map NodeName ImmobileNode) [TransferNode] @@ -65,6 +66,8 @@ data ImmobileNode = ImmobileNode NodeRepo type NodeName = String +type Route = [NodeName] + data TransferNode = TransferNode { currentlocation :: NodeName , possiblelocations :: [NodeName] @@ -193,41 +196,44 @@ genNetwork :: (RandomGen g) => Rand g Network genNetwork = do l <- sequence (replicate numImmobileNodes mkImmobile) let immobiles = M.fromList (zip (map show [1..]) l) - transfers <- sequence (replicate numTransferNodes (mkTransfer immobiles)) + transfers <- sequence (replicate numTransferNodes (mkTransfer $ M.keys immobiles)) return $ Network immobiles transfers mkImmobile :: (RandomGen g) => Rand g ImmobileNode -mkImmobile = ImmobileNode <$> genrepo - where - genrepo = NodeRepo - -- The files this node wants. - -- Currently assumes each file is equally popular. - <$> sequence (replicate (truncate (fromIntegral totalFiles * probabilityFilesWanted)) randomRequest) - -- The files this node already has. - -- - -- We'll assume equal production, so split the total - -- number of files amoung the immobile nodes. - -- (This will produce some duplication of files - -- (consider birthday paradox), and some missing files.) - -- - -- TODO: Some immobile nodes are internet connected, - -- and these should all share their files automatically) - -- (Also when running the sim.) - <*> (S.fromList <$> sequence (replicate (totalFiles `div` numImmobileNodes) randomFile)) - -mkTransfer :: (RandomGen g) => M.Map NodeName ImmobileNode -> Rand g TransferNode +mkImmobile = ImmobileNode <$> mkImmobileRepo + +mkImmobileRepo :: (RandomGen g) => Rand g NodeRepo +mkImmobileRepo = NodeRepo + -- The files this node wants. + -- Currently assumes each file is equally popular. + <$> sequence (replicate (truncate (fromIntegral totalFiles * probabilityFilesWanted)) randomRequest) + -- The files this node already has. + -- + -- We'll assume equal production, so split the total + -- number of files amoung the immobile nodes. + -- (This will produce some duplication of files + -- (consider birthday paradox), and some missing files.) + -- + -- TODO: Some immobile nodes are internet connected, + -- and these should all share their files automatically) + -- (Also when running the sim.) + <*> (S.fromList <$> sequence (replicate (totalFiles `div` numImmobileNodes) randomFile)) + +mkTransfer :: (RandomGen g) => [NodeName] -> Rand g TransferNode mkTransfer immobiles = do -- Transfer nodes are given random routes. May be simplistic. -- Also, some immobile nodes will not be serviced by any transfer nodes. numpossiblelocs <- getRandomR transferDestinationsRange - possiblelocs <- sequence (replicate numpossiblelocs (randomfrom indexes)) + possiblelocs <- sequence (replicate numpossiblelocs (randomfrom immobiles)) + mkTransferBetween possiblelocs + +mkTransferBetween :: (RandomGen g) => [NodeName] -> Rand g TransferNode +mkTransferBetween possiblelocs = do currentloc <- randomfrom possiblelocs movefreq <- getRandomR transferMoveFrequencyRange -- transfer nodes start out with no files or requests in their repo let repo = (NodeRepo [] S.empty) return $ TransferNode currentloc possiblelocs movefreq repo - where - indexes = M.keys immobiles randomfrom :: (RandomGen g) => [a] -> Rand g a randomfrom l = do @@ -250,3 +256,88 @@ summarize (Network is _ts) = unlines $ map (\(d, s) -> d ++ ": " ++ s) in S.difference wantedfs (haveFiles r) repo (ImmobileNode r) = r overis f = map f $ M.elems is + +mocambos :: (RandomGen g) => Rand g Network +mocambos = do + major <- mapM (immobilenamed . fst) communities + minor <- mapM immobilenamed (concatMap snd communities) + majortransfer <- mapM mkTransferBetween majorroutes + minortransfer <- mapM mkTransferBetween (concatMap minorroutes communities) + return $ Network + (M.fromList (major++minor)) + (majortransfer ++ minortransfer) + where + immobilenamed name = do + node <- mkImmobile + return (name, node) + + -- As a simplification, this only makes 2 hop routes, between minor + -- and major communities; no 3-legged routes. + minorroutes :: (NodeName, [NodeName]) -> [Route] + minorroutes (major, minors) = map (\n -> [major, n]) minors + +communities :: [(NodeName, [NodeName])] +communities = + [ ("Tainá/SP", + [ "badtas" + , "vauedo ribera" + , "cofundo" + , "jao" + , "fazenda" + ] + ) + , ("Odomode/RS", + [ "moradadapaz" + , "pelotas" + ] + ) + , ("MercadoSul/DF", + [ "mesquito" + , "kalungos" + ] + ) + , ("Coco/PE", + [ "xambá" + , "alafin" + , "terreiaos" + ] + ) + , ("Linharinho/ES", + [ "monte alegne" + ] + ) + , ("Boneco/BA", + [ "barroso" + , "lagoa santa" + , "terravista" + ] + ) + , ("Zumbidospalmanes/NA", + [ "allantana" + ] + ) + , ("Casa Pneta/PA", + [ "marajó" + ] + ) + , ("Purarue/PA", + [ "oriaminá" + ] + ) + , ("Madiba/NET", []) + ] + +majorroutes :: [Route] +majorroutes = + -- person's routes + [ ["Tainá/SP", "Odomode/RS"] + , ["Tainá/SP", "MercadoSul/DF"] + , ["MercadoSul/DF", "Boneco/BA"] + , ["MercadoSul/DF", "Zumbidospalmanes/NA"] + , ["Zumbidospalmanes/NA", "Casa Pneta/PA"] + , ["Casa Pneta/PA", "Purarue/PA"] + , ["Casa Pneta/PA", "Linharinho/ES"] + , ["Boneco/BA", "Coco/PE"] + -- internet connections + , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"] + ] |