import Ġorg . apache . commons . math 3 . util . Open Int ToDouble HashMap Ċ import Ġjava . lang . RuntimeException Ċ import Ġkotlin . math . absolute Value Ċ Ċ class ĠDouble Simp lex ( constraints : ĠList < Mutable Constraint < Number >>, Ġobjective : ĠMap < Int , Number >, Ġinitial Solution : ĠMap < Int , Number >) Ġ{ ĊĊĠĠĠ Ġval Ġepsilon Ġ= Ġ 1 e - 6 ĊĠĠĠ Ġval Ġn Constraints : ĠInt Ġ= Ġconstraints . size ĊĊĠĠĠ Ġvar Ġfirst Slack Column : ĠInt Ġ= ĠInteger . max ( constraints . num Vars (), ĊĠĠĠĠĠĠĠ Ġobjective . keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. max () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġit Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġn Variables : ĠInt Ġ= Ġfirst Slack Column Ġ+ Ġconstraints . count Ġ{ Ġit . relation Ġ!= Ġ" ==" Ġ} ĊĊĊĠĠĠ Ġval Ġrows Ġ= ĠArrayList < Open Int ToDouble HashMap >( n Constraints Ġ+ Ġ 1 ) ĊĠĠĠ Ġval Ġcols Ġ= ĠArrayList < Open Int ToDouble HashMap >( n Variables Ġ+ Ġ 1 ) ĊĊĠĠĠ Ġval Ġbasic Col sBy Row Ġ= ĠInt Array ( n Constraints ) Ġ{ Ġ- 1 Ġ} ĊĠĠĠ Ġval Ġbasic Rows By Col Ġ= ĠInt Array ( n Variables ) Ġ{ Ġ- 1 Ġ} ĊĊĊĠĠĠ Ġval ĠM : ĠMatrix Ġ= Ġobject : ĠMatrix Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ( i : ĠInt , Ġj : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrows [ i ][ j ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset ( i : ĠInt , Ġj : ĠInt , Ġvalue : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Double Simp lex . set ( i , j , value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠB Ġ= Ġobject : ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ( i : ĠInt ) Ġ= Ġrows [ i ][ n Variables ] ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset ( i : ĠInt , Ġvalue : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Double Simp lex . set ( i , n Variables , value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġobjective Ġ= Ġobject : ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ( j : ĠInt ) Ġ= Ġrows [ n Constraints ][ j ] ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset ( j : ĠInt , Ġvalue : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Double Simp lex . set ( n Constraints , j , value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Trans f erring Ġconstraints Ġto Ġsimp lex Ġtable au ...") ĊĠĠĠĠĠĠĠ Ġvar Ġnext Slack Var Ġ= Ġfirst Slack Column ĊĠĠĠĠĠĠĠ Ġval Ġinitial Non Zero Columns Ġ= ĠArrayList ( initial Solution . keys ) ĊĠĠĠĠĠĠĠ Ġrows . ensure Capacity ( n Constraints Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġrepeat ( n Constraints Ġ+ Ġ 1 ) Ġ{ Ġrows . add ( Open Int ToDouble HashMap ( 0 . 0 )) Ġ} ĊĠĠĠĠĠĠĠ Ġcols . ensure Capacity ( n Variables + 1 ) ĊĠĠĠĠĠĠĠ Ġrepeat ( n Variables Ġ+ Ġ 1 ) Ġ{ Ġcols . add ( Open Int ToDouble HashMap ( 0 . 0 )) Ġ} ĊĠĠĠĠĠĠĠ Ġconstraints . forEach Indexed Ġ{ Ġi , Ġconstraint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġslack ness Ġ= Ġconstraint . slack ness ( initial Solution . map Values Ġ{ Ġit . value . toDouble () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( slack ness Ġ< Ġ 0 . 0 Ġ|| Ġ( constraint . relation Ġ== Ġ" ==" Ġ&& Ġslack ness Ġ!= Ġ 0 . 0 )) Ġprintln (" WARNING : Ġinitial Ġsolution Ġis Ġnot Ġfe asible : ĠSlack ness Ġ$ slack ness ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( slack ness Ġ!= Ġ 0 . 0 ) Ġinitial Non Zero Columns . add ( next Slack Var ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constraint . constant . toDouble () Ġ>= Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint . coefficient s . forEach Ġ{ Ġ( j , Ġx ) Ġ-> ĠM [ i , Ġj ] Ġ= Ġx . toDouble () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB [ i ] Ġ= Ġconstraint . constant . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( constraint . relation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< =" Ġ-> Ġ{ Ġbasic Col sBy Row [ i ] Ġ= Ġnext Slack Var ; ĠM [ i , Ġnext Slack Var ++] Ġ= Ġ 1 . 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"> =" Ġ-> Ġ{ ĠM [ i , Ġnext Slack Var ++] Ġ= Ġ- 1 . 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraint . coefficient s . forEach Ġ{ Ġ( j , Ġx ) Ġ-> ĠM [ i , Ġj ] Ġ= Ġ- x . toDouble () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB [ i ] Ġ= Ġ- constraint . constant . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( constraint . relation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< =" Ġ-> Ġ{ ĠM [ i , Ġnext Slack Var ++] Ġ= Ġ- 1 . 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"> =" Ġ-> Ġ{ Ġbasic Col sBy Row [ i ] Ġ= Ġnext Slack Var ; ĠM [ i , Ġnext Slack Var ++] Ġ= Ġ 1 . 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobjective . forEach Ġ{ Ġ( j , x ) Ġ-> Ġthis . objective [ j ] Ġ= Ġx . toDouble () Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln (" Initial Ġsize Ġ= Ġ${ rows . sum By Ġ{ it . size ()}} Ġ") ĊĠĠĠĠĠĠĠ Ġprintln (" Pivot ing Ġin Ġinitial Ġsolution ") ĊĠĠĠĠĠĠĠ Ġinitial Pivot ( initial Non Zero Columns ) ĊĠĠĠĠĠĠĠ Ġprintln (" Done ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun ĠX ( include Sl acks : ĠBoolean = false ): ĠMap < Int , Double > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= ĠHashMap < Int , Double >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġbasic Col sBy Row . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbasic Col Ġ= Ġbasic Col sBy Row [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠBi Ġ= ĠB [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (( include Sl acks Ġ|| Ġbasic Col Ġ< Ġfirst Slack Column ) Ġ&& ĠBi Ġ!= Ġ 0 . 0 ) Ġx [ basic Col ] Ġ= ĠB [ i ] Ġ/ ĠM [ i , Ġbasic Col ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset ( i : ĠInt , Ġj : ĠInt , Ġvalue : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( value . absolute Value Ġ> Ġepsilon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows [ i ]. put ( j , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcols [ j ]. put ( i , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrows [ i ]. remove ( j ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcols [ j ]. remove ( i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġpivot s Ġin Ġall Ġcolumns Ġin Ġthe Ġsupplied Ġlist ĊĠĠĠ Ġ// Ġthen Ġg reed ily Ġpivot s Ġin Ġany Ġremaining Ġrows ĊĠĠĠ Ġfun Ġinitial Pivot ( columns To Include : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcan Pivot Row Ġ= ĠArray ( basic Col sBy Row . size ) Ġ{ Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġpivot Row : ĠInt ĊĠĠĠĠĠĠĠ Ġfor ( j Ġin Ġcolumns To Include ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! is Basic Column ( j )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpivot Row Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( pivot Row Ġ< Ġn Constraints Ġ&& Ġ(! can Pivot Row [ pivot Row ] Ġ|| ĠM [ pivot Row , j ] Ġ== Ġ 0 . 0 )) Ġ++ pivot Row ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( pivot Row Ġ== Ġn Constraints ) Ġthrow ( IllegalArgumentException (" Can 't Ġpivot Ġin Ġinitial Ġpivot ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpivot ( pivot Row , Ġj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Pivot Row [ pivot Row ] Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Pivot Row [ basic Rows By Col [ j ]] Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpivot Out All Art ificial Variables () ĊĠĠĠĠĠĠĠ Ġcolumns To Include . forEach Ġ{ Ġassert ( Ġis Basic Column ( it ) Ġ) Ġ} ĊĠĠĠĠĠĠĠ Ġassert ( basic Col sBy Row . all Ġ{ Ġit Ġ!= Ġ- 1 Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġpivot s Ġin Ġany Ġrows Ġthat Ġaren 't Ġalready Ġpivot ed Ġin ĊĠĠĠ Ġ// Ġusing Ġa Ġg reedy Ġalgorithm : ĊĠĠĠ Ġ// Ġfor Ġeach Ġrow Ġin Ġturn , Ġchoose Ġto Ġpivot Ġon Ġthe Ġcolumn Ġwith Ġsmallest ĊĠĠĠ Ġ// Ġsparse Ġsize Ġamong Ġall Ġthat Ġresult Ġin Ġa Ġnon - negative Ġpivot Ġvalue ĊĠĠĠ Ġfun Ġpivot Out All Art ificial Variables () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( pivot Row Ġin Ġbasic Col sBy Row . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( basic Col sBy Row [ pivot Row ] Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠBi Ġ= ĠB [ pivot Row ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiter Ġ= Ġrows [ pivot Row ]. iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( iter . hasNext ()) Ġiter . advance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( iter . hasNext () Ġ&& ĠBi / iter . value () Ġ<= Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiter . advance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Bi / iter . value () Ġ>= Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpivot ( pivot Row , Ġiter . key ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ( RuntimeException (" No Ġelements Ġto Ġpivot Ġon .")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ// ĠDoes Ġthe Ġactual Ġpivot ing Ġof ĠM ĊĠĠĠ Ġ// ĠFor Ġa Ġpivot Ġat Ġpoint Ġ( i , j ), Ġthe Ġk 't h Ġrow Ġof ĠM Ġand ĠB Ġis Ġupdated Ġaccording Ġto ĊĠĠĠ Ġ// ĠM _ k ' Ġ= Ġ( M _ ij * M _ k Ġ- ĠM _ kj * M _ i )/ G ĊĠĠĠ Ġ// Ġwhere ĠG Ġis Ġthe Ġgreatest Ġcommon Ġdivisor Ġof ĠM _ ij Ġand ĠM _ kj ĊĠĠĠ Ġ// Ġif Ġthe Ġpivot Ġpoint Ġis Ġ- ve , Ġmultip lies Ġthe Ġpivot Ġrow Ġby Ġ- 1 Ġto Ġmake Ġit Ġpositive ĊĠĠĠ Ġ// Ġfun Ġpivot ( point : ĠP ivot Point ) Ġ= Ġpivot ( point . row , Ġpoint . col ) ĊĠĠĠ Ġfun Ġpivot ( i : ĠInt , Ġj : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠM ij Ġ= ĠM [ i , j ] ĊĊĠĠĠĠĠĠĠ Ġval Ġrow Indices Ġ= Ġrow Keys ( i ) ĊĠĠĠĠĠĠĠ Ġval Ġrow Values Ġ= ĠArray ( row Indices . size ) Ġ{ Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġrow Indices [ m ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Row Val Ġ= ĠM [ i , k ] Ġ/ ĠM ij ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM [ i , k ] Ġ= Ġnew Row Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Row Val ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor ( row Ġin Ġ 0 Ġuntil Ġn Constraints ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Weight Ġ= ĠM [ row , j ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( row Ġ!= Ġi Ġ&& Ġrow Weight Ġ!= Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( row Entry Ġin Ġrow Indices . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM [ row , Ġrow Indices [ row Entry ]] Ġ-= Ġrow Values [ row Entry ] Ġ* Ġrow Weight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġleaving Column Ġ= Ġbasic Col sBy Row [ i ] ĊĠĠĠĠĠĠĠ Ġif ( le aving Column Ġ!= Ġ- 1 ) Ġbasic Rows By Col [ le aving Column ] Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġbasic Col sBy Row [ i ] Ġ= Ġj ĊĠĠĠĠĠĠĠ Ġbasic Rows By Col [ j ] Ġ= Ġi ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġrow Keys ( i : ĠInt ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiter Ġ= Ġrows [ i ]. iterator () ĊĠĠĠĠĠĠĠ Ġreturn ĠInt Array ( rows [ i ]. size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiter . advance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiter . key () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠReturns Ġthe Ġrows Ġin Ġcolumn Ġj Ġthat Ġare ĊĠĠĠ Ġ// Ġpivot Ġpoints Ġthat Ġmaintain Ġa Ġpositive Ġsolution ĊĠĠĠ Ġfun Ġpivot able Rows ( j : ĠInt , Ġallow Pivot s On Negative Elements : ĠBoolean ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( is Basic Column ( j )) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġvar Ġd X j max : ĠDouble ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġlimits Ġ= ĠArrayList < Pair < Int , Double >>() ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġn Constraints ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠM ij Ġ= ĠM [ i , j ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( M ij Ġ> Ġ 0 . 0 Ġ|| Ġ( allow Pivot s On Negative Elements Ġ&& ĠB [ i ] Ġ<= Ġ 0 . 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd X ji Ġ= ĠB [ i ]/ M ij ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dX ji Ġ<= Ġd X j max ?: dX ji ) Ġd X j max Ġ= Ġd X ji ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimits . add ( Pair ( i , Ġd X ji )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlimits ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second Ġ== Ġd X j max Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġtrue Ġif Ġthis Ġcolumn Ġis Ġcurrently Ġa Ġbasic Ġvariable ĊĠĠĠ Ġfun Ġis Basic Column ( j : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbasic Rows By Col [ j ] Ġ!= Ġ- 1 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinterface ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġget ( i : ĠInt ): ĠDouble ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( i : ĠInt , Ġvalue : ĠDouble ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠMatrix Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġget ( i : ĠInt , Ġj : ĠInt ): ĠDouble ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġset ( i : ĠInt , Ġj : ĠInt , Ġvalue : ĠDouble ) ĊĠĠĠ Ġ} ĊĊ Ċ }