Skip to content

Commit 08bbeb7

Browse files
committed
implement pmap
1 parent 83cb86e commit 08bbeb7

File tree

4 files changed

+58
-8
lines changed

4 files changed

+58
-8
lines changed

hs-src/Language/Egison/Core.hs

+17-4
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ evalExpr env (ArrayExpr exprs) = do
204204
return . Intermediate . IArray $ Array.listArray (1, toInteger (length exprs)) refs'
205205

206206
evalExpr env (VectorExpr exprs) = do
207-
whnfs <- parallelMapM (evalExpr env) exprs
207+
whnfs <- mapM (evalExpr env) exprs
208208
case whnfs of
209209
((Intermediate (ITensor (Tensor _ _ _))):_) -> do
210210
ret <- mapM toTensor whnfs >>= tConcat' >>= fromTensor
@@ -216,7 +216,7 @@ evalExpr env (TensorExpr nsExpr xsExpr supExpr subExpr) = do
216216
nsWhnf <- evalExpr env nsExpr
217217
ns <- ((fromCollection nsWhnf >>= fromMList >>= mapM evalRef >>= mapM fromWHNF) :: EgisonM [Integer])
218218
xsWhnf <- evalExpr env xsExpr
219-
xs <- fromCollection xsWhnf >>= fromMList >>= parallelMapM evalRef
219+
xs <- fromCollection xsWhnf >>= fromMList >>= mapM evalRef
220220
supWhnf <- evalExpr env supExpr
221221
sup <- fromCollection supWhnf >>= fromMList >>= mapM evalRefDeep -- >>= mapM extractScalar'
222222
subWhnf <- evalExpr env subExpr
@@ -559,7 +559,7 @@ evalExpr env (GenerateTensorExpr fnExpr sizeExpr) = do
559559
size'' <- collectionToList size'
560560
ns <- (mapM fromEgison size'') :: EgisonM [Integer]
561561
fn <- evalExpr env fnExpr
562-
xs <- parallelMapM (\ms -> applyFunc env fn (Value (makeTuple ms))) (map (\ms -> map toEgison ms) (enumTensorIndices ns))
562+
xs <- mapM (\ms -> applyFunc env fn (Value (makeTuple ms))) (map (\ms -> map toEgison ms) (enumTensorIndices ns))
563563
case (ns, xs) of
564564
([1], x:[]) -> return $ x
565565
_ -> fromTensor (Tensor ns (V.fromList xs) [])
@@ -632,6 +632,19 @@ evalExpr env (TensorMap2Expr fnExpr t1Expr t2Expr) = do
632632
yRef <- newEvaluatedObjectRef y
633633
applyFunc env fn (Intermediate (ITuple [xRef, yRef]))
634634

635+
evalExpr env (ParExpr expr1 expr2) = undefined
636+
evalExpr env (PseqExpr expr1 expr2) = undefined
637+
638+
evalExpr env (PmapExpr fnExpr cExpr) = do
639+
fn <- evalExpr env fnExpr
640+
xs <- evalExpr env cExpr >>= collectionToList
641+
ys <- parallelMapM (applyFunc' env fn) xs
642+
return $ Value $ Collection (Sq.fromList ys)
643+
where
644+
applyFunc' :: Env -> WHNFData -> EgisonValue -> EgisonM EgisonValue
645+
applyFunc' env fn x = applyFunc env fn (Value x) >>= evalWHNF
646+
647+
635648
evalExpr _ SomethingExpr = return $ Value Something
636649
evalExpr _ UndefinedExpr = return $ Value Undefined
637650
evalExpr _ expr = throwError $ NotImplemented ("evalExpr for " ++ show expr)
@@ -682,7 +695,7 @@ evalWHNF (Intermediate (IStrHash refs)) = do
682695
evalWHNF (Intermediate (ITuple [ref])) = evalRefDeep ref
683696
evalWHNF (Intermediate (ITuple refs)) = Tuple <$> mapM evalRefDeep refs
684697
evalWHNF (Intermediate (ITensor (Tensor ns whnfs js))) = do
685-
vals <- parallelMapM evalWHNF (V.toList whnfs)
698+
vals <- mapM evalWHNF (V.toList whnfs)
686699
return $ TensorData $ Tensor ns (V.fromList vals) js
687700
-- vals <- mapM evalWHNF whnfs
688701
-- return $ TensorData $ Tensor ns vals js

hs-src/Language/Egison/Desugar.hs

+15
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,21 @@ desugar (TransposeExpr vars expr) = do
308308
expr' <- desugar expr
309309
return $ TransposeExpr vars' expr'
310310

311+
desugar (ParExpr expr1 expr2) = do
312+
expr1' <- desugar expr1
313+
expr2' <- desugar expr2
314+
return $ ParExpr expr1' expr2'
315+
316+
desugar (PseqExpr expr1 expr2) = do
317+
expr1' <- desugar expr1
318+
expr2' <- desugar expr2
319+
return $ PseqExpr expr1' expr2'
320+
321+
desugar (PmapExpr expr1 expr2) = do
322+
expr1' <- desugar expr1
323+
expr2' <- desugar expr2
324+
return $ PmapExpr expr1' expr2'
325+
311326
desugar (ApplyExpr expr0 expr1) = do
312327
expr0' <- desugar expr0
313328
expr1' <- desugar expr1

hs-src/Language/Egison/Parser.hs

+18
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@ expr' = (try partialExpr
238238
<|> tensorMapExpr
239239
<|> tensorMap2Expr
240240
<|> transposeExpr
241+
<|> parExpr
242+
<|> pseqExpr
243+
<|> pmapExpr
241244
)
242245
<?> "expression")
243246

@@ -560,6 +563,15 @@ tensorMap2Expr = keywordTensorMap2 >> TensorMap2Expr <$> expr <*> expr <*> expr
560563
transposeExpr :: Parser EgisonExpr
561564
transposeExpr = keywordTranspose >> TransposeExpr <$> expr <*> expr
562565

566+
parExpr :: Parser EgisonExpr
567+
parExpr = keywordPar >> ParExpr <$> expr <*> expr
568+
569+
pseqExpr :: Parser EgisonExpr
570+
pseqExpr = keywordPseq >> PseqExpr <$> expr <*> expr
571+
572+
pmapExpr :: Parser EgisonExpr
573+
pmapExpr = keywordPmap >> PmapExpr <$> expr <*> expr
574+
563575
-- Patterns
564576

565577
pattern :: Parser EgisonPattern
@@ -793,6 +805,9 @@ reservedKeywords =
793805
, "tensor-map"
794806
, "tensor-map2"
795807
, "transpose"
808+
, "par"
809+
, "pseq"
810+
, "pmap"
796811
, "something"
797812
, "undefined"]
798813

@@ -869,6 +884,9 @@ keywordTensorContract = reserved "contract"
869884
keywordTensorMap = reserved "tensor-map"
870885
keywordTensorMap2 = reserved "tensor-map2"
871886
keywordTranspose = reserved "transpose"
887+
keywordPar = reserved "par"
888+
keywordPseq = reserved "pseq"
889+
keywordPmap = reserved "pmap"
872890

873891
sign :: Num a => Parser (a -> a)
874892
sign = (char '-' >> return negate)

hs-src/Language/Egison/Types.hs

+8-4
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,10 @@ data EgisonExpr =
256256
| ArrayBoundsExpr EgisonExpr
257257
| ArrayRefExpr EgisonExpr EgisonExpr
258258

259+
| ParExpr EgisonExpr EgisonExpr
260+
| PseqExpr EgisonExpr EgisonExpr
261+
| PmapExpr EgisonExpr EgisonExpr
262+
259263
| GenerateTensorExpr EgisonExpr EgisonExpr
260264
| TensorExpr EgisonExpr EgisonExpr EgisonExpr EgisonExpr
261265
| TensorContractExpr EgisonExpr EgisonExpr
@@ -838,7 +842,7 @@ tTranspose' is t@(Tensor ns xs js) = do
838842

839843
tMap :: HasTensor a => (a -> EgisonM a) -> (Tensor a) -> EgisonM (Tensor a)
840844
tMap f (Tensor ns xs js) = do
841-
xs' <- parallelMapM f (V.toList xs) >>= return . V.fromList
845+
xs' <- mapM f (V.toList xs) >>= return . V.fromList
842846
t <- toTensor (V.head xs')
843847
case t of
844848
(Tensor ns1 _ js1) ->
@@ -848,9 +852,9 @@ tMap f (Scalar x) = f x >>= return . Scalar
848852

849853
tMapN :: HasTensor a => ([a] -> EgisonM a) -> [Tensor a] -> EgisonM (Tensor a)
850854
tMapN f ts@((Tensor ns xs js):_) = do
851-
xs' <- parallelMapM (\is -> mapM (tIntRef is) ts >>= mapM fromTensor >>= f) (enumTensorIndices ns)
855+
xs' <- mapM (\is -> mapM (tIntRef is) ts >>= mapM fromTensor >>= f) (enumTensorIndices ns)
852856
return $ Tensor ns (V.fromList xs') js
853-
tMapN f xs = parallelMapM fromTensor xs >>= f >>= return . Scalar
857+
tMapN f xs = mapM fromTensor xs >>= f >>= return . Scalar
854858

855859
tMap2 :: HasTensor a => (a -> a -> EgisonM a) -> Tensor a -> Tensor a -> EgisonM (Tensor a)
856860
tMap2 f t1@(Tensor ns1 xs1 js1) t2@(Tensor ns2 xs2 js2) = do
@@ -860,7 +864,7 @@ tMap2 f t1@(Tensor ns1 xs1 js1) t2@(Tensor ns2 xs2 js2) = do
860864
let cns = take (length cjs) (tSize t1')
861865
rts1 <- mapM (flip tIntRef t1') (enumTensorIndices cns)
862866
rts2 <- mapM (flip tIntRef t2') (enumTensorIndices cns)
863-
rts' <- parallelMapM (\(t1, t2) -> tProduct f t1 t2) (zip rts1 rts2)
867+
rts' <- mapM (\(t1, t2) -> tProduct f t1 t2) (zip rts1 rts2)
864868
let ret = Tensor (cns ++ (tSize (head rts'))) (V.concat (map tToVector rts')) (cjs ++ tIndex (head rts'))
865869
tTranspose (uniq (tDiagIndex (js1 ++ js2))) ret
866870
where

0 commit comments

Comments
 (0)