MoochoPack : Framework for Large-Scale Optimization Algorithms  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
MoochoPack_CheckConvergence_Strategy.cpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization
5 // Copyright (2003) 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 Roscoe A. Bartlett (rabartl@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #include <assert.h>
43 
44 #include "MoochoPack_CheckConvergence_Strategy.hpp"
45 #include "OptionsFromStreamPack_StringToBool.hpp"
46 
47 namespace MoochoPack {
48 
50 // CheckConvergence_Strategy
52 
53 
55  EOptErrorCheck opt_error_check,
56  EScaleKKTErrorBy scale_opt_error_by,
57  EScaleKKTErrorBy scale_feas_error_by,
58  EScaleKKTErrorBy scale_comp_error_by,
59  bool scale_opt_error_by_Gf
60  )
61  :
62  opt_error_check_(opt_error_check),
63  scale_opt_error_by_(scale_opt_error_by),
64  scale_feas_error_by_(scale_feas_error_by),
65  scale_comp_error_by_(scale_comp_error_by),
66  scale_opt_error_by_Gf_(scale_opt_error_by_Gf)
67  {}
68 
69 
71 // CheckConvergence_StrategySetOptions
73 
74 // Define the options
75 namespace {
76 
77 const int local_num_options = 4;
78 
79 enum local_EOptions
80  {
81  SCALE_OPT_ERROR_BY,
82  SCALE_FEAS_ERROR_BY,
83  SCALE_COMP_ERROR_BY,
84  SCALE_OPT_ERROR_BY_GF
85  };
86 
87 const char* local_SOptions[local_num_options] =
88  {
89  "scale_opt_error_by",
90  "scale_feas_error_by",
91  "scale_comp_error_by",
92  "scale_opt_error_by_Gf",
93  };
94 
95 } // end namespace
96 
99  const char opt_grp_name[] )
100  :
101  OptionsFromStreamPack::SetOptionsFromStreamNode(
102  opt_grp_name, local_num_options, local_SOptions ),
103  OptionsFromStreamPack::SetOptionsToTargetBase<
104  CheckConvergence_Strategy >( target )
105  {}
106 
107 
109  int option_num,
110  const std::string& option_value )
111  {
112  using OptionsFromStreamPack::StringToBool;
113 
114  typedef CheckConvergence_Strategy target_t;
115  switch( (local_EOptions)option_num )
116  {
117  case SCALE_OPT_ERROR_BY:
118  case SCALE_FEAS_ERROR_BY:
119  case SCALE_COMP_ERROR_BY:
120  {
121  const std::string &option = option_value.c_str();
122  CheckConvergence_Strategy::EScaleKKTErrorBy scale_by = target_t::SCALE_BY_ONE;
123 
124  if( option == "SCALE_BY_ONE" )
125  { scale_by = target_t::SCALE_BY_ONE; }
126  else if( option == "SCALE_BY_NORM_2_X" )
127  { scale_by = target_t::SCALE_BY_NORM_2_X; }
128  else if( option == "SCALE_BY_NORM_INF_X" )
129  { scale_by = target_t::SCALE_BY_NORM_INF_X; }
130  else
131  {
132  throw std::invalid_argument( "Error, incorrect value for "
133  "\"scale_kkt_error_by\". Only the options "
134  "SCALE_BY_ONE, SCALE_BY_NORM_2_X, and SCALE_BY_NORM_INF_X "
135  "are available" );
136  }
137 
138 
139  if ((local_EOptions) option_num == SCALE_OPT_ERROR_BY)
140  {
141  target().scale_opt_error_by(scale_by);
142  }
143  else if ((local_EOptions) option_num == SCALE_FEAS_ERROR_BY)
144  {
145  target().scale_feas_error_by(scale_by);
146  }
147  else if ((local_EOptions) option_num == SCALE_COMP_ERROR_BY)
148  {
149  target().scale_comp_error_by(scale_by);
150  }
151  else
152  {
154  std::logic_error,
155  "Unaccounted for option_num in CheckConvergence_Strategy.cpp"
156  );
157  }
158 
159  break;
160  }
161  case SCALE_OPT_ERROR_BY_GF:
162  {
163  target().scale_opt_error_by_Gf(
164  StringToBool( "scale_opt_error_by_Gf", option_value.c_str() ) );
165  break;
166  }
167  default:
168  TEUCHOS_TEST_FOR_EXCEPT(true); // Local error only?
169  }
170  }
171 
172 } // end namespace MoochoPack
CheckConvergence_StrategySetOptions(CheckConvergence_Strategy *target=0, const char opt_grp_name[]="CheckConvergenceStrategy")
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void setOption(int option_num, const std::string &option_value)
Overridden from SetOptionsFromStreamNode.
Strategy interface for performing convergence checks.
CheckConvergence_Strategy(EOptErrorCheck opt_error_check=OPT_ERROR_REDUCED_GRADIENT_LAGR, EScaleKKTErrorBy scale_opt_error_by=SCALE_BY_ONE, EScaleKKTErrorBy scale_feas_error_by=SCALE_BY_ONE, EScaleKKTErrorBy scale_comp_error_by=SCALE_BY_ONE, bool scale_opt_error_by_Gf=true)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)