LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
Classes | 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) More...
 

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 Function 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: