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>());
36 template<
typename>
static auto parameter_type(...) -> std::false_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();
192 update(fit, __begin, __end, args...);
207 update(fit, __begin, __end, args...);
212 catch (
const exception&
error) {
241 update(fit, __begin, __end, args...);
244 DEBUG(
"Hesse matrix:" << endl <<
V << endl);
248 for (
size_t i = 0;
i !=
N; ++
i) {
254 h[
i] = 1.0 / sqrt(
V(
i,
i));
259 for (
size_t row = 0; row !=
N; ++row) {
260 for (
size_t col = 0; col != row; ++col) {
261 V(row,col) *=
h[row] *
h[col];
262 V(col,row) =
V(row,col);
266 for (
size_t i = 0;
i !=
N; ++
i) {
272 for (
size_t col = 0; col !=
N; ++col) {
279 catch (
const exception&
error) {
281 ERROR(
"JGandalf: " << error.what() << endl <<
V << endl);
288 for (
size_t row = 0; row !=
N; ++row) {
309 update(fit, __begin, __end, args...);
314 catch (
const exception&
error) {
360 template<
class JFunction_t,
class T,
class ...Args>
361 inline void update(
const JFunction_t& fit, T __begin, T __end, Args ...
args)
363 for (T
i = __begin;
i != __end; ++
i) {
367 current.result.chi2 += result.chi2;
368 current.result.gradient += result.gradient;
370 for (
size_t row = 0; row !=
parameters.size(); ++row) {
371 for (
size_t col = row; col !=
parameters.size(); ++col) {
386 template<
class JFunction_t>
387 inline void update(
const JFunction_t& fit)
389 for (
size_t row = 0; row !=
parameters.size(); ++row) {
390 for (
size_t col = 0; col != row; ++col) {
391 V(row,col) =
V(col,row);
404 static inline double get(
const JModel_t&
model,
double JModel_t::*parameter)
406 return model.*parameter;
417 static inline double&
get(JModel_t&
model,
double JModel_t::*parameter)
419 return model.*parameter;
430 static inline double get(
const JModel_t&
model,
const size_t index)
443 static inline double&
get(JModel_t&
model,
const size_t index)
456 static inline double get(
const JModel_t&
model,
const int index)
469 static inline double&
get(JModel_t&
model,
const int index)
492 template<
class JModel_t>
499 template<
class JModel_t>
506 template<
class JModel_t>
513 template<
class JModel_t>
520 template<
class JModel_t>
527 template<
class JModel_t>
534 template<
class JModel_t>
T::parameter_type parameter_type
static int debug
debug level (default is off).
double lambda
control parameter
static double EPSILON
maximal distance to minimum
JFIT_LOCAL::JTypedef_t< JModel_t >::parameter_type parameter_type
Data type of fit parameter.
static double PIVOT
minimal value diagonal element of Hesse matrix
JMATH::JMatrixNS V
Hesse matrix.
static const JZero zero
Function object to assign zero value.
JMatrixND & reset()
Set matrix to the null matrix.
Auxiliary data structure for floating point format specification.
std::vector< parameter_type > parameters
fit parameters
void resize(const size_t size)
Resize matrix.
static double LAMBDA_MIN
minimal value control parameter
static double LAMBDA_DOWN
multiplication factor control parameter
Definition of zero value for any class.
void reset()
Reset current parameters.
void update(const JFunction_t &fit)
Termination method to update current parameters.
do set_variable OUTPUT_DIRECTORY $WORKDIR T
JModel_t gradient
partial derivatives of chi2
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.
struct JFIT::JGandalf::@10 current
static auto parameter_type(U *) -> decltype(std::declval< typename U::parameter_type >())
General purpose messaging.
static double LAMBDA_UP
multiplication factor control parameter
void invert()
Invert matrix according LDU decomposition.
Fit method based on the Levenberg-Marquardt method.
then usage $script< input file >[option[primary[working directory]]] nWhere option can be N
Data structure for return value of fit function.
void solve(JVectorND_t &u)
Get solution of equation A x = b.
static const bool has_parameter_type
result_type(const double chi2, const JModel_t &model)
Constructor.
static int MAXIMUM_ITERATIONS
maximal number of iterations
int numberOfIterations
number of iterations
static double LAMBDA_MAX
maximal value control parameter
result_type()
Default constructor.
struct JFIT::JGandalf::@11 previous
double T::* parameter_type
#define DEBUG(A)
Message macros.
Auxiliary class for handling debug parameter within a class.
JGandalf()
Default constructor.