package Ġorg . kal as im . monitor s Ċ Ċ import Ġcom . github . hol ger brand l . json builder . json Ċ import Ġorg . apache . commons . math 3 . distribution . Enumer ated Distribution Ċ import Ġorg . apache . commons . math 3 . stat . Frequency Ċ import Ġorg . apache . commons . math 3 . stat . de scriptive . Descript ive Statistics Ċ import Ġorg . apache . commons . math 3 . stat . de scriptive . moment . Mean Ċ import Ġorg . apache . commons . math 3 . stat . de scriptive . moment . Variance Ċ import Ġorg . kal as im .* Ċ import Ġorg . kal as im . misc .* Ċ import Ġorg . k oin . core . K oin Ċ import Ġjava . util .* Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* ĠAllows Ġto Ġtrack Ġa Ġnumeric Ġquantity Ġover Ġtime . Ċ Ġ* Ċ Ġ* Ġ@ param Ġinitial Value Ġinitial Ġvalue Ġfor Ġa Ġlevel Ġtimeline . ĠIt Ġis Ġimportant Ġto Ġset Ġthe Ġvalue Ġcorrectly . ĠDefault : Ġ 0 Ċ Ġ*/ Ċ open Ġclass ĠMetric Timeline < V Ġ: ĠNumber >( ĊĠĠĠ Ġname : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġinternal Ġval Ġinitial Value : ĠV , ĊĠĠĠ Ġk oin : ĠK oin Ġ= ĠDependency Context . get () Ċ ) Ġ: ĠMonitor < V >( name , Ġk oin ), ĠValue Timeline < V > Ġ{ ĊĊĠĠĠ Ġinternal Ġval Ġtimestamps Ġ= Ġmutable ListOf < Tick Time >() ĊĠĠĠ Ġinternal Ġval Ġvalues Ġ= Ġif Enabled Ġ{ Ġmutable ListOf < V >() Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Value ( initial Value ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġadd Value ( value : ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! enabled ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġtimestamps . add ( env . now ) ĊĠĠĠĠĠĠĠ Ġvalues . add ( value ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġget ( time : ĠNumber ): ĠV Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( timestamps . first () Ġ<= Ġtime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" query Ġtime Ġmust Ġbe Ġgreater Ġthan Ġtimeline Ġstart Ġ(${ timestamps . first () })" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtimestamps . zip ( values . toList ()). reversed (). first Ġ{ Ġit . first Ġ<= Ġtime . toDouble () Ġ}. second ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( time : ĠTick Time ) Ġ= Ġget ( time . value ) ĊĊĠĠĠ Ġoverride Ġfun Ġtotal ( value : ĠV ): ĠDouble Ġ= Ġstats Data (). run Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// yout rack . jetbrains . com / issue / KT - 4 3 7 7 6 ĊĠĠĠĠĠĠĠ Ġvalues . zip ( dur ations ). filter Ġ{ Ġit . first Ġ== Ġvalue Ġ}. sum Of Ġ{ Ġit . second Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġstatistics Summary () Ġ= Ġstats Data (). stat istical Summary () ĊĊĠĠĠ Ġfun Ġstats Data ( exclude Z eros : ĠBoolean Ġ= Ġfalse ): ĠLevel Stats Data < V > Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" D uplicated Code ") ĊĠĠĠĠĠĠĠ Ġrequire ( values . isNotEmpty ()) Ġ{ Ġ" data Ġmust Ġnot Ġbe Ġempty Ġwhen Ġpre paring Ġstatistics Ġof Ġ$ name " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvalues Lst Ġ= Ġvalues . toList () ĊĊĠĠĠĠĠĠĠ Ġval Ġtime points Ext Ġ= Ġtimestamps Ġ+ Ġenv . now ĊĠĠĠĠĠĠĠ Ġval Ġdur ations Ġ= Ġtime points Ext . to Mutable List (). zip With Next Ġ{ Ġfirst , Ġsecond Ġ-> Ġsecond Ġ- Ġfirst Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif ( exclude Z eros ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( dur Filt , Ġval Filt ) Ġ= Ġdur ations . zip ( values Lst ). filter Ġ{ Ġit . second . toDouble () Ġ> Ġ 0 Ġ}. unzip () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( timestamps Filt , Ġ_) Ġ= Ġtimestamps . zip ( values Lst ). filter Ġ{ Ġit . second . toDouble () Ġ> Ġ 0 Ġ}. unzip () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLevel Stats Data ( val Filt , Ġtimestamps Filt , Ġdur Filt ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLevel Stats Data ( values Lst , Ġtimestamps , Ġdur ations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġstep Ġfunction Ġof Ġthis Ġmon itored Ġvalue Ġalong Ġthe Ġtime Ġaxis . Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstep Fun () Ġ= Ġstats Data (). step Fun () ĊĊĠĠĠ Ġfun Ġstatistics ( exclude Z eros : ĠBoolean Ġ= Ġfalse ) Ġ= ĠMetric Timeline Stats ( this , Ġexclude Z eros ) ĊĊĠĠĠ Ġoverride Ġval Ġsnapshot ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstatistics ( false ) ĊĊĠĠĠ Ġoverride Ġfun Ġreset ( initial : ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( enabled ) Ġ{ Ġ" reset ting Ġa Ġdisabled Ġtimeline Ġis Ġunlikely Ġto Ġhave Ġmeaningful Ġsemantics " Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalues . clear () ĊĠĠĠĠĠĠĠ Ġtimestamps . clear () ĊĊĠĠĠĠĠĠĠ Ġadd Value ( initial ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset To Current () Ġ= Ġreset ( get ( now )) ĊĊĠĠĠ Ġ@ Suppress (" D uplicated Code ") ĊĠĠĠ Ġoverride Ġfun Ġclear History ( before : ĠTick Time ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart From Idx Ġ= Ġtimestamps . with Index (). first OrNull Ġ{ Ġbefore Ġ> Ġit . value Ġ} ?. index Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġstart From Idx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Time Ġ= Ġtimestamps . sub List ( 0 , Ġstart From Idx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Values Ġ= Ġvalues . sub List ( 0 , Ġstart From Idx ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamps . apply Ġ{ Ġclear (); Ġadd All ( new Time ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . apply Ġ{ Ġclear (); Ġadd All ( new Values ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas Double Timeline () Ġ= ĠMetric Timeline ( name , Ġinitial Value . toDouble (), Ġk oin Ġ= Ġget K oin ()). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtimestamps . apply Ġ{ Ġclear (); Ġadd All ( this @ Metric Timeline . timestamps ) Ġ} ĊĠĠĠĠĠĠĠ Ġvalues . apply Ġ{ Ġclear (); Ġadd All ( this @ Metric Timeline . values . map Ġ{ Ġit . toDouble () Ġ}) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< V Ġ: ĠNumber > ĠMetric Timeline < V >. print Histogram ( ĊĠĠĠ ĠsortBy Weight : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġbin Count : ĠInt Ġ= ĠNUM _ HIST _ BIN S , ĊĠĠĠ Ġvalue Bins : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĠĠĠ Ġprintln (" Summary Ġof : Ġ'${ name }' ") ĊĠĠĠ Ġstatistics (). toJson (). print This () ĊĊĠĠĠ Ġprintln (" Histogram Ġof : Ġ'${ name }' ") ĊĊĠĠĠ Ġif ( value Bins ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfreq Ġ= ĠFrequency () ĊĊĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ Ġfreq . add Value ( it Ġas ĠComparable <* >) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcol Data : ĠMap < Double , ĠDouble > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatistics (). data . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdur ations . zip ( values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġkv Ġ-> Ġkv . key . toDouble () Ġto Ġkv . value . sum Of Ġ{ Ġit . first Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĠĠĠĠĠĠĠ Ġ// Ġin her ently Ġwrong Ġbecause Ġdoes Ġnot Ġtake Ġinto Ġaccount Ġdur ations Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġby Value Hist Ġ= Ġfreq Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. values Iterator (). iterator (). as Sequence (). toList () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġto Ġfreq . getCount ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġcol Data . print Console ( sortBy Weight Ġ= ĠsortBy Weight ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġtodo Ġmake Ġas Ġpretty Ġas Ġin Ġhttps :// www . sal ab im . org / manual / Monitor . html ĊĠĠĠĠĠĠĠ Ġval Ġhist : ĠList < Pair < Double , ĠDouble >> Ġ= Ġstatistics (). data . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaggregated Monitor : ĠList < Pair < Double , ĠDouble >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdur ations . zip ( values ). groupBy Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġkv Ġ-> Ġkv . key . toDouble () Ġto Ġkv . value . sum Of Ġ{ Ġit . first Ġ} Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaggregated Monitor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstats Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDes cript ive Statistics ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnum erated Distribution ( hist . as CMP air List ()). sample ( 1 0 0 0 , ĠarrayOf < Double > ()). toDouble Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġstats . build Histogram ( bin Count ). print Histogram () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ // Ċ // ĠTimeline ĠAr ith met ics Ċ // ĊĊ Ċ internal Ġenum Ġclass ĠArithmetic Op Ġ{ ĊĠĠĠ ĠPlus , ĠMin us , ĠTimes , ĠDiv ; ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġwhen ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPlus Ġ-> Ġ" +" ĊĠĠĠĠĠĠĠ ĠMin us Ġ-> Ġ"-" ĊĠĠĠĠĠĠĠ ĠTimes Ġ-> Ġ"*" ĊĠĠĠĠĠĠĠ ĠDiv Ġ-> Ġ"/" ĊĠĠĠ Ġ} Ċ } Ċ Ċ operator Ġfun Ġ< V Ġ: ĠNumber > ĠMetric Timeline < V >. plus ( other : ĠMetric Timeline < V >) Ġ= ĊĠĠĠ Ġcombine Internal ( this , Ġother , ĠArithmetic Op . Plus ) Ċ Ċ operator Ġfun Ġ< V Ġ: ĠNumber > ĠMetric Timeline < V >. minus ( other : ĠMetric Timeline < V >) Ġ= ĊĠĠĠ Ġcombine Internal ( this , Ġother , ĠArithmetic Op . Minus ) Ċ Ċ operator Ġfun Ġ< V Ġ: ĠNumber > ĠMetric Timeline < V >. times ( other : ĠMetric Timeline < V >) Ġ= ĊĠĠĠ Ġcombine Internal ( this , Ġother , ĠArithmetic Op . Times ) Ċ Ċ operator Ġfun Ġ< V Ġ: ĠNumber > ĠMetric Timeline < V >. div ( other : ĠMetric Timeline < V >) Ġ= ĊĠĠĠ Ġcombine Internal ( this , Ġother , ĠArithmetic Op . Div ) Ċ Ċ operator Ġfun Ġ< V Ġ: ĠNumber > ĠMetric Timeline < V >. div ( factor : ĠDouble ): ĠMetric Timeline < Double > Ġ{ ĊĠĠĠ Ġval Ġconst MT Ġ= ĠMetric Timeline (" Constant Ġ$ factor ", Ġinitial Value Ġ= Ġfactor . toDouble ()). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtimestamps . apply Ġ{ Ġclear (); Ġadd ( timestamps . first ()) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcombine Internal ( this . as Double Timeline (), Ġconst MT , ĠArithmetic Op . Div ) Ċ } Ċ Ċ fun Ġ< V Ġ: ĠNumber > ĠList < Metric Timeline < V >> . mean (): ĠMetric Timeline < Double > Ġ{ ĊĠĠĠ Ġval Ġreduce Ġ= Ġmap Ġ{ Ġit . as Double Timeline () Ġ}. reduce Ġ{ Ġacc , Ġmt Ġ-> Ġacc Ġ+ Ġmt Ġ} ĊĠĠĠ Ġreturn Ġreduce Ġ/ Ġsize . toDouble () Ċ } Ċ Ċ private Ġfun Ġ< V Ġ: ĠNumber > Ġcombine Internal ( ĊĠĠĠ Ġmt : ĠMetric Timeline < V >, ĊĠĠĠ Ġother : ĠMetric Timeline < V >, ĊĠĠĠ Ġmode : ĠArithmetic Op Ċ ): ĠMetric Timeline < Double > Ġ{ ĊĠĠĠ Ġ// Ġalso Ġsee ĊĠĠĠ Ġ// Ġhttps :// www . ge eks forge eks . org / merge - two - sorted - linked - lists / ĊĠĠĠ Ġ// Ġhttps :// stackoverflow . com / questions / 1 7 7 4 2 5 6 / java - code - review - merge - sorted - lists - into - a - single - sorted - list ĊĠĠĠ Ġval Ġjoin Time Ġ= ĠTree Set < Tick Time >(). apply Ġ{ Ġadd All ( mt . timestamps ); Ġadd All ( other . timestamps ); Ġadd ( mt . now ) Ġ} ĊĊĠĠĠ Ġval Ġmin Time Ġ= Ġmax Of ( mt . timestamps . first (), Ġother . timestamps . first ()) Ċ // ĠĠĠ Ġval Ġmax Time Ġ= ĠMath . min ( mt . timestamps . last (), Ġother . timestamps . last ()) ĊĠĠĠ Ġval Ġmax Time Ġ= Ġmt . now . value Ċ // ĠĠĠ Ġval Ġtime Range Ġ= Ġmin Time .. max Time ĊĊĠĠĠ Ġval Ġmerged Ġ= ĠMetric Timeline ( ĊĠĠĠĠĠĠĠ Ġ"' ${ mt . name }' Ġ$ mode Ġ'${ other . name }' ", ĊĠĠĠĠĠĠĠ Ġk oin Ġ= Ġmt . get K oin (), ĊĠĠĠĠĠĠĠ Ġinitial Value Ġ= Ġ 0 . 0 ĊĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtimestamps . clear () ĊĠĠĠĠĠĠĠ Ġvalues . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġjoin Time . drop While Ġ{ Ġit Ġ< Ġmin Time Ġ}. take While Ġ{ Ġit Ġ<= Ġmax Time Ġ}. forEach Ġ{ Ġtime Ġ-> ĊĠĠĠĠĠĠĠ Ġmerged . timestamps . add ( time ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġwhen ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArithmetic Op . Plus Ġ-> Ġmt [ time ]. toDouble () Ġ+ Ġother [ time ]. toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArithmetic Op . Minus Ġ-> Ġmt [ time ]. toDouble () Ġ- Ġother [ time ]. toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArithmetic Op . Times Ġ-> Ġmt [ time ]. toDouble () Ġ* Ġother [ time ]. toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArithmetic Op . Div Ġ-> Ġmt [ time ]. toDouble () Ġ/ Ġother [ time ]. toDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmerged . values . add ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġmerged Ċ } ĊĊ Ċ // Ġnot Ġpretty Ġbut Ġallows Ġassigning Ġnew Ġnames Ġto Ġmerged Ġtime lines Ġwithout Ġmake ĠSim Entity . name Ġvar . Ċ internal Ġfun Ġ< V Ġ: ĠNumber > ĠMetric Timeline < V >. copy ( name : ĠString Ġ= Ġthis . name ): ĠMetric Timeline < V > Ġ= ĊĠĠĠ ĠMetric Timeline < V >( name , Ġinitial Value Ġ= Ġinitial Value , Ġk oin Ġ= Ġget K oin ()). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġvalues . clear () ĊĠĠĠĠĠĠĠ Ġvalues . addAll ( this @ copy . values ) ĊĠĠĠĠĠĠĠ Ġtimestamps . clear () ĊĠĠĠĠĠĠĠ Ġtimestamps . addAll ( this @ copy . timestamps ) ĊĠĠĠ Ġ} ĊĊ Ċ // Ċ // ĠStat istical ĠSummary Ċ // Ċ Ċ class ĠMetric Timeline Stats < V Ġ: ĠNumber >( nlm : ĠMetric Timeline < V >, Ġexclude Z eros : ĠBoolean Ġ= Ġfalse ) Ġ: ĠJson able (), ĊĠĠĠ ĠEntity Snapshot Ġ{ ĊĠĠĠ Ġval Ġduration : ĠDouble ĊĊĠĠĠ Ġval Ġmean : ĠDouble ? ĊĠĠĠ Ġval Ġstandard De viation : ĠDouble ? ĊĊĠĠĠ Ġval Ġmin : ĠDouble ? ĊĠĠĠ Ġval Ġmax : ĠDouble ? ĊĊĠĠĠ Ġinternal Ġval Ġdata Ġ= Ġn lm . stats Data ( exclude Z eros ) Ċ Ċ // ĠĠĠ Ġval Ġmedian Ġ: Double Ġ= ĠTODO () Ċ // ĠĠĠ Ġval Ġn in ety five Percent ile Ġ: Double Ġ= ĠTODO () Ċ // ĠĠĠ Ġval Ġn inet yn ine Percent ile Ġ: Double Ġ= ĠTODO () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdouble Values Ġ= Ġdata . values . map Ġ{ Ġit . toDouble () Ġ}. toDouble Array () ĊĊĠĠĠĠĠĠĠ Ġmin Ġ= Ġdouble Values . min OrNull () ĊĠĠĠĠĠĠĠ Ġmax Ġ= Ġdouble Values . max OrNull () ĊĊĠĠĠĠĠĠĠ Ġif ( data . dur ations . any Ġ{ Ġit Ġ!= Ġ 0 . 0 Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdur ations Array Ġ= Ġdata . dur ations . toDouble Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmean Ġ= ĠMean (). evaluate ( double Values , Ġdur ations Array ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstandard De viation Ġ= Ġsqrt ( Variance (). evaluate ( double Values , Ġdur ations Array )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedian Ġ= ĠMed ian (). evaluate ( data . values . toDouble Array (), Ġdata . dur ations ) Ġ// Ġnot Ġsupported Ġby Ġcommon s 3 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġhappens Ġif Ġall Ġthere Ġis Ġin Ġtotal Ġno Ġduration Ġassociated Ġonce Ġ 0 s Ġare Ġremoved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmean Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstandard De viation Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġweights Ġnot Ġsupported ĊĠĠĠĠĠĠĠ Ġ// Ġmean Ġ= ĠMed ian (). evaluate ( data . values . toDouble Array (), Ġdata . time points . toDouble Array ()) ĊĊĠĠĠĠĠĠĠ Ġduration Ġ= Ġdata . dur ations . sum () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoJson () Ġ= Ġjson Ġ{ ĊĠĠĠĠĠĠĠ Ġ" duration " Ġto Ġduration ĊĠĠĠĠĠĠĠ Ġ" mean " Ġto Ġmean ?. round Any () ĊĠĠĠĠĠĠĠ Ġ" standard _ dev iation " Ġto Ġstandard De viation ?. round Any (). nan As Null () ĊĠĠĠĠĠĠĠ Ġ" min " Ġto Ġmin ?. round Any () ĊĠĠĠĠĠĠĠ Ġ" max " Ġto Ġmax ?. round Any () ĊĠĠĠ Ġ} Ċ } Ċ