1#ifndef __JFIT__JGANDALF__
2#define __JFIT__JGANDALF__
24namespace 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();
179 current.result.gradient = zero;
192 update(fit, __begin, __end, args...);
211 update(fit, __begin, __end, args...);
216 catch (
const exception&
error) {}
218 for (
size_t i = 0; i != N; ++i) {
247 update(fit, __begin, __end, args...);
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) {
314 update(fit, __begin, __end, args...);
319 catch (
const exception&
error) {}
321 for (
size_t i = 0; i != N; ++i) {
354 current.result.gradient = zero;
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);
412 static inline double get(
const JModel_t&
model,
double JModel_t::*parameter)
414 return model.*parameter;
425 static inline double&
get(JModel_t&
model,
double JModel_t::*parameter)
427 return model.*parameter;
438 static inline double get(
const JModel_t&
model,
const size_t index)
451 static inline double&
get(JModel_t&
model,
const size_t index)
464 static inline double get(
const JModel_t&
model,
const int index)
477 static inline double&
get(JModel_t&
model,
const int index)
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.
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.