LSST Applications 24.1.5,g02d81e74bb+fa3a7a026e,g180d380827+a53a32eff8,g2079a07aa2+86d27d4dc4,g2305ad1205+c0501b3732,g295015adf3+7d3e92f0ec,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g33d1c0ed96+0e5473021a,g3a166c0a6a+0e5473021a,g3ddfee87b4+5dd1654d75,g48712c4677+3bf1020dcb,g487adcacf7+065c13d9cf,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+d7ac436cfb,g5a732f18d5+53520f316c,g64a986408d+fa3a7a026e,g858d7b2824+fa3a7a026e,g8a8a8dda67+585e252eca,g99cad8db69+a5a909b84f,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,ga8c6da7877+4cf350ccb2,gb0e22166c9+60f28cb32d,gba4ed39666+c2a2e4ac27,gbb8dafda3b+f991a0b59f,gc120e1dc64+9ccbfdb8be,gc28159a63d+0e5473021a,gcf0d15dbbd+5dd1654d75,gd96a1ce819+42fd0ee607,gdaeeff99f8+f9a426f77a,ge6526c86ff+0d71447b4b,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gff1a9f87cc+fa3a7a026e
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Friends | List of all members
lsst::meas::modelfit::Optimizer Class Reference

A numerical optimizer customized for least-squares problems with Bayesian priors. More...

#include <optimizer.h>

Public Types

enum  StateFlags {
  CONVERGED_GRADZERO = 0x0001 , CONVERGED_TR_SMALL = 0x0002 , CONVERGED = CONVERGED_GRADZERO | CONVERGED_TR_SMALL , FAILED_MAX_INNER_ITERATIONS = 0x0010 ,
  FAILED_MAX_OUTER_ITERATIONS = 0x0020 , FAILED_MAX_ITERATIONS = 0x0030 , FAILED_EXCEPTION = 0x0040 , FAILED_NAN = 0x0080 ,
  FAILED = FAILED_MAX_INNER_ITERATIONS | FAILED_MAX_OUTER_ITERATIONS | FAILED_EXCEPTION | FAILED_NAN , STATUS_STEP_REJECTED = 0x0100 , STATUS_STEP_ACCEPTED = 0x0200 , STATUS_STEP = STATUS_STEP_REJECTED | STATUS_STEP_ACCEPTED ,
  STATUS_TR_UNCHANGED = 0x1000 , STATUS_TR_DECREASED = 0x2000 , STATUS_TR_INCREASED = 0x4000 , STATUS_TR = STATUS_TR_UNCHANGED | STATUS_TR_DECREASED | STATUS_TR_INCREASED ,
  STATUS = STATUS_STEP | STATUS_TR
}
 
typedef OptimizerObjective Objective
 
typedef OptimizerControl Control
 
typedef OptimizerHistoryRecorder HistoryRecorder
 

Public Member Functions

 Optimizer (std::shared_ptr< Objective const > objective, ndarray::Array< Scalar const, 1, 1 > const &parameters, Control const &ctrl)
 
std::shared_ptr< Objective const > getObjective () const
 
Control const & getControl () const
 
bool step ()
 
bool step (HistoryRecorder const &recorder, afw::table::BaseCatalog &history)
 
int run ()
 
int run (HistoryRecorder const &recorder, afw::table::BaseCatalog &history)
 
int getState () const
 
Scalar getObjectiveValue () const
 
ndarray::Array< Scalar const, 1, 1 > getParameters () const
 
ndarray::Array< Scalar const, 1, 1 > getResiduals () const
 
ndarray::Array< Scalar const, 1, 1 > getGradient () const
 
ndarray::Array< Scalar const, 2, 2 > getHessian () const
 
void removeSR1Term ()
 Remove the symmetric-rank-1 secant term from the Hessian, making it just (J^T J)
 

Friends

class OptimizerHistoryRecorder
 

Detailed Description

A numerical optimizer customized for least-squares problems with Bayesian priors.

The algorithm used by Optimizer combines the Gauss-Newton approach of approximating the second-derivative (Hessian) matrix as the inner product of the Jacobian of the residuals, while maintaining a matrix of corrections to this to account for large residuals, which is updated using a symmetric rank-1 (SR1) secant formula. We assume the prior has analytic first and second derivatives, but use numerical derivatives to compute the Jacobian of the residuals at every step. A trust region approach is used to ensure global convergence.

We consider the function \(f(x)\) we wish to optimize to have two terms, which correspond to negative log likelihood ( \(\chi^2/2=\|r(x)|^2\), where \(r(x)\) is the vector of residuals at \(x\)) and negative log prior \(q(x)=-\ln P(x)\):

\[ f(x) = \frac{1}{2}\|r(x)\|^2 + q(x) \]

At each iteration \(k\), we expand \(f(x)\) in a Taylor series in \(s=x_{k+1}-x_{k}\):

\[ f(x) \approx m(s) = f(x_k) + g_k^T s + \frac{1}{2}s^T H_k s \]

where

\[ g_k \equiv \left.\frac{\partial f}{\partial x}\right|_{x_k} = J_k^T r_k + \nabla q_k;\quad\quad J_k \equiv \left.\frac{\partial r}{\partial x}\right|_{x_k} \]

\[ H_k = J_k^T J_k + \nabla^2 q_k + B_k \]

Here, \(B_k\) is the SR1 approximation term to the second derivative term:

\[ B_k \approx \sum_i \frac{\partial^2 r^{(i)}_k}{\partial x^2}r^{(i)}_k \]

which we initialize to zero and then update with the following formula:

\[ B_{k+1} = B_{k} + \frac{v v^T}{v^T s};\quad\quad v\equiv J^T_{k+1} r_{k+1} - J^T_k r_k \]

Unlike the more common rank-2 BFGS update formula, SR1 updates are not guaranteed to produce a positive definite Hessian. This can result in more accurate approximations of the Hessian (and hence more accurate covariance matrices), but it rules out line-search methods and the simple dog-leg approach to the trust region problem. As a result, we should require fewer steps to converge, but spend more time computing each step; this is ideal when we expect the time spent in function evaluation to dominate the time per step anyway.

Definition at line 399 of file optimizer.h.

Member Typedef Documentation

◆ Control

Definition at line 403 of file optimizer.h.

◆ HistoryRecorder

Definition at line 404 of file optimizer.h.

◆ Objective

Definition at line 402 of file optimizer.h.

Member Enumeration Documentation

◆ StateFlags

Enumerator
CONVERGED_GRADZERO 
CONVERGED_TR_SMALL 
CONVERGED 
FAILED_MAX_INNER_ITERATIONS 
FAILED_MAX_OUTER_ITERATIONS 
FAILED_MAX_ITERATIONS 
FAILED_EXCEPTION 
FAILED_NAN 
FAILED 
STATUS_STEP_REJECTED 
STATUS_STEP_ACCEPTED 
STATUS_STEP 
STATUS_TR_UNCHANGED 
STATUS_TR_DECREASED 
STATUS_TR_INCREASED 
STATUS_TR 
STATUS 

Definition at line 406 of file optimizer.h.

406 {
407 CONVERGED_GRADZERO = 0x0001,
408 CONVERGED_TR_SMALL = 0x0002,
412 FAILED_MAX_ITERATIONS = 0x0030,
413 FAILED_EXCEPTION = 0x0040,
414 FAILED_NAN = 0x0080,
416 STATUS_STEP_REJECTED = 0x0100,
417 STATUS_STEP_ACCEPTED = 0x0200,
419 STATUS_TR_UNCHANGED = 0x1000,
420 STATUS_TR_DECREASED = 0x2000,
421 STATUS_TR_INCREASED = 0x4000,
424 };

Constructor & Destructor Documentation

◆ Optimizer()

lsst::meas::modelfit::Optimizer::Optimizer ( std::shared_ptr< Objective const > objective,
ndarray::Array< Scalar const, 1, 1 > const & parameters,
Control const & ctrl )

Member Function Documentation

◆ getControl()

Control const & lsst::meas::modelfit::Optimizer::getControl ( ) const
inline

Definition at line 434 of file optimizer.h.

434{ return _ctrl; }

◆ getGradient()

ndarray::Array< Scalar const, 1, 1 > lsst::meas::modelfit::Optimizer::getGradient ( ) const
inline

Definition at line 456 of file optimizer.h.

456{ return _gradient; }

◆ getHessian()

ndarray::Array< Scalar const, 2, 2 > lsst::meas::modelfit::Optimizer::getHessian ( ) const
inline

Definition at line 458 of file optimizer.h.

458{ return _hessian; }

◆ getObjective()

std::shared_ptr< Objective const > lsst::meas::modelfit::Optimizer::getObjective ( ) const
inline

Definition at line 432 of file optimizer.h.

432{ return _objective; }

◆ getObjectiveValue()

Scalar lsst::meas::modelfit::Optimizer::getObjectiveValue ( ) const
inline

Definition at line 450 of file optimizer.h.

450{ return _current.objectiveValue; }

◆ getParameters()

ndarray::Array< Scalar const, 1, 1 > lsst::meas::modelfit::Optimizer::getParameters ( ) const
inline

Definition at line 452 of file optimizer.h.

452{ return _current.parameters; }

◆ getResiduals()

ndarray::Array< Scalar const, 1, 1 > lsst::meas::modelfit::Optimizer::getResiduals ( ) const
inline

Definition at line 454 of file optimizer.h.

454{ return _current.residuals; }

◆ getState()

int lsst::meas::modelfit::Optimizer::getState ( ) const
inline

Definition at line 448 of file optimizer.h.

448{ return _state; }

◆ removeSR1Term()

void lsst::meas::modelfit::Optimizer::removeSR1Term ( )

Remove the symmetric-rank-1 secant term from the Hessian, making it just (J^T J)

◆ run() [1/2]

int lsst::meas::modelfit::Optimizer::run ( )
inline

Definition at line 442 of file optimizer.h.

442{ return _runImpl(); }

◆ run() [2/2]

int lsst::meas::modelfit::Optimizer::run ( HistoryRecorder const & recorder,
afw::table::BaseCatalog & history )
inline

Definition at line 444 of file optimizer.h.

444 {
445 return _runImpl(&recorder, &history);
446 }

◆ step() [1/2]

bool lsst::meas::modelfit::Optimizer::step ( )
inline

Definition at line 436 of file optimizer.h.

436{ return _stepImpl(0); }

◆ step() [2/2]

bool lsst::meas::modelfit::Optimizer::step ( HistoryRecorder const & recorder,
afw::table::BaseCatalog & history )
inline

Definition at line 438 of file optimizer.h.

438 {
439 return _stepImpl(0, &recorder, &history);
440 }

Friends And Related Symbol Documentation

◆ OptimizerHistoryRecorder

friend class OptimizerHistoryRecorder
friend

Definition at line 476 of file optimizer.h.


The documentation for this class was generated from the following file: