/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 1 9 ĠH ew lett ĠPack ard ĠEnterprise ĠDevelopment ĠLP Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ċ Ġ* Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ċ Ġ* Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ċ Ġ* Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe Ċ Ġ* ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE Ċ Ġ* ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR Ċ Ġ* ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR Ċ Ġ* ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . h pe . k ra al Ċ Ċ import Ġorg . quick the ories . core . Gen Ċ import Ġorg . quick the ories . generators . Source DSL . inte gers Ċ import Ġjava . util .* Ċ import Ġjava . util . function . Bi Function Ċ Ċ class ĠTest Node ( ĊĠĠĠ Ġval Ġcontent : ĠString , ĊĠĠĠ Ġoverride Ġval Ġindex : ĠInt , ĊĠĠĠ Ġval Ġsuccess ors : ĠMutable Set < Test Node > Ġ= Ġmutable Set Of (), ĊĠĠĠ Ġval Ġpre decess ors : ĠMutable Set < Test Node > Ġ= Ġmutable Set Of () Ċ ) Ġ: ĠVertex < Test Node > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġcontent ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= ĠObjects . hash ( content ) ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠTest Node Ġ&& Ġcontent Ġ== Ġother . content Ċ } Ċ Ċ data Ġclass ĠTest Dig raph ( ĊĠĠĠ Ġoverride Ġval Ġvertices : ĠMutable List < Test Node >, ĊĠĠĠ Ġoverride Ġval Ġroot : ĠTest Node Ġ= Ġvertices . first () Ċ ) Ġ: ĠRoot ed Dig raph < Test Node > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" Test Dig raph " ĊĠĠĠ Ġoverride Ġfun Ġsuccess ors Of ( vertex : ĠTest Node ): ĠSet < Test Node > Ġ= Ġvertex . success ors ĊĠĠĠ Ġoverride Ġfun Ġpre decess ors Of ( vertex : ĠTest Node ): ĠSet < Test Node > Ġ= Ġvertex . pre decess ors ĊĊĠĠĠ Ġoperator Ġfun Ġget ( char : ĠChar ): ĠTest Node Ġ= Ġvertices . first Ġ{ Ġit . content Ġ== Ġ"$ char " Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġvertices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess ors Ġ= Ġsuccess ors Of ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( success or Ġin Ġsuccess ors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("$ node Ġto Ġ$ success or \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success ors . isEmpty () Ġ&& Ġpre decess ors Of ( node ). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("$ node \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclone (): ĠTest Dig raph Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclone Ġ= ĠTest Dig raph ( vertices . map Ġ{ ĠTest Node ( it . content , Ġit . index ) Ġ}. to Mutable List ()) ĊĠĠĠĠĠĠĠ Ġclone . vertices . forEach Indexed Ġ{ Ġi , Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . success ors Ġ+= Ġvertices [ i ]. success ors . map Ġ{ Ġclone . vertices [ it . index ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . pre decess ors Ġ+= Ġvertices [ i ]. pre decess ors . map Ġ{ Ġclone . vertices [ it . index ] Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclone ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTest Graph Builder ( private Ġval Ġedges : ĠMutable List < Pair < String , ĠString >> Ġ= Ġmutable ListOf (), Ġprivate Ġval Ġun connected : ĠMutable List < String > Ġ= Ġmutable ListOf ()) Ġ: ĊĠĠĠ ĠLower Case Letters Ġ{ ĊĊĠĠĠ Ġfun Ġbuild (): ĠTest Dig raph Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= Ġ( edges . flatMap To ( mutable Set Of ()) Ġ{ ĠlistOf ( it . first , Ġit . second ) Ġ} Ġ+ Ġun connected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġc Ġ-> ĠTest Node ( c . toString (), Ġi ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent To Node Ġ= Ġnodes . associate Ġ{ Ġit . content Ġto Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( edge Ġin Ġedges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġcontent To Node . getValue ( edge . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Ġ= Ġcontent To Node . getValue ( edge . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst . success ors Ġ+= Ġsecond ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond . pre decess ors Ġ+= Ġfirst ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTest Dig raph ( nodes , Ġnodes . first ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠString . to ( dest : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġedges Ġ+= ĠPair ( this . toString (), Ġdest . toString ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġdest Ġ// Ġfor Ġchaining ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun connected ( var arg Ġvertices : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġun connected . addAll ( vertices . map Ġ{ Ġit . toString () Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġgraph ( builder : ĠTest Graph Builder . () Ġ-> ĠUnit ): ĠTest Dig raph Ġ= ĠTest Graph Builder (). apply ( builder ). build () Ċ Ċ interface ĠLower Case Letters Ġ{ ĊĠĠĠ Ġval Ġa Ġget () Ġ= Ġ" a " ĊĠĠĠ Ġval Ġb Ġget () Ġ= Ġ" b " ĊĠĠĠ Ġval Ġc Ġget () Ġ= Ġ" c " ĊĠĠĠ Ġval Ġd Ġget () Ġ= Ġ" d " ĊĠĠĠ Ġval Ġe Ġget () Ġ= Ġ" e " ĊĠĠĠ Ġval Ġf Ġget () Ġ= Ġ" f " ĊĠĠĠ Ġval Ġg Ġget () Ġ= Ġ" g " ĊĠĠĠ Ġval Ġh Ġget () Ġ= Ġ" h " ĊĠĠĠ Ġval Ġi Ġget () Ġ= Ġ" i " ĊĠĠĠ Ġval Ġj Ġget () Ġ= Ġ" j " ĊĠĠĠ Ġval Ġk Ġget () Ġ= Ġ" k " ĊĠĠĠ Ġval Ġl Ġget () Ġ= Ġ" l " ĊĠĠĠ Ġval Ġm Ġget () Ġ= Ġ" m " ĊĠĠĠ Ġval Ġn Ġget () Ġ= Ġ" n " ĊĠĠĠ Ġval Ġo Ġget () Ġ= Ġ" o " ĊĠĠĠ Ġval Ġp Ġget () Ġ= Ġ" p " ĊĠĠĠ Ġval Ġq Ġget () Ġ= Ġ" q " ĊĠĠĠ Ġval Ġr Ġget () Ġ= Ġ" r " ĊĠĠĠ Ġval Ġs Ġget () Ġ= Ġ" s " ĊĠĠĠ Ġval Ġt Ġget () Ġ= Ġ" t " ĊĠĠĠ Ġval Ġu Ġget () Ġ= Ġ" u " ĊĠĠĠ Ġval Ġv Ġget () Ġ= Ġ" v " ĊĠĠĠ Ġval Ġw Ġget () Ġ= Ġ" w " ĊĠĠĠ Ġval Ġx Ġget () Ġ= Ġ" x " ĊĠĠĠ Ġval Ġy Ġget () Ġ= Ġ" y " ĊĠĠĠ Ġval Ġz Ġget () Ġ= Ġ" z " Ċ } Ċ Ċ fun ĠInt . toLowerCase Letter (): ĠString Ġ= Ġ(' a '. toInt () Ġ+ Ġthis ). to Char (). toString () Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġnew Ġ` Gen ` Ġthat Ġcalls Ġthe Ġreceiving Ġ` Gen ` Ġmultiple Ġ[ times ] Ġand Ġreturns Ġa Ġlist Ġof Ġthe Ġresults . Ċ Ġ*/ Ċ private Ġfun Ġ< R > ĠGen < R >. repeat ( times : ĠInt ): ĠGen < List < R >> Ġ= ĠGen Ġ{ Ġrand Ġ-> ĊĠĠĠ Ġ( 0 .. times ). map Ġ{ Ġgenerate ( rand ) Ġ} Ċ } Ċ Ċ fun Ġrandom Graph ( min Vertices : ĠInt Ġ= Ġ 1 , Ġmax Vertices : ĠInt Ġ= Ġ 2 0 , Ġmin Edges : ĠInt Ġ= Ġ 0 , Ġmax Edges : ĠInt Ġ= Ġ 4 0 ): ĠGen < Test Dig raph > Ġ{ ĊĊĠĠĠ Ġval Ġsize Ġ= Ġintegers (). between ( min Vertices , Ġmax Vertices ) ĊĠĠĠĠĠĠĠ Ġ. zip ( inte gers (). between ( min Edges , Ġmax Edges ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBi Function < Int , ĠInt , ĠPair < Int , ĠInt >> Ġ{ Ġnum V , Ġnum E Ġ-> ĠPair ( num V , Ġnum E ) Ġ}) ĊĊĠĠĠ Ġval Ġgraph Gen Ġ= Ġsize . flatMap Ġ{ Ġ( num V , Ġnum E ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġedge Gen Ġ= Ġintegers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. between ( 0 , Ġnum V Ġ- Ġ 1 ). mix ( inte gers (). between ( 0 , Ġnum V Ġ- Ġ 1 )). map Ġ{ Ġfirst , Ġsecond Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( first . toLowerCase Letter (), Ġsecond . toLowerCase Letter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġedge Gen . repeat ( num E ). map Ġ{ Ġedges Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpass Ġall Ġvertices Ġas Ġ" un connected " Ġfor Ġinclusion Ġin Ġthe Ġgraph , Ġrather Ġthan Ġfinding Ġwhich Ġactually Ġare ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Graph Builder ( edges . to Mutable List (), Ġ( 0 Ġuntil Ġnum V ). map Ġ{ Ġit . toLowerCase Letter () Ġ}. to Mutable List ()). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġgraph Gen Ċ }