package Ġai . hyper graph . kal ining raph . matrix Ċ Ċ import Ġai . hyper graph . kal ining raph .* Ċ import Ġai . hyper graph . kal ining raph . types .* Ċ import Ġorg . ej ml . data .* Ċ import Ġorg . ej ml . kotlin .* Ċ import Ġjava . lang . reflect . Constructor Ċ import Ġkotlin . math .* Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* ĠGeneric Ġmatrix Ġwhich Ġsupports Ġoverload able Ġaddition Ġand Ġmultiplication Ċ Ġ* Ġusing Ġan Ġabstract Ġalgebra Ġ( e . g . Ġt rop ical Ġsem iring ). ĠUseful Ġfor Ġmany Ċ Ġ* Ġproblems Ġin Ġgraph Ġtheory . Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ Matrix Ring ] Ċ Ġ*/ Ċ Ċ interface ĠMatrix < T , ĠR Ġ: ĠRing < T , ĠR >, ĠM Ġ: ĠMatrix < T , ĠR , ĠM >> Ġ: ĠSparse Tensor < Triple < Int , ĠInt , ĠT >> Ġ{ ĊĠ Ġval Ġdata : ĠList < T > ĊĠ Ġoverride Ġval Ġmap : ĠMutable Map < Triple < Int , ĠInt , ĠT >, ĠInt > Ġget () Ġ= ĠTODO () ĊĊĠ Ġval Ġnum Rows : ĠInt ĊĠ Ġval Ġnum Cols : ĠInt ĊĠ Ġval Ġalgebra : ĠMatrix Ring < T , ĠR > ĊĊĠ Ġval Ġindices Ġget () Ġ= Ġ( 0 Ġuntil Ġnum Rows ) Ġ* Ġ( 0 Ġuntil Ġnum Cols ) ĊĠ Ġval Ġrows Ġget () Ġ= Ġdata . chunk ed ( num Cols ) ĊĠ Ġval Ġcols Ġget () Ġ= Ġ( 0 Ġuntil Ġnum Cols ). map Ġ{ Ġc Ġ-> Ġrows . map Ġ{ Ġit [ c ] Ġ} Ġ} ĊĊĠ Ġoperator Ġfun Ġtimes ( that : ĠM ): ĠM Ġ= Ġwith ( algebra ) Ġ{ Ġthis @ Matrix Ġtimes Ġthat Ġ} ĊĠ Ġoperator Ġfun Ġplus ( that : ĠM ): ĠM Ġ= Ġwith ( algebra ) Ġ{ Ġthis @ Matrix Ġplus Ġthat Ġ} ĊĊĠ Ġ// ĠConstructs Ġa Ġnew Ġinstance Ġwith Ġthe Ġsame Ġconcrete Ġmatrix Ġtype ĊĠ Ġfun Ġnew ( num Cols : ĠInt , Ġnum Rows : ĠInt , Ġalgebra : ĠMatrix Ring < T , ĠR >, Ġdata : ĠList < T >): ĠM Ġ= ĊĠĠĠ Ġ( java Class . get Constructor ( ĊĠĠĠĠĠ ĠMatrix Ring :: class . java , ĠInt :: class . java , ĠInt :: class . java , ĠList :: class . java ĊĠĠĠ Ġ) Ġas ĠConstructor < M >). newInstance ( algebra , Ġnum Cols , Ġnum Rows , Ġdata ) ĊĊĠ Ġfun Ġjoin ( that : ĠMatrix < T , ĠR , ĠM >, Ġop : Ġ( Int , ĠInt ) Ġ-> ĠT ): ĠM Ġ= ĊĠĠĠ Ġassert ( num Cols Ġ== Ġthat . num Rows ) Ġ{ ĊĠĠĠĠĠ Ġ" Dimension Ġmismatch : Ġ$ num Rows ,$ num Cols Ġ. Ġ${ that . num Rows }, ${ that . num Cols }" ĊĠĠĠ Ġ}. run Ġ{ Ġnew ( num Cols , Ġthat . num Rows , Ġalgebra , Ġindices . map Ġ{ Ġ( i , Ġj ) Ġ-> Ġop ( i , Ġj ) Ġ}) Ġ} ĊĊĠ Ġoperator Ġfun Ġget ( r : ĠAny , Ġc : ĠAny ): ĠT Ġ= ĠTODO (" Implement Ġsupport Ġfor Ġnamed Ġindexing ") ĊĠ Ġoperator Ġfun Ġget ( r : ĠInt , Ġc : ĠInt ): ĠT Ġ= Ġdata [ r Ġ* Ġnum Cols Ġ+ Ġc ] ĊĠ Ġoperator Ġfun Ġget ( r : ĠInt ): ĠList < T > Ġ= ĊĠĠĠ Ġdata . toList (). sub List ( r Ġ* Ġnum Cols , Ġr Ġ* Ġnum Cols Ġ+ Ġnum Cols ) ĊĊĠ Ġfun Ġtranspose (): ĠM Ġ= Ġnew ( num Cols , Ġnum Rows , Ġalgebra , Ġindices . map Ġ{ Ġ( i , Ġj ) Ġ-> Ġthis [ j , Ġi ] Ġ}) Ċ } Ċ Ċ /** Ċ Ġ* ĠAd Ġh oc Ġpol ymorphic Ġalgebra Ġ( can Ġbe Ġspecified Ġat Ġruntime ). Ċ Ġ*/ Ċ Ċ interface ĠMatrix Ring < T , ĠR Ġ: ĠRing < T , ĠR >> Ġ{ ĊĠ Ġval Ġalgebra : ĠR ĊĊĠ Ġin fix Ġfun Ġ< M Ġ: ĠMatrix < T , ĠR , ĠM >> ĠMatrix < T , ĠR , ĠM >. plus ( that : ĠMatrix < T , ĠR , ĠM >): ĠM Ġ= ĊĠĠĠ Ġjoin ( that ) Ġ{ Ġi , Ġj Ġ-> Ġwith ( this @ Matrix Ring . algebra ) Ġ{ Ġthis @ plus [ i ][ j ] Ġ+ Ġthat [ i ][ j ] Ġ} Ġ} ĊĊĠ Ġin fix Ġfun ĠList < T >. dot ( es : ĠList < T >): ĠT Ġ= ĊĠĠĠ Ġwith ( algebra ) Ġ{ Ġzip ( es ). map Ġ{ Ġ( a , Ġb ) Ġ-> Ġa Ġ* Ġb Ġ}. reduce Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} Ġ} ĊĊĠ Ġin fix Ġfun Ġ< M Ġ: ĠMatrix < T , ĠR , ĠM >> ĠMatrix < T , ĠR , ĠM >. times ( that : ĠMatrix < T , ĠR , ĠM >): ĠM Ġ= ĊĠĠĠ Ġjoin ( that ) Ġ{ Ġi , Ġj Ġ-> Ġthis [ i ] Ġdot Ġthat [ j ] Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġ< T , ĠR Ġ: ĠRing < T , ĠR >> Ġinvoke ( ring : ĠR ) Ġ= ĊĠĠĠĠĠ Ġobject Ġ: ĠMatrix Ring < T , ĠR > Ġ{ Ġoverride Ġval Ġalgebra : ĠR Ġ= Ġring Ġ} ĊĠ Ġ} Ċ } Ċ Ċ // ĠRing Ġwith Ġadd itive Ġinverse Ċ interface ĠMatrix Field < T , ĠR Ġ: ĠField < T , ĠR >> : ĠMatrix Ring < T , ĠR > Ġ{ ĊĠ Ġoverride Ġval Ġalgebra : ĠR ĊĊĠ Ġin fix Ġfun Ġ< M Ġ: ĠMatrix < T , ĠR , ĠM >> ĠMatrix < T , ĠR , ĠM >. minus ( that : ĠMatrix < T , ĠR , ĠM >): ĠM Ġ= ĊĠĠĠ Ġjoin ( that ) Ġ{ Ġi , Ġj Ġ-> Ġwith ( this @ Matrix Field . algebra ) Ġ{ Ġthis @ minus [ i ][ j ] Ġ- Ġthat [ i ][ j ] Ġ} Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġ< T , ĠR Ġ: ĠField < T , ĠR >> Ġinvoke ( field : ĠR ) Ġ= ĊĠĠĠĠĠ Ġobject Ġ: ĠMatrix Field < T , ĠR > Ġ{ Ġoverride Ġval Ġalgebra : ĠR Ġ= Ġfield Ġ} ĊĠ Ġ} Ċ } Ċ Ċ // Ġhttps :// www . ij ca i . org / Proceedings / 2 0 2 0 / 0 6 8 5 . pdf Ċ Ċ val ĠBOOLEAN _ AL GE BR A Ġ= ĠMatrix Ring ( ĊĠ ĠRing . of ( ĊĠĠĠ Ġnil Ġ= Ġfalse , ĊĠĠĠ Ġone Ġ= Ġtrue , ĊĠĠĠ Ġplus Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ|| Ġb Ġ}, ĊĠĠĠ Ġtimes Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ&& Ġb Ġ} ĊĠ Ġ) Ċ ) Ċ Ċ val ĠINTEGER _ FIELD Ġ= ĠMatrix Field ( ĊĠ ĠField . of ( ĊĠĠĠ Ġnil Ġ= Ġ 0 , ĊĠĠĠ Ġone Ġ= Ġ 1 , ĊĠĠĠ Ġplus Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ}, ĊĠĠĠ Ġminus Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ- Ġb Ġ}, ĊĠĠĠ Ġtimes Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ* Ġb Ġ}, ĊĠĠĠ Ġdiv Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġthrow ĠNotImplementedError (" Division Ġnot Ġdefined Ġon Ġinteger Ġfield .") Ġ} ĊĠ Ġ) Ċ ) Ċ Ċ val ĠDOUBLE _ FIELD Ġ= ĠMatrix Field ( ĊĠ ĠField . of ( ĊĠĠĠ Ġnil Ġ= Ġ 0 . 0 , ĊĠĠĠ Ġone Ġ= Ġ 1 . 0 , ĊĠĠĠ Ġplus Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ}, ĊĠĠĠ Ġminus Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ- Ġb Ġ}, ĊĠĠĠ Ġtimes Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ* Ġb Ġ}, ĊĠĠĠ Ġdiv Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ/ Ġb Ġ} ĊĠ Ġ) Ċ ) Ċ Ċ val ĠMIN PLUS _ AL GE BR A Ġ= ĠMatrix Ring ( ĊĠ ĠRing . of ( ĊĠĠĠ Ġnil Ġ= ĠInteger . MAX _ VALUE , ĊĠĠĠ Ġone Ġ= Ġ 0 , ĊĠĠĠ Ġplus Ġ= Ġ{ Ġa , Ġb Ġ-> Ġmin ( a , Ġb ) Ġ}, ĊĠĠĠ Ġtimes Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĠ Ġ) Ċ ) Ċ Ċ val ĠMAX PLUS _ AL GE BR A Ġ= ĠMatrix Ring ( ĊĠ ĠRing . of ( ĊĠĠĠ Ġnil Ġ= ĠInteger . MIN _ VALUE , ĊĠĠĠ Ġone Ġ= Ġ 0 , ĊĠĠĠ Ġplus Ġ= Ġ{ Ġa , Ġb Ġ-> Ġmax ( a , Ġb ) Ġ}, ĊĠĠĠ Ġtimes Ġ= Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĠ Ġ) Ċ ) Ċ Ċ abstract Ġclass ĠAbstract Matrix < T , ĠR : ĠRing < T , ĠR >, ĠM : ĠAbstract Matrix < T , ĠR , ĠM >> Ġconstructor ( ĊĠ Ġoverride Ġval Ġalgebra : ĠMatrix Ring < T , ĠR >, ĊĠ Ġoverride Ġval Ġnum Rows : ĠInt , ĊĠ Ġoverride Ġval Ġnum Cols : ĠInt Ġ= Ġnum Rows , ĊĠ Ġoverride Ġval Ġdata : ĠList < T >, Ċ ) Ġ: ĠMatrix < T , ĠR , ĠM > Ġ{ ĊĠ Ġval Ġvalues Ġby Ġlazy Ġ{ Ġdata . toSet () Ġ} ĊĠ Ġoverride Ġval Ġmap : ĠMutable Map < Triple < Int , ĠInt , ĠT >, ĠInt > Ġby Ġlazy Ġ{ ĊĠĠĠ Ġindices . fold ( mutable Map Of ()) Ġ{ Ġmap , Ġ( r , Ġc ) Ġ-> ĊĠĠĠĠĠ Ġval Ġelement Ġ= Ġget ( r , Ġc ) ĊĠĠĠĠĠ Ġif Ġ( element Ġ!= Ġalgebra . algebra . nil ) Ġmap [ Triple ( r , Ġc , Ġelement )] Ġ= Ġ 1 ĊĠĠĠĠĠ Ġmap ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠtoString () Ġ= ĊĠĠĠ Ġdata . max Of Ġ{ Ġit . toString (). length Ġ+ Ġ 2 Ġ}. let Ġ{ Ġpad Ġ-> ĊĠĠĠĠĠ Ġdata . fold Indexed ("") Ġ{ Ġi , Ġa , Ġb Ġ-> ĊĠĠĠĠĠĠĠ Ġa Ġ+ Ġ"$ b ". pad End ( pad , Ġ' Ġ') Ġ+ Ġ" Ġ" Ġ+ Ġif Ġ( i Ġ> Ġ 0 Ġ&& Ġ( i Ġ+ Ġ 1 ) Ġ% Ġnum Cols Ġ== Ġ 0 ) Ġ"\ n " Ġelse Ġ"" ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= ĊĠĠĠ Ġother Ġis ĠFree Matrix < *> Ġ&& Ġdata . zip ( other . data ). all Ġ{ Ġ( a , Ġb ) Ġ-> Ġa Ġ== Ġb Ġ} Ġ|| ĊĠĠĠĠĠ Ġother Ġis ĠMatrix < *, Ġ*, Ġ*> Ġ&& Ġother . data Ġ== Ġdata ĊĊĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġdata . hashCode () Ċ } Ċ Ċ // ĠA Ġfree Ġmatrix Ġhas Ġno Ġassociated Ġalgebra Ġby Ġdefault . ĠIf Ġyou Ġtry Ġto Ġdo Ġmath Ċ // Ġwith Ġthe Ġdefault Ġimplementation Ġit Ġwill Ġfail Ġat Ġruntime . Ċ open Ġclass ĠFree Matrix < T > Ġconstructor ( ĊĠ Ġoverride Ġval Ġalgebra : ĠMatrix Ring < T , ĠRing . of < T >> Ġ= ĊĠĠĠ Ġobject Ġ: ĠMatrix Ring < T , ĠRing . of < T >> Ġ{ Ġoverride Ġval Ġalgebra : ĠRing . of < T > Ġby Ġlazy Ġ{ ĠTODO () Ġ} Ġ}, ĊĠ Ġoverride Ġval Ġnum Rows : ĠInt , ĊĠ Ġoverride Ġval Ġnum Cols : ĠInt Ġ= Ġnum Rows , ĊĠ Ġoverride Ġval Ġdata : ĠList < T >, Ċ ) Ġ: ĠAbstract Matrix < T , ĠRing . of < T >, ĠFree Matrix < T >>( algebra , Ġnum Rows , Ġnum Cols , Ġdata ) Ġ{ ĊĠ Ġconstructor ( elements : ĠList < T >) Ġ: Ġthis ( ĊĠĠĠ Ġnum Rows Ġ= Ġsqrt ( elements . size . toDouble ()). toInt (), ĊĠĠĠ Ġdata Ġ= Ġelements ĊĠ Ġ) ĊĊĠ Ġconstructor ( num Rows : ĠInt , Ġnum Cols : ĠInt Ġ= Ġnum Rows , Ġf : Ġ( Int , ĠInt ) Ġ-> ĠT ) Ġ: Ġthis ( ĊĠĠĠ Ġnum Rows Ġ= Ġnum Rows , ĊĠĠĠ Ġnum Cols Ġ= Ġnum Cols , ĊĠĠĠ Ġdata Ġ= ĠList ( num Rows Ġ* Ġnum Cols ) Ġ{ Ġf ( it Ġ/ Ġnum Rows , Ġit Ġ% Ġnum Cols ) Ġ} ĊĠ Ġ) ĊĊĠ Ġconstructor ( var arg Ġrows : ĠT ) Ġ: Ġthis ( rows . toList ()) Ċ } Ċ Ċ // ĠConcrete Ġsubclasses Ċ open Ġclass ĠBoolean Matrix Ġconstructor ( ĊĠ Ġoverride Ġval Ġalgebra : ĠMatrix Ring < Boolean , ĠRing . of < Boolean >> Ġ= ĠBOOLEAN _ AL GE BR A , ĊĠ Ġoverride Ġval Ġnum Rows : ĠInt , ĊĠ Ġoverride Ġval Ġnum Cols : ĠInt Ġ= Ġnum Rows , ĊĠ Ġoverride Ġval Ġdata : ĠList < Boolean >, Ċ ) Ġ: ĠAbstract Matrix < Boolean , ĠRing . of < Boolean >, ĠBoolean Matrix >( algebra , Ġnum Rows , Ġnum Cols , Ġdata ) Ġ{ ĊĠ Ġconstructor ( elements : ĠList < Boolean >) Ġ: Ġthis ( ĊĠĠĠ Ġalgebra Ġ= ĠBOOLEAN _ AL GE BR A , ĊĠĠĠ Ġnum Rows Ġ= Ġsqrt ( elements . size . toDouble ()). toInt (), ĊĠĠĠ Ġdata Ġ= Ġelements ĊĠ Ġ) ĊĊĠ Ġconstructor ( num Rows : ĠInt , Ġnum Cols : ĠInt Ġ= Ġnum Rows , Ġf : Ġ( Int , ĠInt ) Ġ-> ĠBoolean ) Ġ: Ġthis ( ĊĠĠĠ Ġnum Rows Ġ= Ġnum Rows , ĊĠĠĠ Ġnum Cols Ġ= Ġnum Cols , ĊĠĠĠ Ġdata Ġ= ĠList ( num Rows Ġ* Ġnum Cols ) Ġ{ Ġf ( it Ġ/ Ġnum Rows , Ġit Ġ% Ġnum Cols ) Ġ} ĊĠ Ġ) ĊĊĠ Ġconstructor ( var arg Ġrows : ĠShort ) Ġ: Ġthis ( rows . fold ("") Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ}) ĊĠ Ġconstructor ( var arg Ġrows : ĠString ) Ġ: ĊĠĠĠ Ġthis ( rows . fold ("") Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĠĠĠĠĠ Ġ. toCharArray (). let Ġ{ Ġchars Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġchars . distinct () ĊĠĠĠĠĠĠĠ Ġassert ( values . size Ġ== Ġ 2 ) Ġ{ Ġ" Expected Ġtwo Ġvalues " Ġ} ĊĠĠĠĠĠĠĠ Ġchars . map Ġ{ Ġit Ġ== Ġvalues [ 0 ] Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠ Ġ// ĠTODO : ĠImplement ĠFour ĠR us si ans Ġfor Ġspeed y Ġboolean Ġmat mul s Ġhttps :// arxiv . org / pdf / 0 8 1 1 . 1 7 1 4 . pdf # page = 5 ĊĠ Ġoverride Ġfun Ġtimes ( that : ĠBoolean Matrix ): ĠBoolean Matrix Ġ= Ġsuper . times ( that ) ĊĊĠ Ġval Ġis Full Ġby Ġlazy Ġ{ Ġdata . all Ġ{ Ġit Ġ} Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġgray Code ( size : ĠInt ): ĠBoolean Matrix Ġ= ĠTODO () ĊĠĠĠ Ġfun Ġones ( size : ĠInt ) Ġ= ĠBoolean Matrix ( size ) Ġ{ Ġ_, Ġ_ Ġ-> Ġtrue Ġ} ĊĠĠĠ Ġfun Ġzero es ( size : ĠInt ) Ġ= ĠBoolean Matrix ( size ) Ġ{ Ġ_, Ġ_ Ġ-> Ġfalse Ġ} ĊĠĠĠ Ġfun Ġone ( size : ĠInt ) Ġ= ĠBoolean Matrix ( size ) Ġ{ Ġi , Ġj Ġ-> Ġi Ġ== Ġj Ġ} ĊĠĠĠ Ġfun Ġrandom ( size : ĠInt ) Ġ= ĠBoolean Matrix ( size ) Ġ{ Ġ_, Ġ_ Ġ-> ĠRandom . next Boolean () Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠtoString () Ġ= Ġdata . fold Indexed ("") Ġ{ Ġi , Ġa , Ġb Ġ-> ĊĠĠĠ Ġa Ġ+ Ġ( if Ġ( b ) Ġ 1 Ġelse Ġ 0 ) Ġ+ Ġ" Ġ" Ġ+ Ġif Ġ( i Ġ> Ġ 0 Ġ&& Ġ( i Ġ+ Ġ 1 ) Ġ% Ġnum Cols Ġ== Ġ 0 ) Ġ"\ n " Ġelse Ġ"" ĊĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠInteger Matrix Ġconstructor ( ĊĠ Ġoverride Ġval Ġalgebra : ĠMatrix Field < Int , ĠField . of < Int >> Ġ= ĠINTEGER _ FIELD , ĊĠ Ġoverride Ġval Ġnum Rows : ĠInt , ĊĠ Ġoverride Ġval Ġnum Cols : ĠInt Ġ= Ġnum Rows , ĊĠ Ġoverride Ġval Ġdata : ĠList < Int >, Ċ ) Ġ: ĠAbstract Matrix < Int , ĠField . of < Int >, ĠInteger Matrix >( algebra , Ġnum Rows , Ġnum Cols , Ġdata ) Ġ{ ĊĠ Ġconstructor ( elements : ĠList < Int >) Ġ: Ġthis ( ĊĠĠĠ Ġalgebra Ġ= ĠINTEGER _ FIELD , ĊĠĠĠ Ġnum Rows Ġ= Ġsqrt ( elements . size . toDouble ()). toInt (), ĊĠĠĠ Ġdata Ġ= Ġelements ĊĠ Ġ) ĊĊĠ Ġconstructor ( num Rows : ĠInt , Ġnum Cols : ĠInt Ġ= Ġnum Rows , Ġf : Ġ( Int , ĠInt ) Ġ-> ĠInt ) Ġ: Ġthis ( ĊĠĠĠ Ġnum Rows Ġ= Ġnum Rows , ĊĠĠĠ Ġnum Cols Ġ= Ġnum Cols , ĊĠĠĠ Ġdata Ġ= ĠList ( num Rows Ġ* Ġnum Cols ) Ġ{ Ġf ( it Ġ/ Ġnum Rows , Ġit Ġ% Ġnum Cols ) Ġ} ĊĠ Ġ) ĊĊĠ Ġconstructor ( var arg Ġrows : ĠInt ) Ġ: Ġthis ( rows . toList ()) ĊĊĠ Ġoperator Ġfun Ġminus ( that : ĠInteger Matrix ): ĠInteger Matrix Ġ= Ġwith ( algebra ) Ġ{ Ġthis @ Integer Matrix Ġminus Ġthat Ġ} Ċ } Ċ Ċ open Ġclass ĠDouble Matrix Ġconstructor ( ĊĠ Ġoverride Ġval Ġalgebra : ĠMatrix Field < Double , ĠField . of < Double >> Ġ= ĠDOUBLE _ FIELD , ĊĠ Ġoverride Ġval Ġnum Rows : ĠInt , ĊĠ Ġoverride Ġval Ġnum Cols : ĠInt Ġ= Ġnum Rows , ĊĠ Ġoverride Ġval Ġdata : ĠList < Double >, Ċ ) Ġ: ĠAbstract Matrix < Double , ĠField . of < Double >, ĠDouble Matrix >( algebra , Ġnum Rows , Ġnum Cols , Ġdata ) Ġ{ ĊĠ Ġconstructor ( elements : ĠList < Double >) Ġ: Ġthis ( ĊĠĠĠ Ġalgebra Ġ= ĠDOUBLE _ FIELD , ĊĠĠĠ Ġnum Rows Ġ= Ġsqrt ( elements . size . toDouble ()). toInt (), ĊĠĠĠ Ġdata Ġ= Ġelements ĊĠ Ġ) ĊĊĠ Ġconstructor ( num Rows : ĠInt , Ġnum Cols : ĠInt Ġ= Ġnum Rows , Ġf : Ġ( Int , ĠInt ) Ġ-> ĠDouble ) Ġ: Ġthis ( ĊĠĠĠ Ġnum Rows Ġ= Ġnum Rows , ĊĠĠĠ Ġnum Cols Ġ= Ġnum Cols , ĊĠĠĠ Ġdata Ġ= ĠList ( num Rows Ġ* Ġnum Cols ) Ġ{ Ġf ( it Ġ/ Ġnum Rows , Ġit Ġ% Ġnum Cols ) Ġ} ĊĠ Ġ) ĊĊĠ Ġconstructor ( var arg Ġrows : ĠDouble ) Ġ: Ġthis ( rows . toList ()) ĊĊĠ Ġoperator Ġfun Ġminus ( that : ĠDouble Matrix ): ĠDouble Matrix Ġ= Ġwith ( algebra ) Ġ{ Ġthis @ Double Matrix Ġminus Ġthat Ġ} Ċ } Ċ Ċ fun ĠD Matrix . to B Mat () Ġ= ĠBoolean Matrix ( num Rows , Ġnum Cols ) Ġ{ Ġi , Ġj Ġ-> Ġget ( i , Ġj ) Ġ> Ġ 0 . 5 Ġ} Ċ fun ĠB Matrix RM aj . to B Mat () Ġ= ĠBoolean Matrix ( num Rows , Ġnum Cols ) Ġ{ Ġi , Ġj Ġ-> Ġget ( i , Ġj ) Ġ} Ċ operator Ġfun ĠBoolean Matrix . times ( mat : ĠS ps Mat ): ĠS ps Mat Ġ= Ġto EJ ML Sparse () Ġ* Ġmat Ċ operator Ġfun ĠBoolean Matrix . plus ( mat : ĠS ps Mat ): ĠS ps Mat Ġ= Ġto EJ ML Sparse () Ġ* Ġmat Ċ operator Ġfun ĠS ps Mat . minus ( mat : ĠBoolean Matrix ): ĠS ps Mat Ġ= Ġthis Ġ- Ġmat . to EJ ML Sparse () Ċ fun ĠDouble Matrix . to B Mat () Ġ= ĠBoolean Matrix ( num Rows , Ġnum Cols ) Ġ{ Ġi , Ġj Ġ-> Ġget ( i , Ġj ) Ġ> Ġ 0 . 5 Ġ} Ċ operator Ġfun ĠBoolean Matrix . times ( mat : ĠDouble Matrix ): ĠDouble Matrix Ġ= Ġto Double Matrix () Ġ* Ġmat Ċ operator Ġfun ĠBoolean Matrix . plus ( mat : ĠDouble Matrix ): ĠDouble Matrix Ġ= Ġto Double Matrix () Ġ+ Ġmat Ċ operator Ġfun ĠDouble Matrix . minus ( mat : ĠBoolean Matrix ): ĠDouble Matrix Ġ= Ġthis Ġ- Ġmat . toDouble Matrix () Ċ Ċ fun ĠDouble Matrix . to EJ ML Sparse () Ġ= ĠS ps Mat ( num Rows , Ġnum Cols , Ġnum Rows ). also Ġ{ ĊĠ Ġfor Ġ(( i , Ġj ) Ġin Ġ( 0 Ġuntil Ġnum Rows ) Ġ* Ġ( 0 Ġuntil Ġnum Cols )) Ġif ( get ( i , Ġj ) Ġ!= Ġ 0 . 0 ) Ġit [ i , Ġj ] Ġ= Ġget ( i , Ġj ) Ċ } Ċ Ċ fun ĠBoolean Matrix . toDouble Matrix () Ġ= ĠDouble Matrix ( num Rows , Ġnum Cols ) Ġ{ Ġi , Ġj Ġ-> Ġif Ġ( get ( i , Ġj )) Ġ 1 . 0 Ġelse Ġ 0 . 0 Ġ} Ċ Ċ fun ĠBoolean Matrix . to EJ ML Sparse () Ġ= ĠS ps Mat ( num Rows , Ġnum Cols , Ġnum Rows ). also Ġ{ ĊĠ Ġfor Ġ(( i , Ġj ) Ġin Ġ( 0 Ġuntil Ġnum Rows ) Ġ* Ġ( 0 Ġuntil Ġnum Cols )) ĊĠĠĠ Ġif Ġ( this [ i , Ġj ]) Ġit [ i , Ġj ] Ġ= Ġ 1 . 0 Ċ } Ċ Ċ // ĠTODO : ĠN aper ian Ġfunct ors Ċ // Ġhttps :// www . cs . ox . ac . uk / people / jer emy . g ibb ons / publications / ap lic ative . pdf Ċ // Ġ" The Ġmain Ġidea Ġis Ġthat Ġa Ġrank - n Ġarray Ġis Ġessentially Ġa Ġdata Ġstructure Ġof Ġtype Ċ // ĠD âĤģ ( D âĤĤ (... ( D âĤ Ļ Ġa ))), Ġwhere Ġeach ĠD áµ ¢ Ġis Ġa Ġdimension Ġ: Ġa Ġcontainer Ġtype , Ġcategor ically Ċ // Ġa Ġfunctor ; Ġone Ġmight Ġthink Ġin Ġthe Ġfirst Ġinstance Ġof Ġlists ." Ċ Ċ // ĠAlternatively : Ġa Ġlength - 2 âģ ¿ Ġarray Ġwhich Ġcan Ġbe Ġ" parsed " Ġinto Ġa Ġcertain Ġshape ? Ċ // ĠSee : Ġhttp :// con al . net / talk s / can - tensor - programming - be - li ber ated . pdf Ċ interface ĠSparse Tensor < T /* Should Ġbe Ġa Ġnamed Ġtuple Ġor Ġdat aclass Ġof Ġsome Ġkind */ > Ġ{ ĊĠ Ġ// ĠTODO : ĠPre compute Ġspecific Ġ[ B ore l ] Ġsub sets Ġof ĠT 's Ġattributes Ġthat Ġwe Ġexpect Ġto Ġbe Ġqueried Ġat Ġruntime Ċ // Ġe . g . Ġ( n - 1 )- D Ġslices Ġand Ġ 1 D Ġfib ers Ċ // Ġhttps :// math overflow . net / questions / 3 9 3 4 2 7 / general ization - of - sink h orn - s - the orem - to - sto chastic - tensors Ċ // Ġprivate Ġval Ġm arginal s : ĠMutable Map < List < T >, ĠInt > Ġ= Ġmutable Map Of () ĊĠ Ġval Ġmap : ĠMutable Map < T , ĠInt > ĊĠ Ġoperator Ġfun Ġget ( t : ĠT ) Ġ= Ġmap . getOrElse ( t ) Ġ{ Ġ 0 Ġ} Ċ Ċ // Ġ ĠTODO : ĠSupport Ġmut ability Ġbut Ġalso Ġmap - reduce - ability / merge - ability Ġfor Ġparallel ism Ċ // Ġ Ġoperator Ġfun Ġplus ( other : ĠSparse Tensor < T >) Ġ= ĠSparse Tensor ( map Ġ= Ġthis . map Ġ+ Ġother . map ) Ċ // Ġ Ġoperator Ġfun ĠMutable Map < T , ĠInt >. plus ( map : ĠMutable Map < T , ĠInt >): ĠMutable Map < T , ĠInt > Ġ= Ċ // ĠĠĠ ĠHashMap ( this ). apply Ġ{ Ġmap . forEach Ġ{ Ġ( k , Ġv ) Ġ-> Ġmerge ( k , Ġv , ĠInt :: plus ) Ġ} Ġ} ĊĊĠ Ġoperator Ġfun Ġset ( index : ĠT , Ġi : ĠInt ) Ġ{ Ġmap [ index ] Ġ= Ġi Ġ} ĊĊĠ Ġfun Ġcount ( selector : Ġ( T ) Ġ-> ĠBoolean ) Ġ= ĊĠĠĠ Ġmap . entries . sum Of Ġ{ Ġif ( selector ( it . key )) Ġit . value Ġelse Ġ 0 Ġ} Ċ }