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.