package Ġconvolution Ċ Ċ import Ġmodel .* Ċ import Ġkotlin . math . absolute Value Ċ import Ġkotlin . math . ceil Ċ import Ġkotlin . math . round ToInt Ċ Ċ fun Ġcreate Pattern Scan Layer ( ĊĠĠĠ Ġinput Layer : ĠInput Layer , ĊĠĠĠ Ġpattern : ĠArray < Double Array >, ĊĠĠĠ Ġx Padding : ĠInt Ġ= Ġ 3 , ĊĠĠĠ Ġy Padding : ĠInt Ġ= Ġ 3 , ĊĠĠĠ Ġstep X : ĠInt Ġ= Ġ 2 , ĊĠĠĠ Ġstep Y : ĠInt Ġ= Ġ 2 Ċ ): ĠHidden Layer Ġ{ ĊĠĠĠ Ġval Ġne urons Ġ= Ġmutable ListOf < Static Neuron >() ĊĠĠĠ Ġvar Ġx Ġ= Ġx Padding ĊĠĠĠ Ġvar Ġy Ġ= Ġy Padding ĊĊĠĠĠ Ġwhile Ġ( y Ġ< Ġinput Layer . dimensions . y Ġ- Ġy Padding ){ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( x Ġ< Ġinput Layer . dimensions . x Ġ- Ġx Padding ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġne urons . add ( create Mask Neuron ( input Layer , Ġpattern , Ġx , Ġy )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġstep X ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġy Ġ+= Ġstep Y ĊĠĠĠĠĠĠĠ Ġx Ġ= Ġx Padding ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠHidden Layer ( ĊĠĠĠĠĠĠĠ Ġne urons Ġ= Ġne urons , ĊĠĠĠĠĠĠĠ Ġdimensions Ġ= ĠDimensions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġceil ( 1 . 0 Ġ* Ġ( input Layer . dimensions . x Ġ- Ġ 2 Ġ* Ġx Padding ) Ġ/ Ġstep X ). round ToInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġceil ( 1 . 0 Ġ* Ġ( input Layer . dimensions . y Ġ- Ġ 2 Ġ* Ġy Padding ) Ġ/ Ġstep Y ). round ToInt () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ val Ġhorizontal Weight Pattern Ġ= ĠarrayOf ( ĊĠĠĠ Ġdouble ArrayOf (- 0 . 4 , Ġ- 0 . 5 , Ġ- 0 . 7 , Ġ- 1 . 0 , Ġ- 0 . 7 , Ġ- 0 . 5 , Ġ- 0 . 4 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 7 , Ġ 0 . 8 , Ġ 0 . 9 , Ġ 1 . 0 , Ġ 0 . 9 , Ġ 0 . 8 , Ġ 0 . 7 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf (- 0 . 4 , Ġ- 0 . 5 , Ġ- 0 . 7 , Ġ- 1 . 0 , Ġ- 0 . 7 , Ġ- 0 . 5 , Ġ- 0 . 4 ) Ċ ) Ċ Ċ val Ġvertical Weight Pattern Ġ= ĠarrayOf ( ĊĠĠĠ Ġdouble ArrayOf (- 0 . 4 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 4 ), ĊĠĠĠ Ġdouble ArrayOf (- 0 . 5 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 8 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 5 ), ĊĠĠĠ Ġdouble ArrayOf (- 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 9 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 7 ), ĊĠĠĠ Ġdouble ArrayOf (- 1 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 1 . 0 ), ĊĠĠĠ Ġdouble ArrayOf (- 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 9 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 7 ), ĊĠĠĠ Ġdouble ArrayOf (- 0 . 5 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 8 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 5 ), ĊĠĠĠ Ġdouble ArrayOf (- 0 . 4 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 4 ) Ċ ) Ċ Ċ val Ġslash Weight Pattern Ġ= ĠarrayOf ( ĊĠĠĠ Ġdouble ArrayOf (- 2 . 0 , Ġ- 1 . 0 , Ġ- 0 . 5 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 7 ), ĊĠĠĠ Ġdouble ArrayOf (- 1 . 0 , Ġ- 0 . 5 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 8 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf (- 0 . 5 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 7 , Ġ 0 . 9 , Ġ 0 . 0 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 7 , Ġ 1 . 0 , Ġ 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 9 , Ġ 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 5 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 8 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 5 , Ġ- 1 . 0 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 5 , Ġ- 1 . 0 , Ġ- 2 . 0 ) Ċ ) Ċ Ċ val Ġback slash Weight Pattern Ġ= ĠarrayOf ( ĊĠĠĠ Ġdouble ArrayOf ( 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 5 , Ġ- 1 . 0 , Ġ- 2 . 0 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 8 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 5 , Ġ- 1 . 0 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 9 , Ġ 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ- 0 . 5 ), ĊĠĠĠ Ġdouble ArrayOf ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 7 , Ġ 1 . 0 , Ġ 0 . 7 , Ġ 0 . 0 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf (- 0 . 5 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 7 , Ġ 0 . 9 , Ġ 0 . 0 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf (- 1 . 0 , Ġ- 0 . 5 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 8 , Ġ 0 . 0 ), ĊĠĠĠ Ġdouble ArrayOf (- 2 . 0 , Ġ- 1 . 0 , Ġ- 0 . 5 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 7 ) Ċ ) Ċ Ċ private Ġfun Ġcreate Mask Neuron ( ĊĠĠĠ Ġinput Layer : ĠInput Layer , ĊĠĠĠ Ġpattern : ĠArray < Double Array >, ĊĠĠĠ Ġat X : ĠInt , ĊĠĠĠ Ġat Y : ĠInt Ċ ): ĠStatic Neuron Ġ{ ĊĠĠĠ Ġval Ġne uron Ġ= ĠStatic Neuron ( ĊĠĠĠĠĠĠĠ Ġactivation Function Ġ= ĠActivation Function . RE LU ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġne uron . bias Ġ= Ġ- 1 . 0 ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ- 3 .. 3 ){ ĊĠĠĠĠĠĠĠ Ġfor ( j Ġin Ġ- 3 .. 3 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Ġ= Ġpattern [ j + 3 ][ i + 3 ]. take If Ġ{ Ġit . absolute Value Ġ> Ġ 0 . 0 0 1 Ġ} Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Neuron Ġ= Ġinput Layer . get Neuron At ( x Ġ= Ġat X Ġ+ Ġi , Ġy Ġ= Ġat Y Ġ+ Ġj ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= ĠConnection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Neuron Ġ= Ġinput Neuron , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Neuron Ġ= Ġne uron , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweight Ġ= Ġweight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Neuron . outputs . add ( connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġne uron . inputs . add ( connection ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġne uron Ċ } Ċ