package Ġus . s odium labs . elect or ate . sim Ċ Ċ import Ġcom . google . common . collect . Immutable Map Ċ import Ġcom . google . gson . JsonArray Ċ import Ġcom . google . gson . JsonObject Ċ import Ġus . s odium labs . elect or ate . BigDecimal Average Collector Ċ import Ġus . s odium labs . elect or ate . PREC ISION Ċ import Ġus . s odium labs . elect or ate . String Wrapper Ċ import Ġus . s odium labs . elect or ate . Tuple Ċ import Ġus . s odium labs . elect or ate . generate Random BigDecimal Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . Math Context Ċ import Ġjava . math . Round ingMode Ċ import Ġjava . util . Objects Ċ import Ġjava . util . Optional Ċ import Ġjava . util . Random Ċ import Ġjava . util . stream . Collectors Ċ import Ġjava . util . stream . Int Stream Ċ Ċ fun Ġgenerate Elect or ate ( random : ĠRandom , Ġpolicies : ĠList < Policy >, Ġelect or Count : ĠInt , Ġmax Candidate Count : ĠInt ): ĠElect or ate Ġ{ ĊĊĠĠĠ Ġval Ġvot er Random Ġ= ĠRandom ( random . next Long ()) ĊĠĠĠ Ġval Ġvot ers Ġ= ĠInt Stream . range ( 0 , Ġelect or Count ) ĊĠĠĠĠĠĠĠ Ġ. map To Obj Ġ{ ĠV oter ( generate Random St ances ( Random ( v oter Random . next Long ()), Ġpolicies ), Ġgenerate Random BigDecimal ( v oter Random )) Ġ} ĊĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList ()) ĊĊĠĠĠ Ġval Ġcandidates Ġ= Ġgenerate Candidates From V ot ers ( vot ers , Ġmax Candidate Count ) ĊĊĠĠĠ Ġreturn ĠElect or ate ( vot ers , Ġcandidates ) Ċ } Ċ Ċ fun Ġgenerate Candidates From V ot ers ( vot ers : ĠList < V oter >, Ġmax Candidate Count : ĠInt ): ĠList < Candidate > Ġ{ ĊĠĠĠ Ġval Ġcandidates Ġ= ĠArrayList < Candidate >() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. max Candidate Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpotential Candidate Ġ= Ġget V oter Most Lik ely To Run ( vot ers , Ġcandidates ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! potential Candidate . isPresent ) Ġbreak ĊĠĠĠĠĠĠĠ Ġcandidates . add ( Candidate ( potential Candidate . get ())) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcandidates Ċ } Ċ Ċ private Ġfun Ġget V oter Most Lik ely To Run ( vot ers : ĠList < V oter >, Ġcandidates : ĠList < Candidate >): ĠOptional < V oter > Ġ{ ĊĠĠĠ Ġreturn Ġvot ers . stream () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġv Ġ-> ĠTuple ( v , Ġv . calculate Current Running Pro pens ity ( candidates )) Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġt Ġ-> Ġt . t . map To Optional Ġ{ Ġv Ġ-> Ġv Ġ> ĠBigDecimal . ZERO Ġ}. orElse ( false ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. max Ġ{ Ġt 1 , Ġt 2 Ġ-> Ġt 1 . t . compare ( t 2 . t ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġt Ġ-> Ġt . s Ġ} Ċ } Ċ Ċ private Ġfun Ġgenerate Random St ances ( random : ĠRandom , Ġpolicies : ĠList < Policy >): ĠList < St ance > Ġ{ ĊĠĠĠ Ġreturn Ġpolicies . stream () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġp Ġ-> ĠSt ance ( p , Ġgenerate Random BigDecimal ( random )) Ġ} ĊĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList ()) Ċ } Ċ Ċ open Ġclass ĠElect or ate ( private Ġval Ġelect or ate : ĠList < V oter >, Ġval Ġcandidates : ĠList < Candidate >) Ġ{ ĊĊĠĠĠ Ġopen Ġfun Ġ< B > Ġpoll ( v oting Strategy : ĠV oting Strategy < B >): ĠList < B > Ġwhere ĠB : ĠBal lot Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpoll ( v oting Strategy , Ġcandidates ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġ< B > Ġpoll ( v oting Strategy : ĠV oting Strategy < B >, Ġoverride Candidates : ĠList < Candidate >): ĠList < B > Ġwhere ĠB : ĠBal lot Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelect or ate . stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġt : ĠV oter Ġ-> Ġvoting Strategy . accept ( t , Ġoverride Candidates ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate Reg ret ( candidate : ĠOptional < Candidate >): ĠReg ret Metrics Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġutility Map Ġ= ĠHashMap < Candidate , ĠBigDecimal Wrapper >() ĊĠĠĠĠĠĠĠ Ġvar Ġmaximum Utility Ġ= ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠ Ġvar Ġminimum Utility Ġ= ĠBigDecimal . ONE ĊĊĠĠĠĠĠĠĠ Ġcandidates . forEach Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġutility Ġ= Ġcalculate Candidate Utility ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġutility . if Present Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ> Ġmaximum Utility ) Ġmaximum Utility Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġminimum Utility ) Ġminimum Utility Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġutility Map [ c ] Ġ= Ġutility ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcandidate . map Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Utility Ġ= Ġutility Map . getOrElse ( c ) Ġ{ Ġcalculate Candidate Utility ( c ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg ret Ġ= Ġraw Utility ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To Optional Ġ{ Ġ( maximum Utility Ġ- Ġit ). max ( BigDecimal . ZERO ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map (:: wrap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Get (:: nan ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormalized Reg ret Ġ= Ġif Ġ( maximum Utility . compareTo ( minimum Utility ) Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreg ret . map To Optional Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġ/ Ġ( maximum Utility Ġ- Ġminimum Utility )). min ( BigDecimal . ONE ). max ( BigDecimal . ZERO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map (:: wrap ). orElse Get (:: nan ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnan () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠReg ret Metrics ( raw Utility , Ġreg ret , Ġnormalized Reg ret ) ĊĠĠĠĠĠĠĠ Ġ}. orElse Get Ġ{ Ġin determinate () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Candidate Utility ( candidate : ĠC andidate ): ĠBigDecimal Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelect or ate . stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġv Ġ-> Ġv . calculate Candidate Utility ( candidate ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( BigDecimal Average Collector ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠtoJson (): ĠJsonObject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Elect or ate Ġ= ĠJson Array () ĊĠĠĠĠĠĠĠ Ġelect or ate . forEach Ġ{ Ġv Ġ-> Ġout Elect or ate . add ( v . toJson ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġout Candidates Ġ= ĠJson Array () ĊĠĠĠĠĠĠĠ Ġcandidates . forEach Ġ{ Ġc Ġ-> Ġout Candidates . add ( c . toJson ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠ Ġout . add (" elect or ate ", Ġout Elect or ate ) ĊĠĠĠĠĠĠĠ Ġout . add (" candidates ", Ġout Candidates ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠV oter ( val Ġst ances : ĠList < St ance >, Ġprivate Ġval Ġrunning Pro pens ity : ĠBigDecimal Wrapper ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠS Q RT _ CONTEXT Ġ= ĠMath Context ( PREC ISION , ĠRound ingMode . FLO OR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpolicy Scale : ĠBigDecimal ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġpolicy Scale Ġ= ĠBigDecimal . valueOf ( stances . size . to Long ()). sqrt ( SQ RT _ CONTEXT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate Candidate Utility ( candidate : ĠC andidate ): ĠBigDecimal Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġst ances . stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcandidate . get St ance ( s . policy ). value . bi Map ( s . value ) Ġ{ Ġleft , Ġright Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal . ONE Ġ- Ġ( left Ġ- Ġright ). abs () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . map Ġ{ Ġx Ġ-> Ġx Ġ* Ġx Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. reduce ( zero ()) Ġ{ Ġx , Ġy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . bi Map ( y ) Ġ{ Ġl , Ġr Ġ-> Ġl Ġ+ Ġr Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . sqrt ( SQ RT _ CONTEXT ) Ġ/ Ġpolicy Scale Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate Current Running Pro pens ity ( candidates : ĠList < Candidate >): ĠBigDecimal Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Candidate Utility Ġ= Ġcalculate Max Candidate Utility ( candidates ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrunning Pro pens ity . bi Map ( max Candidate Utility ) Ġ{ Ġleft , Ġright Ġ-> Ġleft Ġ- Ġright Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Max Candidate Utility ( candidates : ĠList < Candidate >): ĠBigDecimal Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcandidates . stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġc Ġ-> Ġcalculate Candidate Utility ( c ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. max Ġ{ Ġo 1 , Ġo 2 Ġ-> Ġo 1 . compare ( o 2 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse ( zero ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠtoJson (): ĠJsonObject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠ Ġst ances . forEach Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . addProperty ( s . policy . toString (), Ġs . value . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠC andidate ( stance List : ĠList < St ance >) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġst ances : ĠMap < Policy , ĠSt ance > ĊĊĠĠĠ Ġconstructor ( v oter : ĠV oter ): Ġthis ( v oter . stances ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġst ance Map Builder Ġ= ĠHashMap < Policy , ĠSt ance >() ĊĠĠĠĠĠĠĠ Ġst ance List . forEach Ġ{ Ġs Ġ-> Ġst ance Map Builder [ s . policy ] Ġ= Ġs Ġ} ĊĠĠĠĠĠĠĠ Ġst ances Ġ= ĠImmutableMap . copyOf ( stance Map Builder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget St ance ( policy : ĠPolicy ): ĠSt ance Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġst ances . get OrDefault ( policy , ĠNULL _ ST ANCE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠC andidate ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġst ances . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! other . stances . containsKey ( entry . key ) Ġ|| Ġother . stances [ entry . key ] Ġ!= Ġentry . value ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObjects . hash ( stances ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠtoJson (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠtoJson (): ĠJsonObject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠ Ġst ances . forEach Ġ{ Ġs Ġ-> Ġout . addProperty ( s . key . toString (), Ġs . value . value . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSt ance ( val Ġpolicy : ĠPolicy , Ġval Ġvalue : ĠBigDecimal Wrapper ) Ċ Ċ val ĠNULL _ ST ANCE Ġ= ĠSt ance ( Policy (" null "), Ġnan ()) Ċ Ċ class ĠPolicy ( s : ĠString ) Ġ: ĠString Wrapper ( s ) Ċ Ċ interface ĠV oting Strategy < B > Ġwhere ĠB Ġ: ĠBal lot Ġ{ ĊĠĠĠ Ġfun Ġaccept ( v oter : ĠV oter , Ġcandidates : ĠList < Candidate >): ĠB Ċ } Ċ Ċ interface ĠBal lot Ċ