1#ifndef __JFIT__JGRADIENT__
2#define __JFIT__JGRADIENT__
21namespace JPP {
using namespace JFIT; }
40 virtual void apply(
const double step) = 0;
48 public std::shared_ptr<JParameter_t>
91 const int debug = 3) :
123 return numeric_limits<double>::max();
128 const size_t N = this->size();
133 for (
size_t i = 0; i != N; ++i) {
152 for (
double ds = 1.0; ds > 1.0e-3; ) {
154 this->
move(+1.0 * ds);
158 DEBUG(
"chi2[3] " << setw(4) << m <<
' ' <<
FIXED(12,5) << chi2[3] <<
' ' <<
FIXED(12,5) << ds << endl);
160 if (chi2[3] < chi2[2]) {
184 for ( ; m != 0; --m) {
185 this->
move(-1.0 * ds);
192 this->
move(-1.0 * ds);
194 if (chi2[2] < chi2[3]) {
202 const double f21 = chi2[2] - chi2[1];
203 const double f23 = chi2[2] - chi2[3];
205 const double xs = 0.5 * (f21 - f23) / (f23 + f21);
207 this->
move(+1.0 * xs * ds);
211 if (chi2[3] < chi2[2]) {
217 this->
move(-1.0 * xs * ds);
232 if (fabs(chi2[2] - chi2[0]) <
epsilon * 0.5 * (fabs(chi2[0]) + fabs(chi2[2]))) {
244 for (
size_t i = 0; i != N; ++i){
255 for (
size_t i = 0; i != N; ++i){
257 H[i] = G[i] + dgg * H[i];
287 const size_t N = this->size();
299 for (
size_t i = 0; i != N; ++i) {
300 if ((*
this)[i].name.size() > width) {
301 width = (*this)[i].name.size();
307 for (
size_t i = 0; i != N; ++i) {
309 if ((*
this)[i].value != 0.0) {
311 (*this)[i]->apply(+0.5 * (*
this)[i].value);
315 (*this)[i]->apply(-0.5 * (*
this)[i].value);
316 (*this)[i]->apply(-0.5 * (*
this)[i].value);
322 (*this)[i]->apply(+0.5 * (*
this)[i].value);
324 DEBUG(setw(width) << left << (*
this)[i].name << right <<
' ' <<
FIXED(12,5) << (*
this)[i].value <<
' ' <<
FIXED(12,5) <<
gradient[i] << endl);
334 DEBUG(setw(width) << left <<
"|gradient|" << right <<
' ' <<
FIXED(12,5) << sqrt(V) << endl);
348 for (
size_t i = 0; i != this->size(); ++i) {
349 (*this)[ i ]->apply((*
this)[ i ].value *
gradient[ i ] * factor);
351 }
else if (factor < 0.0) {
352 for (
size_t i = this->size(); i != 0; --i) {
353 (*this)[i-1]->apply((*
this)[i-1].value *
gradient[i-1] * factor);
General purpose messaging.
#define DEBUG(A)
Message macros.
Auxiliary classes and methods for linear and iterative data regression.
double getChi2(const double P)
Get chi2 corresponding to given probability.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
size_t Nmax
maximum number of iterations
void move(const double factor)
Move.
std::vector< double > gradient
double evaluate(const T &getChi2)
Evaluate gradient.
double operator()(const T &getChi2)
Fit.
JGradient(const size_t Nmax=std::numeric_limits< size_t >::max(), const size_t Nextra=0, const double epsilon=1.0e-4, const int debug=3)
Constructor.
size_t numberOfIterations
size_t Nextra
maximum number of extra steps
Auxiliary data structure for editable parameter.
JModifier_t(const std::string &name, JParameter_t *parameter, const double value)
Constructor.
Auxiliary data structure for fit parameter.
virtual void apply(const double step)=0
Apply step.
virtual ~JParameter_t()
Virtual destructor.
Auxiliary data structure for floating point format specification.