#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <kv/autodif.hpp>

namespace ub = boost::numeric::ublas;

template <class T> T f(const ub::vector<T>& x) {
	return atan(x(0) * x(0) + 2. * x(1) * x(1) - 1.);
}

int main()
{
	double d1;
	kv::autodif<double> a1;
	ub::vector<double> v1, v2;
	ub::vector< kv::autodif<double> > va1;

	v1.resize(2);
	v1(0) = 5.; v1(1) = 6.;

	va1 = kv::autodif<double>::init(v1);

	a1 = f(va1);

	kv::autodif<double>::split(a1, d1, v2);

	std::cout << d1 << "\n"; // f(5, 6)
	std::cout << v2 << "\n"; // gradient
}
