package Ġkotlinx . algorithm . c ass ow ary Ċ Ċ class ĠSolver Ġ{ ĊĠĠĠ Ġprivate Ġval Ġconstraints Ġ= Ġmutable Map Of < Constraint , ĠTag >() ĊĠĠĠ Ġprivate Ġval Ġrows Ġ= Ġmutable Map Of < Symbol , ĠRow >() ĊĠĠĠ Ġprivate Ġval Ġvars Ġ= Ġmutable Map Of < Variable , ĠSymbol >() ĊĠĠĠ Ġprivate Ġval Ġedits Ġ= Ġmutable Map Of < Variable , ĠEdit Info >() ĊĠĠĠ Ġprivate Ġval Ġin fe asible Rows Ġ= Ġmutable ListOf < Symbol >() ĊĠĠĠ Ġprivate Ġval Ġobjective Ġ= ĠRow ( 0 . 0 ) ĊĠĠĠ Ġprivate Ġvar Ġart ificial : ĠRow ? Ġ= Ġnull Ġ// ĠTODO : ĠIt Ġdoes Ġnot Ġbelong Ġhere ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa Ġconstraint Ġto Ġthe Ġsolver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġconstraint ĊĠĠĠĠ Ġ* Ġ@ throws ĠDuplicate Constraint Exception ĠThe Ġgiven Ġconstraint Ġhas Ġalready Ġbeen Ġadded Ġto Ġthe Ġsolver . ĊĠĠĠĠ Ġ* Ġ@ throws ĠUn satisf iable Constraint Exception ĠThe Ġgiven Ġconstraint Ġis Ġrequired Ġand Ġcannot Ġbe Ġsatisfied . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Constraint ( constraint : ĠConstraint ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( constraints . containsKey ( constraint )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDuplicate Constraint Exception ( constraint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= ĠTag () ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġcreate Row ( constraint , Ġtag ) ĊĠĠĠĠĠĠĠ Ġvar Ġsubject Ġ= Ġchoose Subject ( row , Ġtag ) ĊĠĠĠĠĠĠĠ Ġif Ġ( subject . type Ġ== ĠSymbol Type . INVALID Ġ&& Ġrow Contains Only D um m ies ( row )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Ġ= Ġif Ġ(! Util . near Zero ( row . constant )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn satisf iable Constraint Exception ( constraint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag . marker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( subject . type Ġ== ĠSymbol Type . INVALID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! add With Art ificial Variable ( row )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn satisf iable Constraint Exception ( constraint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . solve For ( subject ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubstitute ( subject , Ġrow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows [ subject ] Ġ= Ġrow ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconstraints [ constraint ] Ġ= Ġtag ĊĠĠĠĠĠĠĠ Ġoptimize ( objective ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Constraint ( constraint : ĠConstraint ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġconstraints [ constraint ] Ġ?: Ġthrow ĠUnknown Constraint Exception ( constraint ) ĊĠĠĠĠĠĠĠ Ġconstraints . remove ( constraint ) ĊĠĠĠĠĠĠĠ Ġremove Constraint Effects ( constraint , Ġtag ) ĊĠĠĠĠĠĠĠ Ġvar Ġrow Ġ= Ġrows [ tag . marker ] ĊĠĠĠĠĠĠĠ Ġif Ġ( row Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows . remove ( tag . marker ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Ġ= Ġget Marker Le aving Row ( tag . marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Solver Error (" internal Ġsolver Ġerror ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// This Ġlooks Ġwrong ! Ġchanges Ġmade Ġbelow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Symbol Ġleaving Ġ= Ġtag . marker ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// rows . remove ( tag . marker ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġleaving : ĠSymbol ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( current Symbol , Ġcurrent Row ) Ġin Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Row Ġ=== Ġrow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaving Ġ= Ġcurrent Symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠMaybe Ġoptimize . ĠEarly Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( le aving Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Solver Error (" internal Ġsolver Ġerror ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows . remove ( le aving ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . solve For ( le aving , Ġtag . marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubstitute ( tag . marker , Ġrow ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoptimize ( objective ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Constraint Effects ( constraint : ĠConstraint , Ġtag : ĠTag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tag . marker . type Ġ== ĠSymbol Type . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Marker Effects ( tag . marker , Ġconstraint . strength ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( tag . other . type Ġ== ĠSymbol Type . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Marker Effects ( tag . other , Ġconstraint . strength ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Marker Effects ( marker : ĠSymbol , Ġstrength : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġrows [ marker ] ĊĠĠĠĠĠĠĠ Ġif Ġ( row Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjective . insert ( row , Ġ- strength ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjective . insert ( marker , Ġ- strength ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Marker Le aving Row ( marker : ĠSymbol ): ĠRow ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġr 1 Ġ= ĠDouble . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġvar Ġr 2 Ġ= ĠDouble . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġvar Ġfirst : ĠRow ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġsecond : ĠRow ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġthird : ĠRow ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġrows . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcandidate Row Ġ= Ġrows [ s ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcandidate Row !!. coefficient For ( marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . type Ġ== ĠSymbol Type . EXTERNAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthird Ġ= Ġcandidate Row ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ< Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġ- candidate Row . constant Ġ/ Ġc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r Ġ< Ġr 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr 1 Ġ= Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġcandidate Row ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġcandidate Row . constant Ġ/ Ġc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r Ġ< Ġr 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr 2 Ġ= Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Ġ= Ġcandidate Row ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfirst Ġ?: Ġ( second Ġ?: Ġthird ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Constraint ( constraint : ĠConstraint ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconstraints . containsKey ( constraint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Edit Variable ( variable : ĠVariable , Ġstrength : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ed its . containsKey ( variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDuplicate Edit Variable Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcli pped Strength Ġ= ĠSt rength . clip ( strength ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cli pped Strength Ġ== ĠSt rength . REQUIRED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRequired FailureException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġterms Ġ= Ġmutable ListOf < Term >() ĊĠĠĠĠĠĠĠ Ġterms . add ( Term ( variable )) ĊĠĠĠĠĠĠĠ Ġval Ġconstraint Ġ= ĠConstraint ( Expression ( terms ), ĠRel ational Operator . Equals , Ġcli pped Strength ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠWhat Ġis Ġgoing Ġon Ġhere ? ĠWhy Ġthe Ġerrors Ġare Ġsil ence ? ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Constraint ( constraint ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠDuplicate Constraint Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn satisf iable Constraint Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠEdit Info ( constraint , Ġconstraints [ constraint ], Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġedits [ variable ] Ġ= Ġinfo ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Edit Variable ( variable : ĠVariable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġedit Ġ= Ġedits [ variable ] Ġ?: Ġthrow ĠUnknown Edit Variable Exception () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Constraint ( edit . constraint ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUnknown Constraint Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġedits . remove ( variable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Edit Variable ( variable : ĠVariable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġedits . containsKey ( variable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsuggest Value ( variable : ĠVariable , Ġvalue : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġedits [ variable ] Ġ?: Ġthrow ĠUnknown Edit Variable Exception () ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġvalue Ġ- Ġinfo . constant ĊĠĠĠĠĠĠĠ Ġinfo . constant Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġvar Ġrow Ġ= Ġrows [ info . tag !!. marker ] ĊĠĠĠĠĠĠĠ Ġif Ġ( row Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row . add (- delta ) Ġ< Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin fe asible Rows . add ( info . tag !!. marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdual Optimize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrow Ġ= Ġrows [ info . tag !!. other ] ĊĠĠĠĠĠĠĠ Ġif Ġ( row Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row . add ( delta ) Ġ< Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin fe asible Rows . add ( info . tag !!. other ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdual Optimize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġrows . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Row Ġ= Ġrows [ s ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoefficient Ġ= Ġcurrent Row !!. coefficient For ( info . tag !!. marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( coefficient Ġ!= Ġ 0 . 0 Ġ&& Ġcurrent Row . add ( delta Ġ* Ġcoefficient ) Ġ< Ġ 0 . 0 Ġ&& Ġs . type Ġ!= ĠSymbol Type . EXTERNAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin fe asible Rows . add ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdual Optimize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe Ġvalues Ġof Ġthe Ġexternal Ġsolver Ġvariables . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Variables () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( variable , Ġvalue ) Ġin Ġvars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġrows [ value ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . value Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable . value Ġ= Ġrow . constant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġnew ĠRow Ġobject Ġfor Ġthe Ġgiven Ġconstraint . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġterms Ġin Ġthe Ġconstraint Ġwill Ġbe Ġconverted Ġto Ġcells Ġin Ġthe Ġrow . ĊĠĠĠĠ Ġ* ĠAny Ġterm Ġin Ġthe Ġconstraint Ġwith Ġa Ġcoefficient Ġof Ġzero Ġis Ġignored . ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġuses Ġthe Ġ` getVar Symbol ` Ġmethod Ġto Ġget Ġthe Ġsymbol Ġfor ĊĠĠĠĠ Ġ* Ġthe Ġvariables Ġadded Ġto Ġthe Ġrow . ĠIf Ġthe Ġsymbol Ġfor Ġa Ġgiven Ġcell ĊĠĠĠĠ Ġ* Ġvariable Ġis Ġbasic , Ġthe Ġcell Ġvariable Ġwill Ġbe Ġsubstit uted Ġwith Ġthe ĊĠĠĠĠ Ġ* Ġbasic Ġrow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġnecessary Ġslack Ġand Ġerror Ġvariables Ġwill Ġbe Ġadded Ġto Ġthe Ġrow . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġconstant Ġfor Ġthe Ġrow Ġis Ġnegative , Ġthe Ġsign Ġfor Ġthe Ġrow ĊĠĠĠĠ Ġ* Ġwill Ġbe Ġinverted Ġso Ġthe Ġconstant Ġbecomes Ġpositive . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġtag Ġwill Ġbe Ġupdated Ġwith Ġthe Ġmarker Ġand Ġerror Ġsymbols Ġto Ġuse ĊĠĠĠĠ Ġ* Ġfor Ġtracking Ġthe Ġmovement Ġof Ġthe Ġconstraint Ġin Ġthe Ġtable au . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Row ( constraint : ĠConstraint , Ġtag : ĠTag ): ĠRow Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġconstraint . expression ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= ĠRow ( expression . constant ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( term Ġin Ġexpression . terms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Util . near Zero ( term . coefficient )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġget Var Symbol OrCreate External ( term . variable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Row Ġ= Ġrows [ symbol ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Row Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . insert ( symbol , Ġterm . coefficient ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . insert ( other Row , Ġterm . coefficient ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( constraint . operator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRel ational Operator . LessThan , ĠRel ational Operator . GreaterThan Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoeff Ġ= Ġif Ġ( constraint . operator Ġ== ĠRel ational Operator . LessThan ) Ġ 1 . 0 Ġelse Ġ- 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġslack Ġ= ĠSymbol ( Symbol Type . SL ACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag . marker Ġ= Ġslack ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . insert ( slack , Ġcoeff ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constraint . strength Ġ< ĠSt rength . REQUIRED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠSymbol ( Symbol Type . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag . other Ġ= Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . insert ( error , Ġ- coeff ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobjective . insert ( error , Ġconstraint . strength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRel ational Operator . Equals Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constraint . strength Ġ< ĠSt rength . REQUIRED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerr plus Ġ= ĠSymbol ( Symbol Type . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerr minus Ġ= ĠSymbol ( Symbol Type . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag . marker Ġ= Ġerr plus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag . other Ġ= Ġerr minus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . insert ( err plus , Ġ- 1 . 0 ) Ġ// Ġv Ġ= Ġe plus Ġ- Ġem in us ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . insert ( err minus , Ġ 1 . 0 ) Ġ// Ġv Ġ- Ġe plus Ġ+ Ġem in us Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobjective . insert ( err plus , Ġconstraint . strength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobjective . insert ( err minus , Ġconstraint . strength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdummy Ġ= ĠSymbol ( Symbol Type . D UMMY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag . marker Ġ= Ġdummy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . insert ( dummy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthe Ġrow Ġas Ġa Ġpositive Ġconstant . ĊĠĠĠĠĠĠĠ Ġif Ġ( row . constant Ġ< Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow . reverse Sign () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġthe Ġrow Ġto Ġthe Ġtable au Ġusing Ġan Ġart ificial Ġvariable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġwill Ġreturn Ġfalse Ġif Ġthe Ġconstraint Ġcannot Ġbe Ġsatisfied . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd With Art ificial Variable ( row : ĠRow ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// TODO Ġcheck Ġthis ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġand Ġadd Ġthe Ġart ificial Ġvariable Ġto Ġthe Ġtable au ĊĠĠĠĠĠĠĠ Ġval Ġart Ġ= ĠSymbol ( Symbol Type . SL ACK ) ĊĠĠĠĠĠĠĠ Ġrows [ art ] Ġ= ĠRow ( row ) ĊĠĠĠĠĠĠĠ Ġart ificial Ġ= ĠRow ( row ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOpt imize Ġthe Ġart ificial Ġobjective . ĠThis Ġis Ġsuccessful ĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġif Ġthe Ġart ificial Ġobjective Ġis Ġoptimized Ġto Ġzero . ĊĠĠĠĠĠĠĠ Ġoptimize ( art ificial !! ) ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= ĠUtil . near Zero ( art ificial !!. constant ) ĊĠĠĠĠĠĠĠ Ġart ificial Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġart ificial Ġvariable Ġis Ġbasic , Ġpivot Ġthe Ġrow Ġso Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġbecomes Ġbasic . ĠIf Ġthe Ġrow Ġis Ġconstant , Ġexit Ġearly . ĊĠĠĠĠĠĠĠ Ġval Ġart ificial Row Ġ= Ġrows [ art ] ĊĠĠĠĠĠĠĠ Ġif Ġ( art ificial Row Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelete Queue Ġ= ĠLinkedList < Symbol >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( symbol , Ġcurrent Row ) Ġin Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Row Ġ=== Ġart ificial Row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Queue . add ( symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( delete Queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrows . remove ( delete Queue . pop ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Queue . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( art ificial Row . cells . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuccess ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentering Ġ= Ġany Pivot able Symbol ( art ificial Row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enter ing . type Ġ== ĠSymbol Type . INVALID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġ// Ġun satisf iable Ġ( will Ġthis Ġever Ġhappen ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġart ificial Row . solve For ( art , Ġentering ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubstitute ( enter ing , Ġart ificial Row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows [ enter ing ] Ġ= Ġart ificial Row ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġthe Ġart ificial Ġvariable Ġfrom Ġthe Ġtable au . ĊĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġvalue ) Ġin Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . remove ( art ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobjective . remove ( art ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuccess ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubstitute Ġthe Ġparame tric Ġsymbol Ġwith Ġthe Ġgiven Ġrow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġsubstitute Ġall Ġinstances Ġof Ġthe Ġparame tric Ġsymbol ĊĠĠĠĠ Ġ* Ġin Ġthe Ġtable au Ġand Ġthe Ġobjective Ġfunction Ġwith Ġthe Ġgiven Ġrow . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsubstitute ( symbol : ĠSymbol , Ġrow : ĠRow ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . substitute ( symbol , Ġrow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . type Ġ!= ĠSymbol Type . EXTERNAL Ġ&& Ġvalue . constant Ġ< Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin fe asible Rows . add ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobjective . substitute ( symbol , Ġrow ) ĊĠĠĠĠĠĠĠ Ġart ificial ?. substitute ( symbol , Ġrow ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpt imize Ġthe Ġsystem Ġfor Ġthe Ġgiven Ġobjective Ġfunction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġperforms Ġiterations Ġof ĠPhase Ġ 2 Ġof Ġthe Ġsimp lex Ġmethod ĊĠĠĠĠ Ġ* Ġuntil Ġthe Ġobjective Ġfunction Ġreaches Ġa Ġminimum . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠInternal Solver Error ĠThe Ġvalue Ġof Ġthe Ġobjective Ġfunction Ġis Ġun bounded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġoptimize ( objective : ĠRow ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentering Ġ= Ġget Enter ing Symbol OrCreate Invalid ( objective ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enter ing . type Ġ== ĠSymbol Type . INVALID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġget Le aving Row ( enter ing ) Ġ?: Ġthrow ĠInternal Solver Error (" The Ġobjective Ġis Ġun bounded .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġleaving : ĠSymbol ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġrows . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rows [ key ] Ġ=== Ġentry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleaving Ġ= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġentry Key : ĠSymbol ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġrows . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rows [ key ] Ġ=== Ġentry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Key Ġ= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows . remove ( entry Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . solve For ( le aving !! , Ġentering ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubstitute ( enter ing , Ġentry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows [ enter ing ] Ġ= Ġentry ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdual Optimize () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( in fe asible Rows . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaving Ġ= Ġin fe asible Rows . remove At ( in fe asible Rows . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Ġ= Ġrows [ le aving ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Ġ!= Ġnull Ġ&& Ġrow . constant Ġ< Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentering Ġ= Ġget Dual Enter ing Symbol ( row ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enter ing . type Ġ== ĠSymbol Type . INVALID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Solver Error (" internal Ġsolver Ġerror ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrows . remove ( le aving ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow . solve For ( le aving , Ġentering ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstitute ( enter ing , Ġrow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrows [ enter ing ] Ġ= Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Dual Enter ing Symbol ( row : ĠRow ): ĠSymbol Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġentering Ġ= ĠSymbol () ĊĠĠĠĠĠĠĠ Ġvar Ġratio Ġ= ĠDouble . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġfor Ġ(( s , Ġcurrent Cell ) Ġin Ġrow . cells ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s . type Ġ!= ĠSymbol Type . D UMMY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Cell Ġ> Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcoefficient Ġ= Ġobjective . coefficient For ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġcoefficient Ġ/ Ġcurrent Cell ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r Ġ< Ġratio ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ= Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentering Ġ= Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġentering ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġfirst ĠSlack Ġor ĠError Ġsymbol Ġin Ġthe Ġrow . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġno Ġsuch Ġsymbol Ġis Ġpresent , Ġand ĠInvalid Ġsymbol Ġwill Ġbe Ġreturned . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġany Pivot able Symbol ( row : ĠRow ): ĠSymbol Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsymbol Ġ= ĠSymbol () ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key ) Ġin Ġrow . cells ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . type Ġ== ĠSymbol Type . SL ACK Ġ|| Ġkey . type Ġ== ĠSymbol Type . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsymbol ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCompute Ġthe Ġrow Ġwhich Ġholds Ġthe Ġexit Ġsymbol Ġfor Ġa Ġpivot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġdocumentation Ġis Ġcopied Ġfrom Ġthe ĠC ++ Ġversion Ġand Ġis Ġoutdated ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġreturn Ġa Ġrow Ġin Ġthe Ġrow Ġmap ĊĠĠĠĠ Ġ* Ġwhich Ġholds Ġthe Ġexit Ġsymbol . ĠIf Ġno Ġappropriate Ġexit Ġsymbol Ġis ĊĠĠĠĠ Ġ* Ġfound , Ġnull Ġwill Ġbe Ġreturned . ĠThis Ġindicates Ġthat ĊĠĠĠĠ Ġ* Ġthe Ġobjective Ġfunction Ġis Ġun bounded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Le aving Row ( enter ing : ĠSymbol ): ĠRow ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġratio Ġ= ĠDouble . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġvar Ġrow : ĠRow ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġcandidate Row ) Ġin Ġrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . type Ġ!= ĠSymbol Type . EXTERNAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġcandidate Row . coefficient For ( enter ing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ratio Ġ= Ġ- candidate Row . constant Ġ/ Ġtemp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Ratio Ġ< Ġratio ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġratio Ġ= Ġtemp Ratio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Ġ= Ġcandidate Row ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Var Symbol OrCreate External ( variable : ĠVariable ): ĠSymbol Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfound Symbol Ġ= Ġvars [ variable ] ĊĠĠĠĠĠĠĠ Ġif Ġ( found Symbol Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfound Symbol Ġ= ĠSymbol ( Symbol Type . EXTERNAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvars [ variable ] Ġ= Ġfound Symbol ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfound Symbol ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠChoose Ġthe Ġsubject Ġfor Ġsolving Ġfor Ġthe Ġrow ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġchoose Ġthe Ġbest Ġsubject Ġfor Ġusing Ġas Ġthe Ġsolve ĊĠĠĠĠĠĠĠĠ Ġ* Ġtarget Ġfor Ġthe Ġrow . ĠAn Ġinvalid Ġsymbol Ġwill Ġbe Ġreturned Ġif Ġthere ĊĠĠĠĠĠĠĠĠ Ġ* Ġis Ġno Ġvalid Ġtarget . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġsymbols Ġare Ġchosen Ġaccording Ġto Ġthe Ġfollowing Ġprecedence : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 1 ) ĠThe Ġfirst Ġsymbol Ġrepresenting Ġan Ġexternal Ġvariable . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 2 ) ĠA Ġnegative Ġslack Ġor Ġerror Ġtag Ġvariable . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġa Ġsubject Ġcannot Ġbe Ġfound , Ġan Ġinvalid Ġsymbol Ġwill Ġbe Ġreturned . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġchoose Subject ( row : ĠRow , Ġtag : ĠTag ): ĠSymbol Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key ) Ġin Ġrow . cells ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . type Ġ== ĠSymbol Type . EXTERNAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tag . marker . type Ġ== ĠSymbol Type . SL ACK Ġ|| Ġtag . marker . type Ġ== ĠSymbol Type . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row . coefficient For ( tag . marker ) Ġ< Ġ 0 . 0 ) Ġreturn Ġtag . marker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( tag . other . type Ġ== ĠSymbol Type . SL ACK Ġ|| Ġtag . other . type Ġ== ĠSymbol Type . ERROR )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( row . coefficient For ( tag . other ) Ġ< Ġ 0 . 0 ) Ġreturn Ġtag . other ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSymbol () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCompute Ġthe Ġentering Ġvariable Ġfor Ġa Ġpivot Ġoperation . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġreturn Ġfirst Ġsymbol Ġin Ġthe Ġobjective Ġfunction Ġwhich ĊĠĠĠĠĠĠĠĠ Ġ* Ġis Ġnon - dummy Ġand Ġhas Ġa Ġcoefficient Ġless Ġthan Ġzero . ĠIf Ġno Ġsymbol Ġme ets ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġcriteria , Ġit Ġmeans Ġthe Ġobjective Ġfunction Ġis Ġat Ġa Ġminimum , Ġand Ġan ĊĠĠĠĠĠĠĠĠ Ġ* Ġinvalid Ġsymbol Ġis Ġreturned . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Enter ing Symbol OrCreate Invalid ( objective : ĠRow ): ĠSymbol Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġobjective . cells ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . type Ġ!= ĠSymbol Type . D UMMY Ġ&& Ġvalue Ġ< Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSymbol () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrow Contains Only D um m ies ( row : ĠRow ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key ) Ġin Ġrow . cells ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . type Ġ!= ĠSymbol Type . D UMMY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠTag ( ĊĠĠĠĠĠĠĠ Ġvar Ġmarker : ĠSymbol , ĊĠĠĠĠĠĠĠ Ġvar Ġother : ĠSymbol ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor (): Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmarker Ġ= ĠSymbol (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġ= ĠSymbol () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠEdit Info ( ĊĠĠĠĠĠĠĠ Ġvar Ġconstraint : ĠConstraint , ĊĠĠĠĠĠĠĠ Ġvar Ġtag : ĠTag ?, ĊĠĠĠĠĠĠĠ Ġvar Ġconstant : ĠDouble ĊĠĠĠ Ġ) Ċ } Ċ