15#ifndef ENZYMEMLIR_CORE_IMPL_H_
16#define ENZYMEMLIR_CORE_IMPL_H_
19#include "mlir/Interfaces/FunctionInterfaces.h"
20#include "mlir/Support/LogicalResult.h"
22#include "llvm/ADT/DenseSet.h"
32class MGradientUtilsReverse;
39 MGradientUtils *gutils);
42 Operation *op, OpBuilder &builder, MGradientUtils *gutils,
43 const llvm::SmallDenseSet<unsigned> &operandPositionsToShadow,
44 const llvm::SmallDenseSet<unsigned> &resultPositionsToShadow);
49 MGradientUtils *gutils);
54 MGradientUtils *gutils);
58 MGradientUtilsReverse *gutils);
63 MGradientUtils *gutils,
64 ArrayRef<int> storedVals);
68 MGradientUtils *gutils,
bool zero);
73template <
typename OpTy>
75 :
public AutoDiffOpInterface::ExternalModel<AutoDiffUsingControlFlow<OpTy>,
86template <
typename OpTy>
88 :
public AutoDiffOpInterface::ExternalModel<AutoDiffUsingBranch<OpTy>,
100template <
typename OpTy>
102 :
public AutoDiffOpInterface::ExternalModel<
103 AutoDiffUsingRegionTerminator<OpTy>, OpTy> {
112template <
typename OpTy>
114 :
public ReverseAutoDiffOpInterface::ExternalModel<
115 NoopRevAutoDiffInterface<OpTy>, OpTy> {
119 SmallVector<Value> caches)
const {
125 return SmallVector<Value>();
134template <
typename OpTy>
136 :
public ReverseAutoDiffOpInterface::ExternalModel<
137 ReturnRevAutoDiffInterface<OpTy>, OpTy> {
141 SmallVector<Value> caches)
const {
148 return SmallVector<Value>();
159template <
typename OpTy,
int... storedvals>
161 :
public AutoDiffOpInterface::ExternalModel<
162 AutoDiffUsingMemoryIdentity<OpTy, storedvals...>, OpTy> {
168 op, builder, gutils, std::initializer_list<int>{storedvals...});
174template <
typename OpTy>
176 AutoDiffUsingAllocationFwd<OpTy>, OpTy> {
187template <
typename OpTy>
189 :
public ReverseAutoDiffOpInterface::ExternalModel<
190 AutoDiffUsingAllocationRev<OpTy>, OpTy> {
194 SmallVector<Value> caches)
const {
200 return SmallVector<Value>();
221 SmallVector<Value> caches);
228template <
typename OpTy>
230 :
public AutoDiffOpInterface::ExternalModel<AutoDiffCallFwd<OpTy>, OpTy> {
238template <
typename OpTy>
240 :
public ReverseAutoDiffOpInterface::ExternalModel<AutoDiffCallRev<OpTy>,
245 SmallVector<Value> caches)
const {
262template <
typename OpTy>
264 OpTy::template attachInterface<AutoDiffCallFwd<OpTy>>(context);
265 OpTy::template attachInterface<AutoDiffCallRev<OpTy>>(context);
269template <
typename OpTy>
271 OpTy::template attachInterface<detail::AutoDiffUsingControlFlow<OpTy>>(
275template <
typename OpTy>
277 OpTy::template attachInterface<detail::AutoDiffUsingBranch<OpTy>>(context);
278 OpTy::template attachInterface<detail::NoopRevAutoDiffInterface<OpTy>>(
282template <
typename OpTy>
284 OpTy::template attachInterface<detail::AutoDiffUsingRegionTerminator<OpTy>>(
286 OpTy::template attachInterface<detail::NoopRevAutoDiffInterface<OpTy>>(
290template <
typename OpTy>
292 OpTy::template attachInterface<detail::AutoDiffUsingRegionTerminator<OpTy>>(
294 OpTy::template attachInterface<detail::ReturnRevAutoDiffInterface<OpTy>>(
298template <
typename OpTy,
int... storedvals>
300 OpTy::template attachInterface<
304template <
typename OpTy>
306 OpTy::template attachInterface<detail::AutoDiffUsingAllocationFwd<OpTy>>(
308 OpTy::template attachInterface<detail::AutoDiffUsingAllocationRev<OpTy>>(
332mlir::TypedAttr
getConstantAttr(mlir::Type type, llvm::StringRef value);
351template <
typename OpTy>
352std::enable_if_t<std::is_base_of<OpState, OpTy>::value, OpTy>
LogicalResult createForwardModeTangent(Operation *orig, OpBuilder &builder, MGradientUtils *gutils) const
LogicalResult createReverseModeAdjoint(Operation *orig, OpBuilder &builder, MGradientUtilsReverse *gutils, SmallVector< Value > caches) const
SmallVector< Value > cacheValues(Operation *orig, MGradientUtilsReverse *gutils) const
LogicalResult createShadowValues(Operation *op, OpBuilder &builder, MGradientUtilsReverse *gutils) const
LogicalResult createForwardModeTangent(Operation *op, OpBuilder &builder, MGradientUtils *gutils) const
SmallVector< Value > cacheValues(Operation *op, MGradientUtilsReverse *gutils) const
LogicalResult createReverseModeAdjoint(Operation *op, OpBuilder &builder, MGradientUtilsReverse *gutils, SmallVector< Value > caches) const
LogicalResult createShadowValues(Operation *op, OpBuilder &builder, MGradientUtilsReverse *gutils) const
LogicalResult createForwardModeTangent(Operation *op, OpBuilder &builder, MGradientUtils *gutils) const
LogicalResult createForwardModeTangent(Operation *op, OpBuilder &builder, MGradientUtils *gutils) const
LogicalResult createForwardModeTangent(Operation *op, OpBuilder &builder, MGradientUtils *gutils) const
LogicalResult createForwardModeTangent(Operation *op, OpBuilder &builder, MGradientUtils *gutils) const
SmallVector< Value > cacheValues(Operation *op, MGradientUtilsReverse *gutils) const
LogicalResult createReverseModeAdjoint(Operation *op, OpBuilder &builder, MGradientUtilsReverse *gutils, SmallVector< Value > caches) const
LogicalResult createShadowValues(Operation *op, OpBuilder &builder, MGradientUtilsReverse *gutils) const
SmallVector< Value > cacheValues(Operation *op, MGradientUtilsReverse *gutils) const
LogicalResult createReverseModeAdjoint(Operation *op, OpBuilder &builder, MGradientUtilsReverse *gutils, SmallVector< Value > caches) const
LogicalResult createShadowValues(Operation *op, OpBuilder &builder, MGradientUtilsReverse *gutils) const
LogicalResult controlFlowForwardHandler(Operation *op, OpBuilder &builder, MGradientUtils *gutils)
LogicalResult memoryIdentityForwardHandler(Operation *op, OpBuilder &builder, MGradientUtils *gutils, ArrayRef< int > storedVals)
void returnReverseHandler(Operation *op, OpBuilder &builder, MGradientUtilsReverse *gutils)
void regionTerminatorForwardHandler(Operation *op, OpBuilder &builder, MGradientUtils *gutils)
SmallVector< Value > callCacheValues(Operation *orig, MGradientUtilsReverse *gutils)
void branchingForwardHandler(Operation *op, OpBuilder &builder, MGradientUtils *gutils)
LogicalResult callReverseHandler(Operation *orig, OpBuilder &builder, MGradientUtilsReverse *gutils, SmallVector< Value > caches)
LogicalResult allocationForwardHandler(Operation *op, OpBuilder &builder, MGradientUtils *gutils, bool zero)
LogicalResult callForwardHandler(Operation *orig, OpBuilder &builder, MGradientUtils *gutils)
void registerGPUDialectAutoDiffInterface(DialectRegistry ®istry)
void registerComplexDialectAutoDiffInterface(DialectRegistry ®istry)
void registerArithDialectAutoDiffInterface(DialectRegistry ®istry)
bool allResultsActive(Operation *op, const MGradientUtils *gutils)
void registerAutoDiffUsingAllocationInterface(MLIRContext &context)
void registerAutoDiffUsingRegionTerminatorInterface(MLIRContext &context)
void registerLinalgDialectAutoDiffInterface(DialectRegistry ®istry)
void registerLLVMDialectAutoDiffInterface(DialectRegistry ®istry)
void registerAutoDiffUsingBranchInterface(MLIRContext &context)
void registerMathDialectAutoDiffInterface(DialectRegistry ®istry)
void registerEnzymeDialectAutoDiffInterface(DialectRegistry ®istry)
void registerBuiltinDialectAutoDiffInterface(DialectRegistry ®istry)
void setDerivativeFastMath(Operation *op)
Give an operation built for a derivative the fast-math flags the LLVM path gives everything it builds...
void registerFuncDialectAutoDiffInterface(DialectRegistry ®istry)
mlir::TypedAttr getConstantAttr(mlir::Type type, llvm::StringRef value)
void registerCoreDialectAutodiffInterfaces(DialectRegistry ®istry)
void registerSCFDialectAutoDiffInterface(DialectRegistry ®istry)
void registerMemRefDialectAutoDiffInterface(DialectRegistry ®istry)
void registerCFDialectAutoDiffInterface(DialectRegistry ®istry)
void registerAutoDiffUsingCallInterface(MLIRContext &context)
void registerAutoDiffUsingMemoryIdentityInterface(MLIRContext &context)
void registerAutoDiffUsingReturnInterface(MLIRContext &context)
void registerLLVMExtDialectAutoDiffInterface(DialectRegistry ®istry)
void registerAffineDialectAutoDiffInterface(DialectRegistry ®istry)
void registerAutoDiffUsingControlFlowInterface(MLIRContext &context)
void registerNVVMDialectAutoDiffInterface(DialectRegistry ®istry)
void registerTensorDialectAutoDiffInterface(DialectRegistry ®istry)