package Ġch . u zh . ifi . se al . bench er . analysis . call graph . reach ability Ċ Ċ import Ġch . u zh . ifi . se al . bench er . Method Ċ Ċ class ĠRe ach abilities ( ĊĠĠĠĠĠĠĠ Ġval Ġstart : ĠMethod , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġreach abilities : ĠSet < Reach ability Result > Ċ ) Ġ: ĠRe ach ability Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġreach abilities No Duplicates : ĠSet < Reach ability Result > ĊĠĠĠ Ġprivate Ġval Ġto s RR : ĠMap < Method , ĠRe ach ability Result > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs rs Ġ= Ġreach abilities . sorted With ( Reach ability Result Comparator ) ĊĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġmutable Set Of < Method >() ĊĊĠĠĠĠĠĠĠ Ġval Ġrs nd Ġ= Ġmutable Set Of < Reach ability Result >() ĊĠĠĠĠĠĠĠ Ġval Ġm tos rr Ġ= Ġmutable Map Of < Method , ĠRe ach ability Result >() ĊĊĠĠĠĠĠĠĠ Ġs rs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! selected . contains ( it . to )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected . add ( it . to ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrs nd . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm tos rr [ it . to ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreach abilities No Duplicates Ġ= Ġrs nd ĊĠĠĠĠĠĠĠ Ġto s RR Ġ= Ġm tos rr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreachable ( from : ĠMethod , Ġto : ĠMethod ): ĠRe ach ability Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( from Ġ!= Ġstart Ġ|| Ġ! tos RR . containsKey ( to )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRF . not Reach able ( from , Ġto ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrr Ġ= Ġto s RR [ to ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( rr Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap ( from , Ġto , Ġrr ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRF . not Reach able ( from , Ġto ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmap ( from : ĠMethod , Ġto : ĠMethod , Ġr : ĠRe ach ability Result ): ĠRe ach ability Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( r ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRe ach able Ġ-> ĠRF . reachable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ= Ġfrom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġr . to , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= Ġr . level ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPo ss ibly Reach able Ġ-> ĠRF . possibly Reach able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ= Ġfrom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġr . to , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Ġ= Ġr . level , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprobability Ġ= Ġr . probability ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNot Reach able Ġ-> ĠRF . not Reach able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ= Ġfrom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreach abilities ( remove Duplicate T os : ĠBoolean ): ĠSet < Reach ability Result > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! remove Duplicate T os ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreach abilities ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreach abilities No Duplicates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunion ( other : ĠRe ach abilities ): ĠRe ach abilities Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Ġ!= Ġother . start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Can Ġnot Ġcreate Ġunion : Ġstart Ġvertices Ġnot Ġequal Ġ($ start Ġ!= Ġ${ other . start }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe ach abilities ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġstart , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreach abilities Ġ= Ġreach abilities . union ( other . reach abilities ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠRe ach abilities ĊĊĠĠĠĠĠĠĠ Ġif Ġ( start Ġ!= Ġother . start ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( reach abilities Ġ!= Ġother . reach abilities ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġstart . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġreach abilities . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Reach abilities ( start =$ start , Ġreach abilities =$ reach abilities )" ĊĠĠĠ Ġ} Ċ } Ċ