Safe Haskell | None |
---|---|
Language | GHC2024 |
HordeAd.Core.AstSimplify
Description
This module holds smart constructors for AST, that is, term-simplifying combinators corresponding to the Ast constructors. The combinators simplify only on the basis of inspecting the roots of their argument term trees. If the arguments get modified, the modified forms are again inspected and potentially simplified again.
The limited simplification via combinators is enough to uncover redexes for the factorization rules to fire and to undo some of the complication introduced by vectorization. The intention is to leave intact as much as possible of the original terms provided by the user while making sure subterms introduced by vectorization are maximally simplified.
Synopsis
- data RewritePhase
- data SimplifyKnobs = SimplifyKnobs {}
- defaultKnobs :: SimplifyKnobs
- astPair :: forall (s :: AstSpanType) (x :: TK) (y :: TK). AstSpan s => AstTensor 'AstMethodLet s x -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s ('TKProduct x y)
- astProject1 :: forall (x :: TK) (z :: TK) (s :: AstSpanType). AstSpan s => AstTensor 'AstMethodLet s ('TKProduct x z) -> AstTensor 'AstMethodLet s x
- astProject2 :: forall (x :: TK) (z :: TK) (s :: AstSpanType). AstSpan s => AstTensor 'AstMethodLet s ('TKProduct x z) -> AstTensor 'AstMethodLet s z
- astFromVector :: forall (y :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> SingletonTK y -> Vector (AstTensor 'AstMethodLet s y) -> AstTensor 'AstMethodLet s (BuildTensorKind k y)
- astSum :: forall (y :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> SingletonTK y -> AstTensor 'AstMethodLet s (BuildTensorKind k y) -> AstTensor 'AstMethodLet s y
- astReplicate :: forall (y :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> SingletonTK y -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s (BuildTensorKind k y)
- astMapAccumRDer :: forall (accy :: TK) (by :: TK) (ey :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> FullShapeTK by -> FullShapeTK ey -> AstHFun s s ('TKProduct accy ey) ('TKProduct accy by) -> AstHFun s s ('TKProduct (ADTensorKind ('TKProduct accy ey)) ('TKProduct accy ey)) (ADTensorKind ('TKProduct accy by)) -> AstHFun s s ('TKProduct (ADTensorKind ('TKProduct accy by)) ('TKProduct accy ey)) (ADTensorKind ('TKProduct accy ey)) -> AstTensor 'AstMethodLet s accy -> AstTensor 'AstMethodLet s (BuildTensorKind k ey) -> AstTensor 'AstMethodLet s ('TKProduct accy (BuildTensorKind k by))
- astMapAccumLDer :: forall (accy :: TK) (by :: TK) (ey :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> FullShapeTK by -> FullShapeTK ey -> AstHFun s s ('TKProduct accy ey) ('TKProduct accy by) -> AstHFun s s ('TKProduct (ADTensorKind ('TKProduct accy ey)) ('TKProduct accy ey)) (ADTensorKind ('TKProduct accy by)) -> AstHFun s s ('TKProduct (ADTensorKind ('TKProduct accy by)) ('TKProduct accy ey)) (ADTensorKind ('TKProduct accy ey)) -> AstTensor 'AstMethodLet s accy -> AstTensor 'AstMethodLet s (BuildTensorKind k ey) -> AstTensor 'AstMethodLet s ('TKProduct accy (BuildTensorKind k by))
- astApply :: forall (x :: TK) (z :: TK) (s1 :: AstSpanType) (s :: AstSpanType). (AstSpan s1, AstSpan s) => AstHFun s1 s x z -> AstTensor 'AstMethodLet s1 x -> AstTensor 'AstMethodLet s z
- astCond :: forall (s :: AstSpanType) (y :: TK). AstSpan s => AstBool 'AstMethodLet -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s y
- astConcrete :: forall (y :: TK). FullShapeTK y -> Concrete y -> AstTensor 'AstMethodLet 'PrimalSpan y
- astConcreteK :: GoodScalar r => Concrete ('TKScalar r) -> AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r)
- astConcreteS :: forall r (sh :: [Nat]). GoodScalar r => Concrete (TKS sh r) -> AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r)
- astLet :: forall (y :: TK) (z :: TK) (s :: AstSpanType) (s2 :: AstSpanType). (AstSpan s, AstSpan s2) => AstVarName s y -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s2 z -> AstTensor 'AstMethodLet s2 z
- astPrimalPart :: forall (y :: TK). AstTensor 'AstMethodLet 'FullSpan y -> AstTensor 'AstMethodLet 'PrimalSpan y
- astDualPart :: forall (y :: TK). AstTensor 'AstMethodLet 'FullSpan y -> AstTensor 'AstMethodLet 'DualSpan y
- astFloorK :: (GoodScalar r1, RealFrac r1, GoodScalar r2, Integral r2) => AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r1) -> AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r2)
- astFromIntegralK :: (GoodScalar r1, GoodScalar r2, Integral r1) => AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r1) -> AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r2)
- astCastK :: forall r1 r2 (s :: AstSpanType). (GoodScalar r1, GoodScalar r2, RealFrac r1, RealFrac r2, AstSpan s) => AstTensor 'AstMethodLet s ('TKScalar r1) -> AstTensor 'AstMethodLet s ('TKScalar r2)
- astFloorS :: forall r1 r2 (sh :: [Nat]). (GoodScalar r1, RealFrac r1, Integral r2, GoodScalar r2) => AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r1) -> AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r2)
- astFromIntegralS :: forall r1 r2 (sh :: [Nat]). (GoodScalar r1, GoodScalar r2, Integral r1) => AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r1) -> AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r2)
- astCastS :: forall r1 r2 (s :: AstSpanType) (sh :: [Nat]). (GoodScalar r1, GoodScalar r2, RealFrac r1, RealFrac r2, AstSpan s) => AstTensor 'AstMethodLet s (TKS sh r1) -> AstTensor 'AstMethodLet s (TKS sh r2)
- astIndexS :: forall (shm :: [Nat]) (shn :: [Nat]) (s :: AstSpanType) (r :: TK). AstSpan s => ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r) -> AstIxS 'AstMethodLet shm -> AstTensor 'AstMethodLet s ('TKS2 shn r)
- astIndexKnobsS :: forall (shm :: [Nat]) (shn :: [Nat]) (s :: AstSpanType) (r :: TK). AstSpan s => SimplifyKnobs -> ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r) -> AstIxS 'AstMethodLet shm -> AstTensor 'AstMethodLet s ('TKS2 shn r)
- astScatterS :: forall (shm :: [Nat]) (shn :: [Nat]) (shp :: [Nat]) (r :: TK) (s :: AstSpanType). AstSpan s => ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r) -> (AstVarListS shm, AstIxS 'AstMethodLet shp) -> AstTensor 'AstMethodLet s ('TKS2 (shp ++ shn) r)
- astGatherS :: forall (shm :: [Nat]) (shn :: [Nat]) (shp :: [Nat]) (r :: TK) (s :: AstSpanType). AstSpan s => ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shp ++ shn) r) -> (AstVarListS shm, AstIxS 'AstMethodLet shp) -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r)
- astGatherKnobsS :: forall (shm :: [Nat]) (shn :: [Nat]) (shp :: [Nat]) (r :: TK) (s :: AstSpanType). AstSpan s => SimplifyKnobs -> ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shp ++ shn) r) -> (AstVarListS shm, AstIxS 'AstMethodLet shp) -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r)
- astAppendS :: forall (s :: AstSpanType) (m :: Nat) (sh :: [Nat]) (r :: TK) (n :: Nat). AstSpan s => AstTensor 'AstMethodLet s ('TKS2 (m ': sh) r) -> AstTensor 'AstMethodLet s ('TKS2 (n ': sh) r) -> AstTensor 'AstMethodLet s ('TKS2 ((m + n) ': sh) r)
- astSliceS :: forall (i :: Nat) (n :: Nat) (k :: Nat) (sh :: [Natural]) (s :: AstSpanType) (r :: TK). AstSpan s => SNat i -> SNat n -> SNat k -> AstTensor 'AstMethodLet s ('TKS2 (((i + n) + k) ': sh) r) -> AstTensor 'AstMethodLet s ('TKS2 (n ': sh) r)
- astReverseS :: forall (n :: Nat) (sh :: [Nat]) (s :: AstSpanType) (r :: TK). AstSpan s => AstTensor 'AstMethodLet s ('TKS2 (n ': sh) r) -> AstTensor 'AstMethodLet s ('TKS2 (n ': sh) r)
- astTransposeS :: forall (perm :: [Natural]) (sh :: [Nat]) (s :: AstSpanType) (r :: TK). (IsPermutation perm, Rank perm <= Rank sh, AstSpan s) => Perm perm -> AstTensor 'AstMethodLet s ('TKS2 sh r) -> AstTensor 'AstMethodLet s ('TKS2 (PermutePrefix perm sh) r)
- astReshapeS :: forall (sh :: [Natural]) (sh2 :: [Natural]) (x :: TK) (s :: AstSpanType). (Product sh ~ Product sh2, AstSpan s) => ShS sh2 -> AstTensor 'AstMethodLet s ('TKS2 sh x) -> AstTensor 'AstMethodLet s ('TKS2 sh2 x)
- astConvert :: forall (s :: AstSpanType) (y :: TK) (z :: TK). AstSpan s => TKConversion y z -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s z
- astFromS' :: forall (y :: TK) (z :: TK) (s :: AstSpanType). AstSpan s => FullShapeTK z -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s z
- astKFromS' :: forall r (s :: AstSpanType). (AstSpan s, GoodScalar r) => AstTensor 'AstMethodLet s ('TKS2 ('[] :: [Nat]) ('TKScalar r)) -> AstTensor 'AstMethodLet s ('TKScalar r)
- astRFromS' :: forall (sh :: [Nat]) (x :: TK) (s :: AstSpanType). AstSpan s => AstTensor 'AstMethodLet s ('TKS2 sh x) -> AstTensor 'AstMethodLet s ('TKR2 (Rank sh) x)
- astXFromS' :: forall (sh :: [Nat]) (shx :: [Maybe Nat]) (x :: TK) (s :: AstSpanType). (AstSpan s, Rank sh ~ Rank shx) => StaticShX shx -> AstTensor 'AstMethodLet s ('TKS2 sh x) -> AstTensor 'AstMethodLet s ('TKX2 shx x)
- astSFromK' :: forall r (s :: AstSpanType). (GoodScalar r, AstSpan s) => AstTensor 'AstMethodLet s ('TKScalar r) -> AstTensor 'AstMethodLet s (TKS ('[] :: [Nat]) r)
- astSFromR' :: forall (sh :: [Nat]) (s :: AstSpanType) (r :: TK). AstSpan s => ShS sh -> AstTensor 'AstMethodLet s ('TKR2 (Rank sh) r) -> AstTensor 'AstMethodLet s ('TKS2 sh r)
- astSFromX' :: forall (sh :: [Nat]) (sh' :: [Maybe Nat]) (s :: AstSpanType) (x :: TK). (AstSpan s, Rank sh ~ Rank sh') => ShS sh -> AstTensor 'AstMethodLet s ('TKX2 sh' x) -> AstTensor 'AstMethodLet s ('TKS2 sh x)
- astSum0S :: forall (s :: AstSpanType) (sh :: [Nat]) (x :: TK). AstSpan s => AstTensor 'AstMethodLet s ('TKS2 sh x) -> AstTensor 'AstMethodLet s ('TKS2 ('[] :: [Nat]) x)
- astDot0S :: forall r (s :: AstSpanType) (sh :: [Nat]). (GoodScalar r, AstSpan s) => AstTensor 'AstMethodLet s (TKS sh r) -> AstTensor 'AstMethodLet s (TKS sh r) -> AstTensor 'AstMethodLet s (TKS ('[] :: [Nat]) r)
- astDot1InS :: forall (sh :: [Nat]) (n :: Nat) r (s :: AstSpanType). GoodScalar r => ShS sh -> SNat n -> AstTensor 'AstMethodLet s (TKS (sh ++ '[n]) r) -> AstTensor 'AstMethodLet s (TKS (sh ++ '[n]) r) -> AstTensor 'AstMethodLet s (TKS sh r)
- astMatmul2S :: forall r (m :: Nat) (n :: Nat) (p :: Nat) (s :: AstSpanType). GoodScalar r => SNat m -> SNat n -> SNat p -> AstTensor 'AstMethodLet s (TKS '[m, n] r) -> AstTensor 'AstMethodLet s (TKS '[n, p] r) -> AstTensor 'AstMethodLet s (TKS '[m, p] r)
- astLetFun :: forall (y :: TK) (z :: TK) (s :: AstSpanType) (s2 :: AstSpanType). (AstSpan s, AstSpan s2) => AstTensor 'AstMethodLet s y -> (AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s2 z) -> AstTensor 'AstMethodLet s2 z
- substituteAst :: forall (s :: AstSpanType) (s2 :: AstSpanType) (y :: TK) (z :: TK). (AstSpan s, AstSpan s2) => AstTensor 'AstMethodLet s2 z -> AstVarName s2 z -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s y
- substituteAstIxS :: forall (s :: AstSpanType) (y :: TK) (sh :: [Nat]). AstSpan s => AstTensor 'AstMethodLet s y -> AstVarName s y -> AstIxS 'AstMethodLet sh -> AstIxS 'AstMethodLet sh
- substituteAstBool :: forall (s :: AstSpanType) (y :: TK). AstSpan s => AstTensor 'AstMethodLet s y -> AstVarName s y -> AstBool 'AstMethodLet -> AstBool 'AstMethodLet
Documentation
data RewritePhase Source #
Instances
Show RewritePhase Source # | |
Defined in HordeAd.Core.AstSimplify Methods showsPrec :: Int -> RewritePhase -> ShowS # show :: RewritePhase -> String # showList :: [RewritePhase] -> ShowS # | |
Eq RewritePhase Source # | |
Defined in HordeAd.Core.AstSimplify |
data SimplifyKnobs Source #
Constructors
SimplifyKnobs | |
Fields |
Instances
Show SimplifyKnobs Source # | |
Defined in HordeAd.Core.AstSimplify Methods showsPrec :: Int -> SimplifyKnobs -> ShowS # show :: SimplifyKnobs -> String # showList :: [SimplifyKnobs] -> ShowS # |
The simplifying combinators, one for almost each AST constructor
astPair :: forall (s :: AstSpanType) (x :: TK) (y :: TK). AstSpan s => AstTensor 'AstMethodLet s x -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s ('TKProduct x y) Source #
astProject1 :: forall (x :: TK) (z :: TK) (s :: AstSpanType). AstSpan s => AstTensor 'AstMethodLet s ('TKProduct x z) -> AstTensor 'AstMethodLet s x Source #
astProject2 :: forall (x :: TK) (z :: TK) (s :: AstSpanType). AstSpan s => AstTensor 'AstMethodLet s ('TKProduct x z) -> AstTensor 'AstMethodLet s z Source #
astFromVector :: forall (y :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> SingletonTK y -> Vector (AstTensor 'AstMethodLet s y) -> AstTensor 'AstMethodLet s (BuildTensorKind k y) Source #
astSum :: forall (y :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> SingletonTK y -> AstTensor 'AstMethodLet s (BuildTensorKind k y) -> AstTensor 'AstMethodLet s y Source #
astReplicate :: forall (y :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> SingletonTK y -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s (BuildTensorKind k y) Source #
astMapAccumRDer :: forall (accy :: TK) (by :: TK) (ey :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> FullShapeTK by -> FullShapeTK ey -> AstHFun s s ('TKProduct accy ey) ('TKProduct accy by) -> AstHFun s s ('TKProduct (ADTensorKind ('TKProduct accy ey)) ('TKProduct accy ey)) (ADTensorKind ('TKProduct accy by)) -> AstHFun s s ('TKProduct (ADTensorKind ('TKProduct accy by)) ('TKProduct accy ey)) (ADTensorKind ('TKProduct accy ey)) -> AstTensor 'AstMethodLet s accy -> AstTensor 'AstMethodLet s (BuildTensorKind k ey) -> AstTensor 'AstMethodLet s ('TKProduct accy (BuildTensorKind k by)) Source #
astMapAccumLDer :: forall (accy :: TK) (by :: TK) (ey :: TK) (k :: Nat) (s :: AstSpanType). AstSpan s => SNat k -> FullShapeTK by -> FullShapeTK ey -> AstHFun s s ('TKProduct accy ey) ('TKProduct accy by) -> AstHFun s s ('TKProduct (ADTensorKind ('TKProduct accy ey)) ('TKProduct accy ey)) (ADTensorKind ('TKProduct accy by)) -> AstHFun s s ('TKProduct (ADTensorKind ('TKProduct accy by)) ('TKProduct accy ey)) (ADTensorKind ('TKProduct accy ey)) -> AstTensor 'AstMethodLet s accy -> AstTensor 'AstMethodLet s (BuildTensorKind k ey) -> AstTensor 'AstMethodLet s ('TKProduct accy (BuildTensorKind k by)) Source #
astApply :: forall (x :: TK) (z :: TK) (s1 :: AstSpanType) (s :: AstSpanType). (AstSpan s1, AstSpan s) => AstHFun s1 s x z -> AstTensor 'AstMethodLet s1 x -> AstTensor 'AstMethodLet s z Source #
astCond :: forall (s :: AstSpanType) (y :: TK). AstSpan s => AstBool 'AstMethodLet -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s y Source #
astConcrete :: forall (y :: TK). FullShapeTK y -> Concrete y -> AstTensor 'AstMethodLet 'PrimalSpan y Source #
astConcreteK :: GoodScalar r => Concrete ('TKScalar r) -> AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r) Source #
astConcreteS :: forall r (sh :: [Nat]). GoodScalar r => Concrete (TKS sh r) -> AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r) Source #
astLet :: forall (y :: TK) (z :: TK) (s :: AstSpanType) (s2 :: AstSpanType). (AstSpan s, AstSpan s2) => AstVarName s y -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s2 z -> AstTensor 'AstMethodLet s2 z Source #
astPrimalPart :: forall (y :: TK). AstTensor 'AstMethodLet 'FullSpan y -> AstTensor 'AstMethodLet 'PrimalSpan y Source #
astDualPart :: forall (y :: TK). AstTensor 'AstMethodLet 'FullSpan y -> AstTensor 'AstMethodLet 'DualSpan y Source #
astFloorK :: (GoodScalar r1, RealFrac r1, GoodScalar r2, Integral r2) => AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r1) -> AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r2) Source #
astFromIntegralK :: (GoodScalar r1, GoodScalar r2, Integral r1) => AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r1) -> AstTensor 'AstMethodLet 'PrimalSpan ('TKScalar r2) Source #
astCastK :: forall r1 r2 (s :: AstSpanType). (GoodScalar r1, GoodScalar r2, RealFrac r1, RealFrac r2, AstSpan s) => AstTensor 'AstMethodLet s ('TKScalar r1) -> AstTensor 'AstMethodLet s ('TKScalar r2) Source #
astFloorS :: forall r1 r2 (sh :: [Nat]). (GoodScalar r1, RealFrac r1, Integral r2, GoodScalar r2) => AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r1) -> AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r2) Source #
astFromIntegralS :: forall r1 r2 (sh :: [Nat]). (GoodScalar r1, GoodScalar r2, Integral r1) => AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r1) -> AstTensor 'AstMethodLet 'PrimalSpan (TKS sh r2) Source #
astCastS :: forall r1 r2 (s :: AstSpanType) (sh :: [Nat]). (GoodScalar r1, GoodScalar r2, RealFrac r1, RealFrac r2, AstSpan s) => AstTensor 'AstMethodLet s (TKS sh r1) -> AstTensor 'AstMethodLet s (TKS sh r2) Source #
astIndexS :: forall (shm :: [Nat]) (shn :: [Nat]) (s :: AstSpanType) (r :: TK). AstSpan s => ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r) -> AstIxS 'AstMethodLet shm -> AstTensor 'AstMethodLet s ('TKS2 shn r) Source #
astIndexKnobsS :: forall (shm :: [Nat]) (shn :: [Nat]) (s :: AstSpanType) (r :: TK). AstSpan s => SimplifyKnobs -> ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r) -> AstIxS 'AstMethodLet shm -> AstTensor 'AstMethodLet s ('TKS2 shn r) Source #
astScatterS :: forall (shm :: [Nat]) (shn :: [Nat]) (shp :: [Nat]) (r :: TK) (s :: AstSpanType). AstSpan s => ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r) -> (AstVarListS shm, AstIxS 'AstMethodLet shp) -> AstTensor 'AstMethodLet s ('TKS2 (shp ++ shn) r) Source #
astGatherS :: forall (shm :: [Nat]) (shn :: [Nat]) (shp :: [Nat]) (r :: TK) (s :: AstSpanType). AstSpan s => ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shp ++ shn) r) -> (AstVarListS shm, AstIxS 'AstMethodLet shp) -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r) Source #
astGatherKnobsS :: forall (shm :: [Nat]) (shn :: [Nat]) (shp :: [Nat]) (r :: TK) (s :: AstSpanType). AstSpan s => SimplifyKnobs -> ShS shn -> AstTensor 'AstMethodLet s ('TKS2 (shp ++ shn) r) -> (AstVarListS shm, AstIxS 'AstMethodLet shp) -> AstTensor 'AstMethodLet s ('TKS2 (shm ++ shn) r) Source #
astAppendS :: forall (s :: AstSpanType) (m :: Nat) (sh :: [Nat]) (r :: TK) (n :: Nat). AstSpan s => AstTensor 'AstMethodLet s ('TKS2 (m ': sh) r) -> AstTensor 'AstMethodLet s ('TKS2 (n ': sh) r) -> AstTensor 'AstMethodLet s ('TKS2 ((m + n) ': sh) r) Source #
astSliceS :: forall (i :: Nat) (n :: Nat) (k :: Nat) (sh :: [Natural]) (s :: AstSpanType) (r :: TK). AstSpan s => SNat i -> SNat n -> SNat k -> AstTensor 'AstMethodLet s ('TKS2 (((i + n) + k) ': sh) r) -> AstTensor 'AstMethodLet s ('TKS2 (n ': sh) r) Source #
astReverseS :: forall (n :: Nat) (sh :: [Nat]) (s :: AstSpanType) (r :: TK). AstSpan s => AstTensor 'AstMethodLet s ('TKS2 (n ': sh) r) -> AstTensor 'AstMethodLet s ('TKS2 (n ': sh) r) Source #
astTransposeS :: forall (perm :: [Natural]) (sh :: [Nat]) (s :: AstSpanType) (r :: TK). (IsPermutation perm, Rank perm <= Rank sh, AstSpan s) => Perm perm -> AstTensor 'AstMethodLet s ('TKS2 sh r) -> AstTensor 'AstMethodLet s ('TKS2 (PermutePrefix perm sh) r) Source #
Beware, this does not do full simplification, which often requires the gather form, so astTransposeAsGather needs to be called in addition if full simplification is required.
astReshapeS :: forall (sh :: [Natural]) (sh2 :: [Natural]) (x :: TK) (s :: AstSpanType). (Product sh ~ Product sh2, AstSpan s) => ShS sh2 -> AstTensor 'AstMethodLet s ('TKS2 sh x) -> AstTensor 'AstMethodLet s ('TKS2 sh2 x) Source #
Beware, this does not do full simplification, which often requires the gather form, so astReshapeAsGather needs to be called in addition if full simplification is required.
astConvert :: forall (s :: AstSpanType) (y :: TK) (z :: TK). AstSpan s => TKConversion y z -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s z Source #
astFromS' :: forall (y :: TK) (z :: TK) (s :: AstSpanType). AstSpan s => FullShapeTK z -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s z Source #
astKFromS' :: forall r (s :: AstSpanType). (AstSpan s, GoodScalar r) => AstTensor 'AstMethodLet s ('TKS2 ('[] :: [Nat]) ('TKScalar r)) -> AstTensor 'AstMethodLet s ('TKScalar r) Source #
astRFromS' :: forall (sh :: [Nat]) (x :: TK) (s :: AstSpanType). AstSpan s => AstTensor 'AstMethodLet s ('TKS2 sh x) -> AstTensor 'AstMethodLet s ('TKR2 (Rank sh) x) Source #
astXFromS' :: forall (sh :: [Nat]) (shx :: [Maybe Nat]) (x :: TK) (s :: AstSpanType). (AstSpan s, Rank sh ~ Rank shx) => StaticShX shx -> AstTensor 'AstMethodLet s ('TKS2 sh x) -> AstTensor 'AstMethodLet s ('TKX2 shx x) Source #
astSFromK' :: forall r (s :: AstSpanType). (GoodScalar r, AstSpan s) => AstTensor 'AstMethodLet s ('TKScalar r) -> AstTensor 'AstMethodLet s (TKS ('[] :: [Nat]) r) Source #
astSFromR' :: forall (sh :: [Nat]) (s :: AstSpanType) (r :: TK). AstSpan s => ShS sh -> AstTensor 'AstMethodLet s ('TKR2 (Rank sh) r) -> AstTensor 'AstMethodLet s ('TKS2 sh r) Source #
astSFromX' :: forall (sh :: [Nat]) (sh' :: [Maybe Nat]) (s :: AstSpanType) (x :: TK). (AstSpan s, Rank sh ~ Rank sh') => ShS sh -> AstTensor 'AstMethodLet s ('TKX2 sh' x) -> AstTensor 'AstMethodLet s ('TKS2 sh x) Source #
astSum0S :: forall (s :: AstSpanType) (sh :: [Nat]) (x :: TK). AstSpan s => AstTensor 'AstMethodLet s ('TKS2 sh x) -> AstTensor 'AstMethodLet s ('TKS2 ('[] :: [Nat]) x) Source #
astDot0S :: forall r (s :: AstSpanType) (sh :: [Nat]). (GoodScalar r, AstSpan s) => AstTensor 'AstMethodLet s (TKS sh r) -> AstTensor 'AstMethodLet s (TKS sh r) -> AstTensor 'AstMethodLet s (TKS ('[] :: [Nat]) r) Source #
astDot1InS :: forall (sh :: [Nat]) (n :: Nat) r (s :: AstSpanType). GoodScalar r => ShS sh -> SNat n -> AstTensor 'AstMethodLet s (TKS (sh ++ '[n]) r) -> AstTensor 'AstMethodLet s (TKS (sh ++ '[n]) r) -> AstTensor 'AstMethodLet s (TKS sh r) Source #
astMatmul2S :: forall r (m :: Nat) (n :: Nat) (p :: Nat) (s :: AstSpanType). GoodScalar r => SNat m -> SNat n -> SNat p -> AstTensor 'AstMethodLet s (TKS '[m, n] r) -> AstTensor 'AstMethodLet s (TKS '[n, p] r) -> AstTensor 'AstMethodLet s (TKS '[m, p] r) Source #
Helper combinators
astLetFun :: forall (y :: TK) (z :: TK) (s :: AstSpanType) (s2 :: AstSpanType). (AstSpan s, AstSpan s2) => AstTensor 'AstMethodLet s y -> (AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s2 z) -> AstTensor 'AstMethodLet s2 z Source #
Substitution operations
substituteAst :: forall (s :: AstSpanType) (s2 :: AstSpanType) (y :: TK) (z :: TK). (AstSpan s, AstSpan s2) => AstTensor 'AstMethodLet s2 z -> AstVarName s2 z -> AstTensor 'AstMethodLet s y -> AstTensor 'AstMethodLet s y Source #
We assume no variable is shared between a binding and its nested binding and nobody substitutes into variables that are bound. This keeps the substitution code simple, because we never need to compare variables to any variable in the bindings.
substituteAstIxS :: forall (s :: AstSpanType) (y :: TK) (sh :: [Nat]). AstSpan s => AstTensor 'AstMethodLet s y -> AstVarName s y -> AstIxS 'AstMethodLet sh -> AstIxS 'AstMethodLet sh Source #
substituteAstBool :: forall (s :: AstSpanType) (y :: TK). AstSpan s => AstTensor 'AstMethodLet s y -> AstVarName s y -> AstBool 'AstMethodLet -> AstBool 'AstMethodLet Source #