/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . datal ore . plot . base . stat Ċ Ċ import Ġjet brains . datal ore . base . g common . collect . Closed Range Ċ import Ġjet brains . datal ore . plot . base . Aes Ċ import Ġjet brains . datal ore . plot . base . DataFrame Ċ import Ġjet brains . datal ore . plot . base . Stat Context Ċ import Ġjet brains . datal ore . plot . base . data . Transform Var Ċ import Ġjet brains . datal ore . plot . common . data . Series Util Ċ Ċ class ĠY Density Stat ( ĊĠĠĠ Ġprivate Ġval Ġband Width : ĠDouble ?, ĊĠĠĠ Ġprivate Ġval Ġband Width Method : ĠD ensity Stat . Band Width Method , ĊĠĠĠ Ġprivate Ġval Ġadjust : ĠDouble , ĊĠĠĠ Ġprivate Ġval Ġkernel : ĠD ensity Stat . Kernel , ĊĠĠĠ Ġprivate Ġval Ġn : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġfull Scan Max : ĠInt Ċ ) Ġ: ĠBase Stat ( DEF _ MAPPING ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( n Ġ<= ĠD ensity Stat . MAX _ N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġinput Ġn Ġ= Ġ$ n Ġ> Ġ${ Density Stat . MAX _ N } Ġis Ġtoo Ġlarge !" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconsume s (): ĠList < Aes <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Aes . X , ĠA es . Y , ĠA es . WEIGHT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( data : ĠDataFrame , Ġstat Ctx : ĠStat Context , Ġmessage Consumer : Ġ( s : ĠString ) Ġ-> ĠUnit ): ĠDataFrame Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Required Values ( data , ĠA es . Y )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwith Empty Stat Values () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġys Ġ= Ġdata . get Numeric ( Transform Var . Y ) ĊĠĠĠĠĠĠĠ Ġval Ġxs Ġ= Ġif Ġ( data . has ( Transform Var . X )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . get Numeric ( Transform Var . X ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( ys . size ) Ġ{ Ġ 0 . 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġws Ġ= Ġif Ġ( data . has ( Transform Var . WEIGHT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . get Numeric ( Transform Var . WEIGHT ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( ys . size ) Ġ{ Ġ 1 . 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstat Data Ġ= Ġbuild Stat ( xs , Ġys , Ġws ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠDataFrame . Builder () ĊĠĠĠĠĠĠĠ Ġfor Ġ(( variable , Ġseries ) Ġin Ġstat Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . put Numeric ( variable , Ġseries ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnormalize ( data After Stat : ĠDataFrame ): ĠDataFrame Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstat Vi olin Width Ġ= Ġif Ġ( data After Stat . rowCount () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List < Double ?> () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Density Ġ= Ġdata After Stat . get Numeric ( Stats . D ENS ITY ). map Ġ{ Ġit !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdensity Max Ġ= Ġstat Density . max OrNull () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat Density . map Ġ{ Ġit Ġ/ Ġdensity Max Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdata After Stat . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Numeric ( Stats . VI OL IN _ WIDTH , Ġstat Vi olin Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Stat ( ĊĠĠĠĠĠĠĠ Ġxs : ĠList < Double ? >, ĊĠĠĠĠĠĠĠ Ġys : ĠList < Double ? >, ĊĠĠĠĠĠĠĠ Ġws : ĠList < Double ?> ĊĠĠĠ Ġ): ĠMutable Map < DataFrame . Variable , ĠList < Double >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbin ned Data Ġ= Ġ( xs Ġzip Ġ( ys Ġzip Ġws )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . first ?. is Finite () Ġ== Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy ({ Ġit . first !! Ġ}, Ġ{ Ġit . second Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġit . value . unzip () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstat X Ġ= ĠArrayList < Double >() ĊĠĠĠĠĠĠĠ Ġval Ġstat Y Ġ= ĠArrayList < Double >() ĊĠĠĠĠĠĠĠ Ġval Ġstat Density Ġ= ĠArrayList < Double >() ĊĠĠĠĠĠĠĠ Ġval Ġstat Count Ġ= ĠArrayList < Double >() ĊĠĠĠĠĠĠĠ Ġval Ġstat Scaled Ġ= ĠArrayList < Double >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( x , Ġbin ) Ġin Ġbin ned Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( filtered Y , Ġfiltered W ) Ġ= ĠSeries Util . filter Finite ( bin . first , Ġbin . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( bin Y , Ġbin W ) Ġ= Ġ( filtered Y Ġzip Ġfiltered W ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. unzip () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bin Y . isEmpty ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Summary Ġ= ĠF ive Number Summary ( bin Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Y Ġ= ĠClosed Range ( y Summary . min , Ġy Summary . max ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbin Stat Y Ġ= ĠD ensity Stat Util . create Step Values ( range Y , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdensity Function Ġ= ĠD ensity Stat Util . density Function ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin Y , Ġbin W , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġband Width , Ġband Width Method , Ġadjust , Ġkernel , Ġfull Scan Max ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbin Stat Count Ġ= Ġbin Stat Y . map Ġ{ Ġdensity Function ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidths Sum Ġ= Ġbin W . sum () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Bin Count Ġ= Ġbin Stat Count . max OrNull () !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat X Ġ+= ĠMutable List ( bin Stat Y . size ) Ġ{ Ġx Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat Y Ġ+= Ġbin Stat Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat Density Ġ+= Ġbin Stat Count . map Ġ{ Ġit Ġ/ Ġwidths Sum Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat Count Ġ+= Ġbin Stat Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat Scaled Ġ+= Ġbin Stat Count . map Ġ{ Ġit Ġ/ Ġmax Bin Count Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStats . X Ġto Ġstat X , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStats . Y Ġto Ġstat Y , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStats . D ENS ITY Ġto Ġstat Density , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStats . COUNT Ġto Ġstat Count , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStats . SCAL ED Ġto Ġstat Scaled ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEF _ MAPPING : ĠMap < Aes <* >, ĠDataFrame . Variable > Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA es . X Ġto ĠStats . X , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA es . Y Ġto ĠStats . Y , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA es . VI OL IN WIDTH Ġto ĠStats . VI OL IN _ WIDTH ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }