module Language.Egison.Type.TensorMapInsertion
( insertTensorMaps
) where
import Data.List (nub)
import Language.Egison.Data (EvalM)
import Language.Egison.EvalState (MonadEval(..))
import Language.Egison.IExpr (TIExpr(..), TIExprNode(..),
Var(..), tiExprType, tiScheme, tiExprNode)
import Language.Egison.Type.Env (ClassEnv)
import Language.Egison.Type.Tensor ()
import Language.Egison.Type.Types (Type(..), TypeScheme(..), Constraint(..), TyVar(..))
import Language.Egison.Type.Unify as Unify (unifyStrictWithConstraints)
shouldInsertTensorMap :: ClassEnv -> [Constraint] -> Type -> Type -> Bool
shouldInsertTensorMap :: ClassEnv -> [Constraint] -> Type -> Type -> Bool
shouldInsertTensorMap ClassEnv
classEnv [Constraint]
constraints Type
argType Type
paramType =
let isParamScalar :: Bool
isParamScalar = ClassEnv -> [Constraint] -> Type -> Bool
isPotentialScalarType ClassEnv
classEnv [Constraint]
constraints Type
paramType
freshVar :: TyVar
freshVar = String -> TyVar
TyVar String
"a_arg_check"
tensorType :: Type
tensorType = Type -> Type
TTensor (TyVar -> Type
TVar TyVar
freshVar)
isArgTensor :: Bool
isArgTensor = case ClassEnv -> [Constraint] -> Type -> Type -> Either UnifyError Subst
Unify.unifyStrictWithConstraints ClassEnv
classEnv [Constraint]
constraints Type
argType Type
tensorType of
Right Subst
_ -> Bool
True
Left UnifyError
_ -> Bool
False
in Bool
isParamScalar Bool -> Bool -> Bool
&& Bool
isArgTensor
unliftFunctionType :: Type -> Type
unliftFunctionType :: Type -> Type
unliftFunctionType (TFun (TTensor Type
paramType) Type
restType) =
Type -> Type -> Type
TFun Type
paramType (Type -> Type
unliftFunctionType Type
restType)
unliftFunctionType (TFun Type
paramType Type
restType) =
Type -> Type -> Type
TFun Type
paramType (Type -> Type
unliftFunctionType Type
restType)
unliftFunctionType (TTensor Type
returnType) = Type
returnType
unliftFunctionType Type
ty = Type
ty
getParamType :: Type -> Int -> Maybe Type
getParamType :: Type -> Int -> Maybe Type
getParamType (TFun Type
param Type
_) Int
0 = Type -> Maybe Type
forall a. a -> Maybe a
Just Type
param
getParamType (TFun Type
_ Type
rest) Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 = Type -> Int -> Maybe Type
getParamType Type
rest (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
getParamType Type
_ Int
_ = Maybe Type
forall a. Maybe a
Nothing
applyOneArgType :: Type -> Type
applyOneArgType :: Type -> Type
applyOneArgType (TFun Type
_ Type
rest) = Type
rest
applyOneArgType Type
t = Type
t
isPotentialScalarType :: ClassEnv -> [Constraint] -> Type -> Bool
isPotentialScalarType :: ClassEnv -> [Constraint] -> Type -> Bool
isPotentialScalarType ClassEnv
classEnv [Constraint]
constraints Type
ty =
let freshVar :: TyVar
freshVar = String -> TyVar
TyVar String
"a_scalar_check"
tensorType :: Type
tensorType = Type -> Type
TTensor (TyVar -> Type
TVar TyVar
freshVar)
in case ClassEnv -> [Constraint] -> Type -> Type -> Either UnifyError Subst
Unify.unifyStrictWithConstraints ClassEnv
classEnv [Constraint]
constraints Type
ty Type
tensorType of
Right Subst
_ -> Bool
False
Left UnifyError
_ -> Bool
True
shouldWrapWithTensorMap2 :: ClassEnv -> [Constraint] -> Type -> Bool
shouldWrapWithTensorMap2 :: ClassEnv -> [Constraint] -> Type -> Bool
shouldWrapWithTensorMap2 ClassEnv
classEnv [Constraint]
constraints Type
ty = case Type
ty of
TFun Type
param1 (TFun Type
param2 Type
_result) ->
ClassEnv -> [Constraint] -> Type -> Bool
isPotentialScalarType ClassEnv
classEnv [Constraint]
constraints Type
param1 Bool -> Bool -> Bool
&&
ClassEnv -> [Constraint] -> Type -> Bool
isPotentialScalarType ClassEnv
classEnv [Constraint]
constraints Type
param2
Type
_ -> Bool
False
wrapWithTensorMap2 :: [Constraint] -> TIExpr -> TIExpr
wrapWithTensorMap2 :: [Constraint] -> TIExpr -> TIExpr
wrapWithTensorMap2 [Constraint]
_constraints TIExpr
funcExpr =
let funcType :: Type
funcType = TIExpr -> Type
tiExprType TIExpr
funcExpr
in case Type
funcType of
TFun Type
param1 (TFun Type
param2 Type
result) ->
let
var1Name :: String
var1Name = String
"tmap2_arg1"
var2Name :: String
var2Name = String
"tmap2_arg2"
var1 :: Var
var1 = String -> [Index (Maybe Var)] -> Var
Var String
var1Name []
var2 :: Var
var2 = String -> [Index (Maybe Var)] -> Var
Var String
var2Name []
var1Scheme :: TypeScheme
var1Scheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] (Type -> Type
TTensor Type
param1)
var2Scheme :: TypeScheme
var2Scheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] (Type -> Type
TTensor Type
param2)
var1TI :: TIExpr
var1TI = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
var1Scheme (String -> TIExprNode
TIVarExpr String
var1Name)
var2TI :: TIExpr
var2TI = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
var2Scheme (String -> TIExprNode
TIVarExpr String
var2Name)
resultScheme :: TypeScheme
resultScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] (Type -> Type
TTensor Type
result)
innerNode :: TIExprNode
innerNode = TIExpr -> TIExpr -> TIExpr -> TIExprNode
TITensorMap2Expr TIExpr
funcExpr TIExpr
var1TI TIExpr
var2TI
innerExpr :: TIExpr
innerExpr = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
resultScheme TIExprNode
innerNode
lambdaType :: Type
lambdaType = Type -> Type -> Type
TFun (Type -> Type
TTensor Type
param1) (Type -> Type -> Type
TFun (Type -> Type
TTensor Type
param2) (Type -> Type
TTensor Type
result))
lambdaScheme :: TypeScheme
lambdaScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] Type
lambdaType
lambdaNode :: TIExprNode
lambdaNode = Maybe Var -> [Var] -> TIExpr -> TIExprNode
TILambdaExpr Maybe Var
forall a. Maybe a
Nothing [Var
var1, Var
var2] TIExpr
innerExpr
in TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
lambdaScheme TIExprNode
lambdaNode
Type
_ -> TIExpr
funcExpr
isAlreadyWrappedWithTensorMap2 :: TIExprNode -> Bool
isAlreadyWrappedWithTensorMap2 :: TIExprNode -> Bool
isAlreadyWrappedWithTensorMap2 (TILambdaExpr Maybe Var
_ [Var
_, Var
_] TIExpr
body) =
case TIExpr -> TIExprNode
tiExprNode TIExpr
body of
TITensorMap2Expr TIExpr
_ TIExpr
_ TIExpr
_ -> Bool
True
TIExprNode
_ -> Bool
False
isAlreadyWrappedWithTensorMap2 TIExprNode
_ = Bool
False
insertTensorMaps :: TIExpr -> EvalM TIExpr
insertTensorMaps :: TIExpr -> EvalM TIExpr
insertTensorMaps TIExpr
tiExpr = do
ClassEnv
classEnv <- StateT EvalState (ExceptT EgisonError RuntimeM) ClassEnv
forall (m :: * -> *). MonadEval m => m ClassEnv
getClassEnv
let scheme :: TypeScheme
scheme = TIExpr -> TypeScheme
tiScheme TIExpr
tiExpr
ClassEnv -> TypeScheme -> TIExpr -> EvalM TIExpr
insertTensorMapsInExpr ClassEnv
classEnv TypeScheme
scheme TIExpr
tiExpr
wrapBinaryFunctionIfNeeded :: ClassEnv -> [Constraint] -> TIExpr -> TIExpr
wrapBinaryFunctionIfNeeded :: ClassEnv -> [Constraint] -> TIExpr -> TIExpr
wrapBinaryFunctionIfNeeded ClassEnv
classEnv [Constraint]
constraints TIExpr
tiExpr =
let exprType :: Type
exprType = TIExpr -> Type
tiExprType TIExpr
tiExpr
node :: TIExprNode
node = TIExpr -> TIExprNode
tiExprNode TIExpr
tiExpr
in
if TIExprNode -> Bool
isAlreadyWrappedWithTensorMap2 TIExprNode
node
then TIExpr
tiExpr
else case TIExprNode
node of
TILambdaExpr Maybe Var
mVar [Var
var1, Var
var2] TIExpr
body
| ClassEnv -> [Constraint] -> Type -> Bool
shouldWrapWithTensorMap2 ClassEnv
classEnv [Constraint]
constraints Type
exprType ->
[Constraint]
-> Maybe Var -> Var -> Var -> TIExpr -> TIExpr -> TIExpr
wrapLambdaBodyWithTensorMap2 [Constraint]
constraints Maybe Var
mVar Var
var1 Var
var2 TIExpr
body TIExpr
tiExpr
TILambdaExpr {} -> TIExpr
tiExpr
TIApplyExpr {} -> TIExpr
tiExpr
TIExprNode
_ | ClassEnv -> [Constraint] -> Type -> Bool
shouldWrapWithTensorMap2 ClassEnv
classEnv [Constraint]
constraints Type
exprType ->
[Constraint] -> TIExpr -> TIExpr
wrapWithTensorMap2 [Constraint]
constraints TIExpr
tiExpr
| Bool
otherwise -> TIExpr
tiExpr
wrapLambdaBodyWithTensorMap2 :: [Constraint] -> Maybe Var -> Var -> Var -> TIExpr -> TIExpr -> TIExpr
wrapLambdaBodyWithTensorMap2 :: [Constraint]
-> Maybe Var -> Var -> Var -> TIExpr -> TIExpr -> TIExpr
wrapLambdaBodyWithTensorMap2 [Constraint]
constraints Maybe Var
mVar Var
var1 Var
var2 TIExpr
body TIExpr
originalExpr =
case TIExpr -> TIExprNode
tiExprNode TIExpr
body of
TIApplyExpr TIExpr
func [TIExpr]
args
| [TIExpr] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TIExpr]
args Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
2 ->
let arg1 :: TIExpr
arg1 = [TIExpr]
args [TIExpr] -> Int -> TIExpr
forall a. HasCallStack => [a] -> Int -> a
!! Int
0
arg2 :: TIExpr
arg2 = [TIExpr]
args [TIExpr] -> Int -> TIExpr
forall a. HasCallStack => [a] -> Int -> a
!! Int
1
resultType :: Type
resultType = TIExpr -> Type
tiExprType TIExpr
body
resultScheme :: TypeScheme
resultScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] Type
resultType
newBody :: TIExpr
newBody = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
resultScheme (TIExpr -> TIExpr -> TIExpr -> TIExprNode
TITensorMap2Expr TIExpr
func TIExpr
arg1 TIExpr
arg2)
(Forall [TyVar]
tvs [Constraint]
cs Type
lambdaType) = TIExpr -> TypeScheme
tiScheme TIExpr
originalExpr
newLambdaScheme :: TypeScheme
newLambdaScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [TyVar]
tvs ([Constraint]
constraints [Constraint] -> [Constraint] -> [Constraint]
forall a. [a] -> [a] -> [a]
++ [Constraint]
cs) Type
lambdaType
in TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
newLambdaScheme (Maybe Var -> [Var] -> TIExpr -> TIExprNode
TILambdaExpr Maybe Var
mVar [Var
var1, Var
var2] TIExpr
newBody)
TITensorMap2Expr {} -> TIExpr
originalExpr
TIExprNode
_ -> [Constraint] -> TIExpr -> TIExpr
wrapWithTensorMap2 [Constraint]
constraints TIExpr
originalExpr
insertTensorMapsInExpr :: ClassEnv -> TypeScheme -> TIExpr -> EvalM TIExpr
insertTensorMapsInExpr :: ClassEnv -> TypeScheme -> TIExpr -> EvalM TIExpr
insertTensorMapsInExpr ClassEnv
classEnv TypeScheme
scheme TIExpr
tiExpr = do
let (Forall [TyVar]
_vars [Constraint]
constraints Type
_ty) = TypeScheme
scheme
TIExprNode
expandedNode <- ClassEnv -> [Constraint] -> TIExprNode -> EvalM TIExprNode
insertInNode ClassEnv
classEnv [Constraint]
constraints (TIExpr -> TIExprNode
tiExprNode TIExpr
tiExpr)
TIExpr -> EvalM TIExpr
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExpr -> EvalM TIExpr) -> TIExpr -> EvalM TIExpr
forall a b. (a -> b) -> a -> b
$ TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
scheme TIExprNode
expandedNode
where
insertInNode :: ClassEnv -> [Constraint] -> TIExprNode -> EvalM TIExprNode
insertInNode :: ClassEnv -> [Constraint] -> TIExprNode -> EvalM TIExprNode
insertInNode ClassEnv
env [Constraint]
cs TIExprNode
node = case TIExprNode
node of
TIConstantExpr ConstantExpr
c -> TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ ConstantExpr -> TIExprNode
TIConstantExpr ConstantExpr
c
TIVarExpr String
name -> TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ String -> TIExprNode
TIVarExpr String
name
TILambdaExpr Maybe Var
mVar [Var]
params TIExpr
body -> do
let (Forall [TyVar]
_ [Constraint]
bodyConstraints Type
_) = TIExpr -> TypeScheme
tiScheme TIExpr
body
allConstraints :: [Constraint]
allConstraints = [Constraint]
cs [Constraint] -> [Constraint] -> [Constraint]
forall a. [a] -> [a] -> [a]
++ [Constraint]
bodyConstraints
TIExpr
body' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
allConstraints TIExpr
body
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ Maybe Var -> [Var] -> TIExpr -> TIExprNode
TILambdaExpr Maybe Var
mVar [Var]
params TIExpr
body'
TIApplyExpr TIExpr
func [TIExpr]
args -> do
TIExpr
func' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
func
[TIExpr]
args' <- (TIExpr -> EvalM TIExpr)
-> [TIExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs) [TIExpr]
args
let (Forall [TyVar]
_ [Constraint]
funcConstraints Type
_) = TIExpr -> TypeScheme
tiScheme TIExpr
func'
baseConstraints :: [Constraint]
baseConstraints = [Constraint]
cs [Constraint] -> [Constraint] -> [Constraint]
forall a. [a] -> [a] -> [a]
++ [Constraint]
funcConstraints
wrapArg :: TIExpr -> TIExpr
wrapArg TIExpr
arg =
let (Forall [TyVar]
_ [Constraint]
argConstraints Type
_) = TIExpr -> TypeScheme
tiScheme TIExpr
arg
argAllConstraints :: [Constraint]
argAllConstraints = [Constraint] -> [Constraint]
forall a. Eq a => [a] -> [a]
nub ([Constraint]
baseConstraints [Constraint] -> [Constraint] -> [Constraint]
forall a. [a] -> [a] -> [a]
++ [Constraint]
argConstraints)
in ClassEnv -> [Constraint] -> TIExpr -> TIExpr
wrapBinaryFunctionIfNeeded ClassEnv
env [Constraint]
argAllConstraints TIExpr
arg
args'' :: [TIExpr]
args'' = (TIExpr -> TIExpr) -> [TIExpr] -> [TIExpr]
forall a b. (a -> b) -> [a] -> [b]
map TIExpr -> TIExpr
wrapArg [TIExpr]
args'
let funcType :: Type
funcType = TIExpr -> Type
tiExprType TIExpr
func'
argTypes :: [Type]
argTypes = (TIExpr -> Type) -> [TIExpr] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map TIExpr -> Type
tiExprType [TIExpr]
args''
Maybe TIExprNode
result <- ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM (Maybe TIExprNode)
wrapWithTensorMapIfNeeded ClassEnv
env [Constraint]
baseConstraints TIExpr
func' Type
funcType [TIExpr]
args'' [Type]
argTypes
case Maybe TIExprNode
result of
Just TIExprNode
wrappedNode -> TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return TIExprNode
wrappedNode
Maybe TIExprNode
Nothing -> TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> [TIExpr] -> TIExprNode
TIApplyExpr TIExpr
func' [TIExpr]
args''
TITupleExpr [TIExpr]
exprs -> do
[TIExpr]
exprs' <- (TIExpr -> EvalM TIExpr)
-> [TIExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs) [TIExpr]
exprs
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [TIExpr] -> TIExprNode
TITupleExpr [TIExpr]
exprs'
TICollectionExpr [TIExpr]
exprs -> do
[TIExpr]
exprs' <- (TIExpr -> EvalM TIExpr)
-> [TIExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs) [TIExpr]
exprs
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [TIExpr] -> TIExprNode
TICollectionExpr [TIExpr]
exprs'
TIConsExpr TIExpr
h TIExpr
t -> do
TIExpr
h' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
h
TIExpr
t' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
t
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExprNode
TIConsExpr TIExpr
h' TIExpr
t'
TIJoinExpr TIExpr
l TIExpr
r -> do
TIExpr
l' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
l
TIExpr
r' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
r
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExprNode
TIJoinExpr TIExpr
l' TIExpr
r'
TIHashExpr [(TIExpr, TIExpr)]
pairs -> do
[(TIExpr, TIExpr)]
pairs' <- ((TIExpr, TIExpr)
-> StateT
EvalState (ExceptT EgisonError RuntimeM) (TIExpr, TIExpr))
-> [(TIExpr, TIExpr)]
-> StateT
EvalState (ExceptT EgisonError RuntimeM) [(TIExpr, TIExpr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(TIExpr
k, TIExpr
v) -> do
TIExpr
k' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
k
TIExpr
v' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
v
(TIExpr, TIExpr)
-> StateT EvalState (ExceptT EgisonError RuntimeM) (TIExpr, TIExpr)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExpr
k', TIExpr
v')) [(TIExpr, TIExpr)]
pairs
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [(TIExpr, TIExpr)] -> TIExprNode
TIHashExpr [(TIExpr, TIExpr)]
pairs'
TIVectorExpr [TIExpr]
exprs -> do
[TIExpr]
exprs' <- (TIExpr -> EvalM TIExpr)
-> [TIExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs) [TIExpr]
exprs
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [TIExpr] -> TIExprNode
TIVectorExpr [TIExpr]
exprs'
TIIfExpr TIExpr
cond TIExpr
thenExpr TIExpr
elseExpr -> do
TIExpr
cond' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
cond
TIExpr
thenExpr' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
thenExpr
TIExpr
elseExpr' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
elseExpr
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExpr -> TIExprNode
TIIfExpr TIExpr
cond' TIExpr
thenExpr' TIExpr
elseExpr'
TILetExpr [TIBindingExpr]
bindings TIExpr
body -> do
[TIBindingExpr]
bindings' <- (TIBindingExpr
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIBindingExpr)
-> [TIBindingExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIBindingExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(IPrimitiveDataPattern
v, TIExpr
e) -> do
TIExpr
e' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
e
TIBindingExpr
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIBindingExpr
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (IPrimitiveDataPattern
v, TIExpr
e')) [TIBindingExpr]
bindings
TIExpr
body' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
body
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [TIBindingExpr] -> TIExpr -> TIExprNode
TILetExpr [TIBindingExpr]
bindings' TIExpr
body'
TILetRecExpr [TIBindingExpr]
bindings TIExpr
body -> do
[TIBindingExpr]
bindings' <- (TIBindingExpr
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIBindingExpr)
-> [TIBindingExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIBindingExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(IPrimitiveDataPattern
v, TIExpr
e) -> do
TIExpr
e' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
e
TIBindingExpr
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIBindingExpr
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (IPrimitiveDataPattern
v, TIExpr
e')) [TIBindingExpr]
bindings
TIExpr
body' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
body
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [TIBindingExpr] -> TIExpr -> TIExprNode
TILetRecExpr [TIBindingExpr]
bindings' TIExpr
body'
TISeqExpr TIExpr
e1 TIExpr
e2 -> do
TIExpr
e1' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
e1
TIExpr
e2' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
e2
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExprNode
TISeqExpr TIExpr
e1' TIExpr
e2'
TIMatchExpr PMMode
mode TIExpr
target TIExpr
matcher [TIMatchClause]
clauses -> do
TIExpr
target' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
target
TIExpr
matcher' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
matcher
[TIMatchClause]
clauses' <- (TIMatchClause
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIMatchClause)
-> [TIMatchClause]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIMatchClause]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(TIPattern
pat, TIExpr
body) -> do
TIExpr
body' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
body
TIMatchClause
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIMatchClause
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIPattern
pat, TIExpr
body')) [TIMatchClause]
clauses
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ PMMode -> TIExpr -> TIExpr -> [TIMatchClause] -> TIExprNode
TIMatchExpr PMMode
mode TIExpr
target' TIExpr
matcher' [TIMatchClause]
clauses'
TIMatchAllExpr PMMode
mode TIExpr
target TIExpr
matcher [TIMatchClause]
clauses -> do
TIExpr
target' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
target
TIExpr
matcher' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
matcher
[TIMatchClause]
clauses' <- (TIMatchClause
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIMatchClause)
-> [TIMatchClause]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIMatchClause]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(TIPattern
pat, TIExpr
body) -> do
TIExpr
body' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
body
TIMatchClause
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIMatchClause
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIPattern
pat, TIExpr
body')) [TIMatchClause]
clauses
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ PMMode -> TIExpr -> TIExpr -> [TIMatchClause] -> TIExprNode
TIMatchAllExpr PMMode
mode TIExpr
target' TIExpr
matcher' [TIMatchClause]
clauses'
TIMemoizedLambdaExpr [String]
vars TIExpr
body -> do
TIExpr
body' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
body
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [String] -> TIExpr -> TIExprNode
TIMemoizedLambdaExpr [String]
vars TIExpr
body'
TICambdaExpr String
var TIExpr
body -> do
TIExpr
body' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
body
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ String -> TIExpr -> TIExprNode
TICambdaExpr String
var TIExpr
body'
TIWithSymbolsExpr [String]
syms TIExpr
body -> do
TIExpr
body' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
body
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [String] -> TIExpr -> TIExprNode
TIWithSymbolsExpr [String]
syms TIExpr
body'
TIDoExpr [TIBindingExpr]
bindings TIExpr
body -> do
[TIBindingExpr]
bindings' <- (TIBindingExpr
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIBindingExpr)
-> [TIBindingExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIBindingExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\(IPrimitiveDataPattern
v, TIExpr
e) -> do
TIExpr
e' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
e
TIBindingExpr
-> StateT EvalState (ExceptT EgisonError RuntimeM) TIBindingExpr
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (IPrimitiveDataPattern
v, TIExpr
e')) [TIBindingExpr]
bindings
TIExpr
body' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
body
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [TIBindingExpr] -> TIExpr -> TIExprNode
TIDoExpr [TIBindingExpr]
bindings' TIExpr
body'
TITensorMapExpr TIExpr
func TIExpr
tensor -> do
TIExpr
func' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
func
TIExpr
tensor' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
tensor
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExprNode
TITensorMapExpr TIExpr
func' TIExpr
tensor'
TITensorMap2Expr TIExpr
func TIExpr
t1 TIExpr
t2 -> do
TIExpr
func' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
func
TIExpr
t1' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
t1
TIExpr
t2' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
t2
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExpr -> TIExprNode
TITensorMap2Expr TIExpr
func' TIExpr
t1' TIExpr
t2'
TITensorMap2WedgeExpr TIExpr
func TIExpr
t1 TIExpr
t2 -> do
TIExpr
func' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
func
TIExpr
t1' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
t1
TIExpr
t2' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
t2
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExpr -> TIExprNode
TITensorMap2WedgeExpr TIExpr
func' TIExpr
t1' TIExpr
t2'
TIGenerateTensorExpr TIExpr
func TIExpr
shape -> do
TIExpr
func' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
func
TIExpr
shape' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
shape
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExprNode
TIGenerateTensorExpr TIExpr
func' TIExpr
shape'
TITensorExpr TIExpr
shape TIExpr
elems -> do
TIExpr
shape' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
shape
TIExpr
elems' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
elems
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExprNode
TITensorExpr TIExpr
shape' TIExpr
elems'
TITensorContractExpr TIExpr
tensor -> do
TIExpr
tensor' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
tensor
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExprNode
TITensorContractExpr TIExpr
tensor'
TITransposeExpr TIExpr
perm TIExpr
tensor -> do
TIExpr
perm' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
perm
TIExpr
tensor' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
tensor
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExprNode
TITransposeExpr TIExpr
perm' TIExpr
tensor'
TIFlipIndicesExpr TIExpr
tensor -> do
TIExpr
tensor' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
tensor
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExprNode
TIFlipIndicesExpr TIExpr
tensor'
TIQuoteExpr TIExpr
e -> do
TIExpr
e' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
e
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExprNode
TIQuoteExpr TIExpr
e'
TIQuoteSymbolExpr TIExpr
e -> do
TIExpr
e' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
e
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExprNode
TIQuoteSymbolExpr TIExpr
e'
TISubrefsExpr Bool
b TIExpr
base TIExpr
ref -> do
TIExpr
base' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
base
TIExpr
ref' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
ref
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ Bool -> TIExpr -> TIExpr -> TIExprNode
TISubrefsExpr Bool
b TIExpr
base' TIExpr
ref'
TISuprefsExpr Bool
b TIExpr
base TIExpr
ref -> do
TIExpr
base' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
base
TIExpr
ref' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
ref
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ Bool -> TIExpr -> TIExpr -> TIExprNode
TISuprefsExpr Bool
b TIExpr
base' TIExpr
ref'
TIUserrefsExpr Bool
b TIExpr
base TIExpr
ref -> do
TIExpr
base' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
base
TIExpr
ref' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
ref
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ Bool -> TIExpr -> TIExpr -> TIExprNode
TIUserrefsExpr Bool
b TIExpr
base' TIExpr
ref'
TIInductiveDataExpr String
name [TIExpr]
exprs -> do
[TIExpr]
exprs' <- (TIExpr -> EvalM TIExpr)
-> [TIExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs) [TIExpr]
exprs
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ String -> [TIExpr] -> TIExprNode
TIInductiveDataExpr String
name [TIExpr]
exprs'
TIMatcherExpr [TIPatternDef]
patDefs -> TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [TIPatternDef] -> TIExprNode
TIMatcherExpr [TIPatternDef]
patDefs
TIIndexedExpr Bool
override TIExpr
base [Index TIExpr]
indices -> do
TIExpr
base' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
base
[Index TIExpr]
indices' <- (Index TIExpr
-> StateT EvalState (ExceptT EgisonError RuntimeM) (Index TIExpr))
-> [Index TIExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [Index TIExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((TIExpr -> EvalM TIExpr)
-> Index TIExpr
-> StateT EvalState (ExceptT EgisonError RuntimeM) (Index TIExpr)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Index a -> f (Index b)
traverse (\TIExpr
tiexpr -> ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
tiexpr)) [Index TIExpr]
indices
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ Bool -> TIExpr -> [Index TIExpr] -> TIExprNode
TIIndexedExpr Bool
override TIExpr
base' [Index TIExpr]
indices'
TIWedgeApplyExpr TIExpr
func [TIExpr]
args -> do
TIExpr
func' <- ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs TIExpr
func
[TIExpr]
args' <- (TIExpr -> EvalM TIExpr)
-> [TIExpr]
-> StateT EvalState (ExceptT EgisonError RuntimeM) [TIExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
cs) [TIExpr]
args
let funcType :: Type
funcType = TIExpr -> Type
tiExprType TIExpr
func'
isNonTensorType :: Type -> Bool
isNonTensorType Type
ty = case Type
ty of
TTensor Type
_ -> Bool
False
Type
_ -> Bool
True
isScalarFunction :: Bool
isScalarFunction = case Type
funcType of
TFun Type
param1 (TFun Type
param2 Type
_result) ->
Type -> Bool
isNonTensorType Type
param1 Bool -> Bool -> Bool
&& Type -> Bool
isNonTensorType Type
param2
Type
_ -> Bool
False
if Bool
isScalarFunction Bool -> Bool -> Bool
&& [TIExpr] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TIExpr]
args' Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
2
then do
let [TIExpr
arg1, TIExpr
arg2] = [TIExpr]
args'
(Forall [TyVar]
tvs [Constraint]
funcConstraints Type
_) = TIExpr -> TypeScheme
tiScheme TIExpr
func'
unliftedFuncType :: Type
unliftedFuncType = Type -> Type
unliftFunctionType Type
funcType
unliftedFunc :: TIExpr
unliftedFunc = TypeScheme -> TIExprNode -> TIExpr
TIExpr ([TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [TyVar]
tvs [Constraint]
funcConstraints Type
unliftedFuncType) (TIExpr -> TIExprNode
tiExprNode TIExpr
func')
resultType :: Type
resultType = case Type
funcType of
TFun Type
_ (TFun Type
_ Type
res) -> Type -> Type
TTensor Type
res
Type
_ -> Type
funcType
tensorMap2WedgeScheme :: TypeScheme
tensorMap2WedgeScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [Constraint]
cs Type
resultType
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExpr -> TIExprNode
TITensorMap2WedgeExpr TIExpr
unliftedFunc TIExpr
arg1 TIExpr
arg2
else
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> [TIExpr] -> TIExprNode
TIWedgeApplyExpr TIExpr
func' [TIExpr]
args'
TIFunctionExpr [String]
names -> TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ [String] -> TIExprNode
TIFunctionExpr [String]
names
insertTensorMapsWithConstraints :: ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints :: ClassEnv -> [Constraint] -> TIExpr -> EvalM TIExpr
insertTensorMapsWithConstraints ClassEnv
env [Constraint]
contextConstraints TIExpr
expr = do
let (Forall [TyVar]
tvs [Constraint]
exprConstraints Type
ty) = TIExpr -> TypeScheme
tiScheme TIExpr
expr
mergedConstraints :: [Constraint]
mergedConstraints = [Constraint] -> [Constraint]
forall a. Eq a => [a] -> [a]
nub ([Constraint]
contextConstraints [Constraint] -> [Constraint] -> [Constraint]
forall a. [a] -> [a] -> [a]
++ [Constraint]
exprConstraints)
mergedScheme :: TypeScheme
mergedScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [TyVar]
tvs [Constraint]
mergedConstraints Type
ty
ClassEnv -> TypeScheme -> TIExpr -> EvalM TIExpr
insertTensorMapsInExpr ClassEnv
env TypeScheme
mergedScheme TIExpr
expr
wrapWithTensorMapIfNeeded :: ClassEnv -> [Constraint] -> TIExpr -> Type -> [TIExpr] -> [Type] -> EvalM (Maybe TIExprNode)
wrapWithTensorMapIfNeeded :: ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM (Maybe TIExprNode)
wrapWithTensorMapIfNeeded ClassEnv
classEnv [Constraint]
constraints TIExpr
func Type
funcType [TIExpr]
args [Type]
argTypes = do
let checks :: [Bool]
checks = (Type -> Int -> Bool) -> [Type] -> [Int] -> [Bool]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\Type
argType Int
idx ->
case Type -> Int -> Maybe Type
getParamType Type
funcType Int
idx of
Just Type
paramType -> ClassEnv -> [Constraint] -> Type -> Type -> Bool
shouldInsertTensorMap ClassEnv
classEnv [Constraint]
constraints Type
argType Type
paramType
Maybe Type
Nothing -> Bool
False
) [Type]
argTypes [Int
0..]
if [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [Bool]
checks
then do
TIExprNode
wrapped <- ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
wrapWithTensorMapRecursive ClassEnv
classEnv [Constraint]
constraints TIExpr
func Type
funcType [TIExpr]
args [Type]
argTypes
Maybe TIExprNode -> EvalM (Maybe TIExprNode)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe TIExprNode -> EvalM (Maybe TIExprNode))
-> Maybe TIExprNode -> EvalM (Maybe TIExprNode)
forall a b. (a -> b) -> a -> b
$ TIExprNode -> Maybe TIExprNode
forall a. a -> Maybe a
Just TIExprNode
wrapped
else
Maybe TIExprNode -> EvalM (Maybe TIExprNode)
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe TIExprNode
forall a. Maybe a
Nothing
wrapWithTensorMapRecursive ::
ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
wrapWithTensorMapRecursive :: ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
wrapWithTensorMapRecursive ClassEnv
_classEnv [Constraint]
_constraints TIExpr
currentFunc Type
_currentType [] [] = do
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExprNode
tiExprNode TIExpr
currentFunc
wrapWithTensorMapRecursive ClassEnv
classEnv [Constraint]
constraints TIExpr
currentFunc Type
currentType (TIExpr
arg1:[TIExpr]
restArgs) (Type
argType1:[Type]
restArgTypes) = do
case Type -> Int -> Maybe Type
getParamType Type
currentType Int
0 of
Maybe Type
Nothing -> TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> [TIExpr] -> TIExprNode
TIApplyExpr TIExpr
currentFunc (TIExpr
arg1 TIExpr -> [TIExpr] -> [TIExpr]
forall a. a -> [a] -> [a]
: [TIExpr]
restArgs)
Just Type
paramType1 -> do
let needsTensorMap1 :: Bool
needsTensorMap1 = ClassEnv -> [Constraint] -> Type -> Type -> Bool
shouldInsertTensorMap ClassEnv
classEnv [Constraint]
constraints Type
argType1 Type
paramType1
if Bool
needsTensorMap1
then do
case ([TIExpr]
restArgs, [Type]
restArgTypes) of
(TIExpr
arg2:[TIExpr]
restArgs', Type
argType2:[Type]
restArgTypes') -> do
let innerType :: Type
innerType = Type -> Type
applyOneArgType Type
currentType
case Type -> Int -> Maybe Type
getParamType Type
innerType Int
0 of
Just Type
paramType2 | ClassEnv -> [Constraint] -> Type -> Type -> Bool
shouldInsertTensorMap ClassEnv
classEnv [Constraint]
constraints Type
argType2 Type
paramType2 -> do
let varName1 :: String
varName1 = String
"tmapVar" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show ([TIExpr] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TIExpr]
restArgs)
varName2 :: String
varName2 = String
"tmapVar" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show ([TIExpr] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TIExpr]
restArgs')
var1 :: Var
var1 = String -> [Index (Maybe Var)] -> Var
Var String
varName1 []
var2 :: Var
var2 = String -> [Index (Maybe Var)] -> Var
Var String
varName2 []
elemType1 :: Type
elemType1 = case Type
argType1 of
TTensor Type
t -> Type
t
Type
_ -> Type
argType1
elemType2 :: Type
elemType2 = case Type
argType2 of
TTensor Type
t -> Type
t
Type
_ -> Type
argType2
varScheme1 :: TypeScheme
varScheme1 = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] Type
elemType1
varScheme2 :: TypeScheme
varScheme2 = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] Type
elemType2
varTIExpr1 :: TIExpr
varTIExpr1 = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
varScheme1 (String -> TIExprNode
TIVarExpr String
varName1)
varTIExpr2 :: TIExpr
varTIExpr2 = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
varScheme2 (String -> TIExprNode
TIVarExpr String
varName2)
instantiatedFuncType :: Type
instantiatedFuncType = TIExpr -> Type
tiExprType TIExpr
currentFunc
unliftedFuncType :: Type
unliftedFuncType = Type -> Type
unliftFunctionType Type
instantiatedFuncType
funcScheme :: TypeScheme
funcScheme = TIExpr -> TypeScheme
tiScheme TIExpr
currentFunc
(Forall [TyVar]
tvs [Constraint]
funcConstraints Type
_) = TypeScheme
funcScheme
unliftedFuncScheme :: TypeScheme
unliftedFuncScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [TyVar]
tvs [Constraint]
funcConstraints Type
unliftedFuncType
unliftedFunc :: TIExpr
unliftedFunc = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
unliftedFuncScheme (TIExpr -> TIExprNode
tiExprNode TIExpr
currentFunc)
innerType2 :: Type
innerType2 = Type -> Type
applyOneArgType (Type -> Type
applyOneArgType Type
unliftedFuncType)
innerFuncScheme :: TypeScheme
innerFuncScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] Type
innerType2
innerFuncTI :: TIExpr
innerFuncTI = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
innerFuncScheme (TIExpr -> [TIExpr] -> TIExprNode
TIApplyExpr TIExpr
unliftedFunc [TIExpr
varTIExpr1, TIExpr
varTIExpr2])
TIExprNode
innerNode <- ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
wrapWithTensorMapRecursive ClassEnv
classEnv [Constraint]
constraints TIExpr
innerFuncTI Type
innerType2 [TIExpr]
restArgs' [Type]
restArgTypes'
let innerTIExpr :: TIExpr
innerTIExpr = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
innerFuncScheme TIExprNode
innerNode
finalType :: Type
finalType = TIExpr -> Type
tiExprType TIExpr
innerTIExpr
let lambdaType :: Type
lambdaType = Type -> Type -> Type
TFun Type
elemType1 (Type -> Type -> Type
TFun Type
elemType2 Type
finalType)
lambdaScheme :: TypeScheme
lambdaScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] Type
lambdaType
lambdaTI :: TIExpr
lambdaTI = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
lambdaScheme (Maybe Var -> [Var] -> TIExpr -> TIExprNode
TILambdaExpr Maybe Var
forall a. Maybe a
Nothing [Var
var1, Var
var2] TIExpr
innerTIExpr)
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExpr -> TIExprNode
TITensorMap2Expr TIExpr
lambdaTI TIExpr
arg1 TIExpr
arg2
Maybe Type
_ -> do
ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
insertSingleTensorMap ClassEnv
classEnv [Constraint]
constraints TIExpr
currentFunc Type
currentType TIExpr
arg1 Type
argType1 [TIExpr]
restArgs [Type]
restArgTypes
([TIExpr], [Type])
_ -> do
ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
insertSingleTensorMap ClassEnv
classEnv [Constraint]
constraints TIExpr
currentFunc Type
currentType TIExpr
arg1 Type
argType1 [TIExpr]
restArgs [Type]
restArgTypes
else do
let appliedType :: Type
appliedType = Type -> Type
applyOneArgType Type
currentType
appliedScheme :: TypeScheme
appliedScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [Constraint]
constraints Type
appliedType
appliedTI :: TIExpr
appliedTI = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
appliedScheme (TIExpr -> [TIExpr] -> TIExprNode
TIApplyExpr TIExpr
currentFunc [TIExpr
arg1])
ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
wrapWithTensorMapRecursive ClassEnv
classEnv [Constraint]
constraints TIExpr
appliedTI Type
appliedType [TIExpr]
restArgs [Type]
restArgTypes
wrapWithTensorMapRecursive ClassEnv
_classEnv [Constraint]
_constraints TIExpr
currentFunc Type
_currentType [TIExpr]
_args [Type]
_argTypes =
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> [TIExpr] -> TIExprNode
TIApplyExpr TIExpr
currentFunc []
insertSingleTensorMap ::
ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
insertSingleTensorMap :: ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
insertSingleTensorMap ClassEnv
classEnv [Constraint]
constraints TIExpr
currentFunc Type
_currentType TIExpr
arg Type
argType [TIExpr]
restArgs [Type]
restArgTypes = do
let varName :: String
varName = String
"tmapVar" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show ([TIExpr] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TIExpr]
restArgs)
var :: Var
var = String -> [Index (Maybe Var)] -> Var
Var String
varName []
elemType :: Type
elemType = case Type
argType of
TTensor Type
t -> Type
t
Type
_ -> Type
argType
varScheme :: TypeScheme
varScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] Type
elemType
varTIExpr :: TIExpr
varTIExpr = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
varScheme (String -> TIExprNode
TIVarExpr String
varName)
instantiatedFuncType :: Type
instantiatedFuncType = TIExpr -> Type
tiExprType TIExpr
currentFunc
unliftedFuncType :: Type
unliftedFuncType = Type -> Type
unliftFunctionType Type
instantiatedFuncType
funcScheme :: TypeScheme
funcScheme = TIExpr -> TypeScheme
tiScheme TIExpr
currentFunc
(Forall [TyVar]
tvs [Constraint]
funcConstraints Type
_) = TypeScheme
funcScheme
unliftedFuncScheme :: TypeScheme
unliftedFuncScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [TyVar]
tvs [Constraint]
funcConstraints Type
unliftedFuncType
unliftedFunc :: TIExpr
unliftedFunc = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
unliftedFuncScheme (TIExpr -> TIExprNode
tiExprNode TIExpr
currentFunc)
innerType :: Type
innerType = Type -> Type
applyOneArgType Type
unliftedFuncType
innerConstraints :: [Constraint]
innerConstraints = case Type
innerType of
TFun Type
_ Type
_ -> [Constraint]
funcConstraints
Type
_ -> []
innerFuncScheme :: TypeScheme
innerFuncScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [Constraint]
innerConstraints Type
innerType
innerFuncTI :: TIExpr
innerFuncTI = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
innerFuncScheme (TIExpr -> [TIExpr] -> TIExprNode
TIApplyExpr TIExpr
unliftedFunc [TIExpr
varTIExpr])
TIExprNode
innerNode <- ClassEnv
-> [Constraint]
-> TIExpr
-> Type
-> [TIExpr]
-> [Type]
-> EvalM TIExprNode
wrapWithTensorMapRecursive ClassEnv
classEnv [Constraint]
constraints TIExpr
innerFuncTI Type
innerType [TIExpr]
restArgs [Type]
restArgTypes
let innerTIExpr :: TIExpr
innerTIExpr = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
innerFuncScheme TIExprNode
innerNode
finalType :: Type
finalType = TIExpr -> Type
tiExprType TIExpr
innerTIExpr
let lambdaType :: Type
lambdaType = Type -> Type -> Type
TFun Type
elemType Type
finalType
lambdaScheme :: TypeScheme
lambdaScheme = [TyVar] -> [Constraint] -> Type -> TypeScheme
Forall [] [] Type
lambdaType
lambdaTI :: TIExpr
lambdaTI = TypeScheme -> TIExprNode -> TIExpr
TIExpr TypeScheme
lambdaScheme (Maybe Var -> [Var] -> TIExpr -> TIExprNode
TILambdaExpr Maybe Var
forall a. Maybe a
Nothing [Var
var] TIExpr
innerTIExpr)
TIExprNode -> EvalM TIExprNode
forall a. a -> StateT EvalState (ExceptT EgisonError RuntimeM) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TIExprNode -> EvalM TIExprNode) -> TIExprNode -> EvalM TIExprNode
forall a b. (a -> b) -> a -> b
$ TIExpr -> TIExpr -> TIExprNode
TITensorMapExpr TIExpr
lambdaTI TIExpr
arg