Code-Eli  0.3.6
iterative_root_base.hpp
Go to the documentation of this file.
1 /*********************************************************************************
2 * Copyright (c) 2013 David D. Marshall <ddmarsha@calpoly.edu>
3 *
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * David D. Marshall - initial code and implementation
11 ********************************************************************************/
12 
13 #ifndef eli_mutil_nls_iterative_root_base_hpp
14 #define eli_mutil_nls_iterative_root_base_hpp
15 
16 #include <utility> // std::pair
17 
18 #include "eli/code_eli.hpp"
19 
20 namespace eli
21 {
22  namespace mutil
23  {
24  namespace nls
25  {
26  template<typename data__>
28  {
29  public:
30  typedef data__ data_type;
31 
33  {
34  inactive = 0,
35  equal = 1,
36  less = 2,
38  greater = 4,
40  };
41 
42  public:
44  {
45  rel_tol_info=std::make_pair(static_cast<data__>(0), inactive);
46  abs_tol_info=std::make_pair(static_cast<data__>(0), inactive);
47  }
48 
51  {
52  }
53 
55  {
56  }
57 
58  void satisfy_both(bool sb)
59  {
61 
62  // need to make sure that both tolerances are activated
63  if (abs_tol_info.second==inactive)
65  if (rel_tol_info.second==inactive)
67  }
68 
69  bool satisfy_both() const
70  {
71  return satisfy_both_flag;
72  }
73 
74  void set_relative_tolerance_info(const data__ &rt, const activity_state &as = less)
75  {
76  rel_tol_info=std::make_pair(rt, as);
77  }
78 
79  data__ get_relative_tolerance() const
80  {
81  return rel_tol_info.first;
82  }
83 
85  {
86  return rel_tol_info.second;
87  }
88 
89  void set_absolute_tolerance_info(const data__ &at, const activity_state &as = less)
90  {
91  abs_tol_info=std::make_pair(at, as);
92  }
93 
94  data__ get_absolute_tolerance() const
95  {
96  return abs_tol_info.first;
97  }
98 
100  {
101  return abs_tol_info.second;
102  }
103 
104  bool converged(const data__ &rel_val, const data__ &abs_val) const
105  {
106  bool rel_state(compare(rel_val, rel_tol_info)), abs_state(compare(abs_val, abs_tol_info));
107 
108  if (satisfy_both_flag)
109  return rel_state && abs_state;
110  else
111  return rel_state || abs_state;
112  }
113 
114  private:
115  bool compare(const data__ &val, const std::pair<data__, activity_state> &ref) const
116  {
117  // test the relative tolerance terms
118  switch(ref.second)
119  {
120  case(inactive):
121  return false;
122  break;
123  case(equal):
124  return (val==ref.first);
125  break;
126  case(less):
127  return (val<ref.first);
128  break;
129  case(less_equal):
130  return (val<=ref.first);
131  break;
132  case(greater):
133  return (val>ref.first);
134  break;
135  case(greater_equal):
136  return (val>=ref.first);
137  break;
138  default:
139  assert(false);
140  return false;
141  }
142  }
143 
144  private:
146  std::pair<data__, activity_state> rel_tol_info;
147  std::pair<data__, activity_state> abs_tol_info;
148  };
149 
150  template<typename data__>
152  {
153  public:
154  static const int converged = 0;
155  static const int max_iteration = 1;
156  static const int no_root_found = 2;
157 
162 
163  public:
165  {
166  conv.set_absolute_tolerance_info(static_cast<tolerance_type>(1e-8), error_tolerance_type::less);
167  conv.set_relative_tolerance_info(static_cast<tolerance_type>(0), error_tolerance_type::inactive);
168  itmax.set_absolute_tolerance_info(static_cast<iteration_type>(200), max_iteration_type::greater);
169  itmax.set_relative_tolerance_info(static_cast<iteration_type>(0), max_iteration_type::inactive);
170  }
171 
173  : conv(irb.conv), itmax(irb.itmax), itcnt(irb.itcnt)
174  {
175  }
176 
178  {
179  }
180 
181  void set_relative_tolerance(const tolerance_type &rel_tol)
182  {
183  if (rel_tol<=0)
185  else
187  }
188 
189  tolerance_type get_relative_tolerance() const
190  {
192  }
193 
194  void set_absolute_tolerance(const tolerance_type &abs_tol)
195  {
196  if (abs_tol<=0)
198  else
200  }
201 
202  tolerance_type get_absolute_tolerance() const
203  {
204  return conv.get_absolute_tolerance();
205  }
206 
207  void set_max_iteration(const iteration_type &mi)
208  {
209  if (mi==0)
211  else
213  }
214 
215  iteration_type get_max_iteration() const
216  {
217  return itmax.get_absolute_tolerance();
218  }
219 
220  void enforce_both_tolerance(bool ebt)
221  {
222  conv.satisfy_both(ebt);
223  }
224 
226  {
227  return conv.satisfy_both();
228  }
229 
231  {
233  }
234 
236  {
238  }
239 
240  const error_tolerance_type & get_tolerance_tester() const
241  {
242  return conv;
243  }
244 
245  const max_iteration_type & get_iteration_count_tester() const
246  {
247  return itmax;
248  }
249 
250  const iteration_type & get_iteration_count() const
251  {
252  return itcnt;
253  }
254 
255  protected:
256  bool test_converged(const iteration_type &it, const tolerance_type &relv, const tolerance_type &absv) const
257  {
258  return conv.converged(relv, absv) || max_iteration_reached(it);
259  }
260 
261  bool max_iteration_reached(const iteration_type &it) const
262  {
263  itcnt = it;
264  return itmax.converged(0, it);
265  }
266 
267  private:
268  error_tolerance_type conv;
269  max_iteration_type itmax;
270  mutable iteration_type itcnt;
271  };
272  }
273  }
274 }
275 #endif
virtual ~iterative_root_base()
Definition: iterative_root_base.hpp:177
const max_iteration_type & get_iteration_count_tester() const
Definition: iterative_root_base.hpp:245
Definition: math.hpp:20
void satisfy_both(bool sb)
Definition: iterative_root_base.hpp:58
bool max_iteration_reached(const iteration_type &it) const
Definition: iterative_root_base.hpp:261
const activity_state & get_absolute_tolerance_state() const
Definition: iterative_root_base.hpp:99
void set_absolute_tolerance_info(const data__ &at, const activity_state &as=less)
Definition: iterative_root_base.hpp:89
Definition: iterative_root_base.hpp:39
max_iteration_type itmax
Definition: iterative_root_base.hpp:269
convergence_tester(const convergence_tester< data__ > &ct)
Definition: iterative_root_base.hpp:49
std::pair< data__, activity_state > abs_tol_info
Definition: iterative_root_base.hpp:147
bool satisfy_both() const
Definition: iterative_root_base.hpp:69
data__ get_absolute_tolerance() const
Definition: iterative_root_base.hpp:94
void disable_relative_tolerance()
Definition: iterative_root_base.hpp:230
Definition: iterative_root_base.hpp:37
const error_tolerance_type & get_tolerance_tester() const
Definition: iterative_root_base.hpp:240
void enforce_both_tolerance(bool ebt)
Definition: iterative_root_base.hpp:220
bool test_converged(const iteration_type &it, const tolerance_type &relv, const tolerance_type &absv) const
Definition: iterative_root_base.hpp:256
Definition: iterative_root_base.hpp:36
static const int no_root_found
Definition: iterative_root_base.hpp:156
void set_relative_tolerance(const tolerance_type &rel_tol)
Definition: iterative_root_base.hpp:181
Definition: iterative_root_base.hpp:38
void set_max_iteration(const iteration_type &mi)
Definition: iterative_root_base.hpp:207
Definition: iterative_root_base.hpp:151
bool enforce_both_tolerance() const
Definition: iterative_root_base.hpp:225
error_tolerance_type conv
Definition: iterative_root_base.hpp:268
Definition: iterative_root_base.hpp:34
bool satisfy_both_flag
Definition: iterative_root_base.hpp:145
convergence_tester< size_t > max_iteration_type
Definition: iterative_root_base.hpp:159
void set_relative_tolerance_info(const data__ &rt, const activity_state &as=less)
Definition: iterative_root_base.hpp:74
bool compare(const data__ &val, const std::pair< data__, activity_state > &ref) const
Definition: iterative_root_base.hpp:115
data__ get_relative_tolerance() const
Definition: iterative_root_base.hpp:79
activity_state
Definition: iterative_root_base.hpp:32
bool converged(const data__ &rel_val, const data__ &abs_val) const
Definition: iterative_root_base.hpp:104
data__ data_type
Definition: iterative_root_base.hpp:30
void set_absolute_tolerance(const tolerance_type &abs_tol)
Definition: iterative_root_base.hpp:194
Definition: iterative_root_base.hpp:35
tolerance_type get_absolute_tolerance() const
Definition: iterative_root_base.hpp:202
Definition: iterative_root_base.hpp:27
convergence_tester< data__ > error_tolerance_type
Definition: iterative_root_base.hpp:158
iterative_root_base()
Definition: iterative_root_base.hpp:164
const activity_state & get_relative_tolerance_state() const
Definition: iterative_root_base.hpp:84
static const int max_iteration
Definition: iterative_root_base.hpp:155
tolerance_type get_relative_tolerance() const
Definition: iterative_root_base.hpp:189
iterative_root_base(const iterative_root_base< data__ > &irb)
Definition: iterative_root_base.hpp:172
error_tolerance_type::data_type tolerance_type
Definition: iterative_root_base.hpp:160
max_iteration_type::data_type iteration_type
Definition: iterative_root_base.hpp:161
virtual ~convergence_tester()
Definition: iterative_root_base.hpp:54
const iteration_type & get_iteration_count() const
Definition: iterative_root_base.hpp:250
static const int converged
Definition: iterative_root_base.hpp:154
std::pair< data__, activity_state > rel_tol_info
Definition: iterative_root_base.hpp:146
iteration_type itcnt
Definition: iterative_root_base.hpp:270
iteration_type get_max_iteration() const
Definition: iterative_root_base.hpp:215
convergence_tester()
Definition: iterative_root_base.hpp:43
void disable_absolute_tolerance()
Definition: iterative_root_base.hpp:235