/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . Ġ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 . builder . data Ċ Ċ import Ġjet brains . datal ore . base . function . Consumer Ċ import Ġjet brains . datal ore . plot . base .* Ċ import Ġjet brains . datal ore . plot . base . DataFrame . Builder Ċ import Ġjet brains . datal ore . plot . base . DataFrame . Builder . Companion . empty Frame Ċ import Ġjet brains . datal ore . plot . base . DataFrame . Variable Ċ import Ġjet brains . datal ore . plot . base . data . DataFrame Util Ċ import Ġjet brains . datal ore . plot . base . scale . Scale Util Ċ import Ġjet brains . datal ore . plot . base . stat . Stats Ċ import Ġjet brains . datal ore . plot . builder . Var Binding Ċ import Ġjet brains . datal ore . plot . builder . assemble . Plot Fac ets Ċ import Ġjet brains . datal ore . plot . builder . assemble . Typed Scale Map Ċ import Ġjet brains . datal ore . plot . builder . data . Group Util . indices By Group Ċ import Ġjet brains . datal ore . plot . common . data . Series Util Ċ import Ġjet brains . datal ore . plot . common . data . Series Util . pick At Indices Ċ Ċ object ĠData Processing Ġ{ ĊĊĠĠĠ Ġfun Ġtransform Original s ( ĊĠĠĠĠĠĠĠ Ġdata : ĠDataFrame , ĊĠĠĠĠĠĠĠ Ġbindings : ĠList < Var Binding >, ĊĠĠĠĠĠĠĠ Ġscale Map : ĠTyped Scale Map ĊĠĠĠ Ġ): ĠDataFrame Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠ Ġvar Ġdata Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġfor Ġ( binding Ġin Ġbindings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġbinding . variable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable . is Origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( data . has ( variable )) Ġ{ Ġ" Undefined Ġvariable Ġ$ variable " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠDataFrame Util . apply Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . aes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Map [ binding . aes ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Stat Data ( ĊĠĠĠĠĠĠĠ Ġdata : ĠDataFrame , ĊĠĠĠĠĠĠĠ Ġstat : ĠStat , ĊĠĠĠĠĠĠĠ Ġbindings : ĠList < Var Binding >, ĊĠĠĠĠĠĠĠ Ġscale Map : ĠTyped Scale Map , ĊĠĠĠĠĠĠĠ Ġgrouping Context : ĠGroup ing Context , ĊĠĠĠĠĠĠĠ Ġfac ets : ĠPlot Fac ets , ĊĠĠĠĠĠĠĠ Ġstat Ctx : ĠStat Context , ĊĠĠĠĠĠĠĠ Ġvar sWith out Binding : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġorder Options : ĠList < Order Option Util . Order Option >, ĊĠĠĠĠĠĠĠ Ġaggregate Operation : Ġ(( List < Double ?> ) Ġ-> ĠDouble ? )? , ĊĠĠĠĠĠĠĠ Ġmessage Consumer : ĠConsumer < String > ĊĠĠĠ Ġ): ĠData And Grouping Context Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stat Ġ=== ĠStats . IDENTITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠData And Grouping Context ( empty Frame (), Ġgrouping Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġgrouping Context . group Mapper ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Series : ĠMap < Variable , ĠList < Any ? >> ĊĠĠĠĠĠĠĠ Ġval Ġgroup Size List After Stat : ĠList < Int > ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġonly Ġone Ġgroup Ġno Ġneed Ġto Ġmodify ĊĠĠĠĠĠĠĠ Ġif Ġ( groups Ġ=== ĠGroup Util . SINGLE _ GROUP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Data Ġ= Ġapply Stat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbindings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Map , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfac ets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat Ctx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar sWith out Binding , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Consumer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Size List After Stat Ġ= ĠlistOf ( stat Data . rowCount ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Series Ġ= Ġstat Data . variables (). associate With Ġ{ Ġvariable Ġ-> Ġstat Data [ variable ] Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Ġadd Ġoffset Ġto Ġeach Ġgroup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Mer ger Ġ= ĠGroup Mer ger () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Stat Group End Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( d Ġin Ġsplit By Group ( data , Ġgroups )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstat Data Ġ= Ġapply Stat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbindings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Map , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfac ets , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat Ctx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar sWith out Binding , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Consumer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stat Data . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Mer ger . init Order Specs ( order Options , Ġstat Data . variables (), Ġbindings , Ġaggregate Operation ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Group Size After Stat Ġ= Ġstat Data . rowCount () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġ' stat Ġgroup ' Ġto Ġavoid Ġcollisions Ġas Ġstat Ġis Ġapplied Ġindependently Ġto Ġeach Ġoriginal Ġdata Ġgroup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stat Data . has ( Stats . GROUP )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġstat Data . range ( Stats . GROUP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġlast Stat Group End Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġstart Ġ- Ġrange . lower End . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Stat Group End Ġ= Ġrange . upper End . toInt () Ġ+ Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew G Ġ= ĠArrayList < Double >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( g Ġin Ġstat Data . get Numeric ( Stats . GROUP )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew G . add ( g !! Ġ+ Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat Data Ġ= Ġstat Data . builder (). put Numeric ( Stats . GROUP , Ġnew G ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Ġif Ġstat Ġhas Ġ.. group .. Ġthen Ġgrouping Var Ġwon 't Ġbe Ġchecked , Ġso Ġno Ġneed Ġto Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrouping Var Ġ= Ġgrouping Context . optional Grouping Var ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grouping Var Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġstat Data [ stat Data . variables (). first ()]. size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġd [ grouping Var ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat Data Ġ= Ġstat Data . builder (). put ( grouping Var , ĠList ( size ) Ġ{ Ġv Ġ}). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġgroup 's Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Mer ger . addGroup ( stat Data , Ġcur Group Size After Stat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġmerged Ġseries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Series Ġ= Ġgroup Mer ger . getResult Series () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Size List After Stat Ġ= Ġgroup Mer ger . getGroup Sizes () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdata After Stat Ġ= ĠBuilder (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġput Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( variable Ġin Ġresult Series . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( variable , Ġresult Series [ variable ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġordering Ġspecifications ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorder Specs Ġ= Ġorder Options . map Ġ{ Ġorder Option Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrder Option Util . create Order Spec ( result Series . keys , Ġbindings , Ġorder Option , Ġaggregate Operation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Order Specs ( order Specs ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbuild ĠDataFrame ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgrouping Context After Stat Ġ= ĠGroup ing Context . with Ordered Groups ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata After Stat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Size List After Stat ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠData And Grouping Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata After Stat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrouping Context After Stat ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġfind Optional Variable ( data : ĠDataFrame , Ġname : ĠString ?): ĠVariable ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( name . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDataFrame Util . find Variable OrFail ( data , Ġname ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsplit By Group ( data : ĠDataFrame , Ġgroups : Ġ( Int ) Ġ-> ĠInt ): ĠList < DataFrame > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġindices By Group ( data . rowCount (), Ġgroups ). values . map Ġ{ Ġindices Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . variables (). fold ( Builder ()) Ġ{ Ġb , Ġvariable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( data . is Numeric ( variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġb . put Numeric ( variable , Ġpick At Indices ( data . get Numeric ( variable ), Ġindices )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġb . put Discrete ( variable , Ġpick At Indices ( data [ variable ], Ġindices )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. map ( Builder :: build ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠServer - side Ġonly ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġapply Stat ( ĊĠĠĠĠĠĠĠ Ġdata : ĠDataFrame , ĊĠĠĠĠĠĠĠ Ġstat : ĠStat , ĊĠĠĠĠĠĠĠ Ġbindings : ĠList < Var Binding >, ĊĠĠĠĠĠĠĠ Ġscale Map : ĠTyped Scale Map , ĊĠĠĠĠĠĠĠ Ġfac ets : ĠPlot Fac ets , ĊĠĠĠĠĠĠĠ Ġstat Ctx : ĠStat Context , ĊĠĠĠĠĠĠĠ Ġvar sWith out Binding : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġcomp Message Consumer : ĠConsumer < String > ĊĠĠĠ Ġ): ĠDataFrame Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġstat Data Ġ= Ġstat . apply ( data , Ġstat Ctx , Ġcomp Message Consumer ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstat Variables Ġ= Ġstat Data . variables () ĊĠĠĠĠĠĠĠ Ġif Ġ( stat Variables . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstat Data ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġgenerate Ġnew Ġ' input ' Ġseries Ġto Ġmatch Ġstat Ġseries ĊĊĠĠĠĠĠĠĠ Ġval Ġinverse Trans formed Stat Series Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinverse Transform Continuous Stat Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbindings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Map ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġgenerate Ġnew Ġseries Ġfor Ġfacet Ġvariables ĊĊĠĠĠĠĠĠĠ Ġval Ġstat DataSize Ġ= Ġstat Data [ stat Variables . iterator (). next ()]. size ĊĠĠĠĠĠĠĠ Ġval Ġfacet Vars Ġ= ĠHashSet < Variable >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( facet Var Name Ġin Ġfac ets . variables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfacet Var Ġ= ĠDataFrame Util . find Variable OrFail ( data , Ġfacet Var Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfacet Vars . add ( facet Var ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ facet Var ]. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfacet Level Ġ= Ġdata [ facet Var ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgenerate Ġseries Ġfor Ġ' facet ' Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat Data Ġ= Ġstat Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( facet Var , ĠList ( stat DataSize ) Ġ{ Ġfacet Level Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġgenerate Ġnew Ġseries Ġfor Ġinput Ġvariables ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bindings . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstat Data ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Input Series Ġ= ĠHashMap < Variable , ĠList <* >>() ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Series For Variable ( variable : ĠVariable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġwhen Ġ( data . is Numeric ( variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠSeries Util . mean ( data . get Numeric ( variable ), ĠdefaultValue Ġ= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠSeries Util . first NotNull ( data [ variable ], ĠdefaultValue Ġ= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Input Ser ie Ġ= ĠList ( stat DataSize ) Ġ{ Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Input Series [ variable ] Ġ= Ġnew Input Ser ie ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( binding Ġin Ġbindings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġbinding . variable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable . is Stat Ġ|| Ġfacet Vars . contains ( variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaes Ġ= Ġbinding . aes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stat . has Default Mapping ( aes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Stat Var Ġ= Ġstat . getDefault Mapping ( aes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Input Ser ie : ĠList < *> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inverse Trans formed Stat Series . containsKey ( default Stat Var )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinverse Trans formed Stat Series . getValue ( default Stat Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Ser ie Ġ= Ġstat Data . get Numeric ( default Stat Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScale Util . inverse Transform ( stat Ser ie , Ġscale Map [ aes ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Input Series [ variable ] Ġ= Ġnew Input Ser ie ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġoverride Ġseries Ġobtained Ġvia Ġ' default Ġstat Ġvar ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! new Input Series . containsKey ( variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Series For Variable ( variable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġseries Ġfor Ġvariables Ġwithout Ġbindings ĊĠĠĠĠĠĠĠ Ġfor Ġ( varName Ġin Ġvar sWith out Binding . filter Not ( Stats :: is Stat Var )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= ĠDataFrame Util . find Variable OrFail ( data , Ġvar Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! new Input Series . containsKey ( variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Series For Variable ( variable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġstat Data . builder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( variable Ġin Ġnew Input Series . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . put ( variable , Ġnew Input Series . getValue ( variable )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġalso Ġupdate Ġstat Ġseries ĊĠĠĠĠĠĠĠ Ġfor Ġ( variable Ġin Ġinverse Trans formed Stat Series . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . put Numeric ( variable , Ġinverse Trans formed Stat Series . getValue ( variable )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġb . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinverse Transform Continuous Stat Data ( ĊĠĠĠĠĠĠĠ Ġstat Data : ĠDataFrame , ĊĠĠĠĠĠĠĠ Ġstat : ĠStat , ĊĠĠĠĠĠĠĠ Ġbindings : ĠList < Var Binding >, ĊĠĠĠĠĠĠĠ Ġscale Map : ĠTyped Scale Map ĊĠĠĠ Ġ): ĠMap < Variable , ĠList < Double ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinverse Ġtransform Ġstat Ġdata Ġwith Ġcontinuous Ġdomain . ĊĠĠĠĠĠĠĠ Ġval Ġcontinuous Scale By Aes Ġ= ĠHashMap < Aes <* >, ĠScale <* >>() ĊĠĠĠĠĠĠĠ Ġval Ġaes By Mapped Stat Var Ġ= ĠHashMap < Variable , ĠA es <* >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( aes Ġin ĠA es . values ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stat . has Default Mapping ( aes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Stat Var Ġ= Ġstat . getDefault Mapping ( aes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaes By Mapped Stat Var [ default Stat Var ] Ġ= Ġaes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( binding Ġin Ġbindings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaes Ġ= Ġbinding . aes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġbinding . variable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable . is Stat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaes By Mapped Stat Var [ variable ] Ġ= Ġaes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġ' stat ' Ġvar Ġbe ca ue Ġ.. ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġscale Map [ aes ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scale . is Continuous Domain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuous Scale By Aes [ aes ] Ġ= Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Aes . is Position al X ( aes ) Ġ&& Ġ! continuous Scale By Aes . containsKey ( Aes . X )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuous Scale By Aes [ Aes . X ] Ġ= Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Aes . is Position al Y ( aes ) Ġ&& Ġ! continuous Scale By Aes . containsKey ( Aes . Y )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuous Scale By Aes [ Aes . Y ] Ġ= Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinverse Trans formed Stat Series Ġ= ĠHashMap < Variable , ĠList < Double ? >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( stat Var Ġin Ġstat Data . variables ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( aes By Mapped Stat Var . containsKey ( stat Var )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaes Ġ= Ġaes By Mapped Stat Var . getValue ( stat Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscale : ĠScale < *> ? Ġ= Ġcontinuous Scale By Aes [ aes ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scale Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Aes . is Position al X ( aes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ġ= Ġcontinuous Scale By Aes [ Aes . X ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Aes . is Position al Y ( aes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ġ= Ġcontinuous Scale By Aes [ Aes . Y ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scale Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Ser ie Ġ= Ġstat Data . get Numeric ( stat Var ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinverse Trans formed Stat Ser ie Ġ= ĠScale Util . inverse Transform To Continuous Domain ( stat Ser ie , Ġscale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinverse Trans formed Stat Series [ stat Var ] Ġ= Ġinverse Trans formed Stat Ser ie ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinverse Trans formed Stat Series ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcompute Groups ( ĊĠĠĠĠĠĠĠ Ġdata : ĠDataFrame , ĊĠĠĠĠĠĠĠ Ġbindings : ĠList < Var Binding >, ĊĠĠĠĠĠĠĠ Ġgrouping Var : ĠVariable ?, ĊĠĠĠĠĠĠĠ Ġpath Id Var : ĠVariable ? ĊĠĠĠ Ġ): Ġ( Int ) Ġ-> ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgrouping Variables Ġ= Ġget Grouping Variables ( data , Ġbindings , Ġgrouping Var ) Ġ+ ĠlistOf NotNull ( path Id Var ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Groups : ĠList < Int >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( grouping Var Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Groups Ġ= Ġcompute Groups ( data [ grouping Var ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( grouping Variable Ġin Ġgrouping Variables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġdata [ grouping Variable ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġcompute Groups ( values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Groups Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Groups Ġ= Ġgroups ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( current Groups . size Ġ== Ġgroups . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Data Ġseries Ġused Ġto Ġcompute Ġgroups Ġmust Ġbe Ġequal Ġin Ġsize Ġ( en counter ed Ġsizes : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ current Groups ?. size }, Ġ${ groups . size } Ġ)" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd um m ies Ġ= Ġcompute Dummy Values ( current Groups , Ġgroups ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Groups Ġ= Ġcompute Groups ( dum m ies ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( current Groups Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGroup Util . wrap ( current Groups ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGroup Util . SINGLE _ GROUP ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Groups ( values : ĠList < *> ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= ĠArrayList < Int >() ĊĠĠĠĠĠĠĠ Ġval Ġgroup ByVal Ġ= ĠHashMap < Any ?, ĠInt >() ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġvalues ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! group ByVal . containsKey ( v )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup ByVal [ v ] Ġ= Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroups . add ( group ByVal . get ( v ) !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgroups ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Dummy Values ( list 1 : ĠList < Int >, Ġlist 2 : ĠList < Int >): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( list 1 . isEmpty ()) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġ( list 1 Ġ+ Ġlist 2 ). max OrNull () !! ĊĠĠĠĠĠĠĠ Ġcheck ( max Ġ< Ġlimit ) Ġ{ Ġ" Too Ġmany Ġgroups : Ġ$ max " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġd um m ies Ġ= ĠArrayList < Int >() ĊĠĠĠĠĠĠĠ Ġval Ġit 1 Ġ= Ġlist 1 . iterator () ĊĠĠĠĠĠĠĠ Ġval Ġit 2 Ġ= Ġlist 2 . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( it 1 . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġit 1 . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= Ġit 2 . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdummy Ġ= Ġv 1 Ġ* Ġlimit Ġ+ Ġv 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd um m ies . add ( dummy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġd um m ies ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Grouping Variables ( ĊĠĠĠĠĠĠĠ Ġdata : ĠDataFrame , ĊĠĠĠĠĠĠĠ Ġbindings : ĠList < Var Binding >, ĊĠĠĠĠĠĠĠ Ġexplicit Grouping Var : ĠVariable ? ĊĠĠĠ Ġ): ĠIterable < Variable > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġall Ġ' origin ' Ġdiscrete Ġvars Ġ( but Ġnot Ġpositional ) Ġ+ Ġexplicit Grouping Var ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠLinked HashSet < Variable >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( binding Ġin Ġbindings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġbinding . variable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result . contains ( variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable . is Origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variable Ġ== Ġexplicit Grouping Var Ġ|| Ġis Default Grouping Variable ( data , Ġbinding . aes , Ġvariable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( variable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Default Grouping Variable ( ĊĠĠĠĠĠĠĠ Ġdata : ĠDataFrame , ĊĠĠĠĠĠĠĠ Ġaes : ĠA es <* >, ĊĠĠĠĠĠĠĠ Ġvariable : ĠVariable ĊĠĠĠ Ġ) Ġ= Ġ!( Aes . is Position al ( aes ) Ġ|| Ġdata . is Numeric ( variable )) ĊĊĊĠĠĠ Ġclass ĠData And Grouping Context Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠDataFrame , ĊĠĠĠĠĠĠĠ Ġval Ġgrouping Context : ĠGroup ing Context ĊĠĠĠ Ġ) Ċ } Ċ