package Ġme . hay den che ers . scp dt . sim Ċ Ċ import Ġme . hay den che ers . scp dt . SC PD Tool Ċ import Ġme . hay den che ers . scp dt . SC PD Tool Pair wise Execution Future Ċ import Ġme . hay den che ers . scp dt . SC PD Tool Pair wise Execution Result Ċ import Ġme . hay den che ers . scp dt . common . H ung arian Algorithm Ċ import Ġme . hay den che ers . scp dt . util . Temp Util Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . File Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . lang . Integer . max Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġkotlin . streams . toList Ċ Ċ class ĠSim W ine SC PD Tool : ĠS CP D Tool Ġ{ ĊĠĠĠ Ġoverride Ġval Ġid : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" Sim - 3 . 0 . 2 _ W ine 3 2 " ĊĊĠĠĠ Ġprivate Ġval Ġwine : ĠPath ĊĠĠĠ Ġprivate Ġval Ġwine Str : ĠString ĊĊĠĠĠ Ġconstructor (): Ġthis ( Paths . get ( System . getenv (" W INE _ EXEC ") Ġ?: Ġ"/ usr / bin / wine ")) ĊĊĠĠĠ Ġconstructor ( wine : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . wine Ġ= Ġwine ĊĠĠĠĠĠĠĠ Ġthis . wine Str Ġ= Ġwine . to AbsolutePath (). toString () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Files . exists ( wine ) Ġ|| Ġ! Files . is Executable ( wine )) Ġthrow ĠIllegalArgumentException (" wine Ġexecutable Ġdoes Ġnot Ġexist , Ġor Ġis Ġnot Ġexecutable ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsim ResourceName Ġ= Ġ"/ sim _ exe _ 3 _ 0 _ 2 / sim _ java . exe " ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsim Path : ĠPath ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsim Path Str : ĠString ĊĊĠĠĠ Ġoverride Ġfun Ġth aw ( path : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsim Resource Ġ= Ġthis . java Class . getResource AsStream ( sim ResourceName ) ĊĠĠĠĠĠĠĠ Ġthis . sim Path Ġ= Ġpath . resolve (" sim _ java . exe ") ĊĠĠĠĠĠĠĠ Ġthis . sim Path Str Ġ= Ġsim Path . to AbsolutePath (). toString () ĊĠĠĠĠĠĠĠ ĠFiles . copy ( sim Resource , Ġsim Path ) ĊĠĠĠĠĠĠĠ Ġsim Resource . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . delete ( sim Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġevaluate Pair wise ( ld ir : ĠPath , Ġr dir : ĠPath ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! :: sim Path . isInitialized ) Ġthrow ĠIllegalStateException (" Field Ġsim Path Ġis Ġnot Ġth aw ed ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Files . list ( ld ir ). use Ġ{ Ġit . count () Ġ} Ġ== Ġ 0 . to Long ()) Ġreturn Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( Files . list ( r dir ). use Ġ{ Ġit . count () Ġ} Ġ== Ġ 0 . to Long ()) Ġreturn Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ ĠTemp Util . copy Pair wise Inputs To Temp Directory ( ld ir , Ġr dir ). use Ġ{ Ġ( tmp , Ġlhs , Ġrhs ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Java Files Ġ= ĠFiles . walk ( lhs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠFiles . is Regular File ( it ) Ġ&& Ġit . fileName . toString (). endsWith (". java ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ Ġit . toList () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to AbsolutePath (). toString () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Java Files Ġ= ĠFiles . walk ( rhs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠFiles . is Regular File ( it ) Ġ&& Ġit . fileName . toString (). endsWith (". java ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ Ġit . toList () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to AbsolutePath (). toString () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproc Ġ= ĠProcess Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. command ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwine Str , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim Path Str , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- R ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- p ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlhs . to AbsolutePath (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrhs . to AbsolutePath (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproc . waitFor () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġproc . inputStream . buffered Reader (). use Ġ{ Ġit . read Lines () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( proc . exit Value () Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerr Ġ= Ġproc . error Stream . buffered Reader (). use Ġ{ Ġit . readLine () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Received Ġerror Ġcode Ġ${ proc . exit Value () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsim Ġ= Ġcalculate Similarity ( output , Ġtmp . to AbsolutePath (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsim ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġevaluate All Files ( ld ir : ĠPath , Ġr dir : ĠPath ): ĠList < Triple < String , ĠString , ĠDouble >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! :: sim Path . isInitialized ) Ġthrow ĠIllegalStateException (" Field Ġsim Path Ġis Ġnot Ġth aw ed ") ĊĊĠĠĠĠĠĠĠ ĠTemp Util . copy Pair wise Inputs To Temp Directory ( ld ir , Ġr dir ). use Ġ{ Ġ( tmp , Ġlhs , Ġrhs ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Java Files Ġ= ĠFiles . walk ( lhs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠFiles . is Regular File ( it ) Ġ&& Ġit . fileName . toString (). endsWith (". java ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ Ġit . toList () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to AbsolutePath (). toString () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Java Files Ġ= ĠFiles . walk ( rhs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠFiles . is Regular File ( it ) Ġ&& Ġit . fileName . toString (). endsWith (". java ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ Ġit . toList () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to AbsolutePath (). toString () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Java Files . isEmpty () Ġ|| Ġr Java Files . isEmpty ()) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproc Ġ= ĠProcess Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. command ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwine Str , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim Path Str , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- R ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- p ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlhs . to AbsolutePath (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrhs . to AbsolutePath (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproc . waitFor () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġproc . inputStream . buffered Reader (). use Ġ{ Ġit . read Lines () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( proc . exit Value () Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerr Ġ= Ġproc . error Stream . buffered Reader (). use Ġ{ Ġit . readLine () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Received Ġerror Ġcode Ġ${ proc . exit Value () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Files Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Files Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Dir Ġ= Ġtmp . to AbsolutePath (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġoutput . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġoutput [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . startsWith (" Total Ġinput :" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline No Prefix Ġ= Ġline . remove Prefix (" Total Ġinput : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġafter Number Index Ġ= Ġline No Prefix . indexOf (" Ġfiles Ġ( ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= Ġline No Prefix . substring ( 0 , Ġafter Number Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( line Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġline . remove Prefix (" File Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split (": Ġ" )[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Prefix ( rootDir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Prefix ( File . separator ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . startsWith (" lhs ") Ġ&& Ġfile . endsWith (". java ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Files . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( file . startsWith (" rhs ") Ġ&& Ġfile . endsWith (". java ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Files . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Files . isEmpty () Ġ|| Ġr Files . isEmpty ()) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsim s Ġ= Ġmutable ListOf < Triple < String , ĠString , ĠDouble >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġoutput . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġoutput [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent 1 Ġ= Ġline . split (" Ġconsists Ġfor Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent 2 Ġ= Ġcomponent 1 [ 1 ]. split (" Ġ% Ġof Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsim Ġ= Ġcomponent 2 [ 0 ]. toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl File Ġ= Ġcomponent 1 [ 0 ]. remove Prefix ( rootDir ). remove Prefix ( File . separator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr File Ġ= Ġcomponent 2 [ 1 ]. remove Suffix (" Ġmaterial "). remove Prefix ( rootDir ). remove Prefix ( File . separator ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l File . startsWith (" lhs ") Ġ&& Ġr File . startsWith (" rhs ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Index Ġ= Ġl Files . indexOf ( l File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Index Ġ= Ġr Files . indexOf ( r File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Index Ġ!= Ġ- 1 Ġ&& Ġr Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim s . add ( Triple ( l File . remove Prefix (" lhs / "), Ġr File . remove Prefix (" rhs / "), Ġsim )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( r File . startsWith (" lhs ") Ġ&& Ġl File . startsWith (" rhs ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Index Ġ= Ġr Files . indexOf ( r File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Index Ġ= Ġl Files . indexOf ( l File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Index Ġ!= Ġ- 1 Ġ&& Ġr Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim s . add ( Triple ( r File . remove Prefix (" lhs / "), Ġl File . remove Prefix (" rhs / "), Ġsim )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsim s ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Similarity ( output : ĠList < String >, Ġroot Dir : ĠString ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl Files Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġr Files Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġoutput . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġoutput [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . startsWith (" Total Ġinput :" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline No Prefix Ġ= Ġline . remove Prefix (" Total Ġinput : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġafter Number Index Ġ= Ġline No Prefix . indexOf (" Ġfiles Ġ( ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= Ġline No Prefix . substring ( 0 , Ġafter Number Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( line Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġline . remove Prefix (" File Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. split (": Ġ" )[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Prefix ( rootDir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Prefix ( File . separator ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . startsWith (" lhs ") Ġ&& Ġfile . endsWith (". java ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl Files . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( file . startsWith (" rhs ") Ġ&& Ġfile . endsWith (". java ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Files . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( l Files . isEmpty () Ġ|| Ġr Files . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġsim Matrix Ġ Ġ= ĠArray ( l Files . size ) Ġ{ ĠDouble Array ( r Files . size ) Ġ{ Ġ 1 0 0 . 0 Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġoutput . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġoutput [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent 1 Ġ= Ġline . split (" Ġconsists Ġfor Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent 2 Ġ= Ġcomponent 1 [ 1 ]. split (" Ġ% Ġof Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsim Ġ= Ġcomponent 2 [ 0 ]. toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl File Ġ= Ġcomponent 1 [ 0 ]. remove Prefix ( rootDir ). remove Prefix ( File . separator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr File Ġ= Ġcomponent 2 [ 1 ]. remove Suffix (" Ġmaterial "). remove Prefix ( rootDir ). remove Prefix ( File . separator ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l File . startsWith (" lhs ") Ġ&& Ġr File . startsWith (" rhs ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Index Ġ= Ġl Files . indexOf ( l File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Index Ġ= Ġr Files . indexOf ( r File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Index Ġ!= Ġ- 1 Ġ&& Ġr Index Ġ!= Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim Matrix [ l Index ][ r Index ] Ġ= Ġ 1 0 0 . 0 Ġ- Ġsim ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( r File . startsWith (" rhs ") Ġ&& Ġl File . startsWith (" lhs ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl Index Ġ= Ġr Files . indexOf ( r File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Index Ġ= Ġl Files . indexOf ( l File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l Index Ġ!= Ġ- 1 Ġ&& Ġr Index Ġ!= Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim Matrix [ l Index ][ r Index ] Ġ= Ġ 1 0 0 . 0 Ġ- Ġsim ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġh ung Ġ= ĠH ung arian Algorithm ( sim Matrix ) ĊĠĠĠĠĠĠĠ Ġval Ġmatches Ġ= Ġh ung . execute () ĊĊĠĠĠĠĠĠĠ Ġval Ġbest Matches Ġ= Ġmutable ListOf < Triple < String , ĠString , ĠDouble >>() ĊĠĠĠĠĠĠĠ Ġmatches . forEach Indexed Ġ{ Ġl Index , Ġr Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbest Matches . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( l Files [ l Index ], Ġr Files [ r Index ], Ġ 1 0 0 . 0 Ġ- Ġsim Matrix [ l Index ][ r Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmax File Count Ġ= Ġmax ( l Files . size , Ġr Files . size ) ĊĠĠĠĠĠĠĠ Ġval Ġsim Ġ= Ġbest Matches . map Ġ{ Ġit . third Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. copyOf ( max File Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ?: Ġ 0 . 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. average () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsim ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠAsync ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġdata Ġclass ĠSW Async Bundle ( ĊĠĠĠĠĠĠĠ Ġval Ġtmp Handle : ĠTemp Util . Temp Input Triple ĊĠĠĠ Ġ): ĠClose able Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Handle . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute Pair wise Async ( ld ir : ĠPath , Ġr dir : ĠPath ): ĠS CP D Tool Pair wise Execution Future Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! :: sim Path . isInitialized ) Ġthrow ĠIllegalStateException (" Field Ġsim Path Ġis Ġnot Ġth aw ed ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Files . list ( ld ir ). use Ġ{ Ġit . count () Ġ} Ġ== Ġ 0 . to Long ()) Ġthrow ĠIllegalStateException (" L HS Ġis Ġempty ") ĊĠĠĠĠĠĠĠ Ġif Ġ( Files . list ( r dir ). use Ġ{ Ġit . count () Ġ} Ġ== Ġ 0 . to Long ()) Ġthrow ĠIllegalStateException (" RHS Ġis Ġempty ") ĊĊĠĠĠĠĠĠĠ Ġval Ġtmp Handle Ġ= ĠTemp Util . copy Pair wise Inputs To Temp Directory ( ld ir , Ġr dir ) ĊĠĠĠĠĠĠĠ Ġval Ġ( tmp , Ġlhs , Ġrhs ) Ġ= Ġtmp Handle ĊĊĠĠĠĠĠĠĠ Ġval Ġproc Ġ= ĠProcess Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. command ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwine Str , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsim Path Str , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- R ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- p ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlhs . to AbsolutePath (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrhs . to AbsolutePath (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). start () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠS CP D Tool Pair wise Execution Future ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproc , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSW Async Bundle ( tmp Handle ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcomplete ( handle : ĠProcess , Ġbundle : ĠAny ): ĠS CP D Tool Pair wise Execution Result Ġ{ ĊĠĠĠĠĠĠĠ Ġbundle Ġas ĠSW Async Bundle ĊĊĠĠĠĠĠĠĠ Ġval Ġproc Ġ= Ġhandle ĊĊĠĠĠĠĠĠĠ Ġif Ġ( proc . exit Value () Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠS CP D Tool Pair wise Execution Result . Error (" Received Ġerror Ġcode Ġ${ proc . exit Value () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġproc . inputStream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. buffered Reader () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Ġ{ Ġit . read Lines () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġbundle . tmp Handle . temp Dir ĊĊĠĠĠĠĠĠĠ Ġval Ġsim Ġ= Ġcalculate Similarity ( output , Ġtmp . to AbsolutePath (). toString ()) ĊĠĠĠĠĠĠĠ Ġreturn ĠS CP D Tool Pair wise Execution Result . Success ( sim ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose ( handle : ĠProcess , Ġbundle : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle . destroy () ĊĠĠĠĠĠĠĠ Ġ( bundle Ġas ? ĠClose able )?. close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġtool Ġ= ĠSim W ine SC PD Tool () ĊĠĠĠ Ġtool . th aw () ĊĊĠĠĠ Ġval Ġroot Ġ= ĠPaths . get ("/ media / hay den che ers / Data / Pr EP / datasets / COMP 2 2 4 0 _ 2 0 1 8 _ A 1 ") ĊĊĠĠĠ Ġval Ġdirs Ġ= ĠFiles . list ( root ) ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠFiles . isDirectory ( it ) Ġ&& Ġ! Files . is Hidden ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. toList () ĊĊĠĠĠ Ġfor Ġ( l Ġin Ġ 0 Ġuntil Ġdirs . size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl dir Ġ= Ġdirs [ l ] ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġl + 1 Ġuntil Ġdirs . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr dir Ġ= Ġdirs [ r ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġtool . evaluate All Files ( ld ir , Ġr dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprintln (" Done ") ĊĠĠĠ Ġtool . close () Ċ }