Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
CladDerivator.h
Go to the documentation of this file.
1 /// \file CladDerivator.h
2 ///
3 /// \brief The file is a bridge between ROOT and clad automatic differentiation
4 /// plugin.
5 ///
6 /// \author Vassil Vassilev <vvasilev@cern.ch>
7 ///
8 /// \date July, 2018
9 
10 /*************************************************************************
11  * Copyright (C) 1995-2018, Rene Brun and Fons Rademakers. *
12  * All rights reserved. *
13  * *
14  * For the licensing terms see $ROOTSYS/LICENSE. *
15  * For the list of contributors see $ROOTSYS/README/CREDITS. *
16  *************************************************************************/
17 
18 #ifndef CLAD_DERIVATOR
19 #define CLAD_DERIVATOR
20 
21 #ifndef __CLING__
22  #error "This file must not be included by compiled programs."
23 #endif //__CLING__
24 
25 #include <plugins/include/clad/Differentiator/Differentiator.h>
26 #include "TMath.h"
27 
28 namespace custom_derivatives {
29  template <typename T>
30  T Abs_darg0(T d) {
31  return (d < 0) ? -1 : 1;
32  }
33 
34  template <typename T>
35  Double_t ACos_darg0(T d) {
36  return -1./TMath::Sqrt(1 - d * d);
37  }
38 
39  template <typename T>
40  Double_t ACosH_darg0(T d) {
41  return 1. / TMath::Sqrt(d * d - 1);
42  }
43 
44  template <typename T>
45  Double_t ASin_darg0(T d) {
46  return 1. / TMath::Sqrt(1 - d * d);
47  }
48 
49  template <typename T>
50  Double_t ASinH_darg0(T d) {
51  return 1. / TMath::Sqrt(d * d + 1);
52  }
53 
54  template <typename T>
55  Double_t ATan_darg0(T d) {
56  return 1. / (d * d + 1);
57  }
58 
59  template <typename T>
60  Double_t ATanH_darg0(T d) {
61  return 1. / (1 - d * d);
62  }
63 
64  template <typename T>
65  T Cos_darg0(T d) {
66  return -TMath::Sin(d);
67  }
68 
69  template <typename T>
70  T CosH_darg0(T d) {
71  return TMath::SinH(d);
72  }
73 
74  template <typename T>
75  Double_t Erf_darg0(T d) {
76  return 2 * TMath::Exp(-d * d) / TMath::Sqrt(TMath::Pi());
77  }
78 
79  template <typename T>
80  Double_t Erfc_darg0(T d) {
81  return -Erf_darg(d);
82  }
83 
84  template <typename T>
85  Double_t Exp_darg0(T d) {
86  return TMath::Exp(d);
87  }
88 
89  template <typename T>
90  T Hypot_darg0(T x, T y) {
91  return x / TMath::Hypot(x, y);
92  }
93 
94  template <typename T>
95  T Hypot_darg1(T x, T y) {
96  return y / TMath::Hypot(x, y);
97  }
98 
99  template <typename T>
100  void Hypot_grad(T x, T y, T* result) {
101  T h = TMath::Hypot(x, y);
102  result[0] += x / h;
103  result[1] += y / h;
104  }
105 
106  template <typename T>
107  Double_t Log_darg0(T d) {
108  return 1. / d;
109  }
110 
111  template <typename T>
112  Double_t Log10_darg0(T d) {
113  return Log_darg0(d) / TMath::Ln10();
114  }
115 
116  template <typename T>
117  Double_t Log2_darg0(T d) {
118  return Log_darg0(d) / TMath::Log(2);
119  }
120 
121  template <typename T>
122  T Max_darg0(T a, T b) {
123  return (a >= b) ? 1 : 0;
124  }
125 
126  template <typename T>
127  T Max_darg1(T a, T b) {
128  return (a >= b) ? 0 : 1;
129  }
130 
131  template <typename T>
132  void Max_grad(T a, T b, T* result) {
133  if (a >= b)
134  result[0] += 1;
135  else
136  result[1] += 1;
137  }
138 
139  template <typename T>
140  T Min_darg0(T a, T b) {
141  return (a <= b) ? 1 : 0;
142  }
143 
144  template <typename T>
145  T Min_darg1(T a, T b) {
146  return (a <= b) ? 0 : 1;
147  }
148 
149  template <typename T>
150  void Min_grad(T a, T b, T* result) {
151  if (a <= b)
152  result[0] += 1;
153  else
154  result[1] += 1;
155  }
156 
157  template <typename T>
158  T Power_darg0(T x, T y) {
159  return y * TMath::Power(x, y - 1);
160  }
161 
162  template <typename T>
163  Double_t Power_darg1(T x, T y) {
164  return TMath::Power(x, y) * TMath::Log(x);
165  }
166 
167  template <typename T>
168  Double_t Power_grad(T x, T y, Double_t* result) {
169  T t = TMath::Power(x, y - 1);
170  result[0] += y * t;
171  result[1] += x * t * TMath::Log(x);
172  }
173 
174  template <typename T>
175  Double_t Sin_darg0(T d) {
176  return TMath::Cos(d);
177  }
178 
179  template <typename T>
180  Double_t SinH_darg0(T d) {
181  return TMath::CosH(d);
182  }
183 
184  template <typename T>
185  T Sq_darg0(T d) {
186  return 2 * d;
187  }
188 
189  template <typename T>
190  Double_t Sqrt_darg0(T d) {
191  return 0.5 / TMath::Sqrt(d);
192  }
193 
194  template <typename T>
195  Double_t Tan_darg0(T d) {
196  return 1./ TMath::Sq(TMath::Cos(d));
197  }
198 
199  template <typename T>
200  Double_t TanH_darg0(T d) {
201  return 1./ TMath::Sq(TMath::CosH(d));
202  }
203 }
204 #endif // CLAD_DERIVATOR