ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/optimization/EndCriteria.cpp
Revision: 1788
Committed: Wed Aug 29 20:17:07 2012 UTC (12 years, 8 months ago) by gezelter
File size: 7620 byte(s)
Log Message:
Fixed a bug in ForceManager and a compilation issue for cygwin

File Contents

# Content
1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3 /*
4 Copyright (C) 2006, 2007 Ferdinando Ametrano
5 Copyright (C) 2007 Marco Bianchetti
6 Copyright (C) 2001, 2002, 2003 Nicolas Di Césaré
7
8 This file is part of QuantLib, a free-software/open-source library
9 for financial quantitative analysts and developers - http://quantlib.org/
10
11 QuantLib is free software: you can redistribute it and/or modify it
12 under the terms of the QuantLib license. You should have received a
13 copy of the license along with this program; if not, please email
14 <quantlib-dev@lists.sf.net>. The license is also available online at
15 <http://quantlib.org/license.shtml>.
16
17 This program is distributed in the hope that it will be useful, but WITHOUT
18 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19 FOR A PARTICULAR PURPOSE. See the license for more details.
20 */
21
22 #include "optimization/EndCriteria.hpp"
23 #include "utils/simError.h"
24 #include <cmath>
25 #include <cstdio>
26
27 namespace QuantLib {
28
29 EndCriteria::EndCriteria(size_t maxIterations,
30 size_t maxStationaryStateIterations,
31 RealType rootEpsilon,
32 RealType functionEpsilon,
33 RealType gradientNormEpsilon)
34 : maxIterations_(maxIterations),
35 maxStationaryStateIterations_(maxStationaryStateIterations),
36 rootEpsilon_(rootEpsilon),
37 functionEpsilon_(functionEpsilon),
38 gradientNormEpsilon_(gradientNormEpsilon) {
39
40
41 // replaced the QL_REQUIRE macro with OpenMD's simError calls
42 if (maxStationaryStateIterations_ <= 1) {
43 sprintf(painCave.errMsg,
44 "maxStationaryStateIterations_ ( %lu ) "
45 "must be greater than one\n",
46 (unsigned long)maxStationaryStateIterations_);
47 painCave.isFatal = 1;
48 painCave.severity = OPENMD_ERROR;
49 simError();
50 }
51 if (maxStationaryStateIterations_ > maxIterations_) {
52 sprintf(painCave.errMsg,
53 "maxStationaryStateIterations_ ( %lu ) "
54 "must be less than maxIterations_ ( %lu )\n",
55 (unsigned long)maxStationaryStateIterations_,
56 (unsigned long)maxIterations_);
57 painCave.isFatal = 1;
58 painCave.severity = OPENMD_ERROR;
59 simError();
60 }
61
62 }
63
64 bool EndCriteria::checkMaxIterations(const size_t iteration,
65 EndCriteria::Type& ecType) const{
66 if (iteration < maxIterations_)
67 return false;
68 ecType = MaxIterations;
69 return true;
70 }
71
72 bool EndCriteria::checkStationaryPoint(const RealType xOld,
73 const RealType xNew,
74 size_t& statStateIterations,
75 EndCriteria::Type& ecType) const {
76 if (std::fabs(xNew-xOld) >= rootEpsilon_) {
77 statStateIterations = 0;
78 return false;
79 }
80 ++statStateIterations;
81 if (statStateIterations <= maxStationaryStateIterations_)
82 return false;
83 ecType = StationaryPoint;
84 return true;
85 }
86
87 bool EndCriteria::checkStationaryFunctionValue(
88 const RealType fxOld,
89 const RealType fxNew,
90 size_t& statStateIterations,
91 EndCriteria::Type& ecType) const {
92 if (std::fabs(fxNew-fxOld) >= functionEpsilon_) {
93 statStateIterations = 0;
94 return false;
95 }
96 ++statStateIterations;
97 if (statStateIterations <= maxStationaryStateIterations_)
98 return false;
99 ecType = StationaryFunctionValue;
100 return true;
101 }
102
103 bool EndCriteria::checkStationaryFunctionAccuracy(
104 const RealType f,
105 const bool positiveOptimization,
106 EndCriteria::Type& ecType) const {
107 if (!positiveOptimization)
108 return false;
109 if (f >= functionEpsilon_)
110 return false;
111 ecType = StationaryFunctionAccuracy;
112 return true;
113 }
114
115 //bool EndCriteria::checkZerGradientNormValue(
116 // const RealType gNormOld,
117 // const RealType gNormNew,
118 // EndCriteria::Type& ecType) const {
119 // if (std::fabs(gNormNew-gNormOld) >= gradientNormEpsilon_)
120 // return false;
121 // ecType = StationaryGradient;
122 // return true;
123 //}
124
125 bool EndCriteria::checkZeroGradientNorm(const RealType gradientNorm,
126 EndCriteria::Type& ecType) const {
127 if (gradientNorm >= gradientNormEpsilon_)
128 return false;
129 ecType = ZeroGradientNorm;
130 return true;
131 }
132
133 bool EndCriteria::operator()(const size_t iteration,
134 size_t& statStateIterations,
135 const bool positiveOptimization,
136 const RealType fold,
137 const RealType, //normgold,
138 const RealType fnew,
139 const RealType normgnew,
140 EndCriteria::Type& ecType) const {
141 return
142 checkMaxIterations(iteration, ecType) ||
143 checkStationaryFunctionValue(fold, fnew, statStateIterations, ecType) ||
144 checkStationaryFunctionAccuracy(fnew, positiveOptimization, ecType) ||
145 checkZeroGradientNorm(normgnew, ecType);
146 }
147
148 // Inspectors
149 size_t EndCriteria::maxIterations() const {
150 return maxIterations_;
151 }
152
153 size_t EndCriteria::maxStationaryStateIterations() const {
154 return maxStationaryStateIterations_;
155 }
156
157 RealType EndCriteria::rootEpsilon() const {
158 return rootEpsilon_;
159 }
160
161 RealType EndCriteria::functionEpsilon() const {
162 return functionEpsilon_;
163 }
164
165 RealType EndCriteria::gradientNormEpsilon() const {
166 return gradientNormEpsilon_;
167 }
168
169 std::ostream& operator<<(std::ostream& out, EndCriteria::Type ec) {
170 switch (ec) {
171 case QuantLib::EndCriteria::None:
172 return out << "None";
173 case QuantLib::EndCriteria::MaxIterations:
174 return out << "MaxIterations";
175 case QuantLib::EndCriteria::StationaryPoint:
176 return out << "StationaryPoint";
177 case QuantLib::EndCriteria::StationaryFunctionValue:
178 return out << "StationaryFunctionValue";
179 case QuantLib::EndCriteria::StationaryFunctionAccuracy:
180 return out << "StationaryFunctionAccuracy";
181 case QuantLib::EndCriteria::ZeroGradientNorm:
182 return out << "ZeroGradientNorm";
183 case QuantLib::EndCriteria::Unknown:
184 return out << "Unknown";
185 default:
186 sprintf(painCave.errMsg, "unknown EndCriteria::Type ( %d )\n",
187 int(ec));
188 painCave.isFatal = 1;
189 painCave.severity = OPENMD_ERROR;
190 simError();
191 }
192 }
193
194 }

Properties

Name Value
svn:eol-style native