Skip to content

Commit 310ddff

Browse files
make scatter partition payloads using routed trees
1 parent ddf8e2c commit 310ddff

4 files changed

Lines changed: 29 additions & 11 deletions

File tree

src/Tile/Execution.hs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import Control.Monad
1111
import Data.Map.Strict qualified as Map
1212
import Data.Set qualified as Set
1313
import Tile.Schedule
14+
import Tile.Tree (RoutedTree (..), scheduleTree, treeIndex, treeLabels)
1415

1516
runBroadcast :: Schedule String -> String -> IO ()
1617
runBroadcast schedule root = do
@@ -147,7 +148,8 @@ runScatter schedule initialValues root = do
147148
Set.toList $
148149
Set.fromList $
149150
Map.keys graph ++ concat (Map.elems graph) ++ map fst initialValues
150-
subtree = subtreeMembers graph
151+
RoutedTree routed = scheduleTree root schedule
152+
routedSubtrees = treeIndex routed
151153

152154
chanPairs <- forM members $ \m -> do
153155
ch <- newChan
@@ -164,13 +166,17 @@ runScatter schedule initialValues root = do
164166
| otherwise = Map.findWithDefault 0 m incoming
165167

166168
_ <- forkIO $ do
169+
-- Scatter schedules are normally trees, so this usually reads
170+
-- one payload. For a general schedule, merge all incoming
171+
-- payload fragments before forwarding.
167172
payload <- concat <$> replicateM expected (readChan inbox)
168173
case lookup m payload of
169174
Just value -> putStrLn $ m ++ " received scatter value: " ++ show value
170175
Nothing -> pure ()
171176

172177
forM_ childChans $ \(childName, childInbox) -> do
173-
let childMembers = subtree childName
178+
let childMembers =
179+
maybe Set.empty treeLabels (Map.lookup childName routedSubtrees)
174180
childPayload =
175181
[ item
176182
| item@(dest, _) <- payload,
@@ -182,11 +188,3 @@ runScatter schedule initialValues root = do
182188

183189
writeChan (chanMap Map.! root) initialValues
184190
threadDelay 1000000
185-
186-
subtreeMembers :: Map.Map String [String] -> String -> Set.Set String
187-
subtreeMembers graph member =
188-
Set.insert member $
189-
Set.unions
190-
[ subtreeMembers graph child
191-
| child <- Map.findWithDefault [] member graph
192-
]

src/Tile/Tree.hs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ module Tile.Tree
1717
Tree (..),
1818
mapTree,
1919
unfoldTree,
20+
treeLabels,
21+
treeIndex,
2022
renderTreeWith,
2123

2224
-- * Tile tree views
@@ -49,6 +51,7 @@ where
4951

5052
import Data.List (sortOn)
5153
import Data.Map.Strict qualified as Map
54+
import Data.Set qualified as Set
5255
import Tile.Geometry
5356
import Tile.Schedule
5457
import Tile.Tile
@@ -210,6 +213,16 @@ unfoldTree childrenOf label =
210213
subtrees = map (unfoldTree childrenOf) (childrenOf label)
211214
}
212215

216+
-- | Collect every label in a tree.
217+
treeLabels :: (Ord a) => Tree a -> Set.Set a
218+
treeLabels (Tree label kids) =
219+
Set.insert label (Set.unions (map treeLabels kids))
220+
221+
-- | Index every subtree by its root label.
222+
treeIndex :: (Ord a) => Tree a -> Map.Map a (Tree a)
223+
treeIndex tree@(Tree label kids) =
224+
Map.insert label tree (Map.unions (map treeIndex kids))
225+
213226
-- | Render a tree as an ASCII box-drawing string.
214227
renderTreeWith :: (a -> String) -> Tree a -> String
215228
renderTreeWith renderLabel tree =

test/Main.hs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module Main (main) where
22

33
import Data.List (sort)
4+
import Data.Map.Strict qualified as Map
5+
import Data.Set qualified as Set
46
import Test.Tasty
57
import Test.Tasty.HUnit
68
import Test.Tasty.QuickCheck
@@ -288,7 +290,11 @@ treeTests =
288290
]
289291
}
290292
]
291-
}
293+
},
294+
testCase "treeLabels collects subtree labels" $
295+
treeLabels sampleTree @?= Set.fromList [0, 1, 2, 3],
296+
testCase "treeIndex indexes every subtree by label" $
297+
Map.keysSet (treeIndex sampleTree) @?= Set.fromList [0, 1, 2, 3]
292298
]
293299
where
294300
sampleTree :: Tree Int

tile.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ test-suite tile-test
6666
main-is: Main.hs
6767
build-depends:
6868
base ^>=4.22.0.0,
69+
containers >=0.8 && <0.9,
6970
tile,
7071
tasty >=1.4,
7172
tasty-hunit >=0.10,

0 commit comments

Comments
 (0)