import Ġorg . ej ml . simple . Simple Matrix Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . thread Ċ import Ġkotlin . math . exp Ċ Ċ fun Ġassert ( a : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif (! a ) Ġthrow ĠIllegalStateException () Ċ } Ċ Ċ fun Ġdouble Arr ( length : ĠInt , Ġelem : ĠDouble ) Ġ= ĠDouble Array ( length , Ġ{ Ġelem Ġ}) Ċ Ċ fun ĠDouble . mult ( x : ĠSimple Matrix ): ĠSimple Matrix Ġ{ ĊĠĠĠ Ġreturn Ġx . element Apply Ġ{ Ġe Ġ-> Ġthis Ġ* Ġe Ġ} Ċ } Ċ Ċ class ĠNN Data ( val Ġlayers : ĠList < Int >) Ġ{ ĊĠĠĠ Ġval ĠOs : ĠArray < Simple Matrix > ĊĊĠĠĠ Ġval Ġextended Ws : ĠArray < Simple Matrix > ĊĊĠĠĠ Ġvar ĠD s : ĠArray < Simple Matrix > ĊĠĠĠ Ġlateinit Ġvar Ġe : ĠSimple Matrix ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrand Ġ= ĠRandom () ĊĊĠĠĠĠĠĠĠ ĠOs Ġ= ĠArray ( layers . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty Simple Matrix () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġextended Ws Ġ= ĠArray ( layers . size - 1 ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Matrix . random _ DD RM ( layers [ i ]+ 1 , Ġlayers [ i + 1 ], Ġ 0 . 0 , Ġ 1 . 0 Ġ- ĠDouble . MIN _ VALUE , Ġrand ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠD s Ġ= ĠArray ( layers . size - 1 ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty Simple Matrix () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ const Ġval Ġc Ġ= Ġ 1 Ċ fun Ġs ( z : ĠDouble ) Ġ= Ġ 1 /( 1 Ġ+ Ġexp (- c * z )) Ċ Ċ const Ġval Ġgamma : ĠDouble Ġ= Ġ 1 . 0 Ċ Ċ class ĠNN ( val Ġnet : ĠNN Data ) Ġ{ ĊĠĠĠ Ġval Ġdelta Ws : ĠArray < Simple Matrix > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdelta Ws Ġ= ĠArray ( net . extended Ws . size ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnet . extended Ws [ i ]. create Like () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess ( o : ĠSimple Matrix , Ġt : ĠSimple Matrix ): ĠSimple Matrix Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġo Temp Ġ= Ġo ĊĊĠĠĠĠĠĠĠ Ġnet . Os [ 0 ] Ġ= Ġo ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnet . extended Ws . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo Temp Ġ= Ġo Temp . extend (). row Wise Mult ( net . extended Ws [ i ]). column Wise Sum (). transpose (). element Apply (:: s ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnet . Ds [ i ] Ġ= ĠSimple Matrix ( net . layers [ i + 1 ], Ġ 1 , Ġtrue , ĠDouble Array ( net . layers [ i + 1 ]) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ({ Ġo i : ĠDouble Ġ-> Ġo i *( 1 Ġ- Ġo i ) Ġ})( o Temp [ i , Ġ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnet . Os [ i + 1 ] Ġ= Ġo Temp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnet . e Ġ= Ġo Temp . minus ( t ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġo Temp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġback propagate () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdelta Ġ= Ġnet . Ds [ net . Ds . size - 1 ]. mult ( net . e ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ( net . extended Ws . size - 1 ) Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta W Ġ= Ġ(- gamma ). mult ( delta ). mult ( net . Os [ i ]. extend (). transpose ()). transpose () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( i Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Ġ= Ġnet . Ds [ i - 1 ]. row Wise Mult ( net . extended Ws [ i ]. un extend (). matrix Vector Mult ( delta )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Ws [ i ] Ġ= Ġdelta Ws [ i ]. plus ( delta W ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcorrect (): ĠPair < Double , ĠDouble > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġget Error () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnet . extended Ws . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnet . extended Ws [ i ] Ġ= Ġnet . extended Ws [ i ]. plus ( delta Ws [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor ( delta W Ġin Ġdelta Ws ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġdelta W . num Rows ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġdelta W . num Cols ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta W [ i , Ġj ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( error , Ġget Error ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Error () Ġ= Ġnet . e . element Apply Ġ{ Ġ( it Ġ* Ġit )/ 2 . 0 Ġ}. element Sum () Ċ } Ċ Ċ fun Ġget Result ( net : ĠNN , Ġx : ĠDouble Array , Ġy : ĠDouble Array ): ĠDouble Ġ{ ĊĠĠĠ Ġval Ġo Ġ= ĠSimple Matrix ( x . size , Ġ 1 , Ġtrue , Ġx ) ĊĠĠĠ Ġval Ġt Ġ= ĠSimple Matrix ( y . size , Ġ 1 , Ġtrue , Ġy ) ĊĊĠĠĠ Ġreturn Ġnet . process ( o , Ġt )[ 0 ] Ċ } Ċ Ċ fun Ġtrain For ( net : ĠNN , Ġlist : ĠList < Pair < Pair < Double , ĠDouble >, ĠDouble >>) Ġ{ ĊĠĠĠ Ġfor (( input , Ġresult ) Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy ) Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġget Result ( net , Ġdouble ArrayOf ( x , Ġy ), Ġdouble ArrayOf ( result )) ĊĠĠĠĠĠĠĠ Ġprintln (" ($ x , Ġ$ y ) Ġ= Ġ${ r } Ġ( should Ġbe Ġ${ result }) ") ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠRuntime . get Runtime (). add Shutdown Hook ( Ġthread ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" ------------------------ ") ĊĊĠĠĠĠĠĠĠ Ġfor (( input , Ġresult ) Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy ) Ġ= Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġget Result ( net , Ġdouble ArrayOf ( x , Ġy ), Ġdouble ArrayOf ( result )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ($ x , Ġ$ y ) Ġ= Ġ${ r }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġ.. ĠLong . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor (( input , Ġresult ) Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy ) Ġ= Ġinput ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Result ( net , Ġdouble ArrayOf ( x , Ġy ), Ġdouble ArrayOf ( result )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnet . back propagate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnet . correct () ĊĊĠĠĠĠĠĠĠ Ġvar Ġerror Sum Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġfor (( input , Ġresult ) Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( x , Ġy ) Ġ= Ġinput ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Result ( net , Ġdouble ArrayOf ( x , Ġy ), Ġdouble ArrayOf ( result )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Sum Ġ+= Ġnet . getError () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif ( error Sum Ġ< Ġ 0 . 0 0 0 1 ) Ġbreak ĊĠĠĠĠĠĠĠ Ġ// println ("${ i }: Ġ$ error Sum ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġlayers Ġ= ĠlistOf ( 2 , Ġ 3 , Ġ 1 ) ĊĊĠĠĠ Ġval Ġnet Ġ= ĠNN ( NN Data ( layers )) ĊĊĠĠĠ Ġtrain For ( net , ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġ( 0 . 0 Ġto Ġ 0 . 0 ) Ġto Ġ 0 . 0 , ĊĠĠĠĠĠĠĠ Ġ( 1 . 0 Ġto Ġ 0 . 0 ) Ġto Ġ 1 . 0 , ĊĠĠĠĠĠĠĠ Ġ( 0 . 0 Ġto Ġ 1 . 0 ) Ġto Ġ 1 . 0 , ĊĠĠĠĠĠĠĠ Ġ( 1 . 0 Ġto Ġ 1 . 0 ) Ġto Ġ 0 . 0 ĊĠĠĠ Ġ)) Ċ }