Loading...
Searching...
No Matches
gradient.h
Go to the documentation of this file.
1#ifndef _BBM_GRADIENT_BACKBONE_CONCEPT_H_
2#define _BBM_GRADIENT_BACKBONE_CONCEPT_H_
3
4#include "concepts/util.h"
5
6/************************************************************************/
7/*! \file gradient.h
8
9 \brief A differentiable type T has valid gradient operations if:
10 + is_diff_v<T> is defined and is true
11 + gradient(T& ) return a reference to the gradient
12 + detach_gradient(T& ) returns a reference to the raw value (without gradient tracking)
13 + track_gradient(T&, bool toggle) enable/disbale gradient tracking
14 + is_gradient_tracked(const T&) true if gradients are tracked
15 + forward_gradient(T&) set forward tracking mode
16 + backward_gradient(T&) set backward tracking mode
17
18*************************************************************************/
19
20namespace bbm {
21 namespace concepts {
22 namespace backbone {
23
24 template<typename T>
25 concept gradient = requires(T a)
26 {
27 { is_diff_v<T> } -> std::convertible_to<bool>;
28 requires is_diff_v<T>;
29
30 /****************************************************************/
31 /*! \brief track_gradient(T&, bool)
32
33 Enable/disable tracking of gradients.
34 *****************************************************************/
35 { track_gradient(a, true) };
36
37 /****************************************************************/
38 /*! \brief is_gradient_tracked(T&)
39
40 Returns true if gradient tracking is enabled
41 *****************************************************************/
42 { is_gradient_tracked(a) } -> std::convertible_to<bool>;
43
44 /****************************************************************/
45 /*! \brief gradient(T&)
46
47 Computes/returns the gradient of a variable (of computations since
48 gradient tracking was enabled.
49 *****************************************************************/
50 { gradient(a) } -> std::convertible_to<remove_diff_t<T>>;
51
52 /****************************************************************/
53 /*! \brief detach_gradient(T&)
54
55 Returns the raw value of the variable that can be altered without
56 affecting the gradient.
57 *****************************************************************/
58 { detach_gradient(a) } -> std::convertible_to<remove_diff_t<T>>;
59
60 /****************************************************************/
61 /*! \brief forward_gradient(T&)
62
63 Enable forward computation of the gradients of T.
64 *****************************************************************/
65 { forward_gradient(a) };
66
67 /****************************************************************/
68 /*! \brief backward_gradient(T&)
69
70 Enable backward/revserse computation of the gradients of T.
71 *****************************************************************/
72 { backward_gradient(a) };
73 };
74
75
76 /******************************************************************/
77 /*! \brief Only check gradient concept if is_diff_v<T>
78 ******************************************************************/
79 template<typename T>
80 concept if_diff_gradient = (!is_diff_v<T>) || gradient<T>;
81
82 } // end backbone namespace
83 } // end concepts namespace
84} // end bbm namespace
85
86#endif /* _BBM_GRADIENT_BACKBONE_CONCEPT_H_ */
Definition: gradient.h:25
Only check gradient concept if is_diff_v<T>
Definition: gradient.h:80
Random number generator; built on top of Drjit.
Definition: backbone.h:53
Definition: aggregatebsdf.h:29
void track_gradient(T &t, bool toggle=true)
Enable/disable tracking of gradients for a variable.
Definition: backbone.h:451
void backward_gradient(T &t)
Enable backward/reverse gradient tracking.
Definition: backbone.h:479
bool is_gradient_tracked(const T &t)
Checks if gradients are enabled for a variable.
Definition: backbone.h:436
auto gradient(T &t)
Return the gradient.
Definition: backbone.h:423
void forward_gradient(T &t)
Enable forward gradient tracking.
Definition: backbone.h:465
auto detach_gradient(T &t)
Detach the value from the gradient computations.
Definition: backbone.h:408
Additional basic helper concepts.