1 #ifndef __JFIT__JGANDALF__ 
    2 #define __JFIT__JGANDALF__ 
   24 namespace JPP { 
using namespace JFIT; }
 
   31   namespace JFIT_LOCAL {
 
   35       template<
class U>   
static auto parameter_type(U*)   -> decltype(std::declval<typename U::parameter_type>());
 
   39       static const bool has_parameter_type  = !std::is_same<std::false_type, decltype(parameter_type<T> (0))>::value;
 
   42     template<class T, bool has_parameter_type = JTypedef<T>::has_parameter_type>
 
   55   template<
class JModel_t>
 
   56   inline void model(JModel_t& value)
 
   83   template<
class JModel_t>
 
   85     public JMessage< JGandalf<JModel_t> >
 
  118                   const JModel_t& 
model) :
 
  129       operator double()
 const  
  159     template<
class JFunction_t, 
class T, 
class ...Args>
 
  175       previous.result.chi2 = numeric_limits<double>::max();
 
  177       current.result.chi2     = numeric_limits<double>::max();
 
  216               catch (
const exception& 
error) {}
 
  218               for (
size_t i = 0; i != N; ++i) {
 
  250         DEBUG(
"Hesse matrix:" << endl << 
V << endl);
 
  254         for (
size_t i = 0; i != N; ++i) {
 
  260           h[i] = 1.0 / sqrt(
V(i,i));
 
  265         for (
size_t row = 0; row != N; ++row) {
 
  266           for (
size_t col = 0; col != row; ++col) {
 
  267             V(row,col) *= 
h[row] * 
h[col];
 
  268             V(col,row)  = 
V(row,col);
 
  272         for (
size_t i = 0; i != N; ++i) {
 
  278         for (
size_t col = 0; col != N; ++col) {
 
  285         catch (
const exception& 
error) {
 
  287           ERROR(
"JGandalf: " << 
error.what() << endl << 
V << endl);
 
  294         for (
size_t row = 0; row != N; ++row) {
 
  319       catch (
const exception& 
error) {}
 
  321       for (
size_t i = 0; i != N; ++i) {
 
  368     template<
class JFunction_t, 
class T, 
class ...Args>
 
  369     inline void update(
const JFunction_t& fit, T __begin, T __end, Args ...
args)
 
  371       for (T i = __begin; i != __end; ++i) {
 
  378         for (
size_t row = 0; row != 
parameters.size(); ++row) {
 
  379           for (
size_t col = row; col != 
parameters.size(); ++col) {
 
  394     template<
class JFunction_t>
 
  395     inline void update(
const JFunction_t& fit)
 
  397       for (
size_t row = 0; row != 
parameters.size(); ++row) {
 
  398         for (
size_t col = 0; col != row; ++col) {
 
  399           V(row,col) = 
V(col,row);
 
  414       return model.*parameter;
 
  427       return model.*parameter;
 
  499   template<
class JModel_t>
 
  506   template<
class JModel_t>
 
  512   template<
class JModel_t>
 
  518   template<
class JModel_t>
 
  525   template<
class JModel_t>
 
  532   template<
class JModel_t>
 
  539   template<
class JModel_t>
 
  546   template<
class JModel_t>
 
General purpose messaging.
 
#define DEBUG(A)
Message macros.
 
Definition of zero value for any class.
 
Place holder for custom implementation.
 
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 size_t index)
Read/write access to parameter value by index.
 
struct JFIT::JGandalf::@12 current
 
void reset()
Reset current parameters.
 
static double & get(JModel_t &model, double JModel_t::*parameter)
Read/write access to parameter value by data member.
 
static double LAMBDA_DOWN
multiplication factor control parameter
 
static double & get(JModel_t &model, const int index)
Read/write access to parameter value by index.
 
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
 
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
 
Auxiliary classes and methods for linear and iterative data regression.
 
void model(JModel_t &value)
Auxiliary function to constrain model during fit.
 
static const JZero zero
Function object to assign zero value.
 
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.