/* ĠĊ Ġ* Ġ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 Ġspace . k science . k math . optimization . min uit . MIN UIT Plugin Ċ import Ġru . in r . mass . min uit .* Ċ import Ġspace . k science . k math . optimization . min uit . Minimum Seed Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ version Ġ$ Id $ Ċ Ġ*/ Ċ internal Ġclass ĠM n Seed Generator Ġ: ĠMinimum Seed Generator Ġ{ ĊĠĠĠ Ġ/** Ġ{@ inheritDoc } Ġ Ġ*/ ĊĠĠĠ Ġfun Ġgenerate ( fc n : ĠM n F cn , Ġgc : ĠGradient Calculator , Ġst : ĠM n User Parameter State , Ġstr a : ĠM n Strategy ): ĠMinimum Seed Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn : ĠInt Ġ= Ġst . variable Parameters () ĊĠĠĠĠĠĠĠ Ġval Ġprec : ĠM n Machine Precision Ġ= Ġst . precision () ĊĊĠĠĠĠĠĠĠ Ġ// Ġinitial Ġstarting Ġvalues ĊĠĠĠĠĠĠĠ Ġval Ġx : ĠReal Vector Ġ= ĠArray Real Vector ( n ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx . set Entry ( i , Ġst . int Parameters ()[ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġf cn min : ĠDouble Ġ= Ġf cn . value ( x ) ĊĠĠĠĠĠĠĠ Ġval Ġpa Ġ= ĠMinimum Parameters ( x , Ġf cn min ) ĊĠĠĠĠĠĠĠ Ġval Ġd grad : ĠFunction Gradient ĊĠĠĠĠĠĠĠ Ġif Ġ( gc Ġis ĠAn alyt ical Gradient Calculator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġig c Ġ= ĠInitial Gradient Calculator ( fc n , Ġst . get Transformation (), Ġstr a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp : ĠFunction Gradient Ġ= Ġig c . gradient ( pa ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgr d : ĠFunction Gradient Ġ= Ġgc . gradient ( pa ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd grad Ġ= ĠFunction Gradient ( grd . get Gradient (), Ġtmp . get Gradient Deriv ative (), Ġtmp . get Step ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gc . check Gradient ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgood Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh gc Ġ= ĠH ess ian Gradient Calculator ( fc n , Ġst . get Transformation (), ĠM n Strategy ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh grd : ĠPair < Function Gradient , ĠReal Vector > Ġ= Ġh gc . delta Gradient ( pa , Ġd grad ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovided : ĠDouble Ġ= Ġgr d . get Gradient (). getEntry ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalculated : ĠDouble Ġ= Ġh grd . getFirst (). get Gradient (). getEntry ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta : ĠDouble Ġ= Ġh grd . get Second (). getEntry ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( calculated Ġ- Ġprovided ) Ġ> Ġdelta ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMIN UIT Plugin . log Static ("" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" gradient Ġdis cre p ancy Ġof Ġexternal Ġparameter Ġ\"% d \" Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"( internal Ġparameter Ġ\"% d \") Ġtoo Ġlarge . ĠExpected : Ġ\"% f \", Ġprovided : Ġ\"% f \"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst . get Transformation (). ext Of Int ( i ), Ġi , Ġprovided , Ġcalculated ) Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMIN UIT Plugin . log Static (" gradient Ġdis cre p ancy Ġof Ġexternal Ġparameter Ġ" Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġst . get Transformation (). ext Of Int ( i ) Ġ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġ( internal Ġparameter Ġ" Ġ+ Ġi Ġ+ Ġ") Ġtoo Ġlarge ."); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgood Ġ= Ġfalse ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! good ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMIN UIT Plugin . log Static (" Min uit Ġdoes Ġnot Ġaccept Ġuser Ġspecified Ġgradient .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( good ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd grad Ġ= Ġgc . gradient ( pa ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmat Ġ= ĠM n Algebra ic Sym Matrix ( n ) ĊĠĠĠĠĠĠĠ Ġvar Ġd co var Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( st . has Co variance ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġi Ġuntil Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmat [ i , Ġj ] Ġ= Ġst . int Co variance ()[ i , Ġj ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd co var Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 , Ġd co var ) ĊĠĠĠĠĠĠĠ Ġval Ġedm : ĠDouble Ġ= ĠVariable Metric ED ME st imator (). estimate ( d grad , Ġerr ) ĊĠĠĠĠĠĠĠ Ġvar Ġstate Ġ= ĠMinimum State ( pa , Ġerr , Ġd grad , Ġedm , Ġf cn . num Of Calls ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( Negative G 2 Line Search . has Negative G 2 ( d grad , Ġprec )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġif Ġ( gc Ġis ĠAn alyt ical Gradient Calculator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġng c Ġ= ĠNum erical 2 PG rad ient Calculator ( fc n , Ġst . get Transformation (), Ġstr a ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNegative G 2 Line Search . search ( fc n , Ġstate , Ġng c , Ġprec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNegative G 2 Line Search . search ( fc n , Ġstate , Ġgc , Ġprec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( stra . strategy () Ġ=== Ġ 2 Ġ&& Ġ! st . has Co variance ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// calculate Ġfull Ġ 2 nd Ġderivative ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp : ĠMinimum State Ġ= ĠM n H esse ( stra ). calculate ( fc n , Ġstate , Ġst . get Transformation (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMinimum Seed ( tmp , Ġst . get Transformation ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠMinimum Seed ( state , Ġst . get Transformation ()) ĊĠĠĠ Ġ} Ċ }