/usr/include/roboptim/core/twice-differentiable-function.hh is in libroboptim-core-dev 2.0-7.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | // Copyright (C) 2009 by Thomas Moulard, AIST, CNRS, INRIA.
//
// This file is part of the roboptim.
//
// roboptim is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// roboptim is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with roboptim. If not, see <http://www.gnu.org/licenses/>.
#ifndef ROBOPTIM_CORE_TWICE_DIFFERENTIABLE_FUNCTION_HH
# define ROBOPTIM_CORE_TWICE_DIFFERENTIABLE_FUNCTION_HH
# include <cstring>
# include <limits>
# include <utility>
# include <log4cxx/logger.h>
# include <roboptim/core/fwd.hh>
# include <roboptim/core/portability.hh>
# include <roboptim/core/differentiable-function.hh>
# define ROBOPTIM_TWICE_DIFFERENTIABLE_FUNCTION_FWD_TYPEDEFS(PARENT) \
ROBOPTIM_DIFFERENTIABLE_FUNCTION_FWD_TYPEDEFS(PARENT); \
typedef parent_t::hessian_t hessian_t; \
struct e_n_d__w_i_t_h__s_e_m_i_c_o_l_o_n
# define ROBOPTIM_TWICE_DIFFERENTIABLE_FUNCTION_FWD_TYPEDEFS_(PARENT) \
ROBOPTIM_DIFFERENTIABLE_FUNCTION_FWD_TYPEDEFS_(PARENT); \
typedef typename parent_t::hessian_t hessian_t; \
struct e_n_d__w_i_t_h__s_e_m_i_c_o_l_o_n
namespace roboptim
{
/// \addtogroup roboptim_meta_function
/// @{
/// \brief Define an abstract function which is derivable twice (\f$C^2\f$).
///
/// A twice derivable function is a derivable function
/// which provides a way to compute its hessian.
///
/// \f[ f : x \rightarrow f(x) \f]
/// \f$x \in \mathbb{R}^n\f$, \f$f(x) \in \mathbb{R}^m\f$ where
/// \f$n\f$ is the input size and \f$m\f$ is the output size.
///
/// Hessian computation is done through the #impl_hessian method
/// that has to implemented by the concrete class inheriting this
/// class.
///
/// The hessian of a \f$\mathbb{R}^n \rightarrow \mathbb{R}^m\f$
/// function where \f$n > 1\f$ and \f$m > 1\f$ is a tensor.
/// To avoid this costly representation, the function is split
/// into \f$m\f$ \f$\mathbb{R}^n \rightarrow \mathbb{R}\f$ functions.
/// See #DifferentialeFunction documentation for more information.
template <typename T>
class GenericTwiceDifferentiableFunction
: public GenericDifferentiableFunction<T>
{
public:
ROBOPTIM_DIFFERENTIABLE_FUNCTION_FWD_TYPEDEFS_
(GenericDifferentiableFunction<T>);
/// \brief Hessian type.
///
/// Hessians are symmetric matrices.
typedef matrix_t hessian_t;
/// \brief Hessian size type represented as a pair of values.
typedef std::pair<size_type, size_type> hessianSize_t;
/// \brief Return the size of a hessian.
///
/// Hessian size is equales to (input size, input size).
/// \return hessian's size as a pair
hessianSize_t hessianSize () const throw ()
{
return std::make_pair (this->inputSize (), this->inputSize ());
}
/// \brief Check if the hessian is valid (check sizes).
///
/// \param hessian hessian that will be checked
/// \return true if valid, false if not
bool isValidHessian (const hessian_t& hessian) const throw ()
{
return hessian.rows () == this->hessianSize ().first
&& hessian.cols () == this->hessianSize ().second;
}
/// \brief Compute the hessian at a given point.
///
/// Program will abort if the argument size is wrong.
/// \param argument point where the hessian will be computed
/// \param functionId evaluated function id in the split representation
/// \return computed hessian
hessian_t hessian (const argument_t& argument,
size_type functionId = 0) const throw ()
{
hessian_t hessian (matrix_t(hessianSize ().first, hessianSize ().second));
setZero (hessian);
this->hessian (hessian, argument, functionId);
return hessian;
}
/// \brief Compute the hessian at a given point.
///
/// Program will abort if the argument size is wrong.
/// \param hessian hessian will be stored here
/// \param argument point where the hessian will be computed
/// \param functionId evaluated function id in the split representation
void hessian (hessian_t& hessian,
const argument_t& argument,
size_type functionId = 0) const throw ()
{
LOG4CXX_TRACE (this->logger,
"Evaluating hessian at point: " << argument);
assert (isValidHessian (hessian));
#ifndef ROBOPTIM_DO_NOT_CHECK_ALLOCATION
Eigen::internal::set_is_malloc_allowed (false);
#endif //! ROBOPTIM_DO_NOT_CHECK_ALLOCATION
this->impl_hessian (hessian, argument, functionId);
#ifndef ROBOPTIM_DO_NOT_CHECK_ALLOCATION
Eigen::internal::set_is_malloc_allowed (true);
#endif //! ROBOPTIM_DO_NOT_CHECK_ALLOCATION
assert (isValidHessian (hessian));
}
/// \brief Display the function on the specified output stream.
///
/// \param o output stream used for display
/// \return output stream
virtual std::ostream& print (std::ostream&) const throw ();
protected:
/// \brief Concrete class constructor should call this constructor.
///
/// \param inputSize input size (argument size)
/// \param outputSize output size (result size)
/// \param name function's name
GenericTwiceDifferentiableFunction
(size_type inputSize, size_type outputSize = 1,
std::string name = std::string ()) throw ();
/// \brief Hessian evaluation.
///
/// Compute the hessian, has to be implemented in concrete classes.
/// The hessian is computed for a specific sub-function which id is
/// passed through the functionId argument.
/// \warning Do not call this function directly, call #hessian instead.
/// \param hessian hessian will be stored here
/// \param argument point where the hessian will be computed
/// \param functionId evaluated function id in the split representation
virtual void impl_hessian (hessian_t& hessian,
const argument_t& argument,
size_type functionId = 0) const throw () = 0;
/// \brief Set a symmetric matrix to zero
///
/// \note there might be an eigen function to do that.
void setZero (hessian_t& symmetric) const
{
symmetric.setZero ();
}
};
/// @}
} // end of namespace roboptim
# include <roboptim/core/twice-differentiable-function.hxx>
#endif //! ROBOPTIM_CORE_TWICE_DIFFERENTIABLE_FUNCTION_HH
|