@@ -223,10 +223,21 @@ evalExpr env (VectorExpr exprs) = do
223
223
whnfs <- mapM (evalExpr env) exprs
224
224
case whnfs of
225
225
((Intermediate (ITensor (Tensor _ _ _))): _) -> do
226
- ret <- mapM toTensor whnfs >>= tConcat' >>= fromTensor
226
+ ret <- mapM toTensor ( map f $ zip whnfs [ 1 .. ( length exprs + 1 )]) >>= tConcat' >>= fromTensor
227
227
return ret
228
- _ -> do
229
- fromTensor (Tensor [fromIntegral (length whnfs)] (V. fromList whnfs) [] )
228
+ _ -> fromTensor (Tensor [fromIntegral $ length whnfs] (V. fromList whnfs) [] )
229
+ where
230
+ f ((Intermediate (ITensor (Tensor ns xs indices))), i) =
231
+ Intermediate $ ITensor $ Tensor ns (V. fromList $ map g $ zip (V. toList xs) $ map (\ ms -> map toEgison $ (toInteger i): ms) $ enumTensorIndices ns) indices
232
+ f (x, _) = x
233
+ g (Value (ScalarData (Div (Plus [Term 1 [(FunctionData fn argnames args js, 1 )]]) p)), ms) =
234
+ let Env _ maybe_vwi = env in
235
+ let fn' = case maybe_vwi of
236
+ Nothing -> fn
237
+ Just (VarWithIndices nameString indexList) ->
238
+ Just $ symbolScalarData " " $ show $ VarWithIndices nameString $ changeIndexList indexList ms in
239
+ Value $ ScalarData $ Div (Plus [Term 1 [(FunctionData fn' argnames args js, 1 )]]) p
240
+ g (x, _) = x
230
241
231
242
evalExpr env (TensorExpr nsExpr xsExpr supExpr subExpr) = do
232
243
nsWhnf <- evalExpr env nsExpr
@@ -690,11 +701,6 @@ evalExpr env (GenerateTensorExpr fnExpr sizeExpr) = do
690
701
applyFunc env fn (Value (makeTuple ms)))
691
702
(map (\ ms -> map toEgison ms) (enumTensorIndices ns))
692
703
fromTensor (Tensor ns (V. fromList xs) [] )
693
- where
694
- changeIndexList :: [Index String ] -> [EgisonValue ] -> [Index String ]
695
- changeIndexList idxlist ms = map (\ (i, m) -> case i of
696
- Superscript s -> Superscript (s ++ m)
697
- Subscript s -> Subscript (s ++ m)) $ zip idxlist (map show ms)
698
704
699
705
evalExpr env (TensorContractExpr fnExpr tExpr) = do
700
706
fn <- evalExpr env fnExpr
@@ -1007,6 +1013,7 @@ recursiveBind env bindings = do
1007
1013
let (names, exprs) = unzip bindings
1008
1014
refs <- replicateM (length bindings) $ newObjectRef nullEnv UndefinedExpr
1009
1015
let env' = extendEnv env $ makeBindings names refs
1016
+ let Env frame _ = env'
1010
1017
zipWithM_ (\ ref (name,expr) -> do
1011
1018
case expr of
1012
1019
MemoizedLambdaExpr names body -> do
@@ -1021,14 +1028,14 @@ recursiveBind env bindings = do
1021
1028
case whnf of
1022
1029
(Value (CFunc _ env arg body)) -> liftIO . writeIORef ref . WHNF $ (Value (CFunc (Just name) env arg body))
1023
1030
FunctionExpr args -> do
1024
- let Env frame _ = env'
1025
1031
liftIO . writeIORef ref . Thunk $ evalExpr (Env frame (Just $ varToVarWithIndices name)) $ FunctionExpr args
1026
- GenerateTensorExpr _ _ -> do
1027
- let Env frame _ = env'
1028
- liftIO . writeIORef ref . Thunk $ evalExpr (Env frame (Just $ varToVarWithIndices name)) $ expr
1029
- _ -> liftIO . writeIORef ref . Thunk $ evalExpr env' expr)
1032
+ _ | isVarWithIndices name -> liftIO . writeIORef ref . Thunk $ evalExpr (Env frame (Just $ varToVarWithIndices name)) expr
1033
+ | otherwise -> liftIO . writeIORef ref . Thunk $ evalExpr env' expr)
1030
1034
refs bindings
1031
1035
return env'
1036
+ where
1037
+ isVarWithIndices :: Var -> Bool
1038
+ isVarWithIndices (Var _ xs) = not $ null xs
1032
1039
1033
1040
recursiveRebind :: Env -> (Var , EgisonExpr ) -> EgisonM Env
1034
1041
recursiveRebind env (name, expr) = do
0 commit comments