Example shows finite differences gradient use.
#include "shared-tests/fixture.hh"
#include <iostream>
using namespace roboptim;
using namespace roboptim::visualization;
using namespace roboptim::visualization::gnuplot;
template <typename T>
{
{}
void impl_compute (result_t& result,
{
result (0) = argument[0] * argument[0];
}
void impl_gradient (gradient_t& gradient,
const argument_t& argument, size_type)
const throw ();
};
template <>
void
FGood<EigenMatrixSparse>::impl_gradient
(gradient_t& gradient,
const argument_t& argument, size_type)
const throw ()
{
gradient.insert (0) = 2 * argument[0];
}
template <typename T>
void
FGood<T>::impl_gradient (gradient_t& gradient,
const argument_t& argument, size_type)
const throw ()
{
gradient (0) = 2 * argument[0];
}
template <typename T>
{
{}
void impl_compute (result_t& result,
{
result (0) = argument[0] * argument[0];
}
void impl_gradient (gradient_t& gradient,
const argument_t& argument, size_type)
const throw ();
};
template <>
void
(gradient_t& gradient, const
argument_t& argument, size_type) const throw ()
{
gradient.insert (0) = 5 * argument[0] + 42;
}
template <typename T>
void
FBad<T>::impl_gradient (gradient_t& gradient,
const argument_t& argument, size_type)
const throw ()
{
gradient (0) = 5 * argument[0] + 42;
}
template <typename T>
{
{}
void impl_compute (result_t& result,
{
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 ();
};
template <>
void
(gradient_t& gradient, const
argument_t& argument, size_type) const throw ()
{
gradient.insert (0) = -42 * argument[0] + 33;
}
template <typename T>
void
Polynomial<T>::impl_gradient (gradient_t& gradient,
const throw ()
{
gradient (0) = -42 * argument[0] + 33;
}
template <typename T>
{
{}
void impl_compute (result_t& result,
{
result (0) = sin (argument[0]);
result (1) = cos (argument[0]);
}
void impl_gradient (gradient_t& result,
size_type idFunction) const throw ();
};
template <>
void
CircleXY<EigenMatrixSparse>::impl_gradient (gradient_t& gradient,
size_type idFunction) const throw ()
{
switch (idFunction)
{
case 0:
gradient.insert (0) = cos (argument[0]);
break;
case 1:
gradient.insert (0) = -sin (argument[0]);
break;
default:
assert (0);
}
}
template <typename T>
void
CircleXY<T>::impl_gradient (gradient_t& gradient,
size_type idFunction) const throw ()
{
switch (idFunction)
{
case 0:
gradient (0) = cos (argument[0]);
break;
case 1:
gradient (0) = -sin (argument[0]);
break;
default:
assert (0);
}
}
template <typename T>
{
{}
void impl_compute (result_t& result,
const vector_t& argument) const throw ()
{
result (0) = argument[0] * argument[1];
}
void impl_gradient (gradient_t& gradient,
size_type) const throw ();
};
template <>
void
size_type) const throw ()
{
gradient.insert (0) = argument[1];
gradient.insert (1) = argument[0];
}
template <typename T>
void
Times<T>::impl_gradient (gradient_t& gradient,
size_type) const throw ()
{
gradient (0) = argument[1];
gradient (1) = argument[0];
}
template <typename T>
void displayGradient
(boost::shared_ptr<boost::test_tools::output_test_stream> output,
template <typename T>
void
displayGradient
(boost::shared_ptr<boost::test_tools::output_test_stream> output,
{
(*output) << "#" << grad << std::endl
<< "#" << fdgrad << std::endl;
}
BOOST_FIXTURE_TEST_SUITE (core, TestSuiteConfiguration)
BOOST_AUTO_TEST_CASE_TEMPLATE (finite_difference_gradient, T, functionTypes_t)
{
boost::shared_ptr<boost::test_tools::output_test_stream>
output = retrievePattern ("finite-difference-gradient");
FGood<T> fg;
FBad<T> fb;
CircleXY<T> sq;
Times<T> times;
typename FGood<T>::vector_t x (1);
for (x[0] = -10.; x[0] < 10.; x[0] += 1.)
{
(*output) << "#Check gradient at x = " << x[0] << std::endl;
(*output) << "# Good" << std::endl;
displayGradient (output, fg, x);
(*output) << "# Bad" << std::endl;
displayGradient (output, fb, x);
(*output) << "# Circle" << std::endl;
displayGradient (output, sq, x);
displayGradient (output, 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.)
{
(*output) << "# Times at x = " << x << std::endl;
displayGradient (output, times, x);
}
T,
Polynomial<T> p;
T,
p_fd (p, 10.);
(*output)
<< (gnuplot
<<
set (
"multiplot layout 2,2")
<<
plot (fg_fd, interval)
);
std::cout << output->str () << std::endl;
}
BOOST_AUTO_TEST_SUITE_END ()