/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 2 1 ĠK Math Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġspace . k science . k math . dimensions Ċ Ċ import Ġspace . k science . k math . linear .* Ċ import Ġspace . k science . k math . nd . Structure 2 D Ċ import Ġspace . k science . k math . operations . Real Field Ċ import Ġspace . k science . k math . operations . Ring Ċ Ċ /** Ċ Ġ* ĠA Ġmatrix Ġwith Ġcompile - time Ġcontrolled Ġdimension Ċ Ġ*/ Ċ public Ġinterface ĠD Matrix < T , ĠR Ġ: ĠDimension , ĠC Ġ: ĠDimension > Ġ: ĠStructure 2 D < T > Ġ{ ĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCo er ces Ġa Ġregular Ġmatrix Ġto Ġa Ġmatrix Ġwith Ġtype - safe Ġdimensions Ġand Ġthrows Ġa Ġerror Ġif Ġco erc ion Ġfailed ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġinline Ġfun Ġ< T , Ġre ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > Ġco erce ( structure : ĠStructure 2 D < T >): ĠD Matrix < T , ĠR , ĠC > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( structure . row Num Ġ== ĠDimension . dim < R >(). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Row Ġnumber Ġmismatch : Ġexpected Ġ${ Dimension . dim < R >() } Ġbut Ġfound Ġ${ structure . row Num }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( structure . col Num Ġ== ĠDimension . dim < C >(). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Column Ġnumber Ġmismatch : Ġexpected Ġ${ Dimension . dim < C >() } Ġbut Ġfound Ġ${ structure . col Num }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠD Matrix Wrapper ( structure ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġsame Ġas Ġ[ D Matrix . coerce ] Ġbut Ġwithout Ġdimension Ġchecks . ĠUse Ġwith Ġca ution ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġ< T , ĠR Ġ: ĠDimension , ĠC Ġ: ĠDimension > Ġco erce Unsafe ( structure : ĠStructure 2 D < T >): ĠD Matrix < T , ĠR , ĠC > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD Matrix Wrapper ( structure ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġinline Ġwrapper Ġfor Ġa ĠMatrix Ċ Ġ*/ Ċ public Ġinline Ġclass ĠD Matrix Wrapper < T , ĠR Ġ: ĠDimension , ĠC Ġ: ĠDimension >( ĊĠĠĠ Ġprivate Ġval Ġstructure : ĠStructure 2 D < T >, Ċ ) Ġ: ĠD Matrix < T , ĠR , ĠC > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġshape : ĠInt Array Ġget () Ġ= Ġstructure . shape ĊĠĠĠ Ġoverride Ġval Ġrow Num : ĠInt Ġget () Ġ= Ġshape [ 0 ] ĊĠĠĠ Ġoverride Ġval Ġcol Num : ĠInt Ġget () Ġ= Ġshape [ 1 ] ĊĠĠĠ Ġoverride Ġoperator Ġfun Ġget ( i : ĠInt , Ġj : ĠInt ): ĠT Ġ= Ġstructure [ i , Ġj ] Ċ } Ċ Ċ /** Ċ Ġ* ĠDimension - safe Ġpoint Ċ Ġ*/ Ċ public Ġinterface ĠD Point < T , ĠD Ġ: ĠDimension > Ġ: ĠPoint < T > Ġ{ ĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġinline Ġfun Ġ< T , Ġre ified ĠD Ġ: ĠDimension > Ġco erce ( point : ĠPoint < T >): ĠD Point < T , ĠD > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( point . size Ġ== ĠDimension . dim < D >(). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Vector Ġdimension Ġmismatch : Ġexpected Ġ${ Dimension . dim < D >() }, Ġbut Ġfound Ġ${ point . size }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠD Point Wrapper ( point ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġ< T , ĠD Ġ: ĠDimension > Ġco erce Unsafe ( point : ĠPoint < T >): ĠD Point < T , ĠD > Ġ= ĠD Point Wrapper ( point ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠDimension - safe Ġpoint Ġwrapper Ċ Ġ*/ Ċ public Ġinline Ġclass ĠD Point Wrapper < T , ĠD Ġ: ĠDimension >( public Ġval Ġpoint : ĠPoint < T >) Ġ: ĊĠĠĠ ĠD Point < T , ĠD > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġpoint . size ĊĊĠĠĠ Ġoverride Ġoperator Ġfun Ġget ( index : ĠInt ): ĠT Ġ= Ġpoint [ index ] ĊĊĠĠĠ Ġoverride Ġoperator Ġfun Ġiterator (): ĠIterator < T > Ġ= Ġpoint . iterator () Ċ } ĊĊ Ċ /** Ċ Ġ* ĠBasic Ġoperations Ġon Ġdimension - safe Ġmatrices . ĠOper ates Ġon Ġ[ Matrix ] Ċ Ġ*/ Ċ public Ġinline Ġclass ĠD Matrix Context < T Ġ: ĠAny , Ġout ĠA Ġ: ĠRing < T >>( public Ġval Ġcontext : ĠLinear Space < T , ĠA >) Ġ{ ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > ĠMatrix < T >. coerce (): ĠD Matrix < T , ĠR , ĠC > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( row Num Ġ== ĠDimension . dim < R >(). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Row Ġnumber Ġmismatch : Ġexpected Ġ${ Dimension . dim < R >() } Ġbut Ġfound Ġ$ row Num " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequire ( col Num Ġ== ĠDimension . dim < C >(). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Column Ġnumber Ġmismatch : Ġexpected Ġ${ Dimension . dim < C >() } Ġbut Ġfound Ġ$ col Num " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠD Matrix . coerce Unsafe ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro duce Ġa Ġmatrix Ġwith Ġthis Ġcontext Ġand Ġgiven Ġdimensions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > Ġproduce ( ĊĠĠĠĠĠĠĠ Ġno inline Ġinitializer : ĠA .( i : ĠInt , Ġj : ĠInt ) Ġ-> ĠT ĊĠĠĠ Ġ): ĠD Matrix < T , ĠR , ĠC > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrows Ġ= ĠDimension . dim < R >() ĊĠĠĠĠĠĠĠ Ġval Ġcols Ġ= ĠDimension . dim < C >() ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . build Matrix ( rows . toInt (), Ġcols . toInt (), Ġinitializer ). coerce < R , ĠC >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠD Ġ: ĠDimension > Ġpoint ( no inline Ġinitializer : ĠA .( Int ) Ġ-> ĠT ): ĠD Point < T , ĠD > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠDimension . dim < D >() ĊĊĠĠĠĠĠĠĠ Ġreturn ĠD Point . coerce Unsafe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . build Vector ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġinline Ġin fix Ġfun Ġ< re ified ĠR 1 Ġ: ĠDimension , Ġre ified ĠC 1 Ġ: ĠDimension , Ġre ified ĠC 2 Ġ: ĠDimension > ĠD Matrix < T , ĠR 1 , ĠC 1 >. dot ( ĊĠĠĠĠĠĠĠ Ġother : ĠD Matrix < T , ĠC 1 , ĠC 2 >, ĊĠĠĠ Ġ): ĠD Matrix < T , ĠR 1 , ĠC 2 > Ġ= Ġcontext . run Ġ{ Ġthis @ dot Ġdot Ġother Ġ}. coerce () ĊĊĠĠĠ Ġpublic Ġinline Ġin fix Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > ĠD Matrix < T , ĠR , ĠC >. dot ( vector : ĠD Point < T , ĠC >): ĠD Point < T , ĠR > Ġ= ĊĠĠĠĠĠĠĠ ĠD Point . coerce Unsafe ( context . run Ġ{ Ġthis @ dot Ġdot Ġvector Ġ}) ĊĊĠĠĠ Ġpublic Ġinline Ġoperator Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > ĠD Matrix < T , ĠR , ĠC >. times ( value : ĠT ): ĠD Matrix < T , ĠR , ĠC > Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . run Ġ{ Ġthis @ times . times ( value ) Ġ}. coerce () ĊĊĠĠĠ Ġpublic Ġinline Ġoperator Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > ĠT . times ( m : ĠD Matrix < T , ĠR , ĠC >): ĠD Matrix < T , ĠR , ĠC > Ġ= ĊĠĠĠĠĠĠĠ Ġm Ġ* Ġthis ĊĊĠĠĠ Ġpublic Ġinline Ġoperator Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > ĠD Matrix < T , ĠC , ĠR >. plus ( other : ĠD Matrix < T , ĠC , ĠR >): ĠD Matrix < T , ĠC , ĠR > Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . run Ġ{ Ġthis @ plus Ġ+ Ġother Ġ}. coerce () ĊĊĠĠĠ Ġpublic Ġinline Ġoperator Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > ĠD Matrix < T , ĠC , ĠR >. minus ( other : ĠD Matrix < T , ĠC , ĠR >): ĠD Matrix < T , ĠC , ĠR > Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . run Ġ{ Ġthis @ minus Ġ+ Ġother Ġ}. coerce () ĊĊĠĠĠ Ġpublic Ġinline Ġoperator Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > ĠD Matrix < T , ĠC , ĠR >. unary Minus (): ĠD Matrix < T , ĠC , ĠR > Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . run Ġ{ Ġthis @ unary Minus . unary Minus () Ġ}. coerce () ĊĊĠĠĠ Ġpublic Ġinline Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > ĠD Matrix < T , ĠC , ĠR >. transpose (): ĠD Matrix < T , ĠR , ĠC > Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . run Ġ{ Ġ( this @ transpose Ġas ĠMatrix < T >). transpose () Ġ}. coerce () ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġreal : ĠD Matrix Context < Double , ĠReal Field > Ġ= ĠD Matrix Context ( Linear Space . real ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠA Ġsquare Ġunit Ġmatrix Ċ Ġ*/ Ċ public Ġinline Ġfun Ġ< re ified ĠD Ġ: ĠDimension > ĠD Matrix Context < Double , ĠReal Field >. one (): ĠD Matrix < Double , ĠD , ĠD > Ġ= Ġproduce Ġ{ Ġi , Ġj Ġ-> ĊĠĠĠ Ġif Ġ( i Ġ== Ġj ) Ġ 1 . 0 Ġelse Ġ 0 . 0 Ċ } Ċ Ċ public Ġinline Ġfun Ġ< re ified ĠR Ġ: ĠDimension , Ġre ified ĠC Ġ: ĠDimension > ĠD Matrix Context < Double , ĠReal Field >. zero (): ĠD Matrix < Double , ĠR , ĠC > Ġ= ĊĠĠĠ Ġproduce Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠ Ġ}