package Ġcom . m ant ono . k ann Ċ Ċ data Ġclass ĠPer ce ptr on ( val Ġweights : ĠArray < Double >) Ċ { Ċ ĉ constructor ( numberOf Weights : ĠInt ): this ( generate Weights ( numberOf Weights , Ġrandom Seed ())) Ċ ĉ operator Ġfun Ġget ( i : ĠInt ): ĠDouble Ġ= Ġweights [ i ] Ċ } Ċ Ċ fun Ġguess ( per ce ptr on : ĠPer ce ptr on , Ġinputs : ĠArray < Float >): ĠInt Ċ { Ċ ĉ val Ġi : ĠDouble Ġ= Ġinputs . indices . as Sequence () Ċĉĉ ĉ . map Ġ{ Ġinputs [ it ] Ġ* Ġper ce ptr on . weights [ it ] Ġ} Ċĉĉ ĉ . sum () ĊĊ ĉ return ĠMath . sign um ( i ). toInt () Ċ } Ċ Ċ fun Ġcorrect ( per ce ptr on : ĠPer ce ptr on , Ġtraining Data : ĠArray < Float >, Ġerror : ĠInt , Ġlearning Rate : ĠFloat ): ĠPer ce ptr on Ċ { Ċ ĉ val Ġadjusted Weights : ĠArray < Double > Ġ= Ġtraining Data . indices . as Sequence () Ċĉĉ ĉ . map Ġ{ Ġper ce ptr on [ it ] Ġ+ Ġtraining Data [ it ] Ġ* Ġerror Ġ* Ġlearning Rate } Ċĉĉ ĉ . toList () Ċĉĉ ĉ . to Typed Array () ĊĊ ĉ return ĠPer ce ptr on ( adjusted Weights ) Ċ } Ċ Ċ tail rec Ġfun Ġtrain ( per : ĠPer ce ptr on , Ġtraining Data : ĠArray < Float >, Ġtarget : ĠInt , Ġlearning Rate : ĠFloat Ġ= Ġ 0 . 1 f ): ĠPer ce ptr on Ċ { Ċ ĉ val Ġguess : ĠInt Ġ= Ġguess ( per , Ġtraining Data ) Ċ ĉ val Ġerror : ĠInt Ġ= Ġtarget Ġ- Ġguess Ċ ĉ val Ġper ce ptr on Ġ= Ġcorrect ( per , Ġtraining Data , Ġerror , Ġlearning Rate ) Ċ ĉ return Ġif ( error Ġ== Ġ 0 ) Ġper Ġelse Ġtrain ( per ce ptr on , Ġtraining Data , Ġtarget ) Ċ } Ċ