// Copyright ©2014 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 "gonum.org/v1/gonum/floats" // GradientDescent implements the steepest descent optimization method that // performs successive steps along the direction of the negative gradient. type GradientDescent struct { // Linesearcher selects suitable steps along the descent direction. // If Linesearcher is nil, a reasonable default will be chosen. Linesearcher Linesearcher // StepSizer determines the initial step size along each direction. // If StepSizer is nil, a reasonable default will be chosen. StepSizer StepSizer ls *LinesearchMethod } func (g *GradientDescent) Init(loc *Location) (Operation, error) { if g.Linesearcher == nil { g.Linesearcher = &Backtracking{} } if g.StepSizer == nil { g.StepSizer = &QuadraticStepSize{} } if g.ls == nil { g.ls = &LinesearchMethod{} } g.ls.Linesearcher = g.Linesearcher g.ls.NextDirectioner = g return g.ls.Init(loc) } func (g *GradientDescent) Iterate(loc *Location) (Operation, error) { return g.ls.Iterate(loc) } func (g *GradientDescent) InitDirection(loc *Location, dir []float64) (stepSize float64) { copy(dir, loc.Gradient) floats.Scale(-1, dir) return g.StepSizer.Init(loc, dir) } func (g *GradientDescent) NextDirection(loc *Location, dir []float64) (stepSize float64) { copy(dir, loc.Gradient) floats.Scale(-1, dir) return g.StepSizer.StepSize(loc, dir) } func (*GradientDescent) Needs() struct { Gradient bool Hessian bool } { return struct { Gradient bool Hessian bool }{true, false} }