ROL
ROL_ParameterListConverters.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 
45 #ifndef ROL_PARAMETER_LIST_CONVERTERS_H
46 #define ROL_PARAMETER_LIST_CONVERTERS_H
47 
48 #include <map>
49 #include "ROL_Types.hpp"
50 #include "Teuchos_ParameterList.hpp"
51 
52 
53 namespace ROL {
54 
55 namespace StringList {
56 
58 inline std::vector<std::string> join( const std::string &s1,
59  const std::string &s2 ) {
60  std::vector<std::string> v;
61  v.push_back(s1);
62  v.push_back(s2);
63 
64  return v;
65 }
66 
68 inline std::vector<std::string> join( const std::string &s1,
69  const std::string &s2,
70  const std::string &s3 ) {
71  std::vector<std::string> v;
72  v.push_back(s1);
73  v.push_back(s2);
74  v.push_back(s3);
75 
76  return v;
77 }
78 
80 inline std::vector<std::string> join( const std::string &s1,
81  const std::string &s2,
82  const std::string &s3,
83  const std::string &s4 ) {
84  std::vector<std::string> v;
85  v.push_back(s1);
86  v.push_back(s2);
87  v.push_back(s3);
88  v.push_back(s4);
89 
90  return v;
91 }
92 
94 inline std::vector<std::string> join( const std::string &s1,
95  const std::string &s2,
96  const std::string &s3,
97  const std::string &s4,
98  const std::string &s5 ) {
99  std::vector<std::string> v;
100  v.push_back(s1);
101  v.push_back(s2);
102  v.push_back(s3);
103  v.push_back(s4);
104  v.push_back(s5);
105 
106  return v;
107 }
108 
109 } // namespace StringList
110 
111 template<class ParameterType>
112 void setParameter( Teuchos::ParameterList &parlist,
113  const std::vector<std::string> &location,
114  const std::vector<std::string>::iterator iter,
115  ParameterType value ) {
116 
117  if( iter == location.end()-1 ) { // Key name
118  parlist.set(*iter,value);
119  }
120  else { // sublist
121  Teuchos::ParameterList &sublist = parlist.sublist(*iter);
122  setParameter(sublist,location,iter+1,value);
123  }
124 
125 
126 }
127 
128 
129 
131 inline void tierParameterList( Teuchos::ParameterList &outList,
132  const Teuchos::ParameterList &inList ) {
133 
134  using namespace Teuchos;
135  using StringList::join;
136 
137  typedef std::string Str;
138  typedef std::vector<Str> Vec;
139  typedef std::map<Str,Vec> Map;
140  typedef ParameterList::ConstIterator IterPL;
141  typedef typename Vec::iterator IterVec;
142  typedef typename Map::iterator IterMap;
143 
144  Map dict;
145 
146  // Original flat list name heirarchical list name
147  dict["Use Inexact Gradient"] = join("General","Inexact Gradient");
148  dict["Use Inexact Objective Function"] = join("General","Inexact Objective Function");
149  dict["Use Inexact Hessian-Times-A-Vector"] = join("General","Inexact Hessian-Times-A-Vector");
150  dict["Use Projected Gradient Criticality Measure"] = join("General","Projected Gradient Criticality Measure");
151  dict["Scale for Epsilon Active Sets"] = join("General","Scale for Epsilon Active Sets");
152  dict["Variable Objective Function"] = join("General","Variable Objective Function");
153 
154  dict["Absolute Krylov Tolerance"] = join("General","Krylov","Absolute Tolerance");
155  dict["Relative Krylov Tolerance"] = join("General","Krylov","Relative Tolerance");
156  dict["Maximum Number of Krylov Iterations"] = join("General","Krylov","Iteration Limit");
157  dict["Krylov Type"] = join("General","Krylov","Type");
158 
159  dict["Barzilai-Borwein Type"] = join("General","Secant","Barzilai-Borwein Type");
160  dict["Maximum Secant Storage"] = join("General","Secant","Maximum Storage");
161  dict["Secant Type"] = join("General","Secant","Type");
162  dict["Use Secant Hessian-Times-A-Vector"] = join("General","Secant","Use as Hessian");
163  dict["Use Secant Preconditioning"] = join("General","Secant","Use as Preconditioner");
164 
165  dict["Gradient Tolerance"] = join("Status Test","Gradient Tolerance");
166  dict["Maximum Number of Iterations"] = join("Status Test","Iteration Limit");
167  dict["Step Tolerance"] = join("Status Test","Step Tolerance");
168 
169  dict["Accept Last Alpha"] = join("Step","Line Search","Accept Last Alpha");
170  dict["Accept Linesearch Minimizer"] = join("Step","Line Search","Accept Linesearch Minimizer");
171  dict["Maximum Number of Function Evaluations"] = join("Step","Line Search","Function Evaluation Limit");
172  dict["Initial Linesearch Parameter"] = join("Step","Line Search","Initial Step Size");
173  dict["Sufficient Decrease Parameter"] = join("Step","Line Search","Sufficient Decrease Tolerance");
174  dict["User Defined Linesearch Parameter"] = join("Step","Line Search","User Defined Initial Step Size");
175 
176  dict["Curvature Conditions Parameter"] = join("Step","Line Search","Curvature Condition","General Parameter");
177  dict["Curvature Conditions Parameter: Generalized Wolfe"] = join("Step","Line Search","Curvature Condition","Generalized Wolfe Parameter");
178  dict["Linesearch Curvature Condition"] = join("Step","Line Search","Curvature Condition","Type");
179 
180  dict["Nonlinear CG Type"] = join("Step","Line Search","Descent Method","Nonlinear CG Type");
181  dict["Descent Type"] = join("Step","Line Search","Descent Method","Type");
182 
183  dict["Backtracking Rate"] = join("Step","Line Search","Line-Search Method","Backtracking Rate");
184  dict["Bracketing Tolerance"] = join("Step","Line Search","Line-Search Method","Bracketing Tolerance");
185  dict["Linesearch Type"] = join("Step","Line Search","Line-Search Method","Type");
186 
187  dict["Initial Trust-Region Radius"] = join("Step","Trust Region","Initial Radius");
188  dict["Maximum Trust-Region Radius"] = join("Step","Trust Region","Maximum Radius");
189  dict["Radius Growing Threshold"] = join("Step","Trust Region","Radius Growing Threshold");
190  dict["Radius Growing Rate"] = join("Step","Trust Region","Radius Growing Rate");
191  dict["Radius Shrinking Threshold"] = join("Step","Trust Region","Radius Shrinking Threshold");
192  dict["Trust-Region Safeguard"] = join("Step","Trust Region","Safeguard Size");
193  dict["Trust-Region Subproblem Solver Type"] = join("Step","Trust Region","Subproblem Solver");
194  dict["Step Acceptance Parameter"] = join("Step","Trust Region","Step Acceptance Threshold");
195 
196  dict["Gradient Update Relative Tolerance"] = join("Step","Trust Region","Gradient","Relative Tolerance");
197  dict["Gradient Update Tolerance Scaling"] = join("Step","Trust Region","Gradient","Tolerance Scaling");
198  dict["Value Update Exponent"] = join("Step","Trust Region","Inexact","Value","Exponent");
199  dict["Value Update Forcing Sequence Initial Value"] = join("Step","Trust Region","Inexact","Value","Forcing Sequence Initial Value");
200  dict["Value Update Forcing Sequence Reduction Factor"] = join("Step","Trust Region","Inexact","Value","Forcing Sequence Reduction Factor");
201  dict["Value Update Forcing Sequence Update Frequency"] = join("Step","Trust Region","Inexact","Value","Forcing Sequence Update Frequency");
202  dict["Value Update Tolerance Scaling"] = join("Step","Trust Region","Inexact","Value","Tolerance Scaling");
203 
204 
205  // Add duplicate entries with unformatted keys
206  for(IterMap itmap = dict.begin(); itmap != dict.end(); ++itmap) {
207  Str key = itmap->first;
208  Vec value = itmap->second;
209  dict[removeStringFormat(key)] = value;
210  }
211 
212 
213  // Iterate over parameter list
214  for(IterPL itpl = inList.begin(); itpl != inList.end(); ++itpl) {
215 
216  // Get name of old key
217  Str key( inList.name(itpl) );
218 
219  // Look up location/name of new key
220  Vec location = dict[removeStringFormat(key)];
221 
222  // Skip if not found in map
223  if(location.size() != 0) {
224 
225  IterVec itvec = location.begin();
226 
227  if( inList.isType<bool>(key) ) {
228  bool value = inList.get<bool>( key );
229  setParameter( outList, location, itvec, value );
230  }
231  else if( inList.isType<int>(key) ) {
232  int value = inList.get<int>( key );
233  setParameter( outList, location, itvec, value );
234  }
235  else if( inList.isType<double>(key) ) {
236  double value = inList.get<double>( key );
237  setParameter( outList, location, itvec, value );
238  }
239  else if( inList.isType<std::string>(key) ) {
240  std::string value = inList.get<std::string>( key );
241  setParameter( outList, location, itvec, value );
242  }
243  else {
244  TEUCHOS_TEST_FOR_EXCEPTION( true, std::invalid_argument,
245  ">>>Error: Unhandled parameter type." );
246  }
247  }
248 
249  }
250 }
251 
252 } // namespace ROL
253 
254 #endif
Contains definitions of custom data types in ROL.
std::string removeStringFormat(std::string s)
Definition: ROL_Types.hpp:141
void tierParameterList(Teuchos::ParameterList &outList, const Teuchos::ParameterList &inList)
Produce a heirarchical parameter list using the new names from a flat list of the old names...
void setParameter(Teuchos::ParameterList &parlist, const std::vector< std::string > &location, const std::vector< std::string >::iterator iter, ParameterType value)
std::vector< std::string > join(const std::string &s1, const std::string &s2)
Helper function for making vectors of strings.