Developer Tools
Mooncake.jl offers developers to a few convenience functions which give access to the IR that it generates in order to perform AD. These are lightweight wrappers around internals which save you from having to dig in to the objects created by build_rrule
.
Since these provide access to internals, they do not follow the usual rules of semver, and may change without notice!
Mooncake.primal_ir
— Functionprimal_ir(sig::Type{<:Tuple}; interp=get_interpreter())::IRCode
!!! warning: this is not part of the public interface of Mooncake. As such, it may change as part of a non-breaking release of the package.
Get the Core.Compiler.IRCode
associated to sig
from which the a rule can be derived. Roughly equivalent to Base.code_ircode_by_type(sig; interp)
.
For example, if you wanted to get the IR associated to the call map(sin, randn(10))
, you could do one of the following calls:
julia> Mooncake.primal_ir(Tuple{typeof(map), typeof(sin), Vector{Float64}}) isa Core.Compiler.IRCode
true
julia> Mooncake.primal_ir(typeof((map, sin, randn(10)))) isa Core.Compiler.IRCode
true
Mooncake.fwd_ir
— Functionfwd_ir(
sig::Type{<:Tuple};
interp=get_interpreter(), debug_mode::Bool=false, do_inline::Bool=true
)::IRCode
!!! warning: this is not part of the public interface of Mooncake. As such, it may change as part of a non-breaking release of the package.
Generate the Core.Compiler.IRCode
used to construct the forwards-pass of AD. Take a look at how build_rrule
makes use of generate_ir
to see exactly how this is used in practice.
For example, if you wanted to get the IR associated to the forwards pass for the call map(sin, randn(10))
, you could do either of the following:
julia> Mooncake.fwd_ir(Tuple{typeof(map), typeof(sin), Vector{Float64}}) isa Core.Compiler.IRCode
true
julia> Mooncake.fwd_ir(typeof((map, sin, randn(10)))) isa Core.Compiler.IRCode
true
Arguments
sig::Type{<:Tuple}
: the signature of the call to be differentiated.
Keyword Arguments
interp
: the interpreter to use to obtain the primal IR.debug_mode::Bool
: whether the generated IR should make use of Mooncake's debug mode.do_inline::Bool
: whether to apply an inlining pass prior to returning the ir generated by this function. This istrue
by default, but setting it tofalse
can sometimes be helpful if you need to understand what function calls are generated in order to perform AD, before lots of it gets inlined away.
Mooncake.rvs_ir
— Functionrvs_ir(
sig::Type{<:Tuple};
interp=get_interpreter(), debug_mode::Bool=false, do_inline::Bool=true
)::IRCode
!!! warning: this is not part of the public interface of Mooncake. As such, it may change as part of a non-breaking release of the package.
Generate the Core.Compiler.IRCode
used to construct the reverse-pass of AD. Take a look at how build_rrule
makes use of generate_ir
to see exactly how this is used in practice.
For example, if you wanted to get the IR associated to the reverse pass for the call map(sin, randn(10))
, you could do either of the following:
julia> Mooncake.rvs_ir(Tuple{typeof(map), typeof(sin), Vector{Float64}}) isa Core.Compiler.IRCode
true
julia> Mooncake.rvs_ir(typeof((map, sin, randn(10)))) isa Core.Compiler.IRCode
true
Arguments
sig::Type{<:Tuple}
: the signature of the call to be differentiated.
Keyword Arguments
interp
: the interpreter to use to obtain the primal IR.debug_mode::Bool
: whether the generated IR should make use of Mooncake's debug mode.do_inline::Bool
: whether to apply an inlining pass prior to returning the ir generated by this function. This istrue
by default, but setting it tofalse
can sometimes be helpful if you need to understand what function calls are generated in order to perform AD, before lots of it gets inlined away.