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.