以下、添付図面を参照しながら、本発明の実施形態を説明する。
本実施形態は、以下の特徴を有する。
(1) 遅延評価プログラミングを取り入れ,実際に計算するタイミングを遅らせる。
(2) オブジェクト間の演算をオブジェクト間の関連付けで完了できるようにする。
(3) 演算を行う際に,オペランドの引数のオブジェクトについて,その状態を判定することにより,その配列要素を更新するか否かを判定する。
(4) 演算過程で使用された後,不要になったオブジェクトの配列用メモリ領域は直ちに解放する。
本実施形態では,大規模な線形代数演算において,BLAS等の非オブジェクト指向プログラミング言語向けの高速演算ライブラリを直接利用することに比べ,十分無視できる程度のオーバーヘッドで演算子のオーバーロードを利用したプログラミングを実現できる。例えば,演算子オーバーロード等の,C++言語で記述することによるオーバーヘッドを十分無視できるC++言語対応版BLASが実現される。
例えば,以下のような演算について,計算過程で生成される一時的な配列用メモリ領域が必要ない(ただし,V,W:Vector,A,B,C:Matrix,m,n:Complex)。これはBLASを直接使って計算するような場合と同等である。
(a) V = m * A * W + n * V
(b) C = m * A * B + n * C
また,2項間演算を繰り返すことに伴う,一時メモリ領域へのメモリコピー等のオーバーヘッドの増加,必要メモリ量の増加を抑えることができる。
本実施形態の方法では,Matrixの要素及びVectorの成分の計算は先延ばしされるが,実際に計算が行なわれるタイミングは,オブジェクトが数1の右辺の形で表現できなくなる時,=演算子が起動された時,及び,直ちに結果が必要となるメソッド(Dot,NormL2等)が実行された時である。
例えば,下記の式(2)の場合,先延ばしにされた演算の計算が実際に行なわれるのは,図5の1及び2の演算位置である。ただし,大文字のアルファベットはMatrixオブジェクトであり,小文字のアルファベットはComplexオブジェクトである。また,Trans()はエルミート共役に変換するメソッドである。
G=(m * A.Trans()*B+n*C).Trans()*p*E+p*F (2)
図6は、本実施形態に係る演算装置のハードウェア構成を示すブロック図である。
同図において、CPU101は、フローチャートにつき説明した処理手順を含む各種プログラムを実行し、システムバス108により接続された装置各部を制御する。RAM102は、データやプログラムを一時記憶する。ROM103は、固定的なデータやプログラムを記憶する。キーボード104は、文字を入力したり、機能を選択するためのキーを備えている。更に画面上の位置を指示するためのポインティングデバイスとしてマウスが備えられている。
ディスプレイ105は、計算結果の数値やグラフを表示したり、ユーザインターフェース(UI)を提供する。ハードディスクドライブ(HDD)106は、プログラムやデータを永続的に記憶装置である。更にDVD、CD、FDなどの記憶媒体を用いる記憶装置を設けてもよい。通信I/F107は、LANやインターネットなどを経由して装置外部と通信するためのインタフェースである。システムバス108は、上述した装置各部を接続し、装置間でデータやアドレス、制御信号を送受信する媒体として利用される。
フローチャートにつき説明した処理手順を含む各種プログラムは、ROM103に記憶されていてもよいし、HDD106からRAM102へ、処理に先立ってあるいは処理の実行中に必要に応じてロードされるようにしてもよい。
また、計算に必要なデータは、キーボード104から入力したり、HDD106などの記憶装置から読み出したり、通信I/F107を介して外部から受信するなどして、得ることができる。
本実施形態では,オブジェクト指向プログラミング向けでないライブラリ,BLASを利用し,演算子のオーバーロードを使ったオブジェクト指向プログラミングでも利用できるようにする。
本実施形態における線形代数演算は,複素Matrix,複素Vectorに係わるものとする。また,Matrixは行数と列数が同じであるものとする。複素数の演算を実現するクラス(Complex)については説明しない。これについては,STL(Standard Template Library)のComplexクラス相当のものがあらかじめあるものとする。
図面はUML(Unified Modeling Language)の記法に従うものとする。特に,Class diagram,State machine diagram,及びActivity diagramを利用する。Activity daigramでは,プログラムとの対応を分かりやすくするため,C++のソースコードに近い記述を用いた。
図7は本実施形態におけるArrayクラス,Matrixクラス,及びVectorクラスの継承関係を説明するクラス図である。ただし,メソッドについては記載を省略している。ArrayクラスはMatrixクラスとVectorクラスに共通するメンバ変数とメソッドを持つ抽象的なクラスである。
Arrayクラスにおいて,pElmは配列要素のポインタを示す。NumElmは配列の長さを示す。RelationStateは,他オブジェクトとの関係を示す。MyArrayStateは自Arrayオブジェクトの状態を表す,MultiplyingArrayStateは積演算対象Arrayオブジェクトの状態を示す。AddingArrayStateは,和演算対象Arrayオブジェクトの状態を示す。ObjectStateはオブジェクトの状態を表す。Ownerは配列要素を所有しているArrayオブジェクトへの参照である。MultiplyingObjは積演算対象Arrayオブジェクトへの参照である。AddingObjは和演算対象オブジェクトへの参照である。“参照”は既にあるオブジェクトの別名であり,既にあるオブジェクトへのポインタとしてもよい。
MulFactorはマトリックスを以下の式(3)のように表した時の係数αである。AddFactorはマトリックスを以下の式(3)のように表した時の係数βである。
D=αAB+βC (3)
AssociatedCountは,そのオブジェクトを積演算対象としている他オブジェクトの数と和演算対象としている他オブジェクトの数の和である。
Matrixオブジェクトは最大1つまでの他Matrixオブジェクトを積演算対象オブジェクトとすることができる。Matrixオブジェクトは1つまでの他Matrixオブジェクトを和演算対象オブジェクトとすることができる。
Vectorオブジェクトは1つまでの他Vectorオブジェクトを積演算対象オブジェクトとすることができる。Vectorオブジェクトは1つまでの他Vectorオブジェクトを和演算対象オブジェクトとすることができる。自オブジェクトは自オブジェクトを積演算対象又は和演算対象とすることはできない。Vectorオブジェクトは1つまでのMatrixオブジェクトを積演算対象オブジェクトとすることができる。
Arrayオブジェクトは他Arrayオブジェクトの配列要素を利用することができる。この場合に利用するオブジェクトをUser,利用されるオブジェクトをOwnerと呼ぶこととする。積演算関係において,積演算をするオブジェクトをMultiplyingObj,積演算されるオブジェクトをMultipliedObjと呼ぶこととする。和演算関係においては,和演算をするオブジェクトをAddingObj,和演算されるオブジェクトをAddedObjと呼ぶこととする。Arrayオブジェクトは数3の右辺のような数式の形の情報を保持できる。Arrayクラスの属性との対応は以下のようになる。
α:MulFactor
β:AddFactor
A:Owner
B:MultiplyingObj
C:AddingObj
ただし,MultiplyingObj=0は積演算対象のオブジェクトがないこと,AddingObj=0は和演算対象のオブジェクトがないこととして定義する。
図8は、Arrayクラスのオブジェクトの状態を表すメンバ変数RelationStateのとりうる値を示した図である。Arrayクラスのメンバ変数における型RelationTypeは、図8に示す値のいずれか一つを持つ変数型である。Arrayオブジェクトは、以下のいずれか1つの値をRelationStateの値として必ず持ち,それに対応する状態となっている。
図9は、Arrayクラスのオブジェクトの状態を表すビットの集合である変数の要素名とその意味を示した図である。図9の(A)は、オブジェクトの状態を示すために必要な2つのフラグからなるArrayState型についての説明である。
フラグTranspseがON(ビット値が1)であれば、当該オブジェクトはエルミート共役であることを意味する。フラグMulReverseがOFFであれば,Ownerオブジェクトと積演算対象であるMultiplyingObjオブジェクトとの積演算において,Ownerオブジェクトは左側で,MultiplyingObjは右側となる(Owner*MultiplyingObj)。MulReverseがONであればこの積演算の順序は入れ替わる(MultiplyingObj*Owner)。
図9の(B)は、オブジェクトの状態を示すために必要な2つのフラグからなるObjectState型についての説明である。
TemporalOwnerがONであれば当該オブジェクトは一時的に配列用メモリ領域を所有しているオブジェクトである。この状態のオブジェクトの配列用メモリ領域は計算の過程で一時的に利用されるものであるため,利用された直後に当該メモリ領域を解放する。以下において,ObjectState.TemporalOwnerは単にTemporalOwnerと記載する。
UnEvaluatedがONであれば,当該オブジェクトは演算に対応する実際の計算が先延ばしされている。したがって,そのオブジェクトの要素(Matrixの成分又はVectorの成分)を参照する前に実際の計算を完了させる必要がある。以下において,ObjectState.UnEvaluatedは単にUnEvaluatedと記載する。
オブジェクトの状態を表すフラグをこのようにObjectStateとArrayStateに分けているのは,ArrayStateについては積演算又は和演算に伴って,積演算をする又は和演算をするオブジェクトが,積演算をされる又は和演算をされるオブジェクトの状態MyArrayStateをコピーし,保有する必要があるからである。一方,ObjectStateはコピーする必要はない。
図10は、Arrayオブジェクトの状態変化を表すState Machine Diagramである。ただし,ここでの状態は,RelationStateとObjectStateの組合せ{RelationState,ObjectState}である。
大きさを指定してArrayオブジェクトを生成すると、初期状態{RelationNormal,Evaluated}という状態になる。この状態は他オブジェクトとの関係がない状態であり,ポインタpElmで示されるメモリ領域の内容をそのまま利用できる状態である。状態Evaluatedでは,ArrayオブジェクトのMulFactorは1,AddFactorは0,MultiplyingObj=0,AddingObj=0である。
状態{RelationNormal,Evaluated}は,multiplyFactor又はdivideFactorの操作により,状態{RelationNormal,UnEvaluated}になる。UnEvaluatedという状態は計算が完了していない状態である。したがって,真のオブジェクトの要素(Matrixの要素又はVectorの要素)が必要であれば,計算を完了させる必要があるということである。
状態{RelationNormal,Evaluated}において,makeRelationMultiplyの操作により状態{Multiplying,UnEvaluated}になる。これは,他オブジェクトを積演算対象としている状態であり,計算が完了していない状態である。状態{RelationNormal,Evaluated}において,makeRelationAddの操作により状態{Adding,UnEvaluated}になる。これは,他オブジェクトを和演算対象としている状態であり,計算が完了していない状態である。
状態{RelationNormal,UnEvaluated}において,multiplyFactor又はdivideFactorの操作により,状態{RelationNormal,UnEvaluated}へ戻る。状態{RelationNormal,UnEvaluated}において,makeRelationMultiplyにより状態{Multiplying,UnEvaluated}になる。状態{RelationNormal,UnEvaluated}において,makeRelationAddにより状態{Adding,UnEvaluated}になる。
状態{Adding,UnEvaluated}において,multiplyFactor又はdivideFactorの操作により,状態{Adding,UnEvaluated}へ戻る。
状態{Multiplying,UnEvaluated}において,makeRelationAddの操作により,状態{MultiplyingAndAdding,UnEvaluated}になる。状態{MultiplyingAndAdding,UnEvaluated}において,multplyFactor又はdivideFactorの操作により,状態{MultiplyingAndAdding,UnEvaluated}へ戻る。
状態{MultipliedOrAdded,Evaluated}を除いたすべての状態は、evaluate操作により状態{RelationNormal,Evaluated}になる。
状態{RelationNormal,Evaluated}において,他オブジェクトからsetMultiplyingObj又はsetAddingObjの操作がなされることにより,状態{MultipliedOrAdded,Evaluated}に戻る。
本実施の形態において使用するライブラリBLASの関数とその機能は図11に示す通りである。これらの関数の詳細と関数の引数の詳細については非特許文献2に記載されている。また,本実施の形態では,Fortran言語形式の関数を直接呼び出すのではなく,C言語向けの関数CBLASを呼び出すものとする。CBLASはC言語からでもBLAS関数を利用しやすくするためのものであり,配列のメモリ上での配置の仕方を指定する引数があることを除いてBLASと同じである。もちろん,Fortran言語で作られたBLASのサブルーチンのオブジェクトを,引数に注意しながらリンケージさせることも可能であろう。
図12はArrayクラスのメソッド(メンバ関数)の一覧を記載した図である。各メソッドの詳細は、図15〜39につき後述する。
図13はMatrixクラスのメソッドの一覧を示した図である。各メソッドの詳細は、図40〜61につき後述する。
図14はVectorクラスのメソッドの一覧を示した図である。各メソッドの詳細は、図62〜81につき後述する。
図15は引数なしのArrayクラスのデフォルトコンストラクタについてのactivity diagramである。ステップS1501では,メソッドinitializeArrayを実行する。
図16は、1つの整数(int型)を引数に持つArrayクラスのコンストラクタについてのActivity diagramである。本メソッドの引数は,int型変数in_NumElmである。これは配列の要素数である。ステップS1601では,メンバ変数にin_NumElmを設定し,メソッドinitializeArrayを実行する。
図17は、Arrayオブジェクトへの参照を引数とするArrayクラスのコンストラクタについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。ステップS1701では,メソッドcopyArrayを引数argObjで実行する。
図18は、Arrayクラスのデストラクタ~ArrayについてのActivity diagramである。
ステップS1801ではメソッドresetMultiplyingObjを実行し,メソッドresetAddingObjを実行する。ステップS1802では,メソッドisOwnerの戻り値がfalseであればステップS1803へ移行し,trueであればステップS1804へ移行する。
ステップS1803では配列要素の解放処理(freeMemory)を実行する。ステップS1804では,Ownerが0でなければステップS1805へ移行し,そうでなければ終了する。ステップS1805ではメソッドresetOwner(Owner−User関係のリセット)を実行する。
図19は、Arrayオブジェクトを初期化するメソッドinitializeArrayについてのactivity diagramである。
ステップS1901では,RelationStateに値RelationNormalを設定する。ステップS1902では,MyArrayState,AddingArrayState及びMultiplyingArrayStateをリセットする。ここで,リセットするとはすべてのフラグをOFFに設定することである。
ステップS1903では,Ownerに0を設定し,pElmに0を設定する。ステップS1904ではMulFactorに値1を複素数として設定し,AddFactorに値0を複素数として設定する。ステップS1905ではMultiplyingObjに0を設定し,AddingObjに0を設定する。
図20は配列要素のメモリ領域を確保するArrayクラスのメソッドgetMemoryについてのactivity diagramである。
ステップS2001では,メソッドisOwnerの戻り値がfalseであればステップS2002へ移行し,trueであれば終了する。ステップS2002ではNumElmが0でなければステップS2004へ移行し,0であればステップS2003へ移行してエラー終了する。ステップS2004ではOwnerが0でなければステップS2005へ移行し,0であればステップS2006へ移行する。
ステップS2005ではメソッドresetOwnerを実行する。ステップS2006では配列領域を確保する。これはMatrixの要素又はVectorの要素を格納するためのメモリ領域である。callocはメモリ領域を確保するシステムコールである。
ステップS2007では,Ownerにthisを設定する。ただし,thisは自オブジェクトを指す識別子である。C++言語の場合,thisには自オブジェクトへのポインタが設定される仕様となっている。オブジェクトの参照であるOwnerにthisを設定するとは,Ownerのメンバ変数が自オブジェクトのそれを指すようにするということである。これは配列要素の所有者(Owner)が自オブジェクトであることを意味する。
図21は、配列要素のためのメモリ領域を解放するArrayクラスのメソッドfreeMemoryについてのactivity diagramである。
ステップS2101では、メソッドisOwnerの戻り値がtrueであるかTemporalOwnerがONであれば(一時的な所有者であれば)、ステップS2102へ移行し,そうでなければ終了する。ステップS2102では、pElmを先頭アドレスとするメモリ領域を解放する。freeはメモリを解放するためのシステムコールである。
ステップS2103ではpElmに0を設定し,Ownerに0を設定する。ステップS2104ではTemporalOwnerをOFFに設定する。
図22は,配列要素をコピーするArrayクラスのメソッドcopyElementについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
ステップS2201では,メソッドisOwnerの戻り値がfalseであればステップS2202へ移行し,trueであればステップS2203へ移行する。ステップS2202ではメソッドgetMemoryを実行する。ステップS2203では,コピー元のオブジェクトargObjの配列要素をすべて自オブジェクトの配列要素へとコピーする。
図23は、Arrayオブジェクトのメンバ変数の一部をコピーするためのArrayオブジェクトのメソッドcopyArrayについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
ステップS2301で、コピー元ArrayオブジェクトargObjのメンバ変数NumElm,pElm,MulFactor及びAddFactorを自オブジェクトの対応するメンバ変数へコピーする。ステップS2302では,argObjのメンバ変数Ownerを自オブジェクトのOwnerにコピーする。これにより,自オブジェクトのOwnerがargObjのOwnerに一致する。
ステップS2303では,argObjのメンバ変数MyArrayStateを自オブジェクトのMyArrayStateにコピーする。ステップS2304では,argObjのメンバ変数MultiplyingObjが0でなければステップS2305へ移行し,0であればステップS2307へ移行する。
ステップS2305では、メソッドsetMultiplyingObjを引数argObj.MultiplyingObjで実行する。これにより,自オブジェクトのMultiplyingObjがコピー元オブジェクトargObjのMultiplyingObjに一致する。ステップS2306では、argObjのメンバ変数MultiplyingArrayStateを自オブジェクトのMultiplyingArrayStateにコピーする。
ステップS2307では、argObjのメンバ変数AddingObjが0でなければステップS2308へ移行し,0であれば終了する。ステップS2308では、メソッドsetAddingObjを引数argObj.AddingObjとして実行する。これにより,自オブジェクトのAddingObjがコピー元オブジェクトargObjのAddingObjに一致する。
ステップS2309では、argObjのメンバ変数AddingArrayStateを自オブジェクトのAddingArrayStateにコピーする。注意すべきことは,メソッドcopyArrayが配列要素(pElmを先頭アドレスとする連続したデータ)をコピーしないことである。配列要素をコピーするためにはメソッドcopyElementを実行する。
図24は、Arrayオブジェクト(Matrixオブジェクト又はVectorオブジェクト)に対してComplexとの積演算を実行するためのメソッドmultiplyFactorについてのactivity diagramである。本メソッドの引数はComplexオブジェクトargFactorである。
ステップS2401ではMulFactorにargFactorを掛け,AddFactorにargFactorを掛ける。ステップS2402ではUnEvaluatedをONに設定する。
図25は,Arrayオブジェクト(Matrixオブジェクト又はVectorオブジェクト)に対してComplexオブジェクトとの商演算を実行するためのメソッドdivideFactorについてのactivity diagramである。本メソッドの引数はComplexオブジェクトargFactorである。
ステップS2501ではMulFactorをargFactorで割り,AddFactorをargFactorで割る。ステップS2502ではUnEvaluatedをONに設定する。
図26は、2つのArrayオブジェクトを積演算で関連付けするためのメソッドmakeRelationMultiplyについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
ステップS2601では,メソッドsetMultiplyingObjを引数argObjで呼び出す。ステップS2602では,自オブジェクトのMulFactorにargObjのMulFactorを掛ける。ステップS2603では,MultiplyingArrayStateにargObjのMyArrayStateを設定する。ステップS2604では,UnEvaluatedにONを設定する。
図27は、2つのArrayオブジェクトを和演算で関連付けするメソッドmakeRelationAddのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
ステップS2701では、引数をargObj.OwnerとしてメソッドsetAddingObjを実行する。ステップS2702では、自オブジェクトのAddFactorにargObjのMulFactorを設定する。ステップS2703では自オブジェクトのAddingArrayStateにargObjのMyArrayStateを設定する。ステップS2704ではUnEvaluatedにONを設定する。
図28は、2つのArrayオブジェクトの差を2オブジェクト間の関連付けで実現するメソッドmakeRelationSubtractについてのactivity diagramである。本メソッドの引数はArrayオブジェクトへの参照argObjである。
ステップS2801では、引数argObjでメソッドmakeRelationAddを実行する。ステップS2802では,自オブジェクトのAddFactorをComplex(-1.,0.)倍する。ここで,Complex(re,im)とは,実数部がre,虚数部がimの複素数オブジェクトである。ステップS2803ではUnEvaluatedにONを設定する。
図29は,オブジェクトをエルミート共役に変換するメソッドmakeTransposeThisについてのactivity diagramである。
ステップS2901では,メソッドflipArrayStateを実行することにより,MyArrayStateのTransposeフラグを反転し,MulFactorからメソッドconjを実行することにより,MulFactorを複素共役に変換する。ステップS2902では, MultiplyingObjが0でなければステップS2903へ移行し,0であればステップS2904へ移行する。
ステップS2903では,メソッドflipArrayStateを実行することにより,MultiplyingArrayStateのTransposeフラグを反転し,メソッドflipArrayStateを実行することにより,MyArrayStateのMulReverseフラグを反転する。ステップS2904では,AddingObjが0でなければステップS2905へ移行し,0であればステップS2906へ移行する。
ステップS2905では,メソッドflipArrayStateを実行することにより,AddingArrayStateのTransposeフラグを反転し, AddFactorからメソッドconjを実行してAddFactorを複素共役に変換する。ステップS2906ではUnEvaluatedをONに設定する。
図30は、Arrayオブジェクトの状態をリセットするためのメソッドresetArrayについてのactivity diagramである。
ステップS3001ではRelationStateに値RelationNormalを設定する。ステップS3002では,MyArrayState,AddingArrayState及びMultiplyingArrayStateをリセットする。ここで,リセットするとはすべてのフラグをOFFに設定することである。
ステップS3003ではMulFactorにComplex(1.,0.)を設定し,AddFactorにComplex(0.,0.)を設定する。ステップS3004ではメソッドresetMultiplyingAndAddingを実行する。
図31は、引数のArrayオブジェクトを自オブジェクトの和演算対象に設定するためのメソッドsetAddingObjについてのactivity diagramである。本オブジェクトの引数はArrayオブジェクトへの参照argObjである。
ステップS3101ではAddingObjにargObjを設定し,AddingObjのRelationStateに値MultipliedOrAddedを設定し,AddingObjのAssociatedCount値を1だけ加算する。ステップS3102では、自オブジェクトのRelationStateが値RelationNormalであればステップS3103へ移行し,値MultiplyingであればステップS3104へ移行する。
ステップS3103では、自オブジェクトのRelationStateに値Addingを設定する。ステップS3104では自オブジェクトのRelationStateに値MultiplyingAndAddingを設定する。
図32は引数のArrayオブジェクトを自オブジェクトの積演算対象に設定するためのメソッドsetMultiplyingObjについてのactivity diagramである。本オブジェクトの引数はArrayオブジェクトへの参照argObjである。
ステップS3201では,自オブジェクトのMultiplyingObjにargObjを設定し,MultiplyingObjのRelationStateに値MultipliedOrAddedを設定し,MultiplyingObjのAssociatedCountの値を1だけ増加させ,自オブジェクトのRelationStateに値Multiplyingを設定する。
図33は、和演算対象のオブジェクトとの関係をリセットするためのメソッドresetAddingObjについてのactivity diagramである。本オブジェクトの引数はArrayオブジェクトへの参照argObjである。
ステップS3301では、AddingObjのAssociatedCountの値を1だけ減算する。ステップS3302では、AssociatedObjのAssociatedCountの値が0でればステップS3303へ移行し,そうでなければステップS3304へ移行する。
ステップS3303では、AddingObjのRelationStateに値RelationNormalを設定する。ステップS3304では,自オブジェクトのAddingObjに0を設定する。ステップS3305では,自オブジェクトのRelationStateがAddingであればステップS3306へ移行し,値MultiplyingAndAddingであればステップS3307へ移行する。
ステップS3306では,自オブジェクトのRelationStateに値RelationNormalを設定する。ステップS3307では,自オブジェクトのRelationStateに値Multiplyingを設定する。
図34は、積演算対象のオブジェクトとの関係をリセットするためのメソッドresetMultiplyingObjについてのactivity diagramである。本オブジェクトの引数はArrayオブジェクトへの参照argObjである。
ステップS3401では、MultiplyigObjのAssociatedCountの値を1だけ減算する。ステップS3402では、MultiplyingObjのAssociatedCountの値が0であればステップS3403へ移行し,そうでなければステップS3404へ移行する。
ステップS3403では、MultiplyingObjのRelationStateに値RelationNormalを設定する。ステップS3404では、MultiplyingObjに0を設定する。ステップS3405ではRelationStateを判定する。RelationStateが値MultiplyingであればステップS3406へ移行し,値MultiplyingAndAddingであればステップS3407へ移行する。
ステップS3406では、RelationStateに値RelationNormalを設定する。ステップS3407ではRelationStateに値Addingを設定する。
図35は、和演算対象のArrayオブジェクトとの和演算関係と積演算対象のArrayオブジェクトとの積演算関係をリセットするためのメソッドresetMultiplyingAndAddingObjについてのactivity diagramである。
ステップS3501では,MultiplyingObjが0でなければステップS3502へ移行し,そうでなければステップS3503へ移行する。ステップS3502ではメソッドresetMultiplyingObjを実行する。ステップS3503では,AddingObjが0でなければステップS3504へ移行し,そうでなければ終了する。ステップS3504ではメソッドresetAddingObjを実行する。
図36は、配列要素の所有オブジェクト(Owner)と利用オブジェクト(User)の関係をリセットするために利用オブジェクトが呼び出すメソッドresetOwnerについてのactivity diagramである。ステップS3601ではOwnerに0を設定し,pElmに0を設定する。
図37は、自オブジェクトが配列要素の所有オブジェクトであるか否かを判定するためのメソッドisOwnerについてのactivity diagramである。
ステップS3701では,Ownerがthis(自オブジェクト自身)でありpElmが0でなければステップS3702へ移行し,そうでなければステップS3703へ移行する。ステップS3702では戻り値trueでリターンする。ステップS3703では戻り値falseでリターンする。
注意すべきことは,Ownerがthisであっても,pElmが0であれば戻り値falseでリターンすることである。つまり,isOwner()=trueとは,Ownerに自オブジェクト自身(this)が設定されており,かつ,大きさが0より大きい配列用メモリ領域を有していることである。
図38は、Arrayの状態を表すフラグ群ArrayStateから指定したフラグ識別子のフラグを反転させるメソッドflipArrayStateのactivity diagramである。本メソッドの引数はArrayState型変数への参照とフラグ識別子(Transpose又はMulReverse)である。本メソッドはArrayStateの指定されたフラグを反転させる。
ステップS3081では,引数のArrayStete型変数argStateについて,フラグ識別子argFlagのフラグがONであれば処理3802へ移行し,そうでなければ処理3803へ移行する。ステップS3802では当該フラグをOFFに設定する。ステップS3803では当該フラグをONに設定する。
図39は、計算の種類を分類するためにevaluateから利用されるメソッドgetEvaluationTypeについてのactivity diagramである。
ステップS3901では、自オブジェクトがMatrixオブジェクトであればステップS3902へ移行し,そうでなければステップS3913へ移行する。ステップS3902ではMultiplyingObjが0でなければステップS3903へ移行し,そうでなければステップS3910へ移行する。
ステップS3903では、MultiplyingObjがMatrixオブジェクトであればステップS3904へ移行し,そうでなければステップS3907へ移行する。ステップS3904ではAddingObjが0でなければステップS3905へ移行して戻り値MatA_Mul_MatB_Add_MatCでリターンし,そうでなければステップS3906へ移行して戻り値MatA_Mul_MatBでリターンする。
ステップS3907では、AddingObjが0でなければステップS3908へ移行して戻り値MatA_Mul_VecX_Add_VecYでリターンし,そうでなければステップS3909へ移行して戻り値MatA_Mul_VecXでリターンする。
ステップS3910では、AddingObjが0でなければステップS3911へ移行して戻り値ArrL_And_ArrRでリターンし,そうでなければステップS3912へ移行して戻り値EvaluationNormalでリターンする。ステップS3913ではMultiplyingObjが0でなければステップS3914へ移行し,そうでなければステップS3921へ移行する。
ステップS3914では,MultiplyingObjがMatrixオブジェクトであればステップS3915へ移行し,そうでなければステップS3918へ移行する。ステップS3915では、AddingObjが0でなければステップS3916へ移行して戻り値VecX_Mul_MatA_Add_VecYでリターンし,そうでなければステップS3917へ移行して戻り値VecX_Mul_MatAでリターンする。
ステップS3918では、AddingObjが0でなければステップS3919へ移行して戻り値VecX_Mul_VecY_Add_MatAでリターンし,そうでなければステップS3920へ移行して戻り値VecX_Mul_VecYでリターンする。ステップS3921では,AddingObjが0でなければステップS3922へ移行して戻り値ArrL_Add_ArrRでリターンし,そうでなければステップS3923へ移行して戻り値EvaluationNormalでリターンする。
図40は、MatrixクラスのデフォルトコンストラクタについてのActivity diagramである。
ステップS4001では、基底クラスのデフォルトコンストラクタArrayを実行する。C++ではこの基底クラスのコンストラクタの起動は暗黙に行なわれるので,プログラムでは記述する必要がない。ステップS4002では、NxMaxに0を設定し,NyMaxに0を設定する。
図41は、2つの整数in_NxMaxとin_NyMaxとを引数として持つMatrixクラスのコンストラクタについてのActivity diagramである。
ステップS4101では,引数in_NxMax*in_NyMaxで基底クラスのコンストラクタArrayを実行する。ステップS4102ではNxMaxにin_NxMaxを設定し,NyMaxにin_NyMaxを設定する。ステップS4103ではメソッドgetMemoryを実行する。
図42は、Matrixオブジェクトへの参照を引数として持つMatrixクラスのコンストラクタについてのActivity diagramである。ステップS4201では引数argObjでメソッドcopyArrayを実行する。ステップS4202では、NxMaxにargObjのメンバ変数NxMaxを設定し,NyMaxにargObjのメンバ変数NyMaxを設定する。
図43は、“Matrix=Matrix”を実行するための=演算子についてのActivity diagramである。ステップS4301では、引数argObjでメソッドevaluateを実行する。メソッドevaluateはargObjを評価して,結果を自オブジェクトに格納する。本演算子の実行により,先送りされた演算が実際に計算される。
図44は、“Matrix*Matrix”を実行するための*演算子についてのActivity diagramである。本演算子の引数は*演算子の左オペランドLeftMatrixと右オペランドRightMatrixである。
ステップS4401では、Matrixオブジェクトへの参照BaseObjにLeftMatrixを設定し,Matrixオブジェクトへの参照AssociatedObjにRightMatrixを設定する。ステップS4402ではBaseObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップS4403へ移行しそうでなければステップS4404へ移行する。
ステップS4403では、BaseObjからメソッドevaluateを実行する。ステップS4404では、AssociatedObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップS4405へ移行し,そうでなければステップS4406へ移行する。
ステップS4405では、AssociatedObjからメソッドevaluateを実行する(コピーコンストラクタによる生成)。ステップS4406では、引数BaseObjでMatrixオブジェクトResultObjを生成する。ステップS4407では、ResultObjからメソッドmakeRelationMultiplyを引数AssociatedObjで実行する。ステップS4408では戻り値ResultObjでリターンする。
図45は、“Complex*Matrix”又は“Matrix*Complex”を計算する*演算子についてのactivity diagramである。本演算子の引数はComplexオブジェクトargComplex及びMatrixオブジェクトへの参照argMatrixである。ステップS4501では,argMatrixからメソッドmultiplyFactorを引数argComplexで実行する。
図46は、“Matrix/Complex”を実行する/演算子についてのactivity diagramである。本演算子の引数はComplexオブジェクトargComplex及びMatrixオブジェクトへの参照argMatrixである。ステップS4601では,argMatrixからメソッドdivideFactorを引数argComplexで実行する。
図47は、“Matrix+Matrix”を実行する+演算子についてのactivity diagramである。本演算子の引数は+演算子の左オペランドLeftMatrixと右オペランドRightMatrixである。LeftMatrixとRightMatrixはMatrixオブジェクトへの参照である。
ステップS4701では、RightMatrixのRelationStateが値MultiplyingであればステップS4702へ移行し,そうでなければステップS4703へ移行する。ステップS4702では,Matrixオブジェクトへの参照BaseMatrixにRightMatrixを設定し,Matrixオブジェクトへの参照,AssociatedMatrixにLeftMatrixを設定する。
ステップS4703では,Matrixオブジェクトへの参照BaseMatrixにLeftMatrixを設定し,Matrixオブジェクトへの参照,AssociatedMatrixにRightMatrixを設定する。
ステップS4704では,BaseMatrixのRelationStateが値RelationNormalでなく,値MultipliedOrAddedでなく,値MultiplyingでなければステップS4705へ移行し,そうでなければステップS4706へ移行する。
ステップS4705では,BaseMatrixからメソッドevaluateを実行する。ステップS4706では,AssociatedMatrixのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップS4707へ移行し,そうでなければステップS4708へ移行する。
ステップS4707では,AssociatedMatrixからメソッドevaluateを実行する。ステップS4708では,引数BaseMatrixでMatrixオブジェクトResultMatrixを生成する。ステップS4709では,ResultMatrixからメソッドmakeRelationAddを引数AssociatedMatrixで実行する。ステップS4710では,戻り値ResultMatrixでリターンする。
図48は“Matrix−Matrix”を実行する−演算子についてのactivity diagramである。本演算子の引数は−演算子の左オペランドLeftMatrixと右オペランドRightMatrixである。LeftMatrixとRightMatrixはMatrixオブジェクトへの参照である。
ステップS4801では,swapフラグ(swap_flag)をOFFに初期化する。ステップS4802では,RightMatrixのRelationStateが値MultiplyingであればステップS4803へ移行し,そうでなければステップS4804へ移行する。
ステップS4803では,BaseMatrixにRightMatrixを設定し,AssociatedMatrixにLeftMatrixを設定し,swap_flagにONを設定する。ステップS4804では,Matrixオブジェクトへの参照BaseMatrixにLeftMatrixを設定し,Matrixオブジェクトへの参照AssociatedMatrixにRightMatrixを設定する。
ステップS4805では,BaseMatrixのRelationStateが値RelationNormalでなく,値MultipliedOrAddedでなく,値MultiplyingでなければステップS4806へ移行し,そうでなければステップS4807へ移行する。ステップS4806では,BaseMatrixからメソッドevaluateを実行する。ステップS4807では,AssociatedMatrixのRelationStateが値RelationNormalでなく,値MultipliedOrAddedでなければステップS4808へ移行し,そうでなければステップS4809へ移行する。
ステップS4808では,AssociatedMatrixからメソッドevaluateを実行する。ステップS4809では,引数BaseMatrixでMatrixオブジェクトResultMatrixを生成する。ステップS4810では,ResultMatrixからメソッドmakeRelationSubtractを引数AssociatedMatrixで実行する。ステップS4811では,swapフラグがONであればステップS4812へ移行し,そうでなければステップS4813へ移行する。
ステップS4812では,ResultMatrixからメソッドmultiplyFactorを引数Complex(-1.,0.)で実行する。これは,引き算の右側オペランドと左側オペランドを入れ替えたために必要となる。たとえば,βC-αA*Bという演算は,αA*B−βCとして処理した後に−1倍する。ステップS4813では戻り値ResultMatrixでリターンする。
図49は、Matrixクラスの単項演算子+についてのactivity diagramである。ステップS4901では、引数thisでMatrixオブジェクトResultMatrixを生成する。ステップS4902では戻り値ResultMatrixでリターンする。
図50は、Matrixクラスの単項演算子−についてのactivity diagramである。
ステップS5001では、引数thisでMatrixオブジェクトResultMatrixを生成する。ステップS5002では,ResultMatrixからメソッドmultiplyFactorを引数Complex(-1.,0.)で実行する。ステップS5003ではResultMatrixのUnEvaluatedをONに設定する。ステップS5004では戻り値ResultMatrixでリターンする。
図51は、Matrixオブジェクトをエルミート共役に変換するための関数Transのactivity diagramである。ステップS5101では,引数thisでMatrixオブジェクトResultMatrixを生成する。ステップS5102では,ResultMatrixからメソッドmakeTransposeThisを実行する。ステップS5103では,戻り値ResultMatrixでリターンする。
図52は、MatrixオブジェクトのL2ノルムを計算するためのメソッドNormL2についてのactivity diagramである。
ステップS5201で、UnEvaluatedがONならばステップS5202へ移行し,そうでなければステップS5203へ移行する。ステップS5202ではメソッドevaluateを実行する。ステップS5203では、BLAS関数dznrm2を引数(NumElm,this,1)を呼び出し,その戻り値でリターンする。ただし,BLAS関数へ渡す引数のthisは,実際にはthisのメンバ変数pElmであるものとする。つまり,引数thisはthis.pElmを略記したものである。以降でも,BLAS関数の引数としてArrayオブジェクト(Matrixオブジェクト,Vectorオブジェクトを含む)を指定する場合は,実際にはオブジェクトのメンバ変数pElmを指定するものとする。
図53から図60までは,計算を先延ばしされたMatrixオブジェクトの計算を実行するためのメソッドevaluateについてのactivity diagramである。本メソッドの引数はMatrixオブジェクトへの参照argObjである。
ステップS5301では,ToBeRemovedOwnerに0を設定し,ToBeRemovedAddingObjに0を設定し,ToBeRemovedMultiplyingObjに0を設定する。ここで,ToBeRemovedOwner,ToBeRemovedAddingObj,ToBeRemovedMultiplyingObjはArrayオブジェクトへの参照である。また,ComplexオブジェクトTmpMulFactorにargObjのMulFactorを設定し,ComplexオブジェクトTmpAddFactorにargObjのAddFactorを設定し,Arrayオブジェクトへの参照TmpOwnerにargObjのOwnerを設定する。さらに,Arrayオブジェクトへの参照TmpAddingObjにargObjのAddingObjにargObjのAddingObjを設定し,Arrayオブジェクトへの参照TmpMultiplyingObjにargObjのMultiplyingObjを設定する。
ステップS5302では,TmpOwnerが0でなくOwnerのTemporalOwnerがONであればステップS5303へ移行し,そうでなければステップS5304へ移行する。ステップS5303ではToBeRemovedOwnerにTmpOwnerを設定する。ステップS5304では、TmpAddingObjが0でなくTmpAddingObjのTemporalOwnerがONであればステップS5305へ移行し,そうでなければステップS5306へ移行する。
ステップS5305では、ToBeRemovedAddingObjにTmpAddingObjを設定する。ステップS5306では、TmpMultiplyingObjが0でなくTmpMultiplyingObjのTemporalOwnerがONであればステップS5307へ移行し,そうでなければステップS5308へ移行する。ステップS5307では、ToBeRemovedMultiplyingObjにTmpMultiplyingObjを設定する。ステップS5308ではオブジェクトargObjからメソッドgetEvaluationTypeを実行し,戻り値をeval_typeに設定する。
ステップS5309では、自オブジェクトthisがargObjに一致していればステップS5314へ移行し,そうでなければステップS5310へ移行する。ここで,「2つのオブジェクトが一致している」とは,2つオブジェクトが同じ実体を示していること,あるいは,2つのオブジェクトのメンバ変数が同じメモリ領域にあることを意味する。
ステップS5310では,メソッドisOwnerの戻り値がfalseであればステップS5311へ移行し,そうでなければステップS5318へ移行する。ステップS5311では,TmpOwnerが0でなければステップS5312へ移行し,0ならばステップS5313へ移行する。ステップS5312では,自オブジェクトからメソッドresetOwnerを実行する。
ステップS5313では,メソッドgetMemoryを実行し,フラグIsClearedをONに設定する。ステップS5314では,メソッドisOwnerの戻り値がfalseであればステップS5315へ移行し,そうでなければステップS5318へ移行する。ステップS5315ではTmpOwnerが0でなければステップS5316へ移行し,そうでなければステップS5317へ移行する。
ステップS5316では、自オブジェクトからメソッドresetOwnerを実行する。ステップS5317では,メソッドgetMemoryを実行し,フラグIsClearedをONに設定し,TemporalOwnerをONに設定する。
ステップS5318では、eval_typeがArrL_add_ArrRであればステップS5410へ移行し,VecX_mul_VecYであればステップS5606へ移行し,VecX_mul_VecY_add_MatAであればステップS5609へ移行する。また、eval_typeがMatA_mul_MatBであればステップS5701へ移行し,MatA_mul_MatB_add_MatCであればステップS5801へ移行し,EvaluationNormalであればステップS6001へ移行する。
ステップS5401では、ToBeRemovedOwnerが0でなければステップS5402へ移行し,そうでなければステップS5403へ移行する。ステップS5402では、ToBeRemovedOwnerからメソッドfreeMemoryを実行する。ステップS5403では、ToBeRemovedAddingObjが0でなければステップSステップS5404へ移行し,そうでなければステップS5405へ移行する。
ステップS5404では、ToBeRemovedAddingObjからメソッドfreeMemoryを実行する。ステップS5405では、ToBeRemovedMultiplyingObjが0でなければステップS5406へ移行し,そうでなけばステップS5407へ移行する。ステップS5406ではToBeRemovedMultiplyingObjからメソッドfreeMemoryを実行する。
ステップS5407では、自オブジェクトからメソッドresetMatrixを実行し,UnEvaluatedにOFFを設定する。ステップS5408では,argObjがthisに一致すればステップS5409へ移行し,そうでなければ終了する。ステップS5409では,オブジェクトargObjからresetMatrixを実行し,argObjのUnEvaluatedにOFFを設定する。
ステップS5401からステップS5409までの処理により,例えば下記の式(4)のような右辺の長い数式をプログラムとして記述した場合であっても,一時的に生成されるMatrixオブジェクト又はVectorオブジェクトの配列用メモリ領域は,高々2つまでしか生成されない。従来技術では,このような場合,積演算(*)の数に比例して配列用メモリ領域が増大する。
M = A * B * C * D * E * F * G * H; (4)
下記の式(5)のような和演算(+)においても同様に,一時的に生成される配列用メモリ領域は高々2つである。
M = A + B + C + D + E + F + G + H; (5)
ステップS5410では,オブジェクトargObj.MyArrayState.TransposeフラグがOFFである場合、argObj.AddingArrayState.TransposeフラグがOFFであればステップS5501へ移行し,argObj.AddingArrayState.TransposeフラグがONであればステップS5506へ移行する。一方、ステップS5410でargObj.MyArrayState.TransposeフラグがONである場合、argObj.AddingArrayState.TransposeフラグがOFFであればステップS5513へ移行し,argObj.AddingArrayState.TransposeフラグがONであればステップS5601へ移行する。
ステップS5501では,TmpOwnerがthis(自オブジェクト)でなくTmpAddingObjがthisでなければステップS5502へ移行し,TmpOwnerがthisでありTmpAddingObjがthisであればステップS5503へ移行する。また,TmpOwnerがthisでありTmpAddingObjがthisでなければステップS5504へ移行し,TmpOwnerがthisでなくTmpAddingObjがthisであればステップS5505へ移行する。
ステップS5502では、BLAS関数zaxpyを引数(NumElm,TmpMulFactor,TmpOwner, 1, this, 1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpAddFactor,TmpAddingObj, 1, this, 1)で呼び出し,ステップS5401へ移行する。ここで,BLAS関数の引数のComplexオブジェクトは,実際には,Complexオブジェクトのメンバ変数(実数部,虚数部)の先頭のアドレスであるものとする。以降においても,BLAS関数の引数にComplexオブジェクトを指定する場合は,同じ意味の略記であるものとする。
ステップS5503では、ComplexオブジェクトSumFactorにTmpAddFactorとTmpMulFactorの和を設定し,BLAS関数zscalを引数(NumElm,SumFactor, this, 1)で呼び出し,ステップS5401へ移行する。ステップS5504では,BLAS関数zscalを引数(NumElm,TmpMulFactor, this, 1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpAddFactor,TmpAddingObj, 1, this, 1)で呼び出し,ステップS5401へ移行する。
ステップS5505では,BLAS関数zscalを引数(NumElm,TmpAddFactor, this, 1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpMulFactor,TmpOwner, 1, this, 1)で呼び出し,ステップS5401へ移行する。ステップS5506では、TmpOwnerがthisでなくTmpAddingObjがthisでなければステップS5507へ移行し,そうでなければステップS5508へ移行する。
ステップS5507では、メソッドgetTransを引数TmpAddingObjで実行し,BLAS関数zscalを引数(NumElm,TmpAddFactor,this,1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpMulFactor,TmpOwner,1,this,1)で呼び出し,ステップS5401へ移行する。ここで,getTransはMatrix又はVectorについて,そのエルミート共役なものの要素を実際に計算するメソッドである。
ステップS5508では、MatrixオブジェクトtMatrixを引数(NxMax,NyMax)で生成し,tMatrixオブジェクトからメソッドgetTransを引数TmpAddingObjで実行する。ステップS5509では,TmpOwnerがthisであればステップS5510へ移行し,そうでなければステップS5511へ移行する。
ステップS5510では、BLAS関数zscalを引数(NumElm,TmpMulFactor, this, 1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpAddFactor,tMatrix, 1, this, 1)で呼び出す。ステップS5511では、BLAS関数zcopyを引数(NumElm,tMatrix,this,1)で呼び出し,BLAS関数zscalを引数(NumElm,TmpAddFactor,this,1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpMulFactor,TmpOwner,1,this,1)で呼び出す。
ステップS5512ではtMatrixを消去し、ステップS5401へ移行する。C++言語におけるオブジェクトの消去はdelete演算子で実現できる。ステップS5513では、TmpOwnerがthisでなくTmpAddingObjがthisでなければステップS5514へ移行し,そうでなければステップS5515へ移行する。
ステップS5514では、メソッドgetTransを引数TmpOwnerで実行し,BLAS関数zscalを引数(NumElm,TmpMulFactor,this,1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpAddFactor,TmpAddingObj,1,this,1)で呼び出し,ステップS5401へ移行する。
ステップS5515では、MatrixオブジェクトtMatrixを引数(NxMax,NyMax)で生成し,tMatrixオブジェクトからメソッドgetTransを引数TmpAddingObjで実行する。ステップS5516では,TmpAddingObjがthisであればステップS5517へ移行し,そうでなければステップS5518へ移行する。
ステップS5517では、BLAS関数zscalを引数(NumElm,TmpAddFactor,this,1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpMulFactor,tMatrix,1,this,1)で呼び出す。ステップS5518では、BLAS関数zcopyを引数(NumElm,tMatrix,1,this,1)で呼び出し,BLAS関数zscalを引数(NumElm,TmpMulFactor,this,1)で呼び出し,BLAS関数zaxpyを引数(NumElm TmpAddFactor,TmpAddingObj,1,this,1)で呼び出す。
ステップS5519では、オブジェクトtMatrixを消去し,ステップS5401へ移行する。ステップS5601では、MatrixオブジェクトtMatrixを引数(NxMax,NyMax)で生成する。ステップS5602では、TmpOwnerがthisでありTmpAddingObjがthisであればステップS5603へ移行し,そうでなければステップS5604へ移行する。
ステップS5603では,tMatrixからメソッドgetTransを引数TmpOwnerで実行し,ComplexオブジェクトSumFactorにTmpMulFactorとTmpAddFactorの和を設定し,BLAS関数zaxpyを引数(NumElm,SumFactor,tMatrix,1,this,1)で呼び出す。ステップS5604では、BLAS関数zaxpyを引数(NumElm,TmpMulFactor,TmpOwner,1,this,1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpAddFactor,TmpAddingObj,1,this,1)で呼び出す。ステップS5605ではオブジェクトtMatrixを消去し,ステップS5401へ移行する。
ステップS5606では、argObjのMulReverseがONであればステップS5607へ移行し,そうでなければステップS5608へ移行する。ここで,MulReverseがOFFになるのは,argObj.MyArrayState.TransposeがOFFであり,argObj.MultiplyingArrayState.TransposeがONとなる場合のみである。またMulReverseがONになるのは、argObj.MyArrayState.TransposeがONでありargObj.MultiplyingArrayState.TransposeがOFFとなる場合のみである。
ステップS5607では、BLAS関数zgercを引数(CblasRowMajor,Nx,Nx,TmpMulFactor,TmpOwner,1,TmpMultiplyingObj,1,this,Nx)で呼び出す。ここで,引数のNxはNxMaxを略記したものである。以降においてもBLAS関数の引数についてNxMaxをNxと略記する。ここで,CblasRowMajorは配列のメモリ上での配置の仕方を指定する引数である。ステップS5608では、BLAS関数zgercを引数(CblasRowMajor,Nx,Nx,TmpMulFactor,TmpMultiplyingObj,1,TmpOwner,1,this,Nx)で呼び出す。
ステップS5609では、BLAS関数zcopyを引数(NumElm,TmpAddingObj,1,this,1)で呼び出す。ステップS5610では、argObjのMulReverseがOFFであればステップS5611へ移行し,そうでなければステップS5612へ移行する。ここで,MulReverseがOFFになるのは,argObj.MyArrayState.TransposeがOFFであって,argObj.MultiplyingArrayState.TransposeがONとなる場合のみである。またMulReverseがONになるのはargObj.MyArrayState.TransposeがONでありargObj.MultiplyingArrayState.TransposeがOFFとなる場合のみである。
ステップS5611では,BLAS関数zgercを引数(CblasRowMajor,Nx,Nx,TmpMulFactor,TmpOwner,1,TmpMultiplyingObj,1,this,Nx)で呼び出す。ステップS5612では、BLAS関数zgercを引数(CblasRowMajor,Nx,Nx,TmpMulFactor,TmpMultiplyingObj,1,TmpOwner,1,this,Nx)で呼び出す。
ステップS5701では、内部フラグInnerGetMemoryをOFFに設定する。ステップS5702では、TmpOwnerがthisであるか,又は,TmpMultiplyingObjがthisであればステップS5703へ移行し,そうでなければステップS5704へ移行する。
ステップS5703では、MatrixオブジェクトtMatrixを引数(NxMax,NyMax)で生成し,フラグInnerGetMemoryにONを設定する。ステップS5704では,Matrixオブジェクトへの参照tMatrixにthisを設定する。ステップS5705では,argObjのMulReverseがtrueであればステップS5706へ移行し,そうでなければステップS5707へ移行する。
ステップS5706は、BLAS関数zgemmを引数(CblasRowMajor,argObj.MyArrayState.Transpose,argObj.MultiplyingArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpOwner,Nx,TmpMultiplyingObj,Nx,TmpAddFactor,this,Nx)で呼び出す。
ステップS5707では、BLAS関数zgemmを引数(CblasRowMajor,argObj.MultiplyingArrayState.Transpose,argObj.MyArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpMultiplyingObj,Nx,TmpOwner,Nx,TmpAddFactor,this,Nx)で呼び出す。
ステップS5708では、フラグInnerGetMemoryがONであればステップS5709へ移行し,そうでなければステップS5401へ移行する。ステップS5709ではBLAS関数zcopyを引数(NumElm,tMatrix,1,this,1)で呼び出し,オブジェクトtMatrixを消去する。
ステップS5801では,TmpAddingObjのTransposeがONであればステップS5906へ移行し,そうでなければステップS5802へ移行する。ステップS5802では,thisがTmpAddingObjであればステップS5901へ移行し,そうでなければステップS5803へ移行する。ステップS5803では,TmpOwnerがthisであるか,又は,TmpMultiplyingObjがthisであればステップS5804へ移行し,そうでなければステップS5809へ移行する。
ステップS5804では、MatrixオブジェクトtMatrixを引数(NxMax,NyMax)で生成し,BLAS関数zcopyを引数(NumElm,this,1,tMatrix,1)で呼び出す。ステップS5805では、thisのMulReverseがtrueであればステップS5806へ移行し,そうでなければステップS5807へ移行する。
ステップS5806では、BLAS関数zgemmを引数(CblasRowMajor,argObj.MultplyingArrayState.Transpose,argObj.MyArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpMultiplying,Nx,TmpOwner,Nx,TmpAddFactor,tMatrix,Nx)で呼び出す。
ステップS5807では、BLAS関数zgemmを引数(CblasRowMajor,argObj.MyArrayState.Transpose,argObj.MultiplyingArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpOwner,Nx,TmpMultiplyingObj,Nx,TmpAddFactor,tMatrix,Nx)で呼び出す。
ステップS5808では,BLAS関数zcopyを引数(NumElm,tMatrix,1,this,1)で呼び出し,ステップS5401へ移行する。ステップS5809ではthisのMulReverseがtrueであればステップS5810へ移行し,そうでなければステップS5811へ移行する。
ステップS5810では、BLAS関数zgemmを引数(CblasRowMajor,argObj.MultiplyingArrayState.Transpose,argObj.MyArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpMultiplying,Nx,TmpOwner,Nx,TmpAddFactor,this,Nx)で呼び出す。
ステップS5811では、BLAS関数zgemmを引数(CblasRowMajor,argObj.MyArrayState.Transpose,argObj.MultiplyingArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpOwner,Nx,TmpMultiplyingObj,Nx,TmpAddFactor,this,Nx)で呼び出す。
ステップS5901では、MatrixオブジェクトtMatrixを引数(NxMax:int,NyMax:int)のコンストラクタで生成し,BLAS関数zcopyを引数(NumElm,TmpAddingObj,1,tMatrix,1)で呼び出す。ステップS5902ではthisのMulReverseがONであればステップS5903へ移行し,そうでなければステップS5904へ移行する。
ステップS5903では、BLAS関数zgemmを引数(CblasRowMajor,argObj.MultiplyingArrayState.Transpose,argObj.MyArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpMultiplying,Nx,TmpOwner,Nx,TmpAddFactor,tMatrix,Nx)で呼び出す。
ステップS5904では、BLAS関数zgemmを引数(CblasRowMajor,argObj.MyArrayState.Transpose,argObj.MultiplyingArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpOwner,Nx,TmpMultiplyingObj,Nx,TmpAddFactor,tMatrix,Nx)で呼び出す。ステップS5905では、BLAS関数zcopyを引数(NumElm,tMatrix,1,this,1)で呼び出し、ステップS5401へ移行する。
ステップS5906では、MatrixオブジェクトtMatrixを引数(NxMax:int,NyMax:int)のコンストラクタで生成し,tMatrixからメソッドTransを引数TmpAddingObjで実行する。ステップS5907ではthisのMulReverseがONであればステップS5908へ移行し,そうでなければステップS5909へ移行する。
ステップS5908では、BLAS関数zgemmを引数(CblasRowMajor,argObj.MultiplyingArrayState.Transpose,argObj.MyArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpMultiplying,Nx,TmpOwner,Nx,TmpAddFactor,tMatrix,Nx)で呼び出す。
ステップS5909では、BLAS関数zgemmを引数(CblasRowMajor,argObj.MyArrayState.Transpose.Transpose,argObj.MultiplyingArrayState.Transpose,Nx,Nx,Nx,TmpMulFactor,TmpOwner,Nx,TmpMultiplyingObj,Nx,TmpAddFactor,tMatrix,Nx)で呼び出す。ステップS5910では、BLAS関数zcopyを引数(NumElm,tMatrix,1,this,1)で呼び出し、ステップS5401へ移行する。
ステップS6001では、argObjのTransposeがONであればステップS6005へ移行し,そうでなければステップS6002へ移行する。ステップS6002では,thisがTmpOwnerであればステップS6003へ移行し,そうでなければステップS6004へ移行する。
ステップS6003では、BLAS関数zscalを引数(NumElm,TmpMulFactor,this,1)で呼び出す。ステップS6004ではBLAS関数zaxpyを引数(NumElm,TmpMulFactor,TmpOwner,1,this,1)で呼び出す。ステップS6005では、argObjがthisであればステップS6008へ移行し,そうでなければステップS6006へ移行する。
ステップS6006では、引数argObjでMatrixオブジェクトworkMatrixを生成し,フラグInnerGetMemoryをONに設定する。ステップS6007ではworkMatrixからメソッドcopyElementを実行する。ステップS6008では、workMatrixをtMatrixの参照として定義し,フラグInnerGetMemoryをOFFに設定する。ステップS6009では自オブジェクトからメソッドgetTransを引数workMatrixで実行する。
ステップS6010では、BLAS関数zscalを引数(NumElm,TmpMulFactor,this,1)で呼び出す。ステップS6011では、フラグInnerGetMemoryがONであればステップS6012へ移行しそうでなければ,ステップS5401へ移行する。ステップS6012では、オブジェクトworkMatrixを消去し,ステップS5401へ移行する。
図61は、計算を先延ばしされたMatrixオブジェクトの計算を実行するための、引数なしのメソッドevaluateについてのactivity diagramである。ステップS6101では引数thisでメソッドevaluateを実行する。
図62は、引数なしのVectorクラスのデフォルトコンストラクタについてのactivity diagramである。ステップS6201では,基底クラスのデフォルトコンストラクタArrayを実行する。C++ではこの基底クラスのコンストラクタの起動は暗黙に行なわれるので,プログラムでは記述する必要はない。ステップS6202では,NxMaxに0を設定する。
図63は、1つの整数(int型)を引数に持つVectorクラスのコンストラクタについてのactivity diagramである。ステップS6301では,引数in_NxMaxで基底クラスのコンストラクタArrayを実行する。ステップS6302では,NxMaxに引数in_NxMaxを設定する。ステップS6303ではメソッドgetMemoryを実行する。
図64は、Vectorオブジェクトへの参照argObjを引数として持つVectorクラスのコンストラクタについてのactivity diagramである。ステップS6401では、引数argObjで基底クラスのコンストラクタArrayを実行する。ステップS6402ではNxMaxにargObjのNxMaxを設定する。
図65は、演算“Vector=Vector”を実現するための=演算子についてのactivity diagramである。ステップS6501では、引数argObjでメソッドevaluateを実行する。メソッドevaluateはargObjを評価して,結果を自オブジェクトに格納する。
図66は、演算“Matrix*Vector”を行なうための*演算子についてのactivity diagramである。
ステップS6601では、Matrixオブジェクトへの参照BaseObjにLeftObjを設定し,Matrixオブジェクトへの参照AssociatedObjにRightObjを設定する。ステップS6602では、BaseObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップS6603へ移行し,そうでなければステップS6604へ移行する。
ステップS6603では、BaseObjからメソッドevaluateを実行する。ステップS6604では、AssociatedObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでなければステップS6605へ移行し,そうでなければステップS6606へ移行する。
ステップS6605では、AssociatedObjからメソッドevaluateを実行する。ステップS6606では、BaseObjを引数としてVectorクラスのオブジェクトResultObjを生成する。ステップS6607では、ResultObjからメソッドmakeRelationMultiplyを引数AssociatedObjで実行する。ステップS6608では戻り値ResultObjでリターンする。
図67は、演算“Complex*Vector”又は演算“Vector*Complex”を計算する*演算子のactivity diagramである。ステップS6701ではメソッドmultiplyFactorを引数argComplexで実行する。
図68は、演算“Vector/Complex”を計算する/演算子のactivity diagramである。ステップS6801では、メソッドdivideFactorを引数argComplexで実行する。
図69は、演算“Vector+Vector”を計算する+演算子についてのactivity diagramである。
ステップS6901では、RightVectorのRelationStateが値MultiplyingであればステップS6902へ移行し、そうでなければステップS6903へ移行する。
ステップS6902では、Vectorオブジェクトへの参照BaseVectorにRightVectorを設定し,Vectorオブジェクトへの参照AssociatedVectorにLeftVectorを設定する。ステップS6903では、Vectorオブジェクトへの参照BaseVectorにLeftVectorを設定し,Vectorオブジェクトへの参照AssociatedVectorにRightVectorを設定する。
ステップS6904では、BaseVectorのRelationStateが値RelationNormalでなく,値MultipliedOrAddedでなく,値MultiplyingでなければステップS6905へ移行し,そうでなければステップS6906へ移行する。ステップS6905ではBaseVectorからメソッドevaluateを実行する。
ステップS6906では、AssociatedVectorのRelationStateが値RelationNormalでなく,値MultipliedOrAddedでなければステップS6907へ移行し,そうでなければステップS6908へ移行する。ステップS6907では、AssociatedVectorからメソッドevaluateを実行する。ステップS6908では、引数BaseVectorでVectorオブジェクトResultObjを生成する。
ステップS6909では、ResultObjからメソッドmakeRelationAddを引数AssociatedVectorで実行する。ステップS6910では戻り値ResultObjでリターンする。
図70は、演算“Vector−Vector”を計算するための−演算子についてのactivity diagramである。
ステップS7001では、swapフラグ(swap_flag)をOFFで初期化する。ステップS7002では、RightVectorのRelationStateが値MultiplyingであればステップS7003へ移行し,そうでなければステップS7004へ移行する。
ステップS7003では、BaseVectorにRightVectorを設定し,AssociatedVectorにLeftVectorを設定し,swapフラグにONを設定する。ステップS7004では、Vectorオブジェクトへの参照BaseVectorにLeftVectorを設定し,Vectorオブジェクトへの参照AssociatedVectorにRightVectorを設定する。
ステップS7005では、BaseVectorのRelationStateが、値RelationNormalでなく,値MultipliedOrAddedでなく,値MultiplyingでもなければステップS7006へ移行し,そうでなければステップS7007へ移行する。ステップS7006では、BaseVectorからメソッドevaluateを実行する。ステップS7007では、AssociateObjのRelationStateが値RelationNormalでなく値MultipliedOrAddedでもなければステップS7008へ移行し,そうでなければステップS7009へ移行する。
ステップS7008では、AssociatedVectorからメソッドevaluateを実行する。ステップS7009では、引数BaseVectorでVectorオブジェクトResultObjを生成する。ステップS7010では、ResultObjからメソッドmakeRelationSubtractを引数AssociatedVectorで実行する。
ステップS7011では、swapフラグがONであればステップS7012へ移行し,そうでなければステップS7013へ移行する。ステップS7012では、ResultObjからメソッドmultiplyFactorを引数Complex(-1.,0.)で実行する。ステップS7013では戻り値ResultObjでリターンする。
図71は、Vectorクラスの単項演算子+についてのactivity diagramである。ステップS7101では、引数thisでVectorオブジェクトResultVectorを生成する。ステップS7102では、戻り値ResultVectorでリターンする。
図72は、Vectorクラスの単項演算子−についてのactivity diagramである。ステップS7201では、引数thisでVectorオブジェクトResultVectorを生成する。ステップS7202では、ResultVectorからメソッドmultiplyFactorを引数Complex(-1.,0.)で実行する。ステップS7203では、ResultVectorのUnEvaluatedをONに設定する。ステップS7204では戻り値ResultVectorでリターンする。
図73は、Vectorオブジェクトをエルミート共役に変換するメソッドTransについてのactivity diagramである。ステップS7301では、引数thisでVectorオブジェクトResultVectorを生成する。ステップS7302では、ResultVectorからメソッドmakeTransposeThisを実行する。ステップS7303では、戻り値ResultVectorでリターンする。
図74は、VectorオブジェクトのL2ノルムを計算するメソッドNormL2についてのactivity diagramである。
ステップS7401では、UnEvaluatedがONならばステップS7402へ移行し,そうでなければステップS7403へ移行する。ステップS7402ではメソッドevaluateを実行する。ステップS7403では,BLAS関数dznrm2を引数(NumElm,this,1)で呼び出し,この戻り値でリターンする。
図75は、Vectorオブジェクトの内積を計算するメソッドDotについてのactivity diagramである。本メソッドの引数は2つのVectorオブジェクトへの参照,LeftVector及びRightVectorである。
ステップS7501では、LeftVectorのUnEvaluatedがONであればステップS7502へ移行し,そうでなければステップS7503へ移行する。ステップS7502では、LeftVectorからメソッドevaluateを実行する。ステップS7503では、RightVectorのUnEvaluatedがONであればステップS7504へ移行し,そうでなければステップS7505へ移行する。
ステップS7504では、RightVectorからメソッドevaluateを実行する。ステップS7505では、BLAS関数zdotu_sumを引数(NumElm,LeftVector,1,RightVector,1,ReturnValue)で実行し,戻り値ReturnValueでリターンする。
図76から図80までは、計算を先延ばしされたMatrixオブジェクトの計算を実行するためのメソッドevaluateについてのactivity diagramである。本メソッドの引数はVectorオブジェクトへの参照argObjである。
ステップS7601では,ToBeRemovedOwnerに0を設定し,ToBeRemovedAddingObjに0を設定し,ToBeRemovedMultiplyingObjに0を設定する。ここで,ToBeRemovedOwner,ToBeRemovedAddingObj,ToBeRemovedMultiplyingObjはArrayオブジェクトへの参照である。さらに,ComplexオブジェクトTmpMulFactorにargObjのMulFactorを設定し,ComplexオブジェクトTmpAddFactorにargObjのAddFactorを設定し,Arrayオブジェクトへの参照TmpOwnerにargObjのOwnerを設定し,Arrayオブジェクトへの参照TmpAddingObjにargObjのAddingObjにargObjのAddingObjを設定し,Arrayオブジェクトへの参照TmpMultiplyingObjにargObjのMultiplyingObjを設定する。
ステップS7602では、オブジェクトargObjのTmpOwnerが0でなくargObjのTmpOwnerのTemporalOwner値がONであればステップS7604へ移行し,そうでなければステップS7603へ移行する。ステップS7603ではToBeRemovedTmpOwnerにargObjのTmpOwnerを設定する。ステップS7604では、argObjのTmpAddingObjが0でなくargObjのTmpAddingObjのTemporalOwner値が0NであればステップS7605へ移行し,そうでなければステップS7606へ移行する。
ステップS7605では、ToBeRemovedTmpAddingObjにargObjのTmpAddingObjを設定する。ステップS7606では、argObjのTmpMultiplyingObjが0でなくargObjのTmpMultiplyingObjのTemporalOwner値が0NであればステップS7607へ移行し,そうでなければステップS7608へ移行する。
ステップS7607では、ToBeRemovedTmpMultiplyingObjにargObjのTmpMultiplyingObjを設定する。ステップS7608では、argObjからメソッドgetEvaluationTypeを呼び出し,戻り値をeval_typeに設定する。ステップS7609では、自オブジェクト(this)がargObjに一致していればステップS7611へ移行し,そうでなければステップS7614へ移行する。
ステップS7610では、メソッドisTmpOwnerの戻り値がfalseであればステップS7611へ移行し,そうでなければステップS7618へ移行する。ステップS7611では、Onwerが0でなければステップS7612へ移行し,そうでなければステップS7613へ移行する。ステップS7612では,メソッドresetTmpOwnerを実行する。ステップS7613では,メソッドgetMemoryを実行し,フラグIsClearedにONを設定する。
ステップS7614では,メソッドisTmpOwnerの戻り値がfalseであればステップS7615へ移行し,そうでなければステップS7618へ移行する。ステップS7615では、Onwerが0でなければステップS7616へ移行し,そうでなければステップS7617へ移行する。ステップS7616ではメソッドresetTmpOwnerを実行する。ステップS7617では、メソッドgetMemoryを実行し,フラグIsClearedにONを設定し,TemporalOwnerにONを設定する。
ステップS7618では,eval_typeが値ArrL_Add_ArrRであればステップS7801へ移行し,値MatA_Mul_VecXであればステップS7806へ移行し,値MatA_Mul_VecX_Add_VecYであればステップS7901へ移行し,値EvaluationNormalであればステップS8001へ移行する。
ステップS7701では,ToBeRemovedTmpOwnerが0でなければステップS7702へ移行し,そうでなければステップS7703へ移行する。ステップS7702では、オブジェクトToBeRemovedTmpOwnerからメソッドfreeMemoryを実行する。ステップS7703では,ToBeRemovedTmpAddingObjが0でなければステップS7704へ移行し,0であればステップS7705へ移行する。
ステップS7704では,ToBeRemovedTmpAddingObjからメソッドfreeMemoryを実行する。ステップS7705では、ToBeRemovedTmpMultiplyingObjが0でなければステップS7706へ移行し,0であればステップS7707へ移行する。ステップS7706では,ToBeRemovedTmpMultiplyingObjからメソッドfreeMemoryを実行する。
このように,メモリ解放を実行することにより,数式が長くなった場合でも,配列要素を格納するためのメモリ領域の大きさが一定以上にならないようにする。ここで,C++の場合,このタイミングで一時オブジェクトを消去(delete)できないことに注意する。これは,一時的なオブジェクトの消去は,コンパイラによって,数式の最後の位置(セミコロンの直前)で実行されるためである。
ステップS7707では、メソッドresetVectorを実行した後,UnEvaluatedをOFFに設定する。ステップS7708では、argObjがthisでなければステップS7709へ移行し,そうでなければ終了する。ステップS7709では、argObjからメソッドresetVectorを実行し,argObjのUnEvaluatedをOFFに設定する。
ステップS7801では,TmpOwnerがthisでなくTmpAddingObjがthisでなければステップS7802へ移行し,TmpOwnerがthisでありTmpAddingObjがthisであればステップS7803へ移行する。またTmpOwnerがthisでありTmpAddingObjがthisでなければステップS7804へ移行し,TmpOwnerがthisでなくTmpAddingObjがthisであればステップS7805へ移行する。
ステップS7802では、BLAS関数zaxpyを引数(NumElm,TmpMulFactor,TmpOwner, 1, this, 1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpAddFactor,TmpAddingObj, 1, this, 1)で呼び出す。
ステップS7803では、ComplexオブジェクトSumFactorにTmpAddFactorとTmpMulFactorの和を設定し,BLAS関数zscalを引数(NumElm,SumFactor, this, 1)で呼び出す。
ステップS7084では,BLAS関数zscalを引数(NumElm,TmpMulFactor, this, 1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpAddFactor,TmpAddingObj, 1, this, 1)で呼び出す。
ステップS7085では,BLAS関数zscalを引数(NumElm,TmpAddFactor, this, 1)で呼び出し,BLAS関数zaxpyを引数(NumElm,TmpMulFactor,TmpOwner, 1, this, 1)で呼び出す。
このようにいくつかの処理に分ける理由は,例えば,自オブジェクト(this),TmpAddingObj及びTmpOwnerが同じオブジェクトであったような場合に,係数SumFactorを計算し,自オブジェクトの各配列要素をSumFactor倍する方が,2オブジェクトの各要素を足し合わせるよりも一般的に速いからである。
ステップS7806では、thisがTmpAddingObj又はTmpMultiplyingObjであればステップS7807へ移行し,そうでなければステップS7808へ移行する。ステップS7807では、VectorクラスのオブジェクトtVectorを引数BaseObjのコンストラクタで生成する。ステップS7808ではtVectorをinputVectorの参照として定義する。
ステップS7809では、inputVectorのMulReverseがOFFであればステップS7810へ移行し,そうでなければステップS7811へ移行する。
ステップS7810では、BLAS関数zgemvを引数(CblasRowMajor,argObj.MyArrayState.Transpose,Nx,Nx,TmpMulFactor,TmpOwner,Nx,TmpMultiplyingObj,1,TmpAddFactor,tVector,1)で呼び出す。
ステップS7811では、BLAS関数zgemvを引数(CblasRowMajor,argObj.MultiplyingArrayState.Transpose,Nx,Nx,TmpMulFactor,TmpMultiplyingObj,Nx,TmpOwner,1,TmpAddFactor,tVector,1)で呼び出す。
ステップS7901では、thisがTmpAddingObjであればステップS7701へ移行し,そうでなければステップS7902へ移行する。ステップS7902では、thisがTmpOwnerであるか又はthisがTmpMultiplyingObjであればステップS7903へ移行し,そうでなければステップS7908へ移行する。
ステップS7903では、VectorオブジェクトtVectorをデフォルトコンストラクタで生成し,BLAS関数zcopyを引数(NumElm,this,1,tVector,1)で呼び出す。ステップS7904では、inputVectorのMulReverseがOFFであればステップS7905へ移行し,そうでなければステップS7906へ移行する。
ステップS7905では、BLAS関数zgemvを引数(CblasRowMajor,argObj.MultiplyingArrayState.Transpose,Nx,Nx,TmpMulFactor,TmpMultiplyingObj,Nx,TmpOwner,1,TmpAddFactor,tVector,1)で呼び出す。
ステップS7906では、BLAS関数zgemvを引数(CblasRowMajor,argObj.MyArrayState.Transpose,Nx,Nx,TmpMulFactor,TmpOwner,Nx,TmpMultiplyingObj,1,TmpAddFactor,tVector,1)で呼び出す。
ステップS7907では、BLAS関数zcopyを引数(NumElm,tMatrix,1,this,1)で呼び出し,ステップS7701へ移行する。ステップS7908ではinputVectorのMulReverseがOFFならばステップS7909へ移行し,そうでなければステップS7910へ移行する。
ステップS7909では、BLAS関数zgemvを引数(CblasRowMajor,argObj.MyArrayState.Transpose,Nx,Nx,TmpMulFactor,TmpOwner,Nx,TmpMultiplyingObj,1,TmpAddFactor,this,1)で呼び出し,ステップS7701へ移行する。
ステップS7910では、BLAS関数zgemvを引数(CblasRowMajor,argObj.MultiplyingArrayState.Transpose,Nx,Nx,TmpMulFactor,TmpMultiplyingObj,Nx,TmpOwner,1,TmpAddFactor,this,1)で呼び出し,ステップS7701へ移行する。
ステップS7911では、VectorオブジェクトtVectorをデフォルトコンストラクタ生成し,BLAS関数zcopyを引数(NumElm,this,1,tVector,1)で呼び出す。ステップS7912では、inputVectorのMulReverseがOFFならばステップS7913へ移行し,そうでなければステップS7914へ移行する。
ステップS7913では、BLAS関数zgemvを引数(CblasRowMajor,argObj.MyArrayState.Transpose,Nx,Nx,TmpMulFactor,TmpOwner,Nx,TmpMultiplyingObj,1,TmpAddFactor,this,1)で呼び出し,ステップS7701へ移行する。
ステップS7914では、BLAS関数zgemvを引数(CblasRowMajor,argObj.MultiplyingArrayState.Transpose,Nx,Nx,TmpMulFactor,TmpMultiplyingObj,Nx,TmpOwner,1,TmpAddFactor,this,1)で呼び出し,ステップS7701へ移行する。
ステップS8001では、TmpOwnerがthisであればステップS8002へ移行し,そうでなければステップS8003へ移行する。ステップS8002では、BLAS関数zscalを引数(NumElm,tMatrix.TmpMulFactor,this,1)で呼び出す。ステップS8003では、BLAS関数zaxpyを引数(NumElm,tMatrix.TmpMulFactor,TmpOwner,1,this,1)で呼び出す。
図81は、演算が先延ばしされたVectorオブジェクトの演算を完了させるための引数なしのメソッドevaluateについてのactivity diagramである。ステップS8101では引数thisでメソッドevaluateを実行する。
以上説明した実施形態によれば、ComplexオブジェクトmとMatrixオブジェクトの積演算では,ComplexオブジェクトmとMatrixオブジェクトが有するComplexオブジェクトのメンバ変数との積演算を実行する。Matrixオブジェクト間の積演算及び和演算では、オブジェクト間の関連付けを行って実際の演算を先延ばしし,代入演算の実行時にまとめて計算を実行する。
これにより、オブジェクト指向プログラミング言語による演算子オーバーロードを利用した線形代数演算を高速に実行することができる。
なお、本発明は、複数の機器から構成されるシステムに適用しても、一つの機器からなる装置に適用してもよい。
また、本発明の目的は、前述した実施形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体が供給されたシステムあるいは装置のコンピュータが、そのプログラムコードを読み出し実行することでも達成される。
この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコードを記憶した記憶媒体は本発明を構成することになる。また、コンピュータが読み出したプログラムコードの指示に基づき、コンピュータ上で稼働しているオペレーティングシステムなどが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれる。
さらに、記憶媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張カードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれる場合がある。そのプログラムコードの指示に基づき、その機能拡張カードや機能拡張ユニットに備わるCPUなどが実際の処理の一部または全部を行うことで前述した実施形態の機能が実現される場合も本発明に含まれる。