Example shows finite differences gradient use.
#include "common.hh"
#include <iostream>
using namespace roboptim;
using namespace roboptim::visualization;
using namespace roboptim::visualization::gnuplot;
{
{}
void impl_compute (result_t& result,
const argument_t& argument) const throw ()
{
result (0) = argument[0] * argument[0];
}
void impl_gradient (gradient_t& gradient,
const argument_t& argument, size_type) const throw ()
{
gradient (0) = 2 * argument[0];
}
};
{
{}
void impl_compute (result_t& result,
const argument_t& argument) const throw ()
{
result (0) = argument[0] * argument[0];
}
void impl_gradient (result_t& result,
const vector_t& argument, size_type) const throw ()
{
result (0) = 5 * argument[0] + 42;
}
};
{
{}
void impl_compute (result_t& result,
const argument_t& argument) const throw ()
{
result (0) = -24 * argument[0] * argument[0] + 33 * argument[0] + 5;
}
void impl_gradient (gradient_t& gradient,
const argument_t& argument, size_type) const throw ()
{
gradient (0) = -42 * argument[0] + 33;
}
};
{
{}
void impl_compute (result_t& result,
const argument_t& argument) const throw ()
{
result (0) = sin (argument[0]);
result (1) = cos (argument[0]);
}
void impl_gradient (result_t& result,
const argument_t& argument,
size_type idFunction) const throw ()
{
switch (idFunction)
{
case 0:
result (0) = cos (argument[0]);
break;
case 1:
result (0) = -sin (argument[0]);
break;
default:
assert (0);
}
}
};
{
{}
void impl_compute (result_t& result,
const vector_t& argument) const throw ()
{
result (0) = argument[0] * argument[1];
}
void impl_gradient (gradient_t& gradient,
const argument_t& argument,
size_type idFunction) const throw ()
{
gradient (0) = argument[1];
gradient (1) = argument[0];
}
};
int i = 0);
void
int i)
{
std::cout << "#" << grad << std::endl
<< "#" << fdgrad << std::endl;
}
int run_test ()
{
FGood fg;
FBad fb;
CircleXY sq;
Times times;
for (x[0] = -10.; x[0] < 10.; x[0] += 1.)
{
std::cout << "#Check gradient at x = " << x[0] << std::endl;
std::cout << "# Good" << std::endl;
displayGradient (fg, x);
std::cout << "# Bad" << std::endl;
displayGradient (fb, x);
std::cout << "# Circle" << std::endl;
displayGradient (sq, x);
displayGradient (sq, x, 1);
}
x.resize (2);
for (x[1] = -10.; x[1] < 10.; x[1] += 1.)
for (x[0] = -10.; x[0] < 10.; x[0] += 1.)
{
std::cout << "# Times at x = " << x << std::endl;
displayGradient (times, x);
}
Gnuplot gnuplot = Gnuplot::make_interactive_gnuplot ();
Polynomial p;
p_fd (p, 10.);
std::cout
<< (gnuplot
<< set ("multiplot layout 2,2")
<<
plot (fg_fd, interval)
);
return 0;
}
GENERATE_TEST ()