package Ġsc ient ifik . k math . linear Ċ Ċ import Ġsc ient ifik . k math . histogram . Point Ċ import Ġsc ient ifik . k math . operations . Double Field Ċ import Ġsc ient ifik . k math . operations . Field Ċ import Ġsc ient ifik . k math . operations . Space Ċ import Ġsc ient ifik . k math . operations . Space Element Ċ import Ġsc ient ifik . k math . structures . N DE lement Ċ import Ġsc ient ifik . k math . structures . get Ċ Ċ /** Ċ Ġ* ĠA Ġlinear Ġspace Ġfor Ġvectors . Ċ Ġ* ĠCould Ġbe Ġused Ġon Ġany Ġpoint - like Ġstructure Ċ Ġ*/ Ċ abstract Ġclass ĠVector Space < T Ġ: ĠAny , ĠS Ġ: ĠSpace < T >>( val Ġsize : ĠInt , Ġval Ġspace : ĠS ) Ġ: ĠSpace < Point < T >> Ġ{ ĊĊĠĠĠ Ġabstract Ġfun Ġproduce ( initializer : Ġ( Int ) Ġ-> ĠT ): ĠVector < T , ĠS > ĊĊĠĠĠ Ġoverride Ġval Ġzero : ĠVector < T , ĠS > Ġby Ġlazy Ġ{ Ġproduce Ġ{ Ġspace . zero Ġ} Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( a : ĠPoint < T >, Ġb : ĠPoint < T >): ĠVector < T , ĠS > Ġ= Ġproduce Ġ{ Ġwith ( space ) Ġ{ Ġa [ it ] Ġ+ Ġb [ it ] Ġ} Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmultiply ( a : ĠPoint < T >, Ġk : ĠDouble ): ĠVector < T , ĠS > Ġ= Ġproduce Ġ{ Ġwith ( space ) Ġ{ Ġa [ it ] Ġ* Ġk Ġ} Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠA Ġpoint Ġcoup led Ġto Ġthe Ġlinear Ġspace Ċ Ġ*/ Ċ interface ĠVector < T Ġ: ĠAny , ĠS Ġ: ĠSpace < T >> Ġ: ĠSpace Element < Point < T >, ĠVector Space < T , ĠS >>, ĠPoint < T >, ĠIterable < T > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize : ĠInt Ġget () Ġ= Ġcontext . size ĊĊĠĠĠ Ġoverride Ġoperator Ġfun Ġplus ( b : ĠPoint < T >): ĠVector < T , ĠS > Ġ= Ġcontext . add ( self , Ġb ) ĊĠĠĠ Ġoverride Ġoperator Ġfun Ġminus ( b : ĠPoint < T >): ĠVector < T , ĠS > Ġ= Ġcontext . add ( self , Ġcontext . multiply ( b , Ġ- 1 . 0 )) ĊĠĠĠ Ġoverride Ġoperator Ġfun Ġtimes ( k : ĠNumber ): ĠVector < T , ĠS > Ġ= Ġcontext . multiply ( self , Ġk . toDouble ()) ĊĠĠĠ Ġoverride Ġoperator Ġfun Ġdiv ( k : ĠNumber ): ĠVector < T , ĠS > Ġ= Ġcontext . multiply ( self , Ġ 1 . 0 Ġ/ Ġk . toDouble ()) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreate Ġvector Ġwith Ġcustom Ġfield ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠAny , ĠF Ġ: ĠField < T >> Ġof ( size : ĠInt , Ġfield : ĠF , Ġinitializer : Ġ( Int ) Ġ-> ĠT ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Vector ( Array Vector Space ( size , Ġfield ), Ġinitializer ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġreal Space Cache Ġ= ĠHashMap < Int , ĠArray Vector Space < Double , ĠDouble Field >>() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Real Space ( size : ĠInt ): ĠArray Vector Space < Double , ĠDouble Field > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreal Space Cache . get Or Put ( size ){ Array Vector Space ( size , ĠDouble Field , Ġreal ND Field Factory )} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreate Ġvector Ġof Ġ[ Double ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġof Real ( size : ĠInt , Ġinitializer : Ġ( Int ) Ġ-> ĠDouble ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Vector ( get Real Space ( size ), Ġinitializer ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġof Real ( var arg Ġpoint : ĠDouble ) Ġ= Ġpoint . to Vector () ĊĊĠĠĠĠĠĠĠ Ġfun Ġequals ( v 1 : ĠVector < *, Ġ* >, Ġv 2 : ĠVector < *, Ġ* >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 1 Ġ=== Ġv 2 ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 1 . context Ġ!= Ġv 2 . context ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġv 2 . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 1 [ i ] Ġ!= Ġv 2 [ i ]) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠArray Vector Space < T Ġ: ĠAny , ĠF Ġ: ĠField < T >>( ĊĠĠĠĠĠĠĠ Ġsize : ĠInt , ĊĠĠĠĠĠĠĠ Ġfield : ĠF , ĊĠĠĠĠĠĠĠ Ġval Ġnd Factory : ĠND Field Factory < T , ĠF > Ġ= Ġgeneric ND Field Factory ( field ) Ċ ) Ġ: ĠVector Space < T , ĠF >( size , Ġfield ) Ġ{ ĊĠĠĠ Ġval Ġnd Field Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġnd Factory ( int ArrayOf ( size )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġproduce ( initializer : Ġ( Int ) Ġ-> ĠT ): ĠVector < T , ĠF > Ġ= ĠArray Vector ( this , Ġinitializer ) Ċ } ĊĊ Ċ class ĠArray Vector < T Ġ: ĠAny , ĠF Ġ: ĠField < T >> Ġinternal Ġconstructor ( override Ġval Ġcontext : ĠVector Space < T , ĠF >, Ġval Ġelement : ĠN DE lement < T , ĠF >) Ġ: ĠVector < T , ĠF > Ġ{ ĊĊĠĠĠ Ġconstructor ( context : ĠArray Vector Space < T , ĠF >, Ġinitializer : Ġ( Int ) Ġ-> ĠT ) Ġ: Ġthis ( context , Ġcontext . nd Field . produce Ġ{ Ġlist Ġ-> Ġinitializer ( list [ 0 ]) Ġ}) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context . size Ġ!= Ġelement . shape [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Array Ġdimension Ġmismatch ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( index : ĠInt ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelement [ index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġself : ĠArray Vector < T , ĠF > Ġget () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < T > Ġ= Ġ( 0 Ġuntil Ġsize ). map Ġ{ Ġelement [ it ] Ġ}. iterator () ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġthis . join ToString ( prefix Ġ= Ġ"[", Ġpostfix Ġ= Ġ" ]", Ġseparator Ġ= Ġ", Ġ") Ġ{ Ġit . toString () Ġ} Ċ } ĊĊ