#include #include #include using namespace autodiff; dual sqrt1(dual x){ dual res = 0.0; res.val = std::sqrt(x.val); if (x.grad !=0.0){ std::cout << "x.grad: " << x.grad << std::endl; res.grad += 0.5/res.val*x.grad; } return res; } dual test_exp(dual x){ dual res = 0.0; std::cout << "x.val: " << x.val << std::endl; res.val = std::exp(x.val); std::cout << "res.val: " << res.val << std::endl; std::cout << "res.grad: " << res.grad << std::endl; if(x.grad != 0.0) res.grad += x.grad*res.val; std::cout << "res.val: " << res.val << std::endl; std::cout << "res.grad: " << res.grad << std::endl; return res; } dual test_exp0(dual x){ return 1.0+exp(x); } int main() { dual x = 1.2; dual u = sqrt1(x); double dfdx = derivative(sqrt1, wrt(x), at(x)); double dfdx2 = derivative(test_exp, wrt(x), at(x)); double dfdx3 = derivative(test_exp0, wrt(x), at(x)); std::cout << "dfdx: " << dfdx << std::endl; std::cout << "dfdx2: " << dfdx2 << std::endl; std::cout << "dfdx3: " << dfdx3 << std::endl; }