summaryrefslogtreecommitdiff
path: root/source/slang/core.meta.slang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-11-04 09:36:23 -0700
committerGitHub <noreply@github.com>2022-11-04 09:36:23 -0700
commitc6e6b7a9177bf4f7fc2f05da36c5952979006d78 (patch)
tree6db694b5b4bf94ce48678c73921676f9d305614d /source/slang/core.meta.slang
parent015bde8d5a46f32979c00dbb1feb4b3d80729c44 (diff)
Higher order differentiation. (#2487)
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/core.meta.slang')
-rw-r--r--source/slang/core.meta.slang59
1 files changed, 49 insertions, 10 deletions
diff --git a/source/slang/core.meta.slang b/source/slang/core.meta.slang
index ce52dbb56..05963bd11 100644
--- a/source/slang/core.meta.slang
+++ b/source/slang/core.meta.slang
@@ -105,6 +105,55 @@ interface __BuiltinSignedArithmeticType : __BuiltinArithmeticType {}
interface __BuiltinIntegerType : __BuiltinArithmeticType
{}
+
+/// Interface to denote types as differentiable.
+/// Allows for user-specified differential types as
+/// well as automatic generation, for when the associated type
+/// hasn't been declared explicitly.
+/// Note that the requirements must currently be defined in this exact order
+/// since the auto-diff pass relies on the order to grab the struct keys.
+///
+__magic_type(DifferentiableType)
+interface IDifferentiable
+{
+ // Note: the compiler implementation requires the `Differential` associated type to be defined
+ // before anything else.
+
+ __builtin_requirement($( (int) BuiltinRequirementKind::DifferentialType) )
+ associatedtype Differential : IDifferentiable;
+
+ __builtin_requirement($( (int)BuiltinRequirementKind::DZeroFunc) )
+ static Differential dzero();
+
+ __builtin_requirement($( (int)BuiltinRequirementKind::DAddFunc) )
+ static Differential dadd(Differential, Differential);
+
+ __builtin_requirement($( (int)BuiltinRequirementKind::DMulFunc) )
+ static Differential dmul(This, Differential);
+};
+
+__magic_type(DifferentialBottomType)
+__intrinsic_type($(kIROp_DifferentialBottomType))
+struct __DifferentialBottom : IDifferentiable
+{
+ typedef __DifferentialBottom Differential;
+
+ __intrinsic_op($(kIROp_DifferentialBottomValue))
+ static __DifferentialBottom dzero();
+
+ [__unsafeForceInlineEarly]
+ static __DifferentialBottom dadd(Differential a, Differential b)
+ {
+ return dzero();
+ }
+
+ [__unsafeForceInlineEarly]
+ static __DifferentialBottom dmul(This a, Differential b)
+ {
+ return dzero();
+ }
+}
+
/// A type that can represent non-integers
[sealed]
[builtin]
@@ -2739,16 +2788,6 @@ attribute_syntax [Specialize] : SpecializeAttribute;
__attributeTarget(DeclBase)
attribute_syntax [DerivativeMember(memberName)] : DerivativeMemberAttribute;
-enum _BuiltinRequirementKind
-{
- DifferentialType = $( (int) BuiltinRequirementKind::DifferentialType),
- DZeroFunc = $( (int) BuiltinRequirementKind::DZeroFunc),
- DAddFunc = $( (int) BuiltinRequirementKind::DAddFunc),
- DMulFunc = $( (int) BuiltinRequirementKind::DMulFunc),
-};
-__attributeTarget(DeclBase)
-attribute_syntax [__BuiltinRequirement(kind: _BuiltinRequirementKind)] : BuiltinRequirementAttribute;
-
__attributeTarget(DeclBase)
attribute_syntax [builtin] : BuiltinAttribute;