I have written a C++ library that allows for evaluation of thermodynamic equation of state written in terms of residual Helmholtz energy (only, not derivatives): https://github.com/ianhbell/teqp . Derivatives are taken with complex derivatives for single derivatives, and multicomplex derivatives with higher (and cross) derivatives. This works great with multicomplex differentiation, but it is not very fast, so I wanted to see if automatic differentiation would be faster. The core function needs to accept arbitrary numerical types as template arguments.
The below is a simple test case showing how I would like to use autodiff
, in analogy to what I did with the complex differentiation tools. The generic model implements the function alphar
and here I am trying to take the derivative of the first argument, which is scalar, as a first test.
#include <iostream>
#include <algorithm>
#include <numeric>
#include <valarray>
#include "autodiff/forward.hpp"
#include "autodiff/reverse.hpp"
/* A (very) simple implementation of the van der Waals EOS*/
class vdWEOSSimple {
private:
double a, b;
public:
vdWEOSSimple(double a, double b) : a(a), b(b) {};
const double R = 1.380649e-23 * 6.02214076e23; ///< Exact value, given by k_B*N_A
template<typename TType, typename RhoType>
auto alphar(const TType &T, const RhoType& rho) const {
auto rhotot = std::accumulate(std::begin(rho), std::end(rho), (RhoType::value_type)0.0);
auto Psiminus = -log(1.0 - b * rhotot);
auto Psiplus = rhotot;
return Psiminus - a / (R * T) * Psiplus;
}
};
void test_vdW_autodiff() {
// Argon + Xenon
std::valarray<double> Tc_K = { 150.687, 289.733 };
std::valarray<double> pc_Pa = { 4863000.0, 5842000.0 };
double T = 298.15;
auto rho = 3.0;
auto R = 1.380649e-23 * 6.02214076e23; ///< Exact value, given by k_B*N_A
auto rhotot = rho;
const std::valarray<double> rhovec = { rhotot / 2, rhotot / 2 };
int i = 0;
double ai = 27.0/64.0*pow(R*Tc_K[i], 2)/pc_Pa[i];
double bi = 1.0/8.0*R*Tc_K[i]/pc_Pa[i];
vdWEOSSimple vdW(ai, bi);
autodiff::dual varT = T;
auto u = vdW.alphar(varT, rhovec);
auto dalphardT = derivative([&vdW, &rhovec](auto& T) {return vdW.alphar(T, rhovec); }, wrt(varT), at(varT));
}
int main() {
test_vdW_autodiff();
return EXIT_SUCCESS;
}
Visual studio gives voluminous compilation errors (below). I suspect it has something to do with the fact that the function I am wrapping in the lambda is an instance method, though I admit I haven't the foggiest idea how to workaround this issue because the lambda function approach is usually a success in other cases.
Build started...
1>------ Build started: Project: test_autodiff, Configuration: Debug x64 ------
1>test_autodiff.cpp
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(768): error C2280: 'autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>>::BinaryExpr(void)': attempting to reference a deleted function
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612): message : compiler has generated 'autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>>::BinaryExpr' here
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612,1): message : 'autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>>::BinaryExpr(void)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>::UnaryExpr(void)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(605,1): message : 'autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>::UnaryExpr(void)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>::BinaryExpr(void)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612,1): message : 'autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>::BinaryExpr(void)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>::BinaryExpr(void)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612,1): message : 'autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>::BinaryExpr(void)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>::UnaryExpr(void)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(605,1): message : 'autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>::UnaryExpr(void)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>::BinaryExpr(void)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612,1): message : 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>::BinaryExpr(void)': function was implicitly deleted because 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>' has an uninitialized data member 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>::r' of reference type
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(611): message : see declaration of 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>::r'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\src\test_autodiff.cpp(46): message : see reference to function template instantiation 'auto autodiff::forward::derivative<test_vdW_autodiff::<lambda_18ca46ab0a682d1e64406ac8568ab8d2>,std::tuple<autodiff::forward::dual &>,std::tuple<autodiff::forward::dual &>>(const Function &,Wrt &&,Args &&)' being compiled
1> with
1> [
1> Function=test_vdW_autodiff::<lambda_18ca46ab0a682d1e64406ac8568ab8d2>,
1> Wrt=std::tuple<autodiff::forward::dual &>,
1> Args=std::tuple<autodiff::forward::dual &>
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(759,7): error C2280: 'autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>> &autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>>::operator =(const autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>> &)': attempting to reference a deleted function
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612): message : compiler has generated 'autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>>::operator =' here
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612,1): message : 'autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>> &autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>>::operator =(const autodiff::forward::BinaryExpr<autodiff::forward::AddOp,double,autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>> &)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>> &autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>::operator =(const autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>> &)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(605,1): message : 'autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>> &autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>>::operator =(const autodiff::forward::UnaryExpr<autodiff::forward::NegOp,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>> &)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>> &autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>::operator =(const autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>> &)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612,1): message : 'autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>> &autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>>::operator =(const autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>> &)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>> &autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>::operator =(const autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>> &)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612,1): message : 'autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>> &autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>>::operator =(const autodiff::forward::BinaryExpr<autodiff::forward::MulOp,double,autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>> &)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>> &autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>::operator =(const autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>> &)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(605,1): message : 'autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>> &autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>>::operator =(const autodiff::forward::UnaryExpr<autodiff::forward::InvOp,autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>> &)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &> &autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>::operator =(const autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &> &)'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(612,1): message : 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &> &autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>::operator =(const autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &> &)': function was implicitly deleted because 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>' has a data member 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>::r' of reference type
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(611): message : see declaration of 'autodiff::forward::BinaryExpr<autodiff::forward::NumberDualMulOp,double,const TType &>::r'
1> with
1> [
1> TType=autodiff::forward::dual
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(769): message : see reference to function template instantiation 'auto autodiff::forward::derivative<Function,_Ty,_Ty,Result>(const Function &,Wrt &&,Args &&,Result &)' being compiled
1> with
1> [
1> Function=test_vdW_autodiff::<lambda_18ca46ab0a682d1e64406ac8568ab8d2>,
1> _Ty=std::tuple<autodiff::forward::dual &>,
1> Wrt=std::tuple<autodiff::forward::dual &>,
1> Args=std::tuple<autodiff::forward::dual &>,
1> Result=Result
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(761,12): error C2672: 'derivative': no matching overloaded function found
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(761,1): error C2784: 'auto autodiff::forward::derivative(const autodiff::forward::Dual<T,G> &)': could not deduce template argument for 'const autodiff::forward::Dual<T,G> &' from 'Result'
1> with
1> [
1> Result=Result
1> ]
1>C:\Users\ihb\Code\teqp\externals\autodiff\autodiff/forward/forward.hpp(745): message : see declaration of 'autodiff::forward::derivative'
1>C:\Users\ihb\Code\teqp\src\test_autodiff.cpp(46,112): error C3313: 'dalphardT': variable cannot have the type 'void'
1>Done building project "test_autodiff.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========