/* ĠĊ Ġ* ĠCopyright Ġ 2 0 1 5 ĠAlex ander ĠNo z ik . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġru . in r . mass . min uit Ċ Ċ import Ġorg . apache . commons . math 3 . linear . Array Real Vector Ċ import Ġru . in r . mass . min uit .* Ċ Ċ /** Ċ Ġ* ĠIn Ġcase Ġthat Ġone Ġof Ġthe Ġcomponents Ġof Ġthe Ġsecond Ġderivative Ġg 2 Ġcalculated Ġby Ċ Ġ* Ġthe Ġnumerical Ġgradient Ġcalculator Ġis Ġnegative , Ġa Ġ 1 dim Ġline Ġsearch Ġin Ġthe Ċ Ġ* Ġdirection Ġof Ġthat Ġcomponent Ġis Ġdone Ġin Ġorder Ġto Ġfind Ġa Ġbetter Ġposition Ġwhere Ċ Ġ* Ġg 2 Ġis Ġagain Ġpositive . Ċ Ġ* Ċ Ġ* Ġ@ version Ġ$ Id $ Ċ Ġ*/ Ċ internal Ġobject ĠNegative G 2 Line Search Ġ{ ĊĠĠĠ Ġfun Ġhas Negative G 2 ( grad : ĠFunction Gradient , Ġprec : ĠM n Machine Precision ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġgrad . get Gradient (). get Dimension ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grad . get Gradient Deriv ative (). getEntry ( i ) Ġ< Ġprec . eps 2 ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch ( fc n : ĠM n F cn , Ġst : ĠMinimum State , Ġgc : ĠGradient Calculator , Ġprec : ĠM n Machine Precision ): ĠMinimum State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġneg G 2 Ġ= Ġhas Negative G 2 ( st . gradient (), Ġprec ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! neg G 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġst ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġn : ĠInt Ġ= Ġst . parameters (). vec (). get Dimension () ĊĠĠĠĠĠĠĠ Ġvar Ġd grad : ĠFunction Gradient Ġ= Ġst . gradient () ĊĠĠĠĠĠĠĠ Ġvar Ġpa : ĠMinimum Parameters Ġ= Ġst . parameters () ĊĠĠĠĠĠĠĠ Ġvar Ġiterate Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġiter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d grad . get Gradient Deriv ative (). getEntry ( i ) Ġ< Ġprec . eps 2 ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġline Ġsearch Ġif Ġsecond Ġderivative Ġnegative ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstep : ĠReal Vector Ġ= ĠArray Real Vector ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . set Entry ( i , Ġd grad . get Step (). getEntry ( i ) Ġ* Ġd grad . get Gradient (). getEntry ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( d grad . get Gradient (). getEntry ( i )) Ġ> Ġprec . eps 2 ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . set Entry ( i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep . getEntry ( i ) Ġ* Ġ(- 1 . 0 Ġ/ Ġabs ( d grad . get Gradient (). getEntry ( i )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg del : ĠDouble Ġ= Ġstep . getEntry ( i ) Ġ* Ġd grad . get Gradient (). getEntry ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpp : ĠM n Par ab ola Point Ġ= ĠM n Line Search . search ( fc n , Ġpa , Ġstep , Ġg del , Ġprec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= ĠM n Utils . mul ( step , Ġpp . x ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpa Ġ= ĠMinimum Parameters ( Mn Utils . add ( pa . vec (), Ġstep ), Ġpp . y ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd grad Ġ= Ġgc . gradient ( pa , Ġd grad ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterate Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( iter ++ Ġ< Ġ 2 Ġ* Ġn Ġ&& Ġiterate ) ĊĠĠĠĠĠĠĠ Ġval Ġmat Ġ= ĠM n Algebra ic Sym Matrix ( n ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmat [ i , Ġi ] Ġ= Ġif Ġ( abs ( d grad . get Gradient Deriv ative () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getEntry ( i )) Ġ> Ġprec . eps 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ 1 . 0 Ġ/ Ġd grad . get Gradient Deriv ative (). getEntry ( i ) Ġelse Ġ 1 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġerr Ġ= ĠMinimum Error ( mat , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġedm : ĠDouble Ġ= ĠVariable Metric ED ME st imator (). estimate ( d grad , Ġerr ) ĊĠĠĠĠĠĠĠ Ġreturn ĠMinimum State ( pa , Ġerr , Ġd grad , Ġedm , Ġf cn . num Of Calls ()) ĊĠĠĠ Ġ} Ċ }