/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - present Ġby Ġthe Ġauthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ġfollowing Ġlink . Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġar . com . ag ome z . cho co Ċ Ċ import Ġorg . cho co solver . solver . Model Ċ import Ġorg . cho co solver . solver . constraints . Constraint Ċ import Ġorg . cho co solver . solver . constraints . Operator Ċ import Ġorg . cho co solver . solver . variables . Int Var Ċ Ċ sealed Ġclass ĠTerm Expression ( val Ġterms : ĠArray < Term >, Ġval Ġoperator : ĠOperator ) Ċ Ċ internal Ġclass ĠTerm Constant Expression ( terms : ĠArray < Term >, Ġoperator : ĠOperator , Ġval Ġvalue : ĠInt ) Ġ: ĠTerm Expression ( terms , Ġoperator ) Ċ Ċ internal Ġclass ĠTerm Variable Expression ( terms : ĠArray < Term >, Ġoperator : ĠOperator , Ġval Ġvalue : ĠInt Var ) Ġ: ĠTerm Expression ( terms , Ġoperator ) Ċ Ċ object ĠTerm Expression Scope Ġ{ ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. eq ( value : ĠInt ): ĠTerm Expression Ġ= ĠTerm Constant Expression ( this , ĠOperator . EQ , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. eq ( value : ĠInt ): ĠTerm Expression Ġ= Ġas Typed Array () Ġeq Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. eq ( value : ĠInt Var ): ĠTerm Expression Ġ= ĠTerm Variable Expression ( this , ĠOperator . EQ , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. eq ( value : ĠInt Var ): ĠTerm Expression Ġ= Ġas Typed Array () Ġeq Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. ne ( value : ĠInt ): ĠTerm Expression Ġ= ĠTerm Constant Expression ( this , ĠOperator . NQ , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. ne ( value : ĠInt ): ĠTerm Expression Ġ= Ġas Typed Array () Ġne Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. ne ( value : ĠInt Var ): ĠTerm Expression Ġ= ĠTerm Variable Expression ( this , ĠOperator . NQ , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. ne ( value : ĠInt Var ): ĠTerm Expression Ġ= Ġas Typed Array () Ġne Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. lt ( value : ĠInt ): ĠTerm Expression Ġ= ĠTerm Constant Expression ( this , ĠOperator . LT , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. lt ( value : ĠInt ): ĠTerm Expression Ġ= Ġas Typed Array () Ġlt Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. lt ( value : ĠInt Var ): ĠTerm Expression Ġ= ĠTerm Variable Expression ( this , ĠOperator . LT , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. lt ( value : ĠInt Var ): ĠTerm Expression Ġ= Ġas Typed Array () Ġlt Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. le ( value : ĠInt ): ĠTerm Expression Ġ= ĠTerm Constant Expression ( this , ĠOperator . LE , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. le ( value : ĠInt ): ĠTerm Expression Ġ= Ġas Typed Array () Ġle Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. le ( value : ĠInt Var ): ĠTerm Expression Ġ= ĠTerm Variable Expression ( this , ĠOperator . LE , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. le ( value : ĠInt Var ): ĠTerm Expression Ġ= Ġas Typed Array () Ġle Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. gt ( value : ĠInt ): ĠTerm Expression Ġ= ĠTerm Constant Expression ( this , ĠOperator . GT , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. gt ( value : ĠInt ): ĠTerm Expression Ġ= Ġas Typed Array () Ġgt Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. gt ( value : ĠInt Var ): ĠTerm Expression Ġ= ĠTerm Variable Expression ( this , ĠOperator . GT , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. gt ( value : ĠInt Var ): ĠTerm Expression Ġ= Ġas Typed Array () Ġgt Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. ge ( value : ĠInt ): ĠTerm Expression Ġ= ĠTerm Constant Expression ( this , ĠOperator . GE , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. ge ( value : ĠInt ): ĠTerm Expression Ġ= Ġas Typed Array () Ġge Ġvalue ĊĊĠĠĠ Ġin fix Ġfun ĠArray < Term >. ge ( value : ĠInt Var ): ĠTerm Expression Ġ= ĠTerm Variable Expression ( this , ĠOperator . GE , Ġvalue ) ĊĊĠĠĠ Ġin fix Ġfun ĠList < Term >. ge ( value : ĠInt Var ): ĠTerm Expression Ġ= Ġas Typed Array () Ġge Ġvalue ĊĊĠĠĠ Ġoperator Ġfun ĠInt Var . unary Minus (): ĠTerm Ġ= Ġ- 1 Ġto Ġthis ĊĊĠĠĠ Ġoperator Ġfun ĠInt . times ( v : ĠInt Var ): ĠTerm Ġ= Ġthis Ġto Ġv ĊĊĠĠĠ Ġoperator Ġfun ĠTerm . plus ( expr : ĠTerm ): ĠList < Term > Ġ= ĠlistOf ( this , Ġexpr ) ĊĊĠĠĠ Ġoperator Ġfun ĠTerm . plus ( expr : ĠInt Var ): ĠList < Term > Ġ= ĠlistOf ( this , Ġ 1 Ġ* Ġexpr ) ĊĊĠĠĠ Ġoperator Ġfun ĠTerm . minus ( expr : ĠTerm ): ĠList < Term > Ġ= ĠlistOf ( this , Ġ- expr ) ĊĊĠĠĠ Ġoperator Ġfun ĠTerm . minus ( expr : ĠInt Var ): ĠList < Term > Ġ= ĠlistOf ( this , Ġ- expr ) ĊĊĠĠĠ Ġoperator Ġfun ĠList < Term >. plus ( expr : ĠInt Var ): ĠList < Term > Ġ= Ġthis Ġ+ Ġ 1 Ġ* Ġexpr ĊĊĠĠĠ Ġoperator Ġfun ĠList < Term >. minus ( expr : ĠInt Var ): ĠList < Term > Ġ= Ġthis Ġ+ Ġ- expr ĊĊĠĠĠ Ġoperator Ġfun ĠList < Term >. minus ( expr : ĠTerm ): ĠList < Term > Ġ= Ġthis Ġ+ Ġ- expr Ċ } Ċ Ċ /** Ċ Ġ* ĠExtension Ġfor Ġ[ Model . scalar ] Ġto Ġdeclare Ġa Ġscalar Ġconstraint Ġusing Ġarithmetic Ġexpressions . Ċ Ġ* ĠSample : Ġ` scalar Ġ{ Ġ 2 Ġ* Ġv Ġ- w Ġ+ Ġ 3 Ġ* Ġx Ġ- 2 Ġ* Ġy ) Ġge Ġz Ġ}` Ċ Ġ* Ċ Ġ* Ġ@ param Ġexpr Builder Ġscoped Ġblock Ġwhere Ġoperators Ġare Ġdefined Ġas Ġin fix Ġfunctions . Ċ Ġ* Ġ@ return ĠA Ġscalar Ġconstraint . Ċ Ġ* Ġ@ author ĠAle j andro ĠG ome z Ċ Ġ* Ġ@ since Ġ 0 . 0 . 3 Ċ Ġ*/ Ċ fun ĠModel . scalar ( expr Builder : ĠTerm Expression Scope . () Ġ-> ĠTerm Expression ): ĠConstraint Ġ= ĠTerm Expression Scope . expr Builder (). let Ġ{ Ġexpr Ġ-> ĊĠĠĠ Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠTerm Constant Expression Ġ-> Ġscalar ( expr . terms . map Ġ{ Ġit . second Ġ}. to Typed Array (), Ġexpr . terms . map Ġ{ Ġit . first Ġ}. to IntArray (), Ġexpr . operator . toString (), Ġexpr . value ) ĊĠĠĠĠĠĠĠ Ġis ĠTerm Variable Expression Ġ-> Ġscalar ( expr . terms . map Ġ{ Ġit . second Ġ}. to Typed Array (), Ġexpr . terms . map Ġ{ Ġit . first Ġ}. to IntArray (), Ġexpr . operator . toString (), Ġexpr . value ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠExtension Ġfor Ġ[ Model . scalar ] Ġto Ġdeclare Ġa Ġsum Ġconstraint Ġusing Ġarithmetic Ġexpressions . Ċ Ġ* ĠSample : Ġ` scalar ( n ) Ġ{ Ġ 2 Ġ* Ġv Ġ- w Ġ+ Ġ 3 Ġ* Ġx Ġ- 2 Ġ* Ġy ) Ġge Ġz Ġ}` Ċ Ġ* Ċ Ġ* Ġ@ param Ġexpr Builder Ġscoped Ġblock Ġwhere Ġoperators Ġare Ġdefined Ġas Ġin fix Ġfunctions . Ċ Ġ* Ġ@ param Ġmin Card For De comp Ġminimum Ġnumber Ġof Ġcardinality Ġthreshold Ġto Ġa Ġscalar Ġconstraint Ġto Ġbe Ġde composed . Ċ Ġ* Ġ@ return ĠA Ġscalar Ġconstraint . Ċ Ġ* Ġ@ author ĠAle j andro ĠG ome z Ċ Ġ* Ġ@ since Ġ 0 . 0 . 3 Ċ Ġ*/ Ċ fun ĠModel . scalar ( min Card For De comp : ĠInt , Ġexpr Builder : ĠTerm Expression Scope . () Ġ-> ĠTerm Expression ): ĠConstraint Ġ= ĠTerm Expression Scope . expr Builder (). let Ġ{ Ġexpr Ġ-> ĊĠĠĠ Ġwhen Ġ( expr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠTerm Constant Expression Ġ-> Ġscalar ( expr . terms . map Ġ{ Ġit . second Ġ}. to Typed Array (), Ġexpr . terms . map Ġ{ Ġit . first Ġ}. to IntArray (), Ġexpr . operator . toString (), Ġexpr . value , Ġmin Card For De comp ) ĊĠĠĠĠĠĠĠ Ġis ĠTerm Variable Expression Ġ-> Ġscalar ( expr . terms . map Ġ{ Ġit . second Ġ}. to Typed Array (), Ġexpr . terms . map Ġ{ Ġit . first Ġ}. to IntArray (), Ġexpr . operator . toString (), Ġexpr . value , Ġmin Card For De comp ) ĊĠĠĠ Ġ} Ċ } Ċ