we need an autodiff library at some point (or we need to roll our own but I do not think that makes sense). CppAD is well tested and header only and easy to include. It is also Liscene compatible with GPL v3.0. Here we bring it in as a dependency
63 lines
2.3 KiB
C++
63 lines
2.3 KiB
C++
# ifndef CPPAD_EXAMPLE_CODE_GEN_FUN_HPP
|
|
# define CPPAD_EXAMPLE_CODE_GEN_FUN_HPP
|
|
/* --------------------------------------------------------------------------
|
|
CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-20 Bradley M. Bell
|
|
|
|
CppAD is distributed under the terms of the
|
|
Eclipse Public License Version 2.0.
|
|
|
|
This Source Code may also be made available under the following
|
|
Secondary License when the conditions for such availability set forth
|
|
in the Eclipse Public License, Version 2.0 are satisfied:
|
|
GNU General Public License, Version 2.0 or later.
|
|
-------------------------------------------------------------------------- */
|
|
// BEGIN C++
|
|
# include <cppad/cg/cppadcg.hpp>
|
|
|
|
class code_gen_fun {
|
|
public:
|
|
// type of evaluation for Jacobians (possibly Hessians in the future)
|
|
enum evaluation_enum { none_enum, dense_enum, sparse_enum };
|
|
private:
|
|
// dynamic_lib_
|
|
std::unique_ptr< CppAD::cg::DynamicLib<double> > dynamic_lib_;
|
|
//
|
|
// model_ (contains a reference to dynamic_lib_)
|
|
std::unique_ptr< CppAD::cg::GenericModel<double> > model_;
|
|
//
|
|
public:
|
|
// -----------------------------------------------------------------------
|
|
// constructors
|
|
// -----------------------------------------------------------------------
|
|
// fun_name()
|
|
code_gen_fun(void);
|
|
//
|
|
// fun_name( file_name )
|
|
code_gen_fun(const std::string& file_name);
|
|
//
|
|
// fun_name(file_name, cg_fun, eval_jac)
|
|
code_gen_fun(
|
|
const std::string& file_name ,
|
|
CppAD::ADFun< CppAD::cg::CG<double> >& cg_fun ,
|
|
evaluation_enum eval_jac = none_enum
|
|
);
|
|
// -----------------------------------------------------------------------
|
|
// operations
|
|
// -----------------------------------------------------------------------
|
|
// swap(other_fun)
|
|
void swap(code_gen_fun& other_fun);
|
|
//
|
|
// y = fun_name(x)
|
|
CppAD::vector<double> operator()(const CppAD::vector<double> & x);
|
|
//
|
|
// J = fun_name.jacobian(x)
|
|
CppAD::vector<double> jacobian(const CppAD::vector<double> & x);
|
|
//
|
|
// Jrcv = fun_name.sparse_jacobian(x)
|
|
CppAD::sparse_rcv< CppAD::vector<size_t>, CppAD::vector<double> >
|
|
sparse_jacobian(const CppAD::vector<double>& x);
|
|
};
|
|
// END C++
|
|
|
|
# endif
|