1 |
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 |
|
3 |
/* |
4 |
Copyright (C) 2001, 2002, 2003 Nicolas Di Césaré |
5 |
|
6 |
This file is part of QuantLib, a free-software/open-source library |
7 |
for financial quantitative analysts and developers - http://quantlib.org/ |
8 |
|
9 |
QuantLib is free software: you can redistribute it and/or modify it |
10 |
under the terms of the QuantLib license. You should have received a |
11 |
copy of the license along with this program; if not, please email |
12 |
<quantlib-dev@lists.sf.net>. The license is also available online at |
13 |
<http://quantlib.org/license.shtml>. |
14 |
|
15 |
This program is distributed in the hope that it will be useful, but WITHOUT |
16 |
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
17 |
FOR A PARTICULAR PURPOSE. See the license for more details. |
18 |
*/ |
19 |
|
20 |
#include "optimization/LineSearch.hpp" |
21 |
#include "optimization/Problem.hpp" |
22 |
#include "optimization/Constraint.hpp" |
23 |
#include "utils/simError.h" |
24 |
|
25 |
namespace QuantLib { |
26 |
|
27 |
RealType LineSearch::update(DynamicVector<RealType>& params, |
28 |
const DynamicVector<RealType>& direction, |
29 |
RealType beta, |
30 |
const Constraint& constraint) { |
31 |
|
32 |
RealType diff=beta; |
33 |
DynamicVector<RealType> newParams = params + diff*direction; |
34 |
bool valid = constraint.test(newParams); |
35 |
int icount = 0; |
36 |
while (!valid) { |
37 |
if (icount > 200) { |
38 |
sprintf(painCave.errMsg, "can't update linesearch\n"); |
39 |
painCave.isFatal = 1; |
40 |
painCave.severity = OPENMD_ERROR; |
41 |
simError(); |
42 |
} |
43 |
diff *= 0.5; |
44 |
icount ++; |
45 |
newParams = params + diff*direction; |
46 |
valid = constraint.test(newParams); |
47 |
} |
48 |
params += diff*direction; |
49 |
return diff; |
50 |
} |
51 |
|
52 |
} |