import Ġcom . google . ort ools . linear solver . MP Constraint Ċ import Ġcom . google . ort ools . linear solver . MP Solver Ċ import Ġcom . google . ort ools . linear solver . MP Variable Ċ import Ġlib . Multi set Ċ import Ġlib . Mutable Multi set Ċ Ċ interface ĠUnknown Model State < AGENT > Ġ{ ĊĠĠĠ Ġval Ġpotential Con sequences Footprint : ĠSet < AGENT > ĊĠĠĠ Ġval Ġcommitted Con sequences : ĠMulti set < AGENT > ĊĊĠĠĠ Ġfun Ġget End State V ri able ( solver : ĠM PS olver , Ġagent : ĠAG ENT ): ĠMP Variable ĊĊĠĠĠ Ġfun Ġget End State Binary V ri able ( solver : ĠM PS olver , Ġagent : ĠAG ENT ): ĠMP Variable Ċ // ĠĠĠ Ġfun Ġhas Indicators (): ĠBoolean Ċ Ċ // ĠĠĠ Ġfun Ġadd Con sequences To Constraints ( constraints : ĠMap < AGENT , ĠMP Constraint >, Ġmultiplier : ĠDouble ) Ċ Ċ // ĠĠĠ Ġfun Ġadd Sources To Constraints ( constraints : ĠMap < AGENT , ĠMP Constraint >, Ġmultiplier : ĠDouble , Ġequality : ĠBoolean ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġconstraints . forEach Ġ{ Ġ( agent , Ġconstraint ) Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint . setBounds ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmultiplier Ġ* Ġsources . count ( agent ), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( equality ) Ġmultiplier Ġ* Ġsources . count ( agent ) Ġelse ĠDouble . POSITIVE _ INFINITY Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ Ċ } Ċ