package Ġtensor Ċ Ċ import Ġvector . row . Complex Row Vector Ċ import Ġmatrix . Complex Matrix Ċ import Ġutils . Complex Double Ċ import Ġutils . visualization . String Vector Ċ import Ġutils . R Ċ Ċ open Ġclass ĠComplex Tensor ( val Ġshape : ĠInt Array , Ġval Ġdata : ĠArray < Complex Double > Ġ= ĊĠĠĠ ĠArray ( shape . reduce Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal , Ġnum Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num Ġ<= Ġ 0 ) Ġthrow ĠIllegalArgumentException (" Complex Tensor . init : ĠInvalid Ġshape ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtotal Ġ* Ġnum ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ Ġ 0 . 0 . R Ġ} Ċ ) Ġ{ ĊĠĠĠ Ġval Ġsize Ġ= Ġdata . size ĊĠĠĠ Ġval Ġdim Ġ= Ġshape . size ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ!= Ġcalculate Size ( shape )) Ġthrow ĠIllegalArgumentException (" Complex Tensor . init : ĠInvalid Ġdata Ġlength ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( indices : ĠInt Array ): ĠComplex Double Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( indices . size Ġ!= Ġdim ) Ġthrow ĠIllegalArgumentException (" Complex Tensor . get : ĠToo Ġmany Ġindices ") ĊĠĠĠĠĠĠĠ Ġelse Ġdata [ tensor Indices To Data Index ( shape , Ġindices )] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index Long : ĠLong ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġindex Long . toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ>= Ġshape [ 0 ] Ġ-> Ġthrow ĠIllegalArgumentException (" Complex Tensor . get : ĠIndex Ġout Ġof Ġbound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdim Ġ== Ġ 0 Ġ-> Ġthrow ĠIllegalArgumentException (" Complex Tensor . get : Ġcannot Ġget Ġfrom Ġ 0 - dimensional Ġtensor . Ġuse Ġ[ int ArrayOf ()] Ġto Ġget Ġvalue .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Shape Ġ= Ġ( 1 .. shape . last Index ). map Ġ{ Ġshape [ it ] Ġ}. to IntArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Tensor Size Ġ= Ġnew Shape . reduce Ġ{ Ġtotal , Ġnum Ġ-> Ġtotal Ġ* Ġnum Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataIndex Start Ġ= Ġindex Ġ* Ġnew Tensor Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataIndex End Ġ= Ġ( index Ġ+ Ġ 1 ) Ġ* Ġnew Tensor Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= Ġ( data Index Start Ġuntil ĠdataIndex End ). map Ġ{ Ġdata [ it ] Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComplex Tensor ( new Shape , ĠnewData ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( indices : ĠInt Array , Ġvalue : ĠComplex Double ) Ġ{ ĊĠĠĠĠĠĠĠ Ġindices . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġ 0 Ġ|| Ġit Ġ>= Ġshape [ index ]) Ġthrow ĠIllegalArgumentException (" Complex Tensor . set : ĠIndex Ġout Ġof Ġbound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata [ tensor Indices To Data Index ( shape , Ġindices )] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġunary Plus () Ġ= Ġthis ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġunary Minus (): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( shape , ĠArray ( size ) Ġ{- Ġdata [ it ]}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠComplex Tensor ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġshape . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġother . shape [ index ]) Ġthrow ĠIllegalArgumentException (" Complex Tensor . plus : ĠTwo Ġtensors Ġshould Ġhave Ġthe Ġsame Ġshape .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= ĠArray ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ it ] Ġ+ Ġother . data [ it ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( shape , ĠnewData ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( other : ĠComplex Tensor ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġshape . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġother . shape [ index ]) Ġthrow ĠIllegalArgumentException (" Complex Tensor . minus : ĠTwo Ġtensors Ġshould Ġhave Ġthe Ġsame Ġshape .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= ĠArray ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ it ] Ġ- Ġother . data [ it ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( shape , ĠnewData ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes ( other : ĠComplex Tensor ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( shape . last () Ġ!= Ġother . shape [ 0 ]) Ġthrow ĠIllegalArgumentException (" Complex Tensor . times : ĠInvalid Ġtensor Ġproduct .") ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Dim Ġ= Ġdim Ġ- Ġ 1 Ġ+ Ġother . dim Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Shape Ġ= ĠInt Array ( new Dim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< Ġdim Ġ- Ġ 1 Ġ-> Ġshape [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġother . shape [ it Ġ- Ġ( dim Ġ- Ġ 1 ) Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Size Ġ= Ġnew Shape . reduce Ġ{ Ġtot , Ġnum Ġ-> Ġtot Ġ* Ġnum Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= ĠArray ( new Size ) Ġ{ ĠdataIndex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Indices Ġ= ĠdataIndex To Tensor Indices ( new Shape , ĠdataIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsum Ġ= Ġ 0 . 0 . R ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sum Index Ġin Ġ 0 Ġuntil Ġshape . last ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindices 1 Ġ= ĠInt Array ( dim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< Ġdim Ġ- Ġ 1 Ġ-> Ġnew Indices [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsum Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindices 2 Ġ= ĠInt Array ( other . dim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġsum Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnew Indices [ dim Ġ- Ġ 1 Ġ- Ġ 1 Ġ+ Ġit ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġthis [ indices 1 ] Ġ* Ġother [ indices 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠComplex Tensor ( new Shape , ĠnewData ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġtimes ( other : ĠComplex Double ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= ĠArray ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ it ] Ġ* Ġother ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( shape , ĠnewData ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġtimes ( other : ĠNumber ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= ĠArray ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ it ] Ġ* Ġother . toDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( shape , ĠnewData ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġdiv ( other : ĠNumber ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= ĠArray ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ it ] Ġ/ Ġother . toDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( shape , ĠnewData ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġdiv ( other : ĠComplex Double ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewData Ġ= ĠArray ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ it ] Ġ/ Ġother ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( shape , ĠnewData ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus Assign ( other : ĠComplex Tensor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshape . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġother . shape [ index ]) Ġthrow ĠIllegalArgumentException (" Complex Tensor . plus : ĠTwo Ġtensors Ġshould Ġhave Ġthe Ġsame Ġshape .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] Ġ+= Ġother . data [ i ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus Assign ( other : ĠComplex Tensor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshape . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġother . shape [ index ]) Ġthrow ĠIllegalArgumentException (" Complex Tensor . plus : ĠTwo Ġtensors Ġshould Ġhave Ġthe Ġsame Ġshape .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] Ġ-= Ġother . data [ i ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġtimes Assign ( other : ĠNumber ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] Ġ= Ġdata [ i ] Ġ* Ġother . toDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġdiv Assign ( other : ĠNumber ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] Ġ= Ġdata [ i ] Ġ/ Ġother . toDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto Complex Matrix (): ĠComplex Matrix Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( dim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComplex Matrix ( 1 , Ġshape [ 0 ], Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComplex Matrix ( shape [ 0 ], Ġshape [ 1 ], Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Complex Tensor . to Complex Matrix : Ġmust Ġbe Ġa Ġ 2 Ġdimensional Ġtensor , Ġnot Ġ$ dim .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreshape ( new Shape : ĠInt Array ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġneg One Index Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġvar Ġneg One Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġacc Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġnew Shape . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġ- 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneg One Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneg One Index Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ*= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ% Ġacc Ġ!= Ġ 0 ) Ġthrow ĠIllegalArgumentException (" Complex Tensor . reshape : Ġinvalid Ġshape Ġinput ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Complex Tensor . reshape : Ġinvalid Ġshape Ġinput ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( neg One Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Shape [ neg One Index ] Ġ= Ġsize Ġ/ Ġacc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( new Shape , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġflatten (): ĠComplex Row Vector Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . reshape ( int ArrayOf (- 1 )). to Complex Matrix (). to Complex Row Vector () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconcat ( other : ĠComplex Tensor , Ġconcat Dim : ĠInt ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( dim Ġ!= Ġother . dim Ġ|| Ġconcat Dim Ġ>= Ġdim ) Ġthrow ĠIllegalArgumentException (" Complex Tensor . concat : Ġinvalid Ġdimension ") ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġconcat Dim Ġ&& Ġit Ġ!= Ġother . shape [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Complex Tensor . concat : Ġtwo Ġtensors Ġmust Ġhave Ġsame Ġshape Ġexcept Ġfor Ġconcat Ġdimension ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Shape Ġ= ĠInt Array ( shape . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconcat Dim Ġ-> Ġshape [ it ] Ġ+ Ġother . shape [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġshape [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Size Ġ= Ġcalculate Size ( new Shape ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( new Shape , ĠArray ( new Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Indices Ġ= ĠdataIndex To Tensor Indices ( new Shape , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Indices [ concat Dim ] Ġ< Ġshape [ concat Dim ] Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ new Indices ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Indices [ concat Dim ] Ġ-= Ġshape [ concat Dim ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother [ new Indices ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġmap ( lambda : Ġ( e : ĠComplex Double ) Ġ-> ĠComplex Double ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComplex Tensor ( shape , ĠArray ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlambda ( data [ it ]) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠdataIndex To Tensor Indices ( new Shape : ĠInt Array , ĠdataIndex : ĠInt ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret List Ġ= Ġarray ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġnew Shape . fold Right ( data Index ) Ġ{ Ġit , Ġacc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret List . add ( 0 , Ġacc Ġ% Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ/ Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret List . to IntArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtensor Indices To Data Index ( new Shape : ĠInt Array , Ġtensor Indices : ĠInt Array ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtensor Indices . reduce Indexed Ġ{ Ġindex , Ġacc , Ġtensor Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tensor Index Ġ>= Ġnew Shape [ index ]) Ġthrow ĠIllegalArgumentException (" Complex Tensor . tensor Indices To Data Index : ĠIndex Ġout Ġof Ġbound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( acc Ġ* Ġnew Shape [ index ]) Ġ+ Ġtensor Index ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Size ( new Shape : ĠInt Array ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Shape . reduce Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal , Ġnum Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num Ġ<= Ġ 0 ) Ġthrow ĠIllegalArgumentException (" Complex Tensor . init : ĠInvalid Ġshape ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtotal Ġ* Ġnum ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstack Sup pl ( other : ĠComplex Tensor ): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( dim - other . dim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . shape . forEach Indexed Ġ{ index , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . shape [ index ] Ġ!= Ġit ) Ġthrow ĠIllegalArgumentException (" Complex Tensor . stack : ĠCannot Ġstack Ġtensors Ġwith Ġdifferent Ġshape ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComplex Tensor ( int ArrayOf ( 2 ) Ġ+ Ġother . shape , Ġdata Ġ+ Ġother . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . shape . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . shape [ index Ġ+ Ġ 1 ] Ġ!= Ġit ) Ġthrow ĠIllegalArgumentException (" Complex Tensor . stack : ĠCannot Ġstack Ġtensors Ġwith Ġdifferent Ġshape ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComplex Tensor ( int ArrayOf ( shape [ 0 ]+ 1 ) Ġ+ Ġother . shape , Ġdata Ġ+ Ġother . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Complex Tensor . stack : ĠCannot Ġstack Ġtensors Ġwith Ġdifferent Ġshape ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠString Vector . build ( this ). toString () Ġ+ Ġ"\ n " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġstack ( tensors : ĠIterable < Complex Tensor >): ĠComplex Tensor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Ġ= Ġtensors . elementAt ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtensors . fold ( init ) Ġ{ Ġacc , Ġtensor Ġ-> Ġacc . stack Sup pl ( tensor ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ