package Ġeu . red bean . kon nan . test Ċ Ċ import Ġeu . red bean . kon nan . layers . Conv 2 D Ċ import Ġeu . red bean . kon nan . layers . Dense Ċ import Ġeu . red bean . kon nan . layers . Flatten Ċ import Ġeu . red bean . kon nan . layers . Input Ċ import Ġeu . red bean . kon nan . layers . activ ations . ReLU Ċ import Ġeu . red bean . kon nan . layers . activ ations . Soft max Ċ import Ġeu . red bean . kon nan . layers . initial izers . constant Ċ import Ġeu . red bean . kon nan . layers . initial izers . he Normal Ċ import Ġeu . red bean . kon nan . models . Model Ċ import Ġeu . red bean . kon nan . optim izers . Abstract Optimizer Ċ import Ġeu . red bean . kon nan . optim izers . Adam Ċ import Ġeu . red bean . kon nan . optim izers . schedul ers . Linear Dec ay Ċ import Ġeu . red bean . kon nan . optim izers . utils . clip Gradient Normalizer Ċ import Ġeu . red bean . k ten . api . tensor .* Ċ import Ġeu . red bean . k ten . api . tensor . Constants . all Ċ import Ġeu . red bean . k ten . api . tensor . Tensor . Companion . abs Ċ import Ġeu . red bean . k ten . api . tensor . Tensor . Companion . sqrt Ċ import Ġeu . red bean . k ten . api . tensor . platform . DeviceType Ċ import Ġeu . red bean . k ten . api . tensor . platform . Platform Provider Ċ import Ġorg . apache . commons . math 3 . distribution . Enumer ated Integer Distribution Ċ import Ġorg . know m . x chart . Bitmap Encoder Ċ import Ġorg . know m . x chart . Quick Chart Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġjava . util . stream . Int Stream Ċ import Ġkotlin . concurrent . thread Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . math . sign Ċ import Ġkotlin . random . Random ĊĊ Ċ class ĠRect ( ĊĠĠĠ Ġvar Ġx : ĠInt , Ġvar Ġy : ĠInt , ĊĠĠĠ Ġvar Ġwidth : ĠInt , Ġvar Ġheight : ĠInt , ĊĠĠĠ Ġvar Ġvalue : ĠFloat Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġdraw ( canvas : ĠTensor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġmin ( max ( x , Ġ 0 ), Ġcanvas . shape [ 2 ] Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġmin ( max ( y , Ġ 0 ), Ġcanvas . shape [ 1 ] Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġmin ( max ( x Ġ+ Ġwidth , Ġ 1 ), Ġcanvas . shape [ 2 ]) ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġmin ( max ( y Ġ+ Ġheight , Ġ 1 ), Ġcanvas . shape [ 1 ]) ĊĠĠĠĠĠĠĠ Ġcanvas [ 0 .. 0 , Ġtop Ġuntil Ġbottom , Ġleft Ġuntil Ġright ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġintersect s ( other : ĠRect ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġx Ġ+ Ġwidth Ġ>= Ġother . x Ġ&& Ġx Ġ<= Ġother . x Ġ+ Ġother . width Ġ&& Ġy Ġ+ Ġheight Ġ>= Ġother . y Ġ&& Ġy Ġ<= Ġother . y Ġ+ Ġother . height ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠBr ick ( ĊĠĠĠ Ġval Ġcolumn : ĠInt , ĊĠĠĠ Ġval Ġrow : ĠInt , ĊĠĠĠ Ġval Ġvalue : ĠFloat , ĊĠĠĠ Ġval Ġgrid Width : ĠInt Ġ= Ġ 1 2 Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġgrid Offset Top Ġ= Ġ 2 3 ĊĠĠĠ Ġval Ġgap Ġ= Ġ 0 ĊĠĠĠ Ġval Ġbr ick Height Ġ= Ġ 2 ĊĠĠĠ Ġval Ġbr ick Width Ġ= Ġ( 8 4 Ġ- Ġgap Ġ* Ġgrid Width ) Ġ/ Ġgrid Width ĊĊĠĠĠ Ġval Ġrect Ġ= ĠRect ( ĊĠĠĠĠĠĠĠ Ġcolumn Ġ* Ġbr ick Width Ġ+ Ġ( column Ġ+ Ġ 1 ) Ġ* Ġgap , ĊĠĠĠĠĠĠĠ Ġgrid Offset Top Ġ+ Ġbr ick Height Ġ* Ġrow Ġ+ Ġrow Ġ* Ġgap , ĊĠĠĠĠĠĠĠ Ġbr ick Width , Ġbr ick Height , ĊĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġhit ( ball : ĠBall ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rect . value Ġ== Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġhit Ġ= Ġrect . intersect s ( ball . rect ) ĊĠĠĠĠĠĠĠ Ġif Ġ( hit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . value Ġ= Ġ 0 f Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġrect . value Ġ-= Ġ 0 . 2 f Ġ// Ġreplace Ġthe Ġprevious Ġline Ġto Ġthis , Ġif Ġyou 'd Ġlike Ġto Ġmake Ġthe Ġgame Ġmore Ġdifficult ĊĊĠĠĠĠĠĠĠ Ġif Ġ( rect . value Ġ< Ġ 0 . 2 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . value Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw ( canvas : ĠTensor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rect . value Ġ> Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . draw ( canvas ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠBall ( ĊĠĠĠ Ġvar Ġposition : ĠTensor Ċ ) Ġ{ ĊĠĠĠ Ġval Ġwidth Ġ= Ġ 1 ĊĠĠĠ Ġval Ġheight Ġ= Ġ 1 ĊĊĠĠĠ Ġval Ġdirection Ġ= ĠTensor . tensor Of ( 1 f , ĠRandom . next Float ()* 1 . 2 f Ġ- Ġ 0 . 6 f ) ĊĠĠĠ Ġvar Ġspeed Ġ= Ġ 1 f ĊĊĠĠĠ Ġvar Ġactive Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġrect Ġ= ĠRect ( ĊĠĠĠĠĠĠĠ Ġposition [ 1 ]. item (). round ToInt (), Ġposition [ 0 ]. item (). round ToInt (), Ġwidth , Ġheight , Ġ 1 f ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġnormalize Direction () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnormalize Direction () Ġ{ ĊĠĠĠĠĠĠĠ Ġdirection [ 1 ] Ġ= Ġdirection [ 1 ]. clamp ( min Ġ= Ġ- 0 . 8 f , Ġmax Ġ= Ġ 0 . 8 f ) ĊĠĠĠĠĠĠĠ Ġif Ġ( abs ( direction [ 1 ]). item () Ġ< Ġ 0 . 0 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection [ 1 ] Ġ= Ġ 0 . 0 5 f Ġ* Ġdirection [ 1 ]. item (). sign ĊĠĠĠĠĠĠĠ Ġif Ġ( direction [ 1 ]. item () Ġ== Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection [ 1 ] Ġ= Ġ 0 . 0 5 f ĊĠĠĠĠĠĠĠ Ġdirection [ 0 ] Ġ= Ġdirection [ 0 ] Ġ* Ġsqrt ( 1 f Ġ- Ġabs ( direction [ 1 ])) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw ( env : ĠEnvironment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( active ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspeed Int Ġ= Ġspeed . round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġspeed Int ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Direction ( env ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . draw ( env . canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Position () Ġ{ ĊĠĠĠĠĠĠĠ Ġposition Ġ+= Ġdirection ĊĠĠĠĠĠĠĠ Ġrect . y Ġ= Ġposition [ 0 ]. item (). toInt () ĊĠĠĠĠĠĠĠ Ġrect . x Ġ= Ġposition [ 1 ]. item (). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Direction ( env : ĠEnvironment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rect . x Ġ< Ġ 0 Ġ|| Ġ( rect . x Ġ+ Ġrect . width ) Ġ> Ġenv . canvas . shape [ 2 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection [ 1 ] Ġ= Ġdirection [ 1 ] Ġ* Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect . x Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( rect . x Ġ+ Ġrect . width Ġ> Ġenv . canvas . shape [ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ= Ġenv . canvas . shape [ 2 ] Ġ- Ġrect . width ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( rect . y Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection [ 0 ] Ġ= Ġdirection [ 0 ] Ġ* Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . y Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( rect . y Ġ>= Ġenv . canvas . shape [ 1 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset ( env ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġrect . y ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġrect . x ĊĊĠĠĠĠĠĠĠ Ġvar Ġchanged Y Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġenv . grid . hit Detect ( this ). forEach Ġ{ Ġbr ick Hit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( x Ġ+ Ġrect . width Ġ== Ġbr ick Hit . rect . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġx Ġ== Ġbr ick Hit . rect . x Ġ+ Ġbr ick Hit . rect . width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġy Ġ+ Ġrect . height Ġ> Ġbr ick Hit . rect . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġy Ġ< Ġbr ick Hit . rect . y Ġ+ Ġbr ick Hit . rect . height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection [ 1 ] Ġ= Ġdirection [ 1 ] Ġ* Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( y Ġ+ Ġrect . height Ġ== Ġbr ick Hit . rect . y Ġ|| Ġy Ġ== Ġbr ick Hit . rect . y Ġ+ Ġbr ick Hit . rect . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġx Ġ+ Ġrect . width Ġ> Ġbr ick Hit . rect . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġx Ġ< Ġbr ick Hit . rect . x Ġ+ Ġbr ick Hit . rect . width Ġ&& Ġ! changed Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection [ 0 ] Ġ= Ġdirection [ 0 ] Ġ* Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Y Ġ= Ġtrue ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv . score Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ+= Ġ 0 . 0 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( speed Ġ> Ġ 3 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ 3 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( brick Hit . rect . value Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbr ick Value Ġ= Ġ( brick Hit . value Ġ* Ġ 6 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenv . score Ġ+= Ġbr ick Value Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( speed Ġ< Ġ 2 f Ġ&& Ġbr ick Value Ġ> Ġ 3 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( env . paddle . rect . intersect s ( rect )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection [ 0 ] Ġ= Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaddle Center Ġ= Ġenv . paddle . rect . x Ġ+ Ġenv . paddle . rect . width Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġball Center Ġ= Ġrect . x Ġ+ Ġrect . width Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Ġ= Ġball Center Ġ- Ġpaddle Center ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Dist Ġ= Ġenv . paddle . rect . width Ġ/ Ġ 2 f Ġ+ Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection [ 1 ] Ġ= Ġdist Ġ/ Ġmax Dist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalize Direction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset ( env : ĠEnvironment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenv . lif es Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠ Ġposition [ 0 ] Ġ= Ġenv . canvas . shape [ 1 ] Ġ- Ġ 4 0 f ĊĠĠĠĠĠĠĠ Ġposition [ 1 ] Ġ= Ġenv . canvas . shape [ 2 ] Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġrect . x Ġ= Ġposition [ 1 ]. item (). round ToInt () ĊĠĠĠĠĠĠĠ Ġrect . y Ġ= Ġposition [ 0 ]. item (). round ToInt () ĊĠĠĠĠĠĠĠ Ġspeed Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġdirection [ 0 ] Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġdirection [ 1 ] Ġ= ĠRandom . next Float ()* 1 . 2 f Ġ- Ġ 0 . 6 f ĊĠĠĠĠĠĠĠ Ġnormalize Direction () ĊĠĠĠĠĠĠĠ Ġactive Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠGrid ( ĊĠĠĠ Ġval Ġrows : ĠInt , ĊĠĠĠ Ġval Ġcolumns : ĠInt Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġbr icks Ġ= ĠList ( rows Ġ* Ġcolumns ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBr ick ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ% Ġcolumns , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ/ Ġcolumns , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( rows Ġ- Ġit Ġ/ Ġcolumns ). toFloat () Ġ/ Ġrows Ġ* Ġ 0 . 8 f Ġ+ Ġ 0 . 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw ( env : ĠEnvironment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbr icks . forEach Ġ{ Ġit . draw ( env . canvas ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhit Detect ( ball : ĠBall ): ĠList < Brick > Ġ= Ġbr icks . filter Ġ{ Ġit . hit ( ball ) Ġ} Ċ Ċ } Ċ Ċ class ĠP addle ( ĊĠĠĠ Ġy : ĠInt , ĊĠĠĠ Ġx : ĠInt Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġrect Ġ= ĠRect ( x , Ġy , Ġ 8 , Ġ 1 , Ġ 1 f ) ĊĊĠĠĠ Ġprivate Ġval Ġdirection Cap Ġ= Ġrect . width Ġ/ Ġ 3 f ĊĊĠĠĠ Ġvar Ġinternal Direction Ġ= Ġ 0 f ĊĊĠĠĠ Ġfun Ġmove ( direction : ĠInt , Ġenv : ĠEnvironment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Direction Ġ+= Ġ( direction Cap Ġ* Ġdirection ) Ġ/ Ġ 4 f ĊĠĠĠĠĠĠĠ Ġif Ġ( kotlin . math . abs ( internal Direction ) Ġ> Ġdirection Cap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Direction Ġ= Ġinternal Direction . sign Ġ* Ġdirection Cap ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġint Dir Ġ= Ġinternal Direction . toInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( direction Ġ== Ġ 0 Ġ&& Ġint Dir Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Direction Ġ+= Ġ- internal Direction . sign Ġ* Ġ( direction Cap Ġ/ Ġ 4 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ= Ġrect . x Ġ+ Ġinternal Direction . toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( direction Ġ!= Ġ 0 Ġ&& Ġ( direction . sign Ġ== Ġint Dir . sign )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ= Ġrect . x Ġ+ Ġint Dir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġwidth Half Ġ= Ġ( rect . width Ġ/ Ġ 2 ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( rect . x Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rect . x Ġ> Ġenv . canvas . shape [ 2 ] Ġ- Ġwidth Half ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ= Ġenv . canvas . shape [ 2 ] Ġ- Ġwidth Half ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrect . draw ( env . canvas ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠEnvironment ( ĊĠĠĠ Ġval Ġcanvas : ĠTensor Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġpaddle Ġ= ĠP addle ( canvas . shape [ 1 ] Ġ- Ġ 8 , Ġcanvas . shape [ 2 ] Ġ/ Ġ 2 Ġ- Ġ 4 ) ĊĠĠĠ Ġvar Ġball Ġ= ĠBall ( Tensor . tensor Of ( canvas . shape [ 1 ] Ġ- Ġ 4 0 , Ġcanvas . shape [ 2 ] Ġ/ Ġ 2 )) ĊĠĠĠ Ġvar Ġgrid Ġ= ĠGrid ( 6 , Ġ 1 2 ) ĊĠĠĠ Ġvar Ġscore Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġl if es Ġ= Ġ 5 ĊĠĠĠ Ġval Ġlife Indicator Ġ= ĠRect ( canvas . shape [ 1 ] Ġ- Ġ( lif es * 5 ), Ġ 0 , Ġl if es * 5 , Ġ 3 , Ġ 0 . 5 f ) ĊĠĠĠ Ġvar Ġscore Before Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġsum Ep Score Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġsum Score Ġget () Ġ= Ġsum Ep Score Ġ+ Ġscore ĊĊĠĠĠ Ġfun Ġstep ( action : ĠInt ): ĠPair < Float , ĠBoolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl if es Before Ġ= Ġl if es ĊĠĠĠĠĠĠĠ Ġcanvas [ all , Ġall , Ġall ] Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġ- 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġaction ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġball . active Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpaddle . move ( direction , Ġthis ) ĊĠĠĠĠĠĠĠ Ġball . draw ( this ) ĊĠĠĠĠĠĠĠ Ġgrid . draw ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġreward Ġ= Ġ( score Ġ- Ġscore Before ). toFloat () ĊĠĠĠĠĠĠĠ Ġscore Before Ġ= Ġscore ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ball . rect . y Ġ> Ġcanvas . shape [ 1 ] Ġ/ Ġ 2 Ġ&& Ġgrid . br icks . none Ġ{ Ġit . rect . value Ġ> Ġ 0 Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid . br icks . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . rect . value Ġ= Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( lif es Before Ġ> Ġl if es ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlife Indicator . x Ġ= Ġcanvas . shape [ 1 ] Ġ- Ġ( lif es * 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlife Indicator . width Ġ= Ġl if es * 5 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlife Indicator . draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( lif es Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 f Ġto Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġreward Ġto Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġpaddle Ġ= ĠP addle ( canvas . shape [ 1 ] Ġ- Ġ 8 , Ġcanvas . shape [ 2 ] Ġ/ Ġ 2 Ġ- Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġball . reset ( this ) ĊĠĠĠĠĠĠĠ Ġgrid Ġ= ĠGrid ( 6 , Ġ 1 2 ) ĊĠĠĠĠĠĠĠ Ġsum Ep Score Ġ+= Ġscore ĊĠĠĠĠĠĠĠ Ġscore Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġscore Before Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġl if es Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġlife Indicator . x Ġ= Ġcanvas . shape [ 1 ] Ġ- Ġ( lif es * 5 ) ĊĠĠĠĠĠĠĠ Ġlife Indicator . width Ġ= Ġl if es * 5 ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPolicy ( ĊĠĠĠ Ġval Ġobservation Shape : ĠList < Int >, ĊĠĠĠ Ġval Ġaction Space : ĠInt , ĊĠĠĠ Ġval Ġoptimizer : ĠAbstract Optimizer Ġ= ĠAdam (), ĊĠĠĠ Ġval Ġclip Range : ĠFloat Ġ= Ġ 0 . 2 f , ĊĠĠĠ Ġval Ġentropy Coeff : ĠFloat Ġ= Ġ 0 . 0 1 f , ĊĠĠĠ Ġval Ġvf Coeff : ĠFloat Ġ= Ġ 0 . 5 f , ĊĠĠĠ Ġval Ġplatform Key : ĠString Ġ= ĠPlatform Provider . default Platform Key Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġobservation Input Ġ= ĠInput (* observation Shape . to IntArray ()) ĊĠĠĠ Ġval Ġold Prob Input Ġ= ĠInput ( action Space ) ĊĠĠĠ Ġval ĠoldValue Input Ġ= ĠInput ( 1 ) ĊĠĠĠ Ġval Ġadvantage Input Ġ= ĠInput ( 1 ) ĊĠĠĠ Ġval Ġpolicy Out Ġ= ĠDense ( action Space ) ĊĠĠĠ Ġval Ġvalue Out Ġ= ĠDense ( 1 ) ĊĊĠĠĠ Ġval Ġfull Model : ĠModel ĊĠĠĠ Ġval Ġmain Model : ĠModel ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlayer Ġ= ĠConv 2 D ( 3 2 , Ġ 8 , Ġ 4 , Ġweight Initializer Ġ= Ġhe Normal (), Ġbias Initializer Ġ= Ġconstant ( 0 f ))( observation Input ) ĊĠĠĠĠĠĠĠ Ġlayer Ġ= ĠRe LU ()( layer ) ĊĠĠĠĠĠĠĠ Ġlayer Ġ= ĠConv 2 D ( 6 4 , Ġ 4 , Ġ 2 , Ġweight Initializer Ġ= Ġhe Normal (), Ġbias Initializer Ġ= Ġconstant ( 0 f ))( layer ) ĊĠĠĠĠĠĠĠ Ġlayer Ġ= ĠRe LU ()( layer ) ĊĠĠĠĠĠĠĠ Ġlayer Ġ= ĠConv 2 D ( 3 2 , Ġ 3 , Ġ 1 , Ġweight Initializer Ġ= Ġhe Normal (), Ġbias Initializer Ġ= Ġconstant ( 0 f ))( layer ) ĊĠĠĠĠĠĠĠ Ġlayer Ġ= ĠRe LU ()( layer ) ĊĠĠĠĠĠĠĠ Ġlayer Ġ= ĠFlat ten ()( layer ) ĊĠĠĠĠĠĠĠ Ġvar Ġfc 1 Ġ= ĠDense ( 5 1 2 , Ġweight Initializer Ġ= Ġhe Normal (), Ġbias Initializer Ġ= Ġconstant ( 0 f ))( layer ) ĊĠĠĠĠĠĠĠ Ġfc 1 Ġ= ĠRe LU ()( fc 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġpolicy Output Ġ= ĠSoft max ()( policy Out ( fc 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Output Ġ= Ġvalue Out ( fc 1 ) ĊĊĠĠĠĠĠĠĠ Ġmain Model Ġ= ĠModel ( listOf ( observation Input ), ĠlistOf ( policy Output , Ġvalue Output )) ĊĠĠĠĠĠĠĠ Ġmain Model . on Platform ( platform Key ) ĊĊĠĠĠĠĠĠĠ Ġfull Model Ġ= ĠModel ( listOf ( observation Input , Ġadvantage Input , Ġold Prob Input , ĠoldValue Input ), ĠlistOf ( policy Output , Ġvalue Output )) ĊĠĠĠĠĠĠĠ Ġfull Model . on Platform ( platform Key ) ĊĠĠĠĠĠĠĠ Ġfull Model . summary () ĊĠĠĠĠĠĠĠ Ġfull Model . grad Normalizer Ġ= Ġclip Gradient Normalizer ( 0 . 5 f ) ĊĠĠĠĠĠĠĠ Ġfull Model . prepare ( optimizer , Ġthis :: policy Loss , Ġthis :: value Function Loss ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpolicy Loss ( y Pred : ĠTensor , Ġy True : ĠTensor ): ĠTensor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġneg Log Prob Diff Ġ= Ġ-( y True Ġ* ĠTensor . log ( old Prob Input . value )). sum ( axis Ġ= Ġ- 1 , Ġkeep Dimensions Ġ= Ġtrue ) Ġ- Ġ(- ( y True Ġ* ĠTensor . log ( y Pred )). sum ( axis Ġ= Ġ- 1 , Ġkeep Dimensions Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġval Ġratio Ġ= ĠTensor . exp ( neg Log Prob Diff ) ĊĠĠĠĠĠĠĠ Ġval Ġpg Loss 1 Ġ= Ġ- adv antage Input . value Ġ* Ġratio ĊĠĠĠĠĠĠĠ Ġval Ġpg Loss 2 Ġ= Ġ- adv antage Input . value Ġ* Ġratio . clamp ( 1 . 0 f Ġ- Ġclip Range , Ġ 1 . 0 f Ġ+ Ġclip Range ) ĊĠĠĠĠĠĠĠ Ġval Ġmask Ġ= Ġpg Loss 1 . no Grad () Ġgt Ġpg Loss 2 . no Grad () ĊĠĠĠĠĠĠĠ Ġval Ġpg Loss Ġ= ĠTensor . mean (( pg Loss 1 Ġ* Ġmask ) Ġ+ Ġ( pg Loss 2 Ġ* Ġ( 1 f Ġ- Ġmask ))) ĊĠĠĠĠĠĠĠ Ġval Ġentropy Loss Ġ= ĠTensor . mean (- (( y Pred Ġ* ĠTensor . log ( y Pred )). sum ( axis Ġ= Ġ- 1 ))) ĊĠĠĠĠĠĠĠ Ġreturn Ġpg Loss Ġ- Ġ( entropy Coeff Ġ* Ġentropy Loss ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalue Function Loss ( y Pred : ĠTensor , Ġy True : ĠTensor ): ĠTensor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġy Pred Cli pped Ġ= ĠoldValue Input . value Ġ+ Ġ( y Pred Ġ- ĠoldValue Input . value ). clamp (- clip Range , Ġclip Range ) ĊĠĠĠĠĠĠĠ Ġval Ġvf Loss 1 Ġ= Ġ( y True Ġ- Ġy Pred ) Ġpow Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġvf Loss 2 Ġ= Ġ( y True Ġ- Ġy Pred Cli pped ) Ġpow Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġmask Ġ= Ġvf Loss 1 . no Grad () Ġgt Ġvf Loss 2 . no Grad () ĊĠĠĠĠĠĠĠ Ġreturn Ġvf Coeff Ġ* ĠTensor . mean ( vf Loss 1 Ġ* Ġmask Ġ+ Ġvf Loss 2 Ġ* Ġ( 1 f Ġ- Ġmask )) Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġvf Coeff Ġ* Ġmse ( y Pred , Ġy True ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠAgent ( ĊĠĠĠ Ġval Ġpolicy : ĠPolicy , ĊĠĠĠ Ġval Ġaction Space : ĠInt , ĊĠĠĠ Ġval Ġobservation Shape : ĠList < Int >, ĊĠĠĠ Ġval ĠnumberOf En vs : ĠInt Ġ= Ġ 8 , ĊĠĠĠ Ġval Ġrol lout Length : ĠInt Ġ= Ġ 1 0 , ĊĠĠĠ Ġval Ġreward Scale : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠ Ġval Ġgamma : ĠFloat Ġ= Ġ 0 . 9 9 f , ĊĠĠĠ Ġval Ġg ae Lambda : ĠFloat Ġ= Ġ 0 . 9 5 f , ĊĠĠĠ Ġval Ġnormalize Adv antages : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġval Ġepochs : ĠInt Ġ= Ġ 3 , ĊĠĠĠ Ġval Ġmin ib atch Size : ĠInt Ġ= Ġ 6 4 , ĊĠĠĠ Ġvar Ġepsilon : ĠFloat Ġ= Ġ- 1 f Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠE YE Ġ= ĠTensor . eye ( action Space ) ĊĊĠĠĠ Ġvar Ġbatch Obs Ġ= ĠTensor . zeros ( 1 ) ĊĊĠĠĠ Ġval Ġenvironments Ġ= ĠList ( numberOf En vs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsingle Env Shape Ġ= Ġobservation Shape . to IntArray () ĊĠĠĠĠĠĠĠ Ġsingle Env Shape [ 0 ] Ġ/= Ġ 4 ĊĠĠĠĠĠĠĠ ĠEnvironment ( Tensor . zeros (* single Env Shape )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġbatch Pro bs : ĠTensor ĊĠĠĠ Ġlateinit Ġvar Ġbatch Actions : ĠTensor ĊĠĠĠ Ġlateinit Ġvar Ġbatch Values : ĠTensor ĊĠĠĠ Ġlateinit Ġvar Ġbatch Rewards : ĠTensor ĊĠĠĠ Ġlateinit Ġvar Ġbatch Not D ones : ĠTensor ĊĠĠĠ Ġlateinit Ġvar Ġlast Vals : ĠTensor ĊĠĠĠ Ġlateinit Ġvar Ġlast Obs : ĠTensor ĊĊĠĠĠ Ġval Ġtop Score Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠ Ġval Ġsum Score Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠ Ġval Ġmean Returns Log Ġ= Ġmutable ListOf < Double >() ĊĠĠĠ Ġval Ġentropy Log Ġ= Ġmutable ListOf < Double >() ĊĊĊĠĠĠ Ġprivate Ġfun Ġchoose ( prob abilities : ĠTensor ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbatch Ġ= Ġprobabilities . shape [ 0 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( epsilon Ġ>= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠE psilon Ġg reedy Ġoption . Ġ( Norm ally Ġthe Ġentropy Ġbonus Ġis Ġenough Ġfor Ġexploration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġif Ġyou 'd Ġlike Ġto Ġcheck Ġthe Ġconfiguration Ġwith Ġa Ġfixed Ġrandom Ġaction Ġprobability ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġyou Ġcan Ġprovide Ġan Ġepsilon Ġvalue Ġin Ġ 0 f .. 1 f Ġrange ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactions Ġ= Ġprobabilities . arg Max ( axis Ġ= Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInt Array ( batch ) Ġ{ Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Random . next Float () Ġ< Ġepsilon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRandom . nextInt ( action Space ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġactions [ b ]. item (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠInt Array ( batch ) Ġ{ Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchoices Ġ= ĠInt Array ( prob abilities . shape [ 1 ]) Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprob Dist Ġ= ĠDouble Array ( prob abilities . shape [ 1 ]) Ġ{ Ġprobabilities [ b , Ġit ]. item (). toDouble () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistribution Ġ= ĠEnum erated Integer Distribution ( choices , Ġprob Dist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistribution . sample () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġone Hot ( actions : ĠInt Array ): ĠTensor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTensor . concat ( List ( actions . size ) Ġ{ ĠE YE [ actions [ it ]]. unsqueeze ( 0 ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstep () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( batch Obs . dimensions Ġ== Ġ 1 ) Ġ{ Ġ// bootstrap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Obs Ġ= Ġstep In En vs ( IntArray ( numberOf En vs )). first ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprobs List Ġ= Ġmutable ListOf < Tensor >() ĊĠĠĠĠĠĠĠ Ġval Ġactions List Ġ= Ġmutable ListOf < Tensor >() ĊĠĠĠĠĠĠĠ Ġval Ġobs List Ġ= Ġmutable ListOf < Tensor >() ĊĠĠĠĠĠĠĠ Ġval Ġnot D ones List Ġ= Ġmutable ListOf < Tensor >() ĊĠĠĠĠĠĠĠ Ġval Ġre ws List Ġ= Ġmutable ListOf < Tensor >() ĊĠĠĠĠĠĠĠ Ġval Ġvals List Ġ= Ġmutable ListOf < Tensor >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġrol lout Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( probs , Ġvalues ) Ġ= Ġpolicy . main Model . predict On Batch ( listOf ( last Obs )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactions Ġ= Ġchoose ( probs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( envs Obs , Ġenv s Not D ones , Ġenv Rewards ) Ġ= Ġstep In En vs ( actions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenv Actions Ġ= Ġone Hot ( actions ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprobs List Ġ+= Ġprobs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions List Ġ+= Ġenv Actions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobs List Ġ+= Ġlast Obs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot D ones List Ġ+= Ġenv s Not D ones ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre ws List Ġ+= Ġenv Rewards ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvals List Ġ+= Ġvalues ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Obs Ġ= Ġenv s Obs ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġavg Score Ġ= Ġsum Score . get (). toFloat () Ġ/ ĠnumberOf En vs ĊĊĠĠĠĠĠĠĠ Ġprintln (" Full Ġrol lout Ġis Ġdone Ġtop Ġscore : Ġ${ top Score . get ()} Ġavg , Ġscore : Ġ$ avg Score ") ĊĠĠĠĠĠĠĠ Ġsum Score . set ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġbatch Pro bs Ġ= ĠTensor . concat ( probs List ) ĊĠĠĠĠĠĠĠ Ġbatch Obs Ġ= ĠTensor . concat ( obs List ) ĊĠĠĠĠĠĠĠ Ġbatch Actions Ġ= ĠTensor . concat ( actions List ) ĊĠĠĠĠĠĠĠ Ġbatch Rewards Ġ= ĠTensor . concat ( re ws List . map Ġ{ Ġit . unsqueeze ( axis Ġ= Ġ 0 ) Ġ}) ĊĠĠĠĠĠĠĠ Ġbatch Values Ġ= ĠTensor . concat ( vals List . map Ġ{ Ġit . unsqueeze ( axis Ġ= Ġ 0 ) Ġ}) ĊĠĠĠĠĠĠĠ Ġbatch Not D ones Ġ= ĠTensor . concat ( not D ones List . map Ġ{ Ġit . unsqueeze ( axis Ġ= Ġ 0 ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġvalues ) Ġ= Ġpolicy . main Model . predict On Batch ( listOf ( last Obs )) ĊĠĠĠĠĠĠĠ Ġlast Vals Ġ= Ġvalues ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstep In En vs ( actions : ĠInt Array ): ĠTrip le < Tensor , ĠTensor , ĠTensor > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobs Ġ= Ġmutable ListOf < Tensor >() ĊĠĠĠĠĠĠĠ Ġval Ġdon es Ġ= Ġmutable ListOf < Boolean >() ĊĠĠĠĠĠĠĠ Ġval Ġrewards Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġval Ġenv Map Ġ= ĠConcurrent HashMap ( mutable Map Of < Int , ĠTrip le < Tensor , ĠBoolean , ĠFloat >> ()) ĊĠĠĠĠĠĠĠ ĠInt Stream . range ( 0 , Ġenvironments . size ). parallel (). forEach Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenv Ġ= Ġenvironments [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġre w Sum Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdone Sum Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreal Done Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepe ted Step Obs Ġ= Ġmutable ListOf < Tensor >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! real Done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl if es Before Ġ= Ġenv . lif es ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( reward , Ġdone ) Ġ= Ġenv . step ( actions [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre w Sum Ġ+= Ġreward . sign ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( done Ġ|| Ġenv . lif es Ġ< Ġl if es Before ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone Sum Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Done Ġ= Ġdone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepe ted Step Obs Ġ+= Ġenv . canvas ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Score . get AndUpdate Ġ{ Ġif Ġ( it Ġ< Ġenv . score ) Ġenv . score Ġelse Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real Done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Score . add AndGet ( env . score ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenv . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenv . step ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepe ted Step Obs . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzero Obs Ġ= ĠTensor . zeros Like ( env . canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepe ted Step Obs Ġ+= ĠlistOf ( zero Obs , Ġzero Obs , Ġzero Obs , Ġenv . canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġenv Map [ index ] Ġ= ĠTrip le ( Tensor . concat ( repe ted Step Obs ). unsqueeze ( axis Ġ= Ġ 0 ), Ġdone Sum , Ġre w Sum ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġenvironments . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( local Obs , Ġlocal D ones , Ġlocal Rewards ) Ġ= Ġenv Map [ e ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobs . add ( local Obs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdon es . add ( local D ones ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrewards . add ( local Rewards ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġenv s Obs Ġ= ĠTensor . concat ( obs ) ĊĠĠĠĠĠĠĠ Ġval Ġenv s Not D ones Ġ= ĠTensor ( d ones . size ) Ġ{ Ġif Ġ( d ones [ it ]) Ġ 0 f Ġelse Ġ 1 f Ġ}. unsqueeze ( axis Ġ= Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġenv Rewards Ġ= ĠTensor ( rewards . size ) Ġ{ Ġrewards [ it ] Ġ}. unsqueeze ( axis Ġ= Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( envs Obs , Ġenv s Not D ones , Ġenv Rewards ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgeneral ized Adv antage Estimator (): ĠPair < Tensor , ĠTensor > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġadv antages Ġ= ĠTensor . zeros Like ( batch Rewards ) ĊĠĠĠĠĠĠĠ Ġvar Ġnext Adv antages Ġ= ĠTensor . zeros ( 1 ) ĊĠĠĠĠĠĠĠ Ġvar Ġnext Vals : ĠTensor ĊĠĠĠĠĠĠĠ Ġfor Ġ( t Ġin Ġrol lout Length Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġ== Ġrol lout Length Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Vals Ġ= Ġlast Vals ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Vals Ġ= Ġbatch Values [ t + 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġreward Scale Ġ* Ġbatch Rewards [ t ] Ġ+ Ġgamma Ġ* Ġbatch Not D ones [ t ] Ġ* Ġnext Vals Ġ- Ġbatch Values [ t ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Adv antages Ġ= Ġdelta Ġ+ Ġgamma Ġ* Ġg ae Lambda Ġ* Ġbatch Not D ones [ t ] Ġ* Ġnext Adv antages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadv antages [ t ] Ġ= Ġnext Adv antages ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreturns Ġ= Ġ( adv antages Ġ+ Ġbatch Values ). reshape (- 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( normalize Adv antages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadv antages Ġ= Ġadv antages . reshape (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadv antages Ġ= Ġ(( adv antages Ġ- Ġadv antages . mean ()) Ġ/ Ġ( adv antages . std ( 0 ) Ġ+ Ġ 1 e - 1 0 f )). unsqueeze ( axis Ġ= Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadv antages Ġ= Ġadv antages . reshape (- 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġadv antages Ġto Ġreturns ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbootstrap En vs ( bootstrap Steps : ĠInt Ġ= Ġ 5 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsum Score Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġbootstrap Steps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironments . stream (). parallel (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġdone ) Ġ= Ġit . step ( Random . nextInt ( action Space )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Score . add AndGet ( it . score ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . sum Ep Score Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" Bootstrap Ġdone , Ġavg Ġscore Ġfor Ġrandom Ġsteps : Ġ${ sum Score . get (). toDouble () Ġ/ Ġ( bootstrap Steps Ġ* Ġenvironments . size )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtrain () Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġre arrange ( tensor : ĠTensor , Ġindices : ĠList < Int >) Ġ= ĠTensor . concat ( indices . map Ġ{ Ġtensor [ it ]. unsqueeze ( 0 ) Ġ}, Ġaxis Ġ= Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġprintln (" Training Ġstart , Ġcurrent Ġlearning Ġrate : Ġ${ policy . optimizer . current LR }") ĊĠĠĠĠĠĠĠ Ġval Ġ( adv antages , Ġreturns ) Ġ= Ġgeneral ized Adv antage Estimator () ĊĠĠĠĠĠĠĠ Ġval Ġmean Return Ġ= Ġenvironments . map Ġ{ Ġit . sum Score Ġ}. reduce ( Int :: plus ). toDouble () Ġ/ ĠnumberOf En vs ĊĠĠĠĠĠĠĠ Ġenvironments . forEach Ġ{ Ġit . sum Ep Score Ġ= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġmean Returns Log Ġ+= Ġmean Return ĊĠĠĠĠĠĠĠ Ġprintln (" Mean Ġof Ġreturns : Ġ${ mean Return }") ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Entropy Ġ= ĠTensor . mean (- (( batch Pro bs Ġ* ĠTensor . log ( batch Pro bs )). sum ( axis Ġ= Ġ- 1 ))). item (). toDouble () ĊĠĠĠĠĠĠĠ Ġprintln (" Current Ġentropy : Ġ$ current Entropy ") ĊĠĠĠĠĠĠĠ Ġentropy Log Ġ+= Ġcurrent Entropy ĊĊĠĠĠĠĠĠĠ Ġbatch Values Ġ= Ġbatch Values . reshape (- 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġsteps Ġ= Ġbatch Obs . shape [ 0 ] Ġ/ Ġmin ib atch Size ĊĠĠĠĠĠĠĠ Ġval Ġlast Step Size Ġ= Ġbatch Obs . shape [ 0 ] Ġ% Ġmin ib atch Size ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( epoch Ġin Ġ 0 Ġuntil Ġepochs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsh uffled Indices Ġ= Ġ( 0 Ġuntil Ġbatch Values . shape [ 0 ]). sh uffled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobs Ġ= Ġre arrange ( batch Obs , Ġsh uffled Indices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġad vs Ġ= Ġre arrange ( adv antages , Ġsh uffled Indices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprobs Ġ= Ġre arrange ( batch Pro bs , Ġsh uffled Indices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvals Ġ= Ġre arrange ( batch Values , Ġsh uffled Indices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacts Ġ= Ġre arrange ( batch Actions , Ġsh uffled Indices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġre ts Ġ= Ġre arrange ( returns , Ġsh uffled Indices ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġepoch Metrics Ġ= Ġmutable Map Of < String , ĠFloat >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( step Ġin Ġ 0 Ġuntil Ġsteps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin ib atch Range Ġ= Ġ Ġ( step * min ib atch Size ) Ġuntil Ġ( step * min ib atch Size Ġ+ Ġmin ib atch Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetrics Ġ= Ġpolicy . full Model . train On Batch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( obs [ min ib atch Range ], Ġad vs [ min ib atch Range ], Ġprobs [ min ib atch Range ], Ġvals [ min ib atch Range ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( acts [ min ib atch Range ], Ġre ts [ min ib atch Range ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( epoch Metrics . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepoch Metrics . put All ( metrics ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . forEach Ġ{ Ġkey , Ġvalue Ġ-> Ġepoch Metrics [ key ] Ġ= Ġepoch Metrics [ key ] !! Ġ+ Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Step Size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin ib atch Range Ġ= Ġ Ġ( steps * min ib atch Size ) Ġuntil Ġ( steps * min ib atch Size Ġ+ Ġlast Step Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetrics Ġ= Ġpolicy . full Model . train On Batch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( obs [ min ib atch Range ], Ġad vs [ min ib atch Range ], Ġprobs [ min ib atch Range ], Ġvals [ min ib atch Range ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( acts [ min ib atch Range ], Ġre ts [ min ib atch Range ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( epoch Metrics . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepoch Metrics . put All ( metrics ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . forEach Ġ{ Ġkey , Ġvalue Ġ-> Ġepoch Metrics [ key ] Ġ= Ġepoch Metrics [ key ] !! Ġ+ Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetrics Ġ= Ġepoch Metrics . map Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġkey Ġto Ġ( value Ġ/ Ġif Ġ( last Step Size Ġ> Ġ 0 ) Ġsteps Ġ+ Ġ 1 Ġelse Ġsteps ) Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Training Ġmetrics : Ġ$ metrics ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtop Score . set ( 0 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFrame s Calculator ( ĊĠĠĠ Ġval Ġrol lout Length : ĠInt Ġ= Ġ 1 2 8 , ĊĠĠĠ Ġval ĠnumberOf En vs : ĠInt Ġ= Ġ 1 6 , ĊĠĠĠ Ġval Ġmin ib atch Size : ĠInt Ġ= Ġ 2 5 6 , ĊĠĠĠ Ġval Ġtrain Epoch s : ĠInt Ġ= Ġ 4 Ċ ) Ġ{ ĊĠĠĠ Ġval Ġframes Per Episode Ġ= ĠnumberOf En vs Ġ* Ġrol lout Length ĊĠĠĠ Ġfun Ġcalc Training Steps For Max Frames ( max Frames : ĠInt ) Ġ= Ġmax Frames Ġ* Ġtrain Epoch s Ġ/ Ġmin ib atch Size ĊĠĠĠ Ġfun Ġcalc Max Episode s ( max Frames : ĠInt ) Ġ= Ġmax Frames Ġ/ Ġframes Per Episode Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġload Weights Ġ= Ġtrue ĊĠĠĠ Ġval Ġtrain Ġ= Ġfalse ĊĠĠĠ Ġval Ġplay Ġ= Ġtrue ĊĠĠĠ Ġval Ġplatform Key Ġ= ĠPlatform Provider . find Platform Ġ{ Ġit . device Type Ġ== ĠDevice Type . GPU Ġ}. platform Key Ġ// Ġchange Ġto Ġyour Ġpreferred Ġplatform ĊĊĠĠĠ Ġval Ġframes Calculator Ġ= ĠFrame s Calculator ( ĊĠĠĠĠĠĠĠ Ġrol lout Length Ġ= Ġ 1 2 8 , ĊĠĠĠĠĠĠĠ ĠnumberOf En vs Ġ= Ġ 1 6 , ĊĠĠĠĠĠĠĠ Ġtrain Epoch s Ġ= Ġ 4 ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġlearning Rate Ġ= Ġ 1 . 0 e - 4 f ĊĠĠĠ Ġval Ġmax Frames Ġ= Ġ 1 0 _ 0 0 0 _ 0 0 0 ĊĊĠĠĠ Ġval Ġpolicy Ġ= ĠPolicy ( listOf ( 4 , Ġ 8 4 , Ġ 8 4 ), Ġ 4 , ĊĠĠĠĠĠĠĠ Ġplatform Key Ġ= Ġplatform Key , ĊĠĠĠĠĠĠĠ Ġvf Coeff Ġ= Ġ 0 . 5 f , ĊĠĠĠĠĠĠĠ Ġoptimizer Ġ= ĠAdam ( learning Rate , Ġscheduler Ġ= ĠLinear Dec ay ( learning Rate Ġ/ Ġframes Calculator . calc Training Steps For Max Frames ( max Frames ))), ĊĠĠĠĠĠĠĠ Ġentropy Coeff Ġ= Ġ 0 . 0 1 f , ĊĠĠĠĠĠĠĠ Ġclip Range Ġ= Ġ 0 . 1 f ) ĊĊĠĠĠ Ġif Ġ( load Weights ) ĊĠĠĠĠĠĠĠ Ġpolicy . full Model . load Params ( Path . of ("./ br ak out _ pp o . weights ")) ĊĊĠĠĠ Ġif Ġ( train ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġagent Ġ= ĠAgent ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy , Ġ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 4 , Ġ 8 4 , Ġ 8 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrol lout Length Ġ= Ġframes Calculator . rol lout Length , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnumberOf En vs Ġ= Ġframes Calculator . numberOf En vs , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġepochs Ġ= Ġframes Calculator . train Epoch s , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg ae Lambda Ġ= Ġ 0 . 7 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormalize Adv antages Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin ib atch Size Ġ= Ġframes Calculator . min ib atch Size ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// agent . bootstrap En vs () Ġ// Ġmay Ġimprove Ġthe Ġfirst Ġphase Ġof Ġtraining ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġ 0 Ġuntil Ġframes Calculator . calc Max Episode s ( max Frames )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" episode Ġ$ e Ġstart ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġagent . step () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġagent . train () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" episode Ġ$ e Ġend ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ% Ġ 5 0 Ġ== Ġ 0 Ġ&& Ġe Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" saving Ġmodel Ġparameters ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy . full Model . save Params ( Path . of ("./ br ak out _ pp o . weights "), Ġwith Optimizer State Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ% Ġ 1 0 Ġ== Ġ 0 Ġ&& Ġe Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" plot ting Ġreward Ġchart , Ġand Ġentropy Ġchart ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreward Chart Ġ= ĠQuick Chart . get Chart (" P PO ", Ġ" episode ", Ġ" mean Ġreturns ", Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . mean Returns Log . indices . toList (). map Ġ{ Ġit . toDouble () Ġ}. toDouble Array (), Ġagent . mean Returns Log . toDouble Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Encoder . save Bitmap With DPI ( reward Chart , Ġ"./ break out _ pp o _ rewards ", ĠBitmap Encoder . Bitmap Format . PNG , Ġ 3 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentropy Chart Ġ= ĠQuick Chart . get Chart (" P PO ", Ġ" episode ", Ġ" entropy ", Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġagent . entropy Log . indices . toList (). map Ġ{ Ġit . toDouble () Ġ}. toDouble Array (), Ġagent . entropy Log . toDouble Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Encoder . save Bitmap With DPI ( entropy Chart , Ġ"./ break out _ pp o _ entropy ", ĠBitmap Encoder . Bitmap Format . PNG , Ġ 3 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpolicy . full Model . save Params ( Path . of ("./ br ak out _ pp o . weights "), Ġwith Optimizer State Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( play ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplay Agent Ġ= ĠAgent ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolicy , Ġ 4 , ĠlistOf ( 4 , Ġ 8 4 , Ġ 8 4 ), Ġ 1 , Ġ 1 , Ġepsilon Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġtensor Ġ= ĠTensor . zeros ( 1 , Ġ 8 4 , Ġ 8 4 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġimg Show Ġ= Ġtensor . to Image () ĊĠĠĠĠĠĠĠ Ġimg Show . processor Ġ= Ġimg Show . processor . resize ( 3 2 0 ) ĊĠĠĠĠĠĠĠ Ġimg Show . show () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Agent . step () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtensor Ġ= Ġplay Agent . environments [ 0 ]. canvas . copy () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Ġ= Ġtensor . to Image () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( img Show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Show . processor Ġ= Ġimg . processor . resize ( 3 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Show . update And Draw () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }