ROL
ROL_SecantFactory.hpp
Go to the documentation of this file.
1// @HEADER
2// ************************************************************************
3//
4// Rapid Optimization Library (ROL) Package
5// Copyright (2014) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact lead developers:
38// Drew Kouri (dpkouri@sandia.gov) and
39// Denis Ridzal (dridzal@sandia.gov)
40//
41// ************************************************************************
42// @HEADER
43
44#ifndef ROL_SECANTFACTORY_H
45#define ROL_SECANTFACTORY_H
46
47#include "ROL_Types.hpp"
48
49#include "ROL_ParameterList.hpp"
50#include "ROL_Ptr.hpp"
51
52#include "ROL_Secant.hpp"
53#include "ROL_lBFGS.hpp"
54#include "ROL_lDFP.hpp"
55#include "ROL_lSR1.hpp"
57
58namespace ROL {
59 template<class Real>
60 inline ROL::Ptr<Secant<Real> > getSecant( ESecant esec = SECANT_LBFGS, int L = 10, int BBtype = 1 ) {
61 switch (esec) {
62 case SECANT_LBFGS: return ROL::makePtr<lBFGS<Real>>(L);
63 case SECANT_LDFP: return ROL::makePtr<lDFP<Real>>(L);
64 case SECANT_LSR1: return ROL::makePtr<lSR1<Real>>(L);
65 case SECANT_BARZILAIBORWEIN: return ROL::makePtr<BarzilaiBorwein<Real>>(BBtype);
66 default: return ROL::nullPtr;
67 }
68 }
69
70 template<class Real>
71 inline ROL::Ptr<Secant<Real> > SecantFactory( ROL::ParameterList &parlist, ESecantMode mode = SECANTMODE_BOTH ) {
73 parlist.sublist("General").sublist("Secant").get("Type","Limited-Memory BFGS") );
74 int L = parlist.sublist("General").sublist("Secant").get("Maximum Storage",10);
75 int BB = parlist.sublist("General").sublist("Secant").get("Barzilai-Borwein",1);
76 bool uds = parlist.sublist("General").sublist("Secant").get("Use Default Scaling",true);
77 Real s = parlist.sublist("General").sublist("Secant").get("Initial Hessian Scale",1.0);
78 switch (esec) {
79 case SECANT_LBFGS: return ROL::makePtr<lBFGS<Real>>(L,uds,s);
80 case SECANT_LDFP: return ROL::makePtr<lDFP<Real>>(L,uds,s);
81 case SECANT_LSR1: return ROL::makePtr<lSR1<Real>>(L,uds,s,mode);
82 case SECANT_BARZILAIBORWEIN: return ROL::makePtr<BarzilaiBorwein<Real>>(BB);
83 default: return ROL::nullPtr;
84 }
85 }
86}
87
88#endif
Contains definitions of custom data types in ROL.
ESecant StringToESecant(std::string s)
@ SECANT_LSR1
@ SECANT_LDFP
@ SECANT_LBFGS
@ SECANT_BARZILAIBORWEIN
ESecantMode
@ SECANTMODE_BOTH
ROL::Ptr< Secant< Real > > SecantFactory(ROL::ParameterList &parlist, ESecantMode mode=SECANTMODE_BOTH)
ROL::Ptr< Secant< Real > > getSecant(ESecant esec=SECANT_LBFGS, int L=10, int BBtype=1)