package Ġme . sh ut kin . ass ur . samples Ċ Ċ import Ġme . sh ut kin . ass ur .* Ċ import Ġme . sh ut kin . ass ur . logger . ass ur Log Ċ import Ġjava . io .* Ċ Ċ data Ġclass ĠReference ( val Ġid : ĠInt , Ġval Ġaverage Error : ĠDouble , Ġval Ġpop ularity : ĠDouble , Ġval Ġdata : ĠDouble Array ) Ġ{ ĊĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠ Ġother Ġas ĠReference ĊĊĠĠĠ Ġif Ġ( id Ġ!= Ġother . id ) Ġreturn Ġfalse ĊĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġid ĊĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠReferences ( val Ġmedian Min : ĠDouble , Ġval Ġmedian Max : ĠDouble , Ġval Ġrefs : ĠList < Reference >) Ġ{ ĊĠ Ġfun Ġget Median Quantum () Ġ= Ġ( median Max Ġ- Ġmedian Min ) Ġ/ Ġ 2 8 . 0 Ċ } Ċ Ċ fun Ġcollect References ( path : ĠString , Ġmedian Filter : ĠDouble Ġ= Ġ 0 . 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiff Function : Ġ( Double Array , ĠDouble Array ) Ġ-> ĠDouble Ġ= Ġ:: eval Arrays Diff , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Raster : Ġ( HDR Raster ) Ġ-> ĠDouble Array ): ĠList < Reference > Ġ{ ĊĠ Ġval Ġall Samples Ġ= ĠFile ( path ). list Files (). filter Ġ{ Ġit . isFile Ġ}. map Indexed Ġ{ Ġindex , Ġfile Ġ-> ĊĠĠĠ Ġass ur Log (" process Ġ${ file . name } Ġ#$ index ") ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġprocess Raster ( read HDR Raster ( FileInputStream ( file ))) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġass ur Log ( e . message Ġ?: Ġ" some Ġexception Ġoccurs ") ĊĠĠĠĠĠ ĠDouble Array ( 0 ) ĊĠĠĠ Ġ} ĊĠ Ġ}. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠ Ġass ur Log (" Total Ġsamples : Ġ${ all Samples . size }") ĊĠ Ġval Ġaverage Median Ġ= Ġall Samples . map Ġ{ Ġget Histogram Median Value ( Histogram Data ( 0 . 0 , Ġ 1 . 0 , Ġit ), Ġmedian Filter ) Ġ}. average () ĊĠ Ġass ur Log (" Average Ġmedian : Ġ$ average Median ") ĊĠ Ġval Ġfiltered Samples Ġ= Ġall Samples . filter Ġ{ Ġget Histogram Median Value ( Histogram Data ( 0 . 0 , Ġ 1 . 0 , Ġit ), Ġ 0 . 5 ) Ġ> Ġaverage Median Ġ} ĊĠ Ġass ur Log (" Filtered Ġsamples : Ġ${ filtered Samples . size }") ĊĠ Ġreturn Ġgrouping ( filtered Samples , Ġ 2 1 , Ġdiff Function ) Ċ } Ċ Ċ fun Ġsave References ( references : ĠList < Reference >, Ġprefix : ĠString ) Ġ{ ĊĠ Ġreferences . forEach Ġ{ Ġreference Ġ-> ĊĠĠĠ Ġsave Histogram ( reference . data , Ġ"${ prefix }_ ref _${ reference . id }. png ") ĊĠĠĠ Ġass ur Log ( reference . toString ()) ĊĠ Ġ} ĊĠ Ġserialize References ( File OutputStream ("$ prefix . ref "), Ġreferences ) Ċ } Ċ Ċ private Ġfun Ġserialize References ( stream : ĠOutputStream , Ġreferences : ĠList < Reference >) Ġ{ ĊĠ Ġval Ġobject Stream Ġ= ĠObject OutputStream ( stream ) ĊĠ Ġobject Stream . writeInt ( references . size ) ĊĠ Ġreferences . forEach Ġ{ Ġref Ġ-> ĊĠĠĠ Ġobject Stream . write Double ( ref . average Error ) ĊĠĠĠ Ġobject Stream . write Double ( ref . pop ularity ) ĊĠĠĠ Ġref . data . forEach Ġ{ Ġobject Stream . write Double ( it ) Ġ} ĊĠ Ġ} ĊĠ Ġobject Stream . flush () ĊĠ Ġobject Stream . close () Ċ } Ċ Ċ fun Ġdeserialize References ( stream : ĠInputStream , Ġsample Size : ĠInt ): ĠReferences Ġ{ ĊĠ Ġval Ġobject Stream Ġ= ĠObject InputStream ( stream ) ĊĠ Ġval Ġsize Ġ= Ġobject Stream . readInt () ĊĠ Ġval Ġdata Arrays Ġ= ĠArray ( size ) Ġ{ ĠDouble Array ( sample Size ) Ġ} ĊĠ Ġval Ġaverage Errors Ġ= ĠDouble Array ( size ) ĊĠ Ġval Ġpopular ities Ġ= ĠDouble Array ( size ) ĊĠ Ġfor Ġ( reference Index Ġin Ġdata Arrays . indices ) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġaverage Errors [ reference Index ] Ġ= Ġobject Stream . read Double () ĊĠĠĠĠĠ Ġpopular ities [ reference Index ] Ġ= Ġobject Stream . read Double () ĊĠĠĠĠĠ Ġfor Ġ( index Ġin Ġdata Arrays [ reference Index ]. indices ) ĊĠĠĠĠĠĠĠ Ġdata Arrays [ reference Index ][ index ] Ġ= Ġobject Stream . read Double () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ Ġass ur Log (" Exception Ġat Ġreference Ġ$ reference Index ") ĊĠĠĠĠĠ Ġstream . close () ĊĠĠĠĠĠ Ġbreak ĊĠĠĠ Ġ} ĊĠ Ġstream . close () ĊĠ Ġval Ġmedi ans Ġ= Ġdata Arrays . map Ġ{ Ġget Histogram Median Value ( Histogram Data ( 0 . 0 , Ġ 1 . 0 , Ġit ), Ġ 0 . 5 ) Ġ} ĊĠ Ġreturn ĠReferences ( medi ans . min () Ġ?: Ġ 0 . 0 , Ġmedi ans . max () Ġ?: Ġ 1 . 0 , ĊĠĠĠĠĠĠĠĠĠ ĠList ( size ) Ġ{ ĠReference ( it , Ġaverage Errors [ it ], Ġpopular ities [ it ], Ġdata Arrays [ it ]) Ġ}) Ċ } Ċ Ċ fun Ġget References ( all References : ĠList < Reference >, Ġdi ap ason : ĠDi ap ason ) Ġ= ĊĠĠĠĠĠĠĠ Ġall References . slice ( di ap ason . getStart Index ( all References . size ) Ġuntil Ġdi ap ason . getEnd Index ( all References . size ))