-
Notifications
You must be signed in to change notification settings - Fork 14k
Start documenting autodiff activities #148201
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 1 commit
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1499,6 +1499,25 @@ pub(crate) mod builtin { | |
| /// - `INPUT_ACTIVITIES`: Specifies one valid activity for each input parameter. | ||
| /// - `OUTPUT_ACTIVITY`: Must not be set if the function implicitly returns nothing | ||
| /// (or explicitly returns `-> ()`). Otherwise, it must be set to one of the allowed activities. | ||
| /// | ||
| /// ACTIVITIES might either be `Dual` or `Const`, more options will be exposed later. | ||
| /// | ||
| /// `Const` should be used on non-float arguments, or float-based arguments as an optimization | ||
| /// if we are not interested in computing the derivatives with respect to this argument. | ||
| /// | ||
| /// `Dual` can be used for float scalar values or for references, raw pointers, or other | ||
| /// indirect input arguments. It can also be used on a scalar float return value. | ||
| /// If used on a return value, the generated function will return a tuple of two float scalars. | ||
| /// If used on an input argument, a new shadow argument of the same type will be created, | ||
| /// directly following the original argument. | ||
| /// | ||
| /// We might want to track how one input float affects one or more output floats. In this case, | ||
| /// the shadow of one input should be initialized to `1.0`, while the shadows of the other | ||
| /// inputs should be initialized to `0.0`. The shadow of the output(s) should be initialized to | ||
| /// `0.0`. After calling the generated function, the shadow of the input will be zeroed, | ||
| /// while the shadow(s) of the output(s) will contain the derivatives. Forward mode is generally | ||
| /// more efficient if we have more output floats marked as `Dual` than input floats. | ||
| /// Related information can also be found unter the term "Vector-Jacobian product" (VJP). | ||
| #[unstable(feature = "autodiff", issue = "124509")] | ||
| #[allow_internal_unstable(rustc_attrs)] | ||
| #[allow_internal_unstable(core_intrinsics)] | ||
|
|
@@ -1518,6 +1537,34 @@ pub(crate) mod builtin { | |
| /// - `INPUT_ACTIVITIES`: Specifies one valid activity for each input parameter. | ||
| /// - `OUTPUT_ACTIVITY`: Must not be set if the function implicitly returns nothing | ||
| /// (or explicitly returns `-> ()`). Otherwise, it must be set to one of the allowed activities. | ||
| /// | ||
| /// ACTIVITIES might either be `Active`, `Duplicated` or `Const`, more options will be exposed later. | ||
| /// | ||
| /// `Active` can be used for float scalar values. | ||
| /// If used on an input, a new float will be appended to the return tuple of the generated | ||
| /// function. If the function returns a float scalar, `Active` can be used for the return as | ||
| /// well. In this case a float scalar will be appended to the argument list, it works as seed. | ||
| /// | ||
| /// `Duplicated` can be used on references, raw pointers, or other indirect input | ||
| /// arguments. It creates a new shadow argument of the same type, following the original argument. | ||
| /// A const reference or pointer argument will receive a mutable reference or pointer as shadow. | ||
| /// | ||
| /// `Const` should be used on non-float arguments, or float-based arguments as an optimization | ||
| /// if we are not interested in computing the derivatives with respect to this argument. | ||
| /// | ||
| /// We often want to track how one or more input floats affect one output float. This output can | ||
| /// be a scalar return value, or a mutable reference or pointer argument. In this case, the | ||
| /// shadow of the input should be marked as duplicated and initialized to `0.0`. The shadow of | ||
| /// the output should be marked as active or duplicated and initialized to `1.0`. After calling | ||
| /// the generated function, the shadow(s) of the input(s) will contain the derivatives. If the | ||
| /// function has more than one output float marked as active or duplicated, users might want to | ||
| /// set one of them to `1.0` and the others to `0.0` to compute partial derivatives. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It is a bit unclear to me how the 1.0 and 0.0 are used to specify the partial derivatives. I would assume the output given 1.0 has it's derivative evaluated and the one 0.0 not, but I think it would be good to be explicit in the docs. |
||
| /// Unlike forward-mode, a call to the generated function does not reset the shadow of the | ||
| /// inputs. | ||
| /// Reverse mode is generally more efficient if we have more active/duplicated input than | ||
| /// output floats. | ||
| /// | ||
| /// Related information can also be found unter the term "Jacobian-Vector Product" (JVP). | ||
| #[unstable(feature = "autodiff", issue = "124509")] | ||
| #[allow_internal_unstable(rustc_attrs)] | ||
| #[allow_internal_unstable(core_intrinsics)] | ||
|
|
||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To me, it is unclear what "this case" refers to. Based on the following text, I think this refers to the case when the output is a mutable reference or pointer argument. Is that right? If so, maybe something like the following would be more clear
or