1#ifndef __JFIT__JGANDALF__ 
    2#define __JFIT__JGANDALF__ 
   25namespace JPP { 
using namespace JFIT; }
 
   32  namespace JFIT_LOCAL {
 
   36      template<
class U>   
static auto parameter_type(U*)   -> 
decltype(std::declval<typename U::parameter_type>());
 
   40      static const bool has_parameter_type  = !std::is_same<std::false_type, decltype(parameter_type<T> (0))>::value;
 
 
   43    template<class T, bool has_parameter_type = JTypedef<T>::has_parameter_type>
 
 
   56  template<
class JModel_t>
 
   57  inline void model(JModel_t& value)
 
 
   84  template<
class JModel_t>
 
   86    public JMessage< JGandalf<JModel_t> >
 
  119                  const JModel_t& 
model) :
 
 
  130      operator double()
 const  
 
 
  160    template<
class JFunction_t, 
class T, 
class ...Args>
 
  176      previous.result.chi2 = numeric_limits<double>::max();
 
  178      current.result.chi2     = numeric_limits<double>::max();
 
  180      current.result.gradient = zero;
 
  193        update(fit, __begin, __end, args...);
 
  212              update(fit, __begin, __end, args...);
 
  217              catch (
const exception& 
error) {}
 
  219              for (
size_t i = 0; i != N; ++i) {
 
  248          update(fit, __begin, __end, args...);
 
  251        DEBUG(
"Hesse matrix:" << endl << 
V << endl);
 
  255        for (
size_t i = 0; i != N; ++i) {
 
  261          h[i] = 1.0 / sqrt(
V(i,i));
 
  266        for (
size_t row = 0; row != N; ++row) {
 
  267          for (
size_t col = 0; col != row; ++col) {
 
  268            V(row,col) *= 
h[row] * 
h[col];
 
  269            V(col,row)  = 
V(row,col);
 
  273        for (
size_t i = 0; i != N; ++i) {
 
  279        for (
size_t col = 0; col != N; ++col) {
 
  286        catch (
const exception& 
error) {
 
  288          ERROR(
"JGandalf: " << 
error.what() << endl << 
V << endl);
 
  295        for (
size_t row = 0; row != N; ++row) {
 
  315      update(fit, __begin, __end, args...);
 
  320      catch (
const exception& 
error) {}
 
  322      for (
size_t i = 0; i != N; ++i) {
 
 
  355      current.result.gradient = zero;
 
 
  369    template<
class JFunction_t, 
class T, 
class ...Args>
 
  370    inline void update(
const JFunction_t& fit, T __begin, T __end, Args ...args)
 
  372      for (T i = __begin; i != __end; ++i) {
 
  379        for (
size_t row = 0; row != 
parameters.size(); ++row) {
 
  380          for (
size_t col = row; col != 
parameters.size(); ++col) {
 
 
  395    template<
class JFunction_t>
 
  396    inline void update(
const JFunction_t& fit)
 
  398      for (
size_t row = 0; row != 
parameters.size(); ++row) {
 
  399        for (
size_t col = 0; col != row; ++col) {
 
  400          V(row,col) = 
V(col,row);
 
 
  413    static inline double get(
const JModel_t& 
model, 
double JModel_t::*parameter)
 
  415      return model.*parameter;
 
 
  426    static inline double& 
get(JModel_t& 
model, 
double JModel_t::*parameter)
 
  428      return model.*parameter;
 
 
  439    static inline double get(
const JModel_t& 
model, 
const size_t index)
 
 
  452    static inline double& 
get(JModel_t& 
model, 
const size_t index)
 
 
  465    static inline double get(
const JModel_t& 
model, 
const int index)
 
 
  478    static inline double& 
get(JModel_t& 
model, 
const int index)
 
 
 
  500  template<
class JModel_t>
 
  507  template<
class JModel_t>
 
  513  template<
class JModel_t>
 
  519  template<
class JModel_t>
 
  526  template<
class JModel_t>
 
  533  template<
class JModel_t>
 
  540  template<
class JModel_t>
 
  547  template<
class JModel_t>
 
General purpose messaging.
 
#define DEBUG(A)
Message macros.
 
Definition of zero value for any class.
 
static auto parameter_type(...) -> std::false_type
 
static auto parameter_type(U *) -> decltype(std::declval< typename U::parameter_type >())
 
static const bool has_parameter_type
 
Fit method based on the Levenberg-Marquardt method.
 
void update(const JFunction_t &fit)
Termination method to update current parameters.
 
double lambda
control parameter
 
static double LAMBDA_MIN
minimal value control parameter
 
static double & get(JModel_t &model, const int index)
Read/write access to parameter value by index.
 
struct JFIT::JGandalf::@12 current
 
void reset()
Reset current parameters.
 
static double LAMBDA_DOWN
multiplication factor control parameter
 
std::vector< parameter_type > parameters
fit parameters
 
static double get(const JModel_t &model, const size_t index)
Read/write access to parameter value by index.
 
static double LAMBDA_UP
multiplication factor control parameter
 
int numberOfIterations
number of iterations
 
static bool EPSILON_ABSOLUTE
set epsilon to absolute difference instead of relative
 
static double get(const JModel_t &model, double JModel_t::*parameter)
Read/write access to parameter value by data member.
 
static int MAXIMUM_ITERATIONS
maximal number of iterations
 
static double PIVOT
minimal value diagonal element of Hesse matrix
 
result_type operator()(const JFunction_t &fit, T __begin, T __end, Args ...args)
Multi-dimensional fit of multiple data sets.
 
void update(const JFunction_t &fit, T __begin, T __end, Args ...args)
Recursive method to update current parameters.
 
JGandalf()
Default constructor.
 
static double EPSILON
maximal distance to minimum
 
static double & get(JModel_t &model, double JModel_t::*parameter)
Read/write access to parameter value by data member.
 
JFIT_LOCAL::JTypedef_t< JModel_t >::parameter_type parameter_type
Data type of fit parameter.
 
JMATH::JMatrixNS V
Hesse matrix.
 
static double LAMBDA_MAX
maximal value control parameter
 
static double get(const JModel_t &model, const int index)
Read/write access to parameter value by index.
 
struct JFIT::JGandalf::@13 previous
 
static double & get(JModel_t &model, const size_t index)
Read/write access to parameter value by index.
 
Auxiliary classes and methods for linear and iterative data regression.
 
void model(JModel_t &value)
Auxiliary function to constrain model during fit.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Auxiliary data structure for floating point format specification.
 
Auxiliary class for handling debug parameter within a class.
 
static int debug
debug level (default is off).
 
double T::* parameter_type
 
T::parameter_type parameter_type
 
Data structure for return value of fit function.
 
result_type()
Default constructor.
 
result_type(const double chi2, const JModel_t &model)
Constructor.
 
JModel_t gradient
partial derivatives of chi2
 
void resize(const size_t size)
Resize matrix.
 
JMatrixND & reset()
Set matrix to the null matrix.
 
void solve(JVectorND_t &u)
Get solution of equation A x = b.
 
void invert()
Invert matrix according LDU decomposition.