|
9 | 9 | # General Overview
|
10 | 10 |
|
11 | 11 | Diffractor is an experimental next-generation, compiler-based AD system for Julia.
|
12 |
| -Its public interface should be familiar to users, essentially matching Zygote. |
13 | 12 |
|
14 | 13 | Design goals:
|
15 | 14 | - Ultra high performance for both scalar and array code
|
16 |
| -- Efficient higher order derivatives |
| 15 | +- Efficient higher order derivatives through nested AD |
17 | 16 | - Reasonable compile times
|
18 | 17 | - High flexibility (like Zygote)
|
19 | 18 | - Support for forward/reverse/mixed modes
|
| 19 | +- Fast Jacobians |
20 | 20 |
|
21 | 21 | This is achieved through a combination of innovations:
|
22 | 22 | - A new lowest level interface (∂⃖ the "AD optic functor" or "diffractor"), more suited to higher order AD
|
23 | 23 | - New capabilities in Base Julia (Opaque closures, inference plugins)
|
24 | 24 | - Better integration with ChainRules.jl
|
| 25 | +- Demand-driven forward-mode AD (Applying transforms to only those IR statements that contribute to relevant outputs of the function being differentiated) |
25 | 26 |
|
26 |
| -# Current Status |
| 27 | +# Current status |
| 28 | +## Current Status: Forward-Mode |
| 29 | +Currently, forward-mode is the only fully-functional mode and is now shipping in some closed source products. |
| 30 | +It is in a position to compete with [ForwardDiff.jl](https://github.com/JuliaDiff/TaylorDiff.jl), and with [TaylorDiff.jl](https://github.com/JuliaDiff/TaylorDiff.jl). |
| 31 | +It is not as battle-tested as ForwardDiff.jl, but it has several advantages. |
| 32 | +Primarily, as it is not an operator overloading AD, it frees one from the need to relax type-constants and worry about the types of containers. |
| 33 | +Furthermore, Like TaylorDiff.jl, it supports Taylor series based computation of higher order derviatives. |
| 34 | +It directly and efficiently uses ChainRules.jl's `frules`, no need for a wrapper macro to import them etc. |
| 35 | + |
| 36 | + |
| 37 | +One limitation over ForwardDiff.jl is a lack of chunking support, to pushforward multiple bases at once. |
| 38 | + |
| 39 | + |
| 40 | + |
| 41 | +## Current Status: Reverse-Mode |
| 42 | +Improved reverse mode support is planned for a future release. |
| 43 | +While reverse mode was originally implemented and working, it has been stripped out until such a time as it can be properly implemented on top of new Julia compiler changes.<br> |
| 44 | +⚠️ **Reverse Mode support should be considered experimental, and may break without warning, and may not be fixed rapidly.** ⚠️ <br> |
| 45 | + |
| 46 | +With that said, issues and PRs for reverse mode continue to be appreciated. |
| 47 | +### Status as of last time reverse mode was worked on: |
27 | 48 |
|
28 | 49 | The plan is to implement this in two stages:
|
29 | 50 | 1. Generated function based transforms, using the ChainRules, the new low level interface and Opaque closures
|
|
0 commit comments