Loading...
Searching...
No Matches
gradient.h
Go to the documentation of this file.
1#if !defined _BBM_ENOKI_GRADIENT_H_ && defined ENOKI_AUTODIFF
2#define _BBM_ENOKI_GRADIENT_H_
3
4#include "backbone/type_traits.h"
5
6#include "enoki/autodiff.h"
7
8
9/************************************************************************/
10/*! \file gradient.h
11
12 \brief Enoki backbone support for auto-diff
13
14 Only defined if ENOKI_AUTODIFF is set.
15
16 Satisfies: concepts::backbone::gradient
17*************************************************************************/
18
19namespace backbone {
20
21 //! \brief Enable/Disable tracking of gradients
22 template<typename T> requires is_diff_v<T>
23 void track_gradient(T& t, bool toggle=true)
24 {
25 enoki::set_requires_gradient(t, toggle);
26 }
27
28 //! \brief Returns true if the gradient is tracked.
29 template<typename T> requires is_diff_v<T>
30 bool is_gradient_tracked(const T& t)
31 {
32 return enoki::requires_gradient(t);
33 }
34
35 //! \brief Returns the gradient
36 template<typename T> requires is_diff_v<T>
37 auto gradient(T& t)
38 {
39 return enoki::gradient(t);
40 }
41
42 //! \brief Detach the value from gradient computations
43 template<typename T> requires is_diff_v<T>
44 auto detach_gradient(T& t)
45 {
46 return enoki::detach(t);
47 }
48
49 //! \brief Enable Forward Mode auto-diff
50 template<typename T> requires is_diff_v<T>
51 void forward_gradient(T& t)
52 {
53 enoki::forward(t);
54 }
55
56 //! \brief Enable Reverse Mode auto-diff
57 template<typename T> requires is_diff_v<T>
58 void backward_gradient(T& t)
59 {
60 enoki::backward(t);
61 }
62
63} // end backbone namespace
64
65#endif /* _BBM_ENOKI_GRADIENT_H_ */
Random number generator; built on top of Drjit.
Definition: backbone.h:53
bool is_gradient_tracked(T &)
void forward_gradient(T &)
const remove_diff_t< T > & gradient(T &)
remove_diff_t< T > & detach_gradient(T &)
void backward_gradient(T &)
void track_gradient(T &, bool)