package Ġth uan . hand some . l bf gs b Ċ Ċ import Ġth uan . hand some . core . env . Native Loader Ċ import Ġth uan . hand some . core . function . Differ ential Function Ċ import Ġth uan . hand some . core . x space . Bound Ċ import Ġth uan . hand some . l bf gs b . jni .* Ċ Ċ class ĠL BF G SB Wrapper Ġprivate Ġconstructor ( private Ġval Ġdimensions : ĠInt , Ġnum Corre ctions : ĠInt ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġnative Runner : ĠL _ BF GS _ B Ġ= Ġl bf gs b _ wrapper . create ( dimensions , Ġnum Corre ctions ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNative Loader ("/ th uan / hand some / l bf gs b "). load Library ByName (" l bf gs b _ wrapper ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** Ċĉĉ Ġ* Ġ@ param Ġfunc Ġ- Ġa Ġdiffer ential Ġfunction Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġx Zero Ġ- Ġan Ġinitial Ġguess Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġbounds Ġ- Ġan Ġarray Ġof ĠBounds Ġwhich Ġdefines Ġthe Ġlimits Ġof Ġeach Ġvariable . Ċĉĉ Ġ* ĠNull Ġvalue Ġis Ġused Ġfor Ġno Ġlimit Ġsuch Ġas ĠBound ( 1 , Ġnull ) Ġmeans Ġno Ġupper Ġlimit . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġmax Gradient Norm Ġ- Ġ( p gt ol ) Ġmax imal Ġacceptable Ġgradient Ġvalue Ċĉĉ Ġ* ĠThe Ġiteration Ġwill Ġstop Ġwhen Ġ`` max {| proj Ġg _ i Ġ| Ġi Ġ= Ġ 1 , Ġ..., Ġn } Ġ<= Ġp gt ol `` Ċĉĉ Ġ* Ġwhere Ġ$ proj Ġg _ i $ Ġis Ġi - th Ġcomponent Ġof Ġthe Ġthe Ġprojected Ġgradient . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġmax Corre ctions Ġ- ĠThe Ġmaximum Ġnumber Ġof Ġvariable Ġmetric Ġcorre ctions Ġused Ċĉĉ Ġ* Ġto Ġdefine Ġthe Ġlimited Ġmemory Ġmatrix . Ġ( The Ġlimited Ġmemory ĠBF GS Ġmethod Ġdoes Ċĉĉ Ġ* Ġnot Ġstore Ġthe Ġfull Ġhe ss ian Ġbut Ġuses Ġthis Ġmany Ġterms Ġin Ġan Ġapproximation Ġto Ġit ). Ċĉĉ Ġ* Ċĉĉ Ġ* ĠAccording Ġto Ġthe Ġoriginal Ġfor tran Ġdocumentation , Ġrange Ġ[ 3 , Ġ 2 0 ] Ġis Ġrecommended . Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ@ param Ġfunc Reduction Factor Ġ- Ġ( fact r , Ġf tol / eps ) Ġrelative Ġfunction Ġreduction Ċĉĉ Ġ* Ġfactor . ĠThe Ġiteration Ġwill Ġstop Ġwhen Ċĉĉ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ`( f ^ k Ġ- Ġf ^{ k + 1 }) / max {| f ^ k |, | f ^{ k + 1 } |, 1 } Ġ<= Ġfact r Ġ* Ġeps ``, Ċĉĉ Ġ* Ġwhere Ġ`` eps `` Ġis Ġthe Ġmachine Ġprecision , Ġwhich Ġis Ġautomatically Ċĉĉ Ġ* Ġgenerate `( f ^ k Ġ- Ġf ^{ k + 1 }) / max {| f ^ k |, | f ^{ k + 1 } |, 1 } Ġ<= Ġfact r Ġ* Ġeps ``, Ċĉĉ Ġ* Ġwhere Ġ`` eps `` Ġis Ġthe Ġmachine Ġprecision , Ġwhich Ġis Ġautomatically Ċĉĉ Ġ* Ġgenerated Ġby Ġthe Ġcoded Ġby Ġthe Ġcode . Ċĉĉ Ġ* Ċĉĉ Ġ* ĠExample Ġvalues Ġfor Ġ 1 5 Ġdigits Ġaccuracy : Ċĉĉ Ġ* Ġ Ġ* Ġ 1 e + 1 2 Ġfor Ġlow Ġaccuracy , Ċĉĉ Ġ* Ġ Ġ* Ġ 1 e + 7 Ġ Ġfor Ġmod erate Ġaccuracy , Ċĉĉ Ġ* Ġ Ġ* Ġ 1 e + 1 Ġ Ġfor Ġextremely Ġhigh Ġaccuracy Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ Ġ@ param Ġverbose Ġ- 1 Ġmeans Ġno Ġlogging , Ġincreasing Ġwill Ġincrease Ġlogging Ċĉĉ Ġ* Ċĉĉ Ġ* Ġ Ġ@ param Ġcallback Ġ( x , Ġy , Ġgrad s ) Ġ- Ġa Ġmethod Ġto Ġcall Ġafter Ġeach Ġiteration Ċĉĉ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġminimize ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmost Ġimportant Ġinputs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunc : ĠD iffer ential Function , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Zero : ĠDouble Array , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds : ĠArray < Bound > Ġ= ĠBound (). times ( x Zero . size ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalgorithm 's Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Iterations : ĠInt Ġ= Ġ 1 5 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Corre ctions : ĠInt Ġ= Ġ 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Gradient Norm : ĠDouble Ġ= Ġ 1 e - 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunc Reduction Factor : ĠDouble Ġ= Ġ 1 e 7 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexternal Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverbose : ĠInt Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : Ġ(( Double Array , ĠDouble , ĠDouble Array ) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ): ĠSummary Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( bounds . size Ġ== Ġx Zero . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Bounds Ġnumber Ġ(${ bounds . size }) Ġdoesn 't Ġmatch Ġstarting Ġpoint Ġsize Ġ(${ x Zero . size })" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptimizer Ġ= ĠL BF G SB Wrapper ( x Zero . size , Ġmax Corre ctions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset X ( x Zero ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Bounds ( bounds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Debug Level ( verbose ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Max Gradient Norm ( max Gradient Norm ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Function Factor ( func Reduction Factor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsummary Ġ= Ġoptimizer . minimize ( func , Ġmax Iterations , Ġcallback ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptimizer . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsummary ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Bound Code ( bound : ĠBound ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bound . is Lower Bounded () Ġ&& Ġ! bound . is Upper Bounded ()) Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bound . is Lower Bounded () Ġ&& Ġ! bound . is Upper Bounded ()) Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bound . is Lower Bounded () Ġ&& Ġbound . is Upper Bounded ()) Ġreturn Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġjava Array To Native ( java Array : ĠDouble Array , Ġnative Array : ĠSWIG TYPE _ p _ double ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġjava Array . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl bf gs b _ wrapper . double Array _ set item ( native Array , Ġi , Ġjava Array [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġnative Array To Java ( native Array : ĠSWIG TYPE _ p _ double , Ġlength : ĠInt ): ĠDouble Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjava Array Ġ= ĠDouble Array ( length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġjava Array . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Array [ i ] Ġ= Ġl bf gs b _ wrapper . double Array _ getitem ( native Array , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjava Array ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġminimize ( ĊĠĠĠĠĠĠĠ Ġfunc : ĠD iffer ential Function , ĊĠĠĠĠĠĠĠ Ġmax Iterations : ĠInt , ĊĠĠĠĠĠĠĠ Ġon Iteration Finished : Ġ(( Double Array , ĠDouble , ĠDouble Array ) Ġ-> ĠBoolean )? ĊĠĠĠ Ġ): ĠSummary Ġ{ ĊĠĠĠĠĠĠĠ Ġset Task ( Task Type . L BF G SB _ START ) ĊĠĠĠĠĠĠĠ Ġvar Ġstop Type Ġ= ĠStop Type . MAX _ ITER ATIONS ĊĠĠĠĠĠĠĠ Ġvar Ġnum E vals Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ ĠLOOP @ Ġfor Ġ( iteration Ġin Ġ 1 .. max Iterations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġget Task () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( task Ġ!= ĠTask Type . L BF G SB _ ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" L - BF GS - B ĠError : Ġ${ getState () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( task ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Type . L BF G SB _ FG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum E vals Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġget X () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( y , Ġgrad s ) Ġ= Ġfunc . invoke ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Y ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Grad s ( grad s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Type . L BF G SB _ NEW _ X Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Iteration Finished Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Continue Ġ= Ġon Iteration Finished ( getX (), Ġget Y (), Ġget Grad s ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Continue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Type Ġ= ĠStop Type . USER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Type . L BF G SB _ CONV Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Type Ġ= ĠStop Type . CONVER G ENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Type . L BF G SB _ AB NO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Type Ġ= ĠStop Type . AB NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" L - BF GS - B : ĠUnknown Ġtask ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stop Type Ġ!= ĠStop Type . MAX _ ITER ATIONS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstop () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSummary ( this . getX (), Ġthis . getY (), Ġthis . get Grad s (), Ġmax Iterations , Ġnum E vals , Ġstop Type , ĠgetState ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstep () Ġ{ ĊĠĠĠĠĠĠĠ Ġl bf gs b _ wrapper . step ( native Runner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Y (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnative Runner . f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Y ( y : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnative Runner . f Ġ= Ġy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget X (): ĠDouble Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnative Array To Java ( native Runner . x , Ġdimensions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset X ( x : ĠDouble Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjava Array To Native ( x , Ġnative Runner . x ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Grad s (): ĠDouble Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnative Array To Java ( native Runner . g , Ġdimensions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Grad s ( grad s : ĠDouble Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjava Array To Native ( grad s , Ġnative Runner . g ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Bounds ( bounds : ĠArray < Bound >) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( dimensions Ġ== Ġbounds . size ) ĊĠĠĠĠĠĠĠ Ġval Ġn bd Ġ= Ġnative Runner . nb d ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġnative Runner . l ĊĠĠĠĠĠĠĠ Ġval Ġu Ġ= Ġnative Runner . u ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġbound ) Ġin Ġbounds . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl bf gs b _ wrapper . int Array _ set item ( nb d , Ġindex , Ġget Bound Code ( bound )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl bf gs b _ wrapper . double Array _ set item ( l , Ġindex , Ġbound . lower ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl bf gs b _ wrapper . double Array _ set item ( u , Ġindex , Ġbound . upper ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Debug Level ( debug Level : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnative Runner . ip rint Ġ= Ġdebug Level ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Function Factor ( value : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnative Runner . fact r Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Max Gradient Norm ( value : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnative Runner . p gt ol Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Task (): ĠTask Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġl bf gs b _ wrapper . get _ task ( native Runner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Task ( type : ĠTask Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġl bf gs b _ wrapper . set _ task ( native Runner , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetState (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnative Runner . task . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Task ( Task Type . L BF G SB _ STOP ) ĊĠĠĠĠĠĠĠ Ġstep () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġl bf gs b _ wrapper . close ( native Runner ) ĊĠĠĠ Ġ} Ċ } Ċ