package Ġbenchmarks . util . exec utors Ċ Ċ import Ġbenchmarks . util .* Ċ import Ġconnectivity . sequential . general . Dynamic Connectivity Ċ import Ġkotlinx . atomic fu . Atomic Int Ċ import Ġkotlinx . atomic fu . atomic Ċ import Ġthird party . A ks en ov 2 3 9 . fc . F CD ynamic Graph Ċ import Ġjava . util . concurrent . Thread Local Random Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ private Ġconst Ġval ĠB ATCH _ SIZE Ġ= Ġ 1 5 Ġ// Ġincrease Ġcounter Ġin Ġbatches Ġto Ġreduce Ġcontent ion Ċ Ċ class ĠSuccess ive Scenario Executor ( val Ġscenario : ĠScenario , Ġd cp Constructor : Ġ( Int ) Ġ-> ĠDynamic Connectivity ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġd cp Ġ= Ġd cp Constructor ( scenario . nodes ) ĊĊĠĠĠ Ġprivate Ġval Ġpos : ĠAtomic Int Ġ= Ġatomic ( 0 ) ĊĠĠĠ Ġprivate Ġval Ġthreads : ĠArray < Thread > ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġstart Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( d cp Ġis ĠF CD ynamic Graph ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠF CD ynamic Graph . Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( edge Ġin Ġscenario . initial Edges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . set ( 0 , Ġedge . from (), Ġedge . to ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cp . add Edge ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( edge Ġin Ġscenario . initial Edges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cp . add Edge ( edge . from (), Ġedge . to ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġthreads Initialized Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġthreads Ġ= ĠArray ( scenario . threads ) Ġ{ Ġthread Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBenchmark Thread ( thread Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueries Ġ= Ġscenario . queries [ 0 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthreads Initialized . increment AndGet () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! start ); Ġ// Ġwait Ġuntil Ġstart ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueries Size Ġ= Ġqueries . size ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Start Ġ= Ġpos . get And Add ( BATCH _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Start Ġ>= Ġqueries Size ) Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( id Ġin Ġid Start Ġuntil Ġ( id Start Ġ+ ĠB ATCH _ SIZE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ>= Ġqueries Size ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġqueries [ id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( query . type ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Type . CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cp . connected ( query . from (), Ġquery . to ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Type . ADD _ EDGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cp . add Edge ( query . from (), Ġquery . to ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Type . REMOVE _ EDGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd cp . remove Edge ( query . from (), Ġquery . to ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork ( work Amount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthreads . forEach Ġ{ Ġit . start () Ġ} ĊĠĠĠĠĠĠĠ Ġwhile Ġ( threads Initialized . get () Ġ!= Ġscenario . threads ); Ġ// Ġwait Ġuntil Ġall Ġthreads Ġare Ġinitialized ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġthreads . forEach Ġ{ Ġit . join () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġwork ( amount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġ 1 . 0 Ġ/ Ġamount ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠThread Local Random . current () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r . next Double () Ġ< Ġp ) Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }