/* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Opt In ( Un stable K Math API :: class ) Ċ Ċ package Ġspace . k science . k math . nd Ċ Ċ import Ġspace . k science . k math . misc . Performance P it fall Ċ import Ġspace . k science . k math . misc . Un stable K Math API Ċ import Ġspace . k science . k math . operations .* Ċ import Ġspace . k science . k math . structures . Buffer Factory Ċ Ċ public Ġinterface ĠBuffer Al ge br aN D < T , Ġout ĠA Ġ: ĠAl gebra < T >> Ġ: ĠAl ge br aN D < T , ĠA > Ġ{ ĊĠĠĠ Ġpublic Ġval Ġindexer Builder : Ġ( IntArray ) Ġ-> ĠShape Indexer ĊĠĠĠ Ġpublic Ġval Ġbuffer Algebra : ĠBuffer Algebra < T , ĠA > ĊĠĠĠ Ġoverride Ġval Ġelement Algebra : ĠA Ġget () Ġ= Ġbuffer Algebra . element Algebra ĊĊĠĠĠ Ġoverride Ġfun Ġstructure ND ( shape : ĠShape , Ġinitializer : ĠA .( IntArray ) Ġ-> ĠT ): ĠBuffer ND < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindexer Ġ= Ġindexer Builder ( shape ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBuffer ND ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindexer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Algebra . buffer ( indexer . linear Size ) Ġ{ Ġoffset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Algebra . initializer ( indexer . index ( offset )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun ĠStructure ND < T >. to Buffer ND (): ĠBuffer ND < T > Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠBuffer ND Ġ-> Ġthis ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindexer Ġ= Ġindexer Builder ( shape ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuffer ND ( indexer , Ġbuffer Algebra . buffer ( indexer . linear Size ) Ġ{ Ġoffset Ġ-> Ġget ( indexer . index ( offset )) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Performance P it fall ĊĠĠĠ Ġoverride Ġfun ĠStructure ND < T >. map ( transform : ĠA .( T ) Ġ-> ĠT ): ĠBuffer ND < T > Ġ= Ġmap Inline ( to Buffer ND (), Ġtransform ) ĊĊĠĠĠ Ġ@ Performance P it fall ĊĠĠĠ Ġoverride Ġfun ĠStructure ND < T >. map Indexed ( transform : ĠA .( index : ĠInt Array , ĠT ) Ġ-> ĠT ): ĠBuffer ND < T > Ġ= ĊĠĠĠĠĠĠĠ Ġmap Indexed Inline ( to Buffer ND (), Ġtransform ) ĊĊĠĠĠ Ġ@ Performance P it fall ĊĠĠĠ Ġoverride Ġfun Ġzip ( left : ĠStructure ND < T >, Ġright : ĠStructure ND < T >, Ġtransform : ĠA .( T , ĠT ) Ġ-> ĠT ): ĠBuffer ND < T > Ġ= ĊĠĠĠĠĠĠĠ Ġzip Inline ( left . to Buffer ND (), Ġright . to Buffer ND (), Ġtransform ) ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġdefault Indexer Builder : Ġ( IntArray ) Ġ-> ĠShape Indexer Ġ= ĠDefault Stride s . Companion :: invoke ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġinline Ġfun Ġ< T , ĠA Ġ: ĠAl gebra < T >> ĠBuffer Al ge br aN D < T , ĠA >. map Inline ( ĊĠĠĠ Ġarg : ĠBuffer ND < T >, ĊĠĠĠ Ġcross inline Ġtransform : ĠA .( T ) Ġ-> ĠT , Ċ ): ĠBuffer ND < T > Ġ{ ĊĠĠĠ Ġval Ġindexes Ġ= Ġarg . indices ĊĠĠĠ Ġval Ġbuffer Ġ= Ġarg . buffer ĊĠĠĠ Ġreturn ĠBuffer ND ( ĊĠĠĠĠĠĠĠ Ġindexes , ĊĠĠĠĠĠĠĠ Ġbuffer Algebra . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Factory ( buffer . size ) Ġ{ Ġelement Algebra . transform ( buffer [ it ]) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< T , ĠA Ġ: ĠAl gebra < T >> ĠBuffer Al ge br aN D < T , ĠA >. map Indexed Inline ( ĊĠĠĠ Ġarg : ĠBuffer ND < T >, ĊĠĠĠ Ġcross inline Ġtransform : ĠA .( index : ĠInt Array , Ġarg : ĠT ) Ġ-> ĠT , Ċ ): ĠBuffer ND < T > Ġ{ ĊĠĠĠ Ġval Ġindexes Ġ= Ġarg . indices ĊĠĠĠ Ġval Ġbuffer Ġ= Ġarg . buffer ĊĠĠĠ Ġreturn ĠBuffer ND ( ĊĠĠĠĠĠĠĠ Ġindexes , ĊĠĠĠĠĠĠĠ Ġbuffer Algebra . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Factory ( buffer . size ) Ġ{ Ġelement Algebra . transform ( indexes . index ( it ), Ġbuffer [ it ]) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< T , ĠA Ġ: ĠAl gebra < T >> ĠBuffer Al ge br aN D < T , ĠA >. zip Inline ( ĊĠĠĠ Ġl : ĠBuffer ND < T >, ĊĠĠĠ Ġr : ĠBuffer ND < T >, ĊĠĠĠ Ġcross inline Ġblock : ĠA .( l : ĠT , Ġr : ĠT ) Ġ-> ĠT , Ċ ): ĠBuffer ND < T > Ġ{ ĊĠĠĠ Ġrequire ( l . indices Ġ== Ġr . indices ) Ġ{ Ġ" Zip Ġrequires Ġthe Ġsame Ġshapes , Ġbut Ġfound Ġ${ l . shape } Ġon Ġthe Ġleft Ġand Ġ${ r . shape } Ġon Ġthe Ġright " Ġ} ĊĠĠĠ Ġval Ġindexes Ġ= Ġl . indices ĊĠĠĠ Ġval Ġl buffer Ġ= Ġl . buffer ĊĠĠĠ Ġval Ġr buffer Ġ= Ġr . buffer ĊĠĠĠ Ġreturn ĠBuffer ND ( ĊĠĠĠĠĠĠĠ Ġindexes , ĊĠĠĠĠĠĠĠ Ġbuffer Algebra . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Factory ( l buffer . size ) Ġ{ Ġelement Algebra . block ( l buffer [ it ], Ġr buffer [ it ]) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Opt In ( Performance P it fall :: class ) Ċ public Ġopen Ġclass ĠBuffered Group N DO ps < T , Ġout ĠA Ġ: ĠGroup < T >>( ĊĠĠĠ Ġoverride Ġval Ġbuffer Algebra : ĠBuffer Algebra < T , ĠA >, ĊĠĠĠ Ġoverride Ġval Ġindexer Builder : Ġ( IntArray ) Ġ-> ĠShape Indexer Ġ= ĠBuffer Al ge br aN D . default Indexer Builder , Ċ ) Ġ: ĠGroup Ops ND < T , ĠA >, ĠBuffer Al ge br aN D < T , ĠA > Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠStructure ND < T >. unary Minus (): ĠStructure ND < T > Ġ= Ġmap Ġ{ Ġ- it Ġ} Ċ } Ċ Ċ public Ġopen Ġclass ĠBuffered Ring Ops ND < T , Ġout ĠA Ġ: ĠRing < T >>( ĊĠĠĠ Ġbuffer Algebra : ĠBuffer Algebra < T , ĠA >, ĊĠĠĠ Ġindexer Builder : Ġ( IntArray ) Ġ-> ĠShape Indexer Ġ= ĠBuffer Al ge br aN D . default Indexer Builder , Ċ ) Ġ: ĠBuffered Group N DO ps < T , ĠA >( buffer Algebra , Ġindexer Builder ), ĠRing Ops ND < T , ĠA > Ċ Ċ public Ġopen Ġclass ĠBuffered Field Ops ND < T , Ġout ĠA Ġ: ĠField < T >>( ĊĠĠĠ Ġbuffer Algebra : ĠBuffer Algebra < T , ĠA >, ĊĠĠĠ Ġindexer Builder : Ġ( IntArray ) Ġ-> ĠShape Indexer Ġ= ĠBuffer Al ge br aN D . default Indexer Builder , Ċ ) Ġ: ĠBuffered Ring Ops ND < T , ĠA >( buffer Algebra , Ġindexer Builder ), ĠField Ops ND < T , ĠA > Ġ{ ĊĊĠĠĠ Ġpublic Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġelement Algebra : ĠA , ĊĠĠĠĠĠĠĠ Ġbuffer Factory : ĠBuffer Factory < T >, ĊĠĠĠĠĠĠĠ Ġindexer Builder : Ġ( IntArray ) Ġ-> ĠShape Indexer Ġ= ĠBuffer Al ge br aN D . default Indexer Builder , ĊĠĠĠ Ġ) Ġ: Ġthis ( Buffer Field Ops ( element Algebra , Ġbuffer Factory ), Ġindexer Builder ) ĊĊĠĠĠ Ġ@ Opt In ( Performance P it fall :: class ) ĊĠĠĠ Ġoverride Ġfun Ġscale ( a : ĠStructure ND < T >, Ġvalue : ĠDouble ): ĠStructure ND < T > Ġ= Ġa . map Ġ{ Ġit Ġ* Ġvalue Ġ} Ċ } Ċ Ċ public Ġval Ġ< T , ĠA Ġ: ĠGroup < T >> ĠBuffer Algebra < T , ĠA >. nd : ĠBuffered Group N DO ps < T , ĠA > Ġget () Ġ= ĠBuffered Group N DO ps ( this ) Ċ public Ġval Ġ< T , ĠA Ġ: ĠRing < T >> ĠBuffer Algebra < T , ĠA >. nd : ĠBuffered Ring Ops ND < T , ĠA > Ġget () Ġ= ĠBuffered Ring Ops ND ( this ) Ċ public Ġval Ġ< T , ĠA Ġ: ĠField < T >> ĠBuffer Algebra < T , ĠA >. nd : ĠBuffered Field Ops ND < T , ĠA > Ġget () Ġ= ĠBuffered Field Ops ND ( this ) ĊĊ Ċ public Ġfun Ġ< T , ĠA Ġ: ĠAl gebra < T >> ĠBuffer Al ge br aN D < T , ĠA >. structure ND ( ĊĠĠĠ Ġvar arg Ġshape : ĠInt , ĊĠĠĠ Ġinitializer : ĠA .( IntArray ) Ġ-> ĠT , Ċ ): ĠBuffer ND < T > Ġ= Ġstructure ND ( shape , Ġinitializer ) Ċ Ċ public Ġfun Ġ< T , ĠEA Ġ: ĠAl gebra < T >, ĠA > ĠA . structure ND ( ĊĠĠĠ Ġinitializer : ĠEA .( IntArray ) Ġ-> ĠT , Ċ ): ĠBuffer ND < T > Ġwhere ĠA Ġ: ĠBuffer Al ge br aN D < T , ĠEA >, ĠA Ġ: ĠWith Shape Ġ= Ġstructure ND ( shape , Ġinitializer ) Ċ Ċ //// Ġgroup Ġfactories Ċ // public Ġfun Ġ< T , ĠA Ġ: ĠGroup < T >> ĠA . nd Algebra ( Ċ // ĠĠĠ Ġbuffer Algebra : ĠBuffer Algebra < T , ĠA >, Ċ // ĠĠĠ Ġvar arg Ġshape : ĠInt , Ċ // ): ĠBuffered Group N DO ps < T , ĠA > Ġ= ĠBuffered Group N DO ps ( buffer Algebra ) Ċ // Ċ //@ Jvm Name (" with Nd Group ") Ċ // public Ġinline Ġfun Ġ< T , ĠA Ġ: ĠGroup < T >, ĠR > ĠA . with Nd Algebra ( Ċ // ĠĠĠ Ġno inline Ġbuffer Factory : ĠBuffer Factory < T >, Ċ // ĠĠĠ Ġvar arg Ġshape : ĠInt , Ċ // ĠĠĠ Ġaction : ĠBuffered Group N DO ps < T , ĠA >. () Ġ-> ĠR , Ċ // ): ĠR Ġ{ Ċ // ĠĠĠ Ġcontract Ġ{ Ġcalls In Place ( action , ĠInvocation Kind . EX ACT LY _ ON CE ) Ġ} Ċ // ĠĠĠ Ġreturn Ġnd Algebra ( buffer Factory , Ġ* shape ). run ( action ) Ċ //} Ċ Ċ //// ring Ġfactories Ċ // public Ġfun Ġ< T , ĠA Ġ: ĠRing < T >> ĠA . nd Algebra ( Ċ // ĠĠĠ Ġbuffer Factory : ĠBuffer Factory < T >, Ċ // ĠĠĠ Ġvar arg Ġshape : ĠInt , Ċ // ): ĠBuffered Ring N DO ps < T , ĠA > Ġ= ĠBuffered Ring N DO ps ( shape , Ġthis , Ġbuffer Factory ) Ċ // Ċ //@ Jvm Name (" with Nd Ring ") Ċ // public Ġinline Ġfun Ġ< T , ĠA Ġ: ĠRing < T >, ĠR > ĠA . with Nd Algebra ( Ċ // ĠĠĠ Ġno inline Ġbuffer Factory : ĠBuffer Factory < T >, Ċ // ĠĠĠ Ġvar arg Ġshape : ĠInt , Ċ // ĠĠĠ Ġaction : ĠBuffered Ring N DO ps < T , ĠA >. () Ġ-> ĠR , Ċ // ): ĠR Ġ{ Ċ // ĠĠĠ Ġcontract Ġ{ Ġcalls In Place ( action , ĠInvocation Kind . EX ACT LY _ ON CE ) Ġ} Ċ // ĠĠĠ Ġreturn Ġnd Algebra ( buffer Factory , Ġ* shape ). run ( action ) Ċ //} Ċ // Ċ //// field Ġfactories Ċ // public Ġfun Ġ< T , ĠA Ġ: ĠField < T >> ĠA . nd Algebra ( Ċ // ĠĠĠ Ġbuffer Factory : ĠBuffer Factory < T >, Ċ // ĠĠĠ Ġvar arg Ġshape : ĠInt , Ċ // ): ĠBuffered Field N DO ps < T , ĠA > Ġ= ĠBuffered Field N DO ps ( shape , Ġthis , Ġbuffer Factory ) Ċ // Ċ // /** Ċ // Ġ* ĠCreate Ġa Ġ[ Field ND ] Ġfor Ġthis Ġ[ Field ] Ġinf erring Ġproper Ġbuffer Ġfactory Ġfrom Ġthe Ġtype Ċ // Ġ*/ Ċ //@ Un stable K Math API Ċ //@ Suppress (" UN CHECK ED _ CAST ") Ċ // public Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny , ĠA Ġ: ĠField < T >> ĠA . auto Nd Algebra ( Ċ // ĠĠĠ Ġvar arg Ġshape : ĠInt , Ċ // ): ĠField ND < T , ĠA > Ġ= Ġwhen Ġ( this ) Ġ{ Ċ // ĠĠĠ ĠDouble Field Ġ-> ĠDouble Field ND ( shape ) Ġas ĠField ND < T , ĠA > Ċ // ĠĠĠ Ġelse Ġ-> ĠBuffered Field N DO ps ( shape , Ġthis , ĠBuffer . Companion :: auto ) Ċ //} Ċ // Ċ //@ Jvm Name (" with Nd Field ") Ċ // public Ġinline Ġfun Ġ< T , ĠA Ġ: ĠField < T >, ĠR > ĠA . with Nd Algebra ( Ċ // ĠĠĠ Ġno inline Ġbuffer Factory : ĠBuffer Factory < T >, Ċ // ĠĠĠ Ġvar arg Ġshape : ĠInt , Ċ // ĠĠĠ Ġaction : ĠBuffered Field N DO ps < T , ĠA >. () Ġ-> ĠR , Ċ // ): ĠR Ġ{ Ċ // ĠĠĠ Ġcontract Ġ{ Ġcalls In Place ( action , ĠInvocation Kind . EX ACT LY _ ON CE ) Ġ} Ċ // ĠĠĠ Ġreturn Ġnd Algebra ( buffer Factory , Ġ* shape ). run ( action ) Ċ //}