package Ġde sel by . std . collections Ċ Ċ import Ġde sel by . std . ND Range Ċ import Ġde sel by . std . ND Range Iterator Ċ import Ġjava . lang . IllegalArgumentException Ċ Ċ class ĠDouble ND Array Slice Ġ: ĠDouble ND Array Ġ{ ĊĠĠĠ Ġvar Ġoffset Ġ: ĠInt ĊĊĠĠĠ Ġoverride Ġval Ġsize Ġ: ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġshape . fold ( 1 , ĠInt :: times ) ĊĊĠĠĠ Ġconstructor ( base Ġ: ĠDouble ND Array Slice , Ġslice Ġ: ĠND Range ) Ġ: Ġthis ( base Ġas ĠDouble ND Array , Ġslice ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġbase . offset ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġconstructor ( base Ġ: ĠDouble ND Array , Ġslice Ġ: ĠND Range ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslice . shape , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInt Array ( slice . n Dimensions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase . stride [ it ]* slice [ it ]. step ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase . as Double Array () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoffset Ġ= Ġbase . to Flat Index ( slice . first ()) Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ( ArrayIndex OutOfBoundsException (" Slice Ġcontains Ġout Ġof Ġbounds Ġelements ")) Ċ // ĠĠĠĠĠĠĠ Ġprintln (" Creating Ġslice Ġwith Ġ${ slice . first (). asList ()} Ġto Ġ${ slice . last (). asList () }") Ċ // ĠĠĠĠĠĠĠ Ġprintln (" offset Ġis Ġ$ offset ") ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġslice . n Dimensions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( slice [ i ]. last Ġ>= Ġbase . shape [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ( ArrayIndex OutOfBoundsException (" Slice Ġcontains Ġout Ġof Ġbounds Ġelements ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( shape Array Ġ: ĠInt Array , Ġstride Array Ġ: ĠInt Array , Ġdata Ġ: ĠDouble Array , Ġoffset Ġ: ĠInt ) Ġ: Ġsuper ( shape Array , Ġstride Array , Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . offset Ġ= Ġoffset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Flat Index ( index Ġ: ĠInt Array ) Ġ: ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . to Flat Index ( index )?. plus ( offset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( slice : ĠND Range ): ĠDouble ND Array Slice Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDouble ND Array Slice ( this , Ġslice ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġre Shape ( var arg Ġnew Shape Ġ: ĠInt ) Ġ: ĠDouble ND Array Slice Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Stride Ġ= ĠInt Array ( new Shape . size ) Ġ{ 1 } ĊĠĠĠĠĠĠĠ Ġvar Ġold Dim Ġ= Ġshape Array . size - 1 ĊĠĠĠĠĠĠĠ Ġvar Ġdim Ġ= Ġnew Shape . size - 1 ĊĠĠĠĠĠĠĠ Ġwhile ( dim Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Shape [ dim ] Ġ== Ġshape [ old Dim ] Ġ-> Ġnew Stride [ dim -- ] Ġ= Ġstride [ old Dim -- ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Shape [ dim ] Ġ> Ġshape [ old Dim ] Ġ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( shape [ old Dim ] Ġ== Ġ 1 ) Ġ-- old Dim ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġthrow ( IllegalArgumentException (" Can 't Ġreshape Ġa Ġslice Ġin Ġthis Ġway ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Shape [ dim ] Ġ< Ġshape [ old Dim ] Ġ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstride Ġ= Ġstride [ old Dim ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Stride [ dim ] Ġ= Ġstride ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ*= Ġnew Shape [ dim ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstride Ġ*= Ġnew Shape [ dim -- ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile ( size Ġ< Ġshape [ old Dim ] Ġ&& Ġdim Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( size Ġ> Ġshape [ old Dim ]) Ġthrow ( IllegalArgumentException (" Can 't Ġreshape Ġa Ġslice Ġin Ġthis Ġway ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- old Dim ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠDouble ND Array Slice ( new Shape , Ġnew Stride , Ġdata , Ġoffset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġoperator Ġfun Ġiterator () Ġ= ĠData Iterator () ĊĊĠĠĠ Ġinner Ġclass ĠData Iterator Ġ: ĠIterator < Double > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Iterator Ġ= ĠND Range Iterator ( this @ Double ND Array Slice . index Set . range ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next () Ġ= Ġindex Iterator . hasNext () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext () Ġ= Ġthis @ Double ND Array Slice [ index Iterator . next ()] ĊĠĠĠ Ġ} Ċ Ċ }