/* Ċ Copyright Ġ 2 0 1 9 ĠAlex ĠB ary zh ik ov Ċ Ċ 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 ĊĊĠĠ Ġ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 Ġcom . ale xb . constraints . core . constraints Ċ Ċ import Ġcom . ale xb . constraints . core . Constraint Ċ import Ġcom . ale xb . constraints . core . Domain Ċ import Ġcom . ale xb . constraints . utils .* Ċ Ċ /** Ċ Ġ* ĠConstraint Ġen for cing Ġthat Ġvalues Ġof Ġgiven Ġvariables Ġsum Ġexactly Ċ Ġ* Ġto Ġa Ġgiven Ġamount . Ċ Ġ* Ċ Ġ* Ġ@ param Ġexact Sum ĠValue Ġto Ġbe Ġconsidered Ġas Ġthe Ġexact Ġsum . Ċ Ġ*/ Ċ class ĠExact Sum Constraint < V Ġ: ĠAny , ĠD Ġ: ĠNumber >( ĊĠĠĠ Ġprivate Ġval Ġexact Sum : ĠD Ċ ) Ġ: ĠConstraint < V , ĠD > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġinvoke ( ĊĠĠĠĠĠĠĠ Ġvariables : ĠList < V >, ĊĠĠĠĠĠĠĠ Ġdomains : ĠHashMap < V , ĠDomain < D >>, ĊĠĠĠĠĠĠĠ Ġassignments : ĠHashMap < V , ĠD >, ĊĠĠĠĠĠĠĠ Ġforward check : ĠBoolean ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsum : ĠD Ġ= Ġexact Sum . zero () ĊĠĠĠĠĠĠĠ Ġvar Ġmissing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġvariables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġin Ġassignments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġassignments [ v ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ= Ġwhen Ġ( sum ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġsum . toDouble (). round ( FLOAT _ PREC ISION ). toFloat () Ġas ĠD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDouble Ġ-> Ġsum . round ( DOUBLE _ PREC ISION ) Ġas ĠD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsum ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( sum Ġ> Ġexact Sum ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( forward check Ġand Ġmissing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġvariables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ! in Ġassignments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdomain Ġ= Ġdomains [ v ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin ĠArrayList ( domain )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sum Ġ+ Ġvalue Ġ> Ġexact Sum ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain . hide Value ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( domain . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( missing ) Ġsum Ġ<= Ġexact Sum Ġelse Ġsum Ġ== Ġexact Sum ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpreprocess ( ĊĠĠĠĠĠĠĠ Ġvariables : ĠList < V >, ĊĠĠĠĠĠĠĠ Ġdomains : ĠHashMap < V , ĠDomain < D >>, ĊĠĠĠĠĠĠĠ Ġconstraints : ĠArrayList < Constraint Env < V , ĠD >>, ĊĠĠĠĠĠĠĠ Ġv constraints : ĠHashMap < V , ĠArrayList < Constraint Env < V , ĠD >>> ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . preprocess ( variables , Ġdomains , Ġconstraints , Ġv constraints ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġvariables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdomain Ġ= Ġdomains [ v ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin ĠArrayList ( domain )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġexact Sum ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain . remove ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Exact Sum Constraint @ $ exact Sum " ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFLOAT _ PREC ISION Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDOUBLE _ PREC ISION Ġ= Ġ 1 0 ĊĠĠĠ Ġ} Ċ }