| // Copyright ©2015 The gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package optimize |
| |
| import "math" |
| |
| // FunctionConverge tests for the convergence of function values. See comment |
| // in Settings. |
| type FunctionConverge struct { |
| Absolute float64 |
| Relative float64 |
| Iterations int |
| |
| best float64 |
| iter int |
| } |
| |
| func (fc *FunctionConverge) Init(f float64) { |
| fc.best = f |
| fc.iter = 0 |
| } |
| |
| func (fc *FunctionConverge) FunctionConverged(f float64) Status { |
| if fc.Iterations == 0 { |
| return NotTerminated |
| } |
| maxAbs := math.Max(math.Abs(f), math.Abs(fc.best)) |
| if f < fc.best && fc.best-f > fc.Relative*maxAbs+fc.Absolute { |
| fc.best = f |
| fc.iter = 0 |
| return NotTerminated |
| } |
| fc.iter++ |
| if fc.iter < fc.Iterations { |
| return NotTerminated |
| } |
| return FunctionConvergence |
| } |