71 lSR1(
int M,
bool useDefaultScaling =
true, Real Bscaling = Real(1), ESecantMode
mode = SECANTMODE_BOTH)
72 :
Secant<Real>(M,useDefaultScaling,Bscaling,
mode), isInitialized_(false),
73 H0called_(false), B0called_(false) {
80 const Vector<Real> &gp,
const Vector<Real> &s,
82 const Real one(1), tol(std::sqrt(ROL_EPSILON<Real>()));
83 if ( !isInitialized_ ) {
84 state_->iterate = x.clone();
86 if (
state_->mode == SECANTMODE_FORWARD) {
87 Bs_ = grad.clone(); dual_ = grad.clone();
89 else if (
state_->mode == SECANTMODE_INVERSE) {
90 Hy_ = x.clone(); prim_ = x.clone();
93 Bs_ = grad.clone(); dual_ = grad.clone();
94 Hy_ = x.clone(); prim_ = x.clone();
96 isInitialized_ =
true;
107 Real dotF(ROL_INF<Real>()), tolF(0), dotI(ROL_INF<Real>()), tolI(0);
108 if (
state_->mode == SECANTMODE_FORWARD ||
state_->mode == SECANTMODE_BOTH) {
114 dotF = s.apply(*Bs_);
115 tolF = tol*
snorm*Bs_->norm();
117 if (
state_->mode == SECANTMODE_INVERSE ||
state_->mode == SECANTMODE_BOTH) {
123 dotI =
y_->apply(*Hy_);
124 tolI = tol*
y_->norm()*Hy_->norm();
126 if (std::abs(dotF) > tolF && std::abs(dotI) > tolI) {
129 if (
state_->mode == SECANTMODE_INVERSE ||
state_->mode == SECANTMODE_BOTH) {
130 state_->iterDiff.push_back(x.clone());
132 if (
state_->mode == SECANTMODE_FORWARD ||
state_->mode == SECANTMODE_BOTH) {
133 state_->gradDiff.push_back(grad.clone());
137 if (
state_->mode == SECANTMODE_INVERSE ||
state_->mode == SECANTMODE_BOTH) {
142 if (
state_->mode == SECANTMODE_FORWARD ||
state_->mode == SECANTMODE_BOTH) {
148 if (
state_->mode == SECANTMODE_INVERSE ||
state_->mode == SECANTMODE_BOTH) {
150 state_->product2.push_back(dotI);
152 if (
state_->mode == SECANTMODE_FORWARD ||
state_->mode == SECANTMODE_BOTH) {
154 state_->product.push_back(dotF);
void updateStorage(const Vector< Real > &x, const Vector< Real > &grad, const Vector< Real > &gp, const Vector< Real > &s, const Real snorm, const int iter)