[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

JP2007328692A - 代数演算方法及びその装置、プログラム - Google Patents

代数演算方法及びその装置、プログラム Download PDF

Info

Publication number
JP2007328692A
JP2007328692A JP2006161031A JP2006161031A JP2007328692A JP 2007328692 A JP2007328692 A JP 2007328692A JP 2006161031 A JP2006161031 A JP 2006161031A JP 2006161031 A JP2006161031 A JP 2006161031A JP 2007328692 A JP2007328692 A JP 2007328692A
Authority
JP
Japan
Prior art keywords
flag
algebraic
process proceeds
function
complex
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2006161031A
Other languages
English (en)
Inventor
Yasuhiro Nakahara
康博 中原
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Canon Inc
Original Assignee
Canon Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Canon Inc filed Critical Canon Inc
Priority to JP2006161031A priority Critical patent/JP2007328692A/ja
Priority to US11/759,643 priority patent/US8276116B2/en
Publication of JP2007328692A publication Critical patent/JP2007328692A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution
    • G06F9/4491Optimising based on receiver type

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Complex Calculations (AREA)

Abstract

【課題】 オブジェクト指向プログラミング言語による演算子オーバーロードを利用した線形代数演算プログラミングにおいて,一時的なMatrixやVectorの配列要素が必要以上に生成されないようにする。
【解決手段】 代数演算方法に、複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを備える。
【選択図】 図10

Description

本発明は、演算子をオーバーロードする機能を有したオブジェクト指向プログラミング言語で利用できる代数演算方法及びその装置に関するものである。
従来、線形代数演算のプログラムを効率よく開発するために、C++等のオブジェクト指向プログラミング言語を使って、Matrix(行列)クラス、Vector(ベクトル)クラス、及びこれらをオペランドとする2項演算子を定義した線形代数プログラムやライブラリが利用されていた。
上記オブジェクト指向プログラミングによれば、例えば図1のようにC言語で書かれたプログラムは、C++言語による演算子のオーバーロードを使うと、図2のように記述できる(例えば、非特許文献1)。
演算子を定義(オーバーロード)することで、Matrix間の演算やMatrixによるVectorの変換も、添え字についてのループ処理を記述しないで、簡潔に記述することができる。
上記のオブジェクト指向プログラミングは、線形代数における数式との対応が直感的に分かるというメリットがあり、利用者にとっては、プログラムの作成とテストに要するコストが削減される。
一方、C言語やFortran言語による非オブジェクト指向プログラミング言語によるプログラミングでは、大規模高速な線形代数プログラミングのために線形代数ライブラリBLAS(非特許文献2参照)が利用されることが多い。
Bjarne Stroustrup : The C++ Programming Language. Addison-Wesley. 2000 URL:http://www.netlib.org/blas/
しかしながら、C++言語のオーバーロードを利用するMatrix及びVectorの演算は、通常、2項演算ごとに計算を完了する方式であるため、オーバーヘッドが大きくなりやすい。例えば、C=m*A*B+n*Cを計算する際に、図3に示すように、ステップ1からステップ6までの処理が行われる。
このため、C++言語のオーバーロードを利用する演算は、2項演算のたびに配列用のメモリ領域が確保されるので、メモリ使用効率がよくない。さらに、演算子からリターンされたオブジェクトを格納するための、コンパイラに自動生成されるオブジェクトまで考慮すると、一時的に生成されるオブジェクト数はさらに多くなる。
また、上記のようなプログラミングにおけるループ処理の数は、最低限必要なループ処理の数よりも明らかに大きい(図4)。これは、一度メモリから読み込んだデータを何度も読み込むことになり得るため、計算時間を増大させる原因となる。
上記非特許文献1もこのような問題を挙げている。その解決策としてW = M * V + X(W, V, X:Vector,M:Matrix)という演算に対しては,2つのオブジェクトへの参照をメンバ変数(属性)として持つ新たなクラスのオブジェクトをM*Vの演算の戻り値とするためにつくることを提案している。
しかし、この方法では、例えば、C = m * A * B + n * CやC = m * AH * B + n * Cのような一般的な演算には対応できない。ただし、AHはMatrix Aのエルミート共役を示す。また、C = m * A * B + n * C * (m * A * B + n * C)のように数式が長くなる場合における一時オブジェクトのメモリ領域が増大するという問題も残る。このように、従来技術は線形代数におけるあらゆる演算の種類について十分に対応できているわけではない。
一方、上述したBLASは,計算機のアーキテクチャに適したチューニングが施されて市販されていることも多いが,C++等のオブジェクト指向プログラミング言語に適したインターフェースでは提供されていない。
BLASでは,下記の式(1)のような演算は1つの関数を呼び出すだけで実現できるが,2項演算ごとに計算を完了させるオブジェクト指向プログラミングによる方法では,BLASのように1回の関数呼び出しで計算することはで困難である。ここで,A,B及びCはMatrixであり,α及びβは複素数である。
C=αAB+βC (1)
このため,C++等のオブジェクト指向プログラミング言語による演算子のオーバーロードを利用してBLAS相当の高速な線形代数演算プログラムを記述することはできなかった。
そこで、本発明の課題は,BLAS等を利用する非オブジェクト指向な線形代数演算プログラムと同等の性能(高速性)を,演算子を利用したオブジェクト指向プログラミング言語による線形代数演算プログラムでも実現できるようにすることである。
上記課題を解決するために、本発明によれば、代数演算方法に、複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを備える。
また、本発明の他の態様によれば、代数演算装置に、複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、該複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを記憶する記憶手段と、前記複数オブジェクトに対する代数演算を、前記オブジェクトアクセス用データと前記オブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換手段と、前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定手段と、前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価手段とを備える。
また、本発明の他の態様によれば、コンピュータ読み取り可能な代数演算プログラムにおいて、コンピュータに、複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを実行させることを特徴とする。
本発明によれば、オブジェクト指向プログラミング言語による代数演算を高速に実行することが可能となる。
以下、添付図面を参照しながら、本発明の実施形態を説明する。
本実施形態は、以下の特徴を有する。
(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などが実際の処理の一部または全部を行うことで前述した実施形態の機能が実現される場合も本発明に含まれる。
C言語で記述したプログラムの例の図である。 C++言語で記述したプログラムの例の図である。 従来技術における一時オブジェクトの生成を示した図である。 従来技術における演算方法と最も簡単な演算方法を対比した図である。 長い数式において,線型代数演算が実際に実行されるタイミングを示した図である。 実施形態における演算装置のハードウェア構成を示す図である。 Arrayクラス,Matrixクラス,Vectorクラスの継承関係を説明する図である。 Arrayクラスのオブジェクトの状態を表すメンバ変数RelationStateのとりうる値を示した図である。 Arrayクラスのオブジェクトの状態を表すビットの集合である変数の要素名とその意味を示した図である。 Arrayクラスのオブジェクトの状態遷移を示した図である。 実施形態で利用するBLASライブラリの関数名を示した図である。 Arrayクラスのメソッドの一覧を示した図である。 Matrixクラスのメソッドの一覧を示した図である。 Vectorクラスのメソッドの一覧を示した図である。 Arrayクラスのデフォルトコンストラクタにおいて実行される処理を示す図である。 Arrayクラスのint型を引数とするコンストラクタにおいて実行される処理を示す図である。 Arrayクラスの,Arrayオブジェクトの参照を引数とするコンストラクタにおいて実行される処理を示す図である。 Arrayクラスのデストラクタにおいて実行される処理を示す図である。 ArrayクラスのメソッドinitializeArrayで実行される処理を示す図である。 ArrayクラスのメソッドgetMemoryで実行される処理を示す図である。 ArrayクラスのメソッドfreeMemoryで実行される処理を示す図である。 ArrayクラスのメソッドcopyElementで実行される処理を示す図である。 ArrayクラスのメソッドcoppyArrayで実行される処理を示す図である。 ArrayクラスのメソッドmultiplyFactorで実行される処理を示す図である。 ArrayクラスのメソッドdivideFactorで実行される処理を示す図である。 ArrayクラスのメソッドmakeRelationMultiplyで実行される処理を示す図である。 ArrayクラスのメソッドmakeRelationAddで実行される処理を示す図である。 ArrayクラスのメソッドmakeRelationSubtractで実行される処理を示す図である。 ArrayクラスのメソッドmakeTransposeThisで実行される処理を示す図である。 ArrayクラスのメソッドresetArrayで実行される処理を示す図である。 ArrayクラスのメソッドsetAddingObjで実行される処理を示す図である。 ArrayクラスのメソッドsetMultiplyingObjで実行される処理を示す図である。 ArrayクラスのメソッドresetAddingObjで実行される処理を示す図である。 ArrayクラスのメソッドresetMultiplyingObjで実行される処理を示す図である。 ArrayクラスのメソッドresetMultiplyingAndAddingObjで実行される処理を示す図である。 ArrayクラスのメソッドresetOwnerで実行される処理を示す図である。 ArrayクラスのメソッドisOwnerで実行される処理を示す図である。 ArrayクラスのメソッドflipArrayStateで実行される処理を示す図である。 ArrayクラスのメソッドgetEvaluationTypeで実行される処理を示す図である。 Matrixクラスのデフォルトコンストラクタで実行される処理を示す図である。 Matrixクラスのint型変数2つを引数とするコンストラクタで実行される処理を示す図である。 Matrixクラスの,Matrixオブジェクトの参照を引数とするコンストラクタで実行される処理を示す図である。 Matrixクラスの=演算子(代入演算子)で実行される処理を示す図である。 “Matrixオブジェクト*Matrixオブジェクト”を演算する*演算子で実行される処理を示す図である。 “Complexオブジェクト*Matrixオブジェクト”又は“Matrixオブジェクト*Complexオブジェクト”を演算する*演算子で実行される処理を示す図である。 “Matrixオブジェクト/Complexオブジェクト”を演算する/演算子で実行される処理を示す図である。 “Matrixオブジェクト+Matrixオブジェクト”を演算する+演算子で実行される処理を示す図である。 “Matrixオブジェクト−Matrixオブジェクト”を演算する−演算子で実行される処理を示す図である。 Matrixクラスの単項演算子+で実行される処理を示す図である。 Matrixクラスの単項演算子−で実行される処理を示す図である。 MatrixクラスのメソッドTransで実行される処理を示す図である。 MatrixクラスのメソッドNormL2で実行される処理を示す図である。 Matrixクラスの,Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Matrixクラスの,Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Matrixクラスの,Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Matrixクラスの,Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Matrixクラスの,Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Matrixクラスの,Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Matrixクラスの,Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Matrixクラスの,Matrixオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Matrixクラスの,引数なしのメソッドevaluateで実行される処理を示す図である。 Vectorクラスのデフォルトコンストラクタで実行される処理を示す図である。 Vectorクラスのint型変数2つを引数とするコンストラクタで実行される処理を示す図である。 Vectorクラスの,Vectorオブジェクトの参照を引数とするコンストラクタで実行される処理を示す図である。 Vectorクラスの=演算子(代入演算子)で実行される処理を示す図である。 “Matrixオブジェクト*Vectorオブジェクト”を演算する*演算子で実行される処理を示す図である。 “Complexオブジェクト*Vectorオブジェクト”又は“Vectorオブジェクト*Complexオブジェクト”を演算する*演算子で実行される処理を示す図である。 “Vectorオブジェクト/Complexオブジェクト”を演算する/演算子で実行される処理を示す図である。 “Vectorオブジェクト+Vectorオブジェクト”を演算する+演算子で実行される処理を示す図である。 “Vectorオブジェクト−Vectorオブジェクト”を演算する−演算子で実行される処理を示す図である。 Vectorクラスの,+単項演算子で実行される処理を示す図である。 Vectorクラスの,−単項演算子で実行される処理を示す図である。 VectorクラスのメソッドTransで実行される処理を示す図である。 VectorクラスのメソッドNormL2で実行される処理を示す図である。 2つのVectorオブジェクトを引数とするフレンド関数Dotで実行される処理を示す図である。 Vectorクラスの,Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Vectorクラスの,Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Vectorクラスの,Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Vectorクラスの,Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Vectorクラスの,Vectorオブジェクトへの参照を引数とするメソッドevaluateで実行される処理を示す図である。 Vectorクラスの,引数なしのメソッドevaluateで実行される処理を示す図である。
符号の説明
101 CPU
102 RAM
103 ROM
104 キーボード
105 ディスプレイ
106 HDD
107 通信I/F
108 バス

Claims (15)

  1. 複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、
    前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、
    前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを有することを特徴とする代数演算方法。
  2. 前記代数演算変換工程において演算を1つの代数演算手順オブジェクトに変換できなければ、演算子の左オペランド又は右オペランドのオブジェクトについて前記評価工程を実行した後に、前記代数演算変換工程を実行することを特徴とする請求項1に記載の代数演算方法。
  3. 前記オブジェクトアクセス用データは、配列用メモリ領域を所有している、配列所有オブジェクトへの参照と、積演算対象オブジェクトへの参照と、和演算対象オブジェクトへの参照とを有することを特徴とする請求項2に記載の代数演算方法。
  4. 前記オブジェクト状態データは、自オブジェクトとの積演算を実行するための積演算用複素数オブジェクトと、前記和演算対象オブジェクトとの積演算を実行するための和演算用複素数オブジェクトとを含む複素数オブジェクト群と、自オブジェクトの代数状態を表すフラグ群と、他オブジェクトの代数状態を表すフラグ群と、自オブジェクトの計算状態を表すフラグ群とを有することを特徴とする請求項3に記載の代数演算方法。
  5. 前記オブジェクトの代数状態を表すフラグ群は、オブジェクトがエルミート共役であるか否かを示すエルミート共役フラグと、オブジェクトの積演算対象オブジェクトがある場合に自オブジェクトがそのオブジェクトに対して左側から作用するか右側から作用するかを示す積演算順序フラグを有することを特徴とする請求項4に記載の代数演算方法。
  6. 前記自オブジェクトの計算状態を表すフラグ群は、一時的に配列用メモリ領域を所有しているオブジェクトか否かを示す一時配列所有オブジェクトフラグと、評価が未完了か否かを示す未評価フラグを有することを特徴とする請求項4に記載の代数演算方法。
  7. 前記代数演算変換工程は、前記オブジェクトアクセス用データをコピーし、前記オブジェクト状態データをコピーする複製生成工程を有することを特徴とする請求項6に記載の代数演算方法。
  8. 前記代数演算変換工程は、前記複製生成工程により生成したオブジェクトの積演算用複素数オブジェクトと他複素数オブジェクトとの積演算を行い、その演算結果を該生成したオブジェクトの積演算用複素数オブジェクトに格納し、該生成したオブジェクトの前記和演算用複素数オブジェクトと他複素数オブジェクトとの積演算を行い、その演算結果を該生成したオブジェクトの和演算用複素数オブジェクトに格納し、前記未評価フラグを有効に設定する第1の積演算実行工程を有することを特徴とする請求項7に記載の代数演算方法。
  9. 前記代数演算変換工程は、2項演算子のオペランドである2オブジェクトの一方の複製を前記複製生成工程により生成し、該生成したオブジェクトの有する積演算対象オブジェクトへの参照にもう一方のオブジェクトを設定し、該生成したオブジェクトの積演算用複素数オブジェクトともう一方のオブジェクトの積演算用複素数オブジェクトとの積演算を行ない、この結果を該生成したオブジェクトの積演算用複素数オブジェクトに格納し、前記積演算対象オブジェクトが有する自オブジェクトの代数状態を表すフラグ群を、自オブジェクトの積演算対象オブジェクトの代数状態を表すフラグ群に格納し、前記未評価フラグを有効にする第2の積演算実行工程を有することを特徴とする請求項7に記載の代数演算方法。
  10. 前記代数演算変換工程は、2項演算子のオペランドである2オブジェクトの一方の複製を前記複製生成工程により生成し、該生成したオブジェクトの有する前記和演算対象オブジェクトへの参照にもう一方のオブジェクトを設定し、該生成したオブジェクトの和演算用複素数オブジェクトにもう一方のオブジェクトの積演算用複素数オブジェクトを格納し、前記和演算対象オブジェクトが有する前記自オブジェクトの状態を表すフラグ群を、自オブジェクトが有する前記和演算対象オブジェクトの状態を表すフラグ群に格納し、前記未評価フラグを有効にすることを特徴とする、オブジェクト和演算実行工程を有することを特徴とする請求項7に記載の代数演算方法。
  11. 前記代数演算変換工程は、前記複製生成工程によりオブジェクトの複製を生成し、該生成したオブジェクトが有する自オブジェクトの代数状態フラグ群の前記エルミート共役フラグを反転し、自オブジェクトの前記積演算対象オブジェクトへの参照が設定されていれば、自オブジェクトの状態フラグ群の前記積演算順序フラグを反転させ、前記積演算用複素数オブジェクトを複素共役に変換し、自オブジェクトが有する積演算対象オブジェクトの代数状態フラグ群の前記エルミート共役フラグを反転し、自オブジェクトの前記和演算対象オブジェクトへの参照が設定されていれば、前記和演算用複素数オブジェクトを複素共役に変換し、自オブジェクトが有する和演算対象オブジェクトの代数状態フラグ群のエルミート共役フラグを反転させ、前記未評価フラグを有効にする、エルミート共役変換工程を有することを特徴とする請求項7に記載の代数演算プログラム。
  12. 前記評価工程は、前記オブジェクトの代数状態を表すフラグ群に含まれる積順序フラグが無効であれば、自オブジェクトが積演算の左側であり、前記積演算対象オブジェクトが積演算の右側となるように引数を設定して関数を実行し、前記積順序フラグが有効であれば、自オブジェクトが積演算の右側、積演算対象オブジェクトが積演算の左側となるように引数を設定して関数を実行する工程を有することを特徴とする請求項5に記載の代数演算方法。
  13. 前記評価工程は、評価対象のオブジェクトが自オブジェクトであれば、評価計算が完了した後に、該オブジェクトの計算状態を表すフラグ群の一時配列所有オブジェクトフラグを有効に設定し、前記積演算対象オブジェクト、前記和演算対象オブジェクト又は前記配列所有オブジェクトが一時的に生成されたオブジェクトであるか否かを、これらのオブジェクトが有するオブジェクトの計算状態を表すフラグ群の一時オブジェクトフラグにより判定し、該フラグが有効であれば、該オブジェクトの配列用メモリ領域を解放する工程を有することを特徴とする請求項6に記載の代数演算方法。
  14. 複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、該複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを記憶する記憶手段と、
    前記複数オブジェクトに対する代数演算を、前記オブジェクトアクセス用データと前記オブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換手段と、
    前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定手段と、
    前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価手段とを有することを特徴とする代数演算装置。
  15. コンピュータに、
    複数オブジェクトに対する代数演算を、該複数のオブジェクトにアクセスするためのオブジェクトアクセス用データと、前記複数のオブジェクトに係わる状態を格納するオブジェクト状態データとを用いて記述する代数演算手順オブジェクトに変換する代数演算変換工程と、
    前記代数演算手順オブジェクトに対して、適用すべき関数を決定する関数決定工程と、
    前記関数に必要な引数群を指定して当該関数を実行することにより前記代数演算を評価する評価工程とを実行させることを特徴とするコンピュータ読み取り可能な代数演算プログラム。

JP2006161031A 2006-06-09 2006-06-09 代数演算方法及びその装置、プログラム Pending JP2007328692A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2006161031A JP2007328692A (ja) 2006-06-09 2006-06-09 代数演算方法及びその装置、プログラム
US11/759,643 US8276116B2 (en) 2006-06-09 2007-06-07 Algebra operation method, apparatus, and storage medium thereof

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2006161031A JP2007328692A (ja) 2006-06-09 2006-06-09 代数演算方法及びその装置、プログラム

Publications (1)

Publication Number Publication Date
JP2007328692A true JP2007328692A (ja) 2007-12-20

Family

ID=38874691

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006161031A Pending JP2007328692A (ja) 2006-06-09 2006-06-09 代数演算方法及びその装置、プログラム

Country Status (2)

Country Link
US (1) US8276116B2 (ja)
JP (1) JP2007328692A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10101980B2 (en) 2016-12-05 2018-10-16 Fujitsu Limited Compilation method and information processing apparatus
US11231917B2 (en) 2018-06-20 2022-01-25 Fujitsu Limited Information processing apparatus, computer-readable recording medium storing therein compiler program, and compiling method

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10776244B2 (en) 2013-07-09 2020-09-15 Oracle International Corporation Consolidation planning services for systems migration
US9805070B2 (en) 2013-07-09 2017-10-31 Oracle International Corporation Dynamic migration script management
US9491072B2 (en) 2013-07-09 2016-11-08 Oracle International Corporation Cloud services load testing and analysis
US9967154B2 (en) 2013-07-09 2018-05-08 Oracle International Corporation Advanced customer support services—advanced support cloud portal
US9996562B2 (en) 2013-07-09 2018-06-12 Oracle International Corporation Automated database migration architecture
US9792321B2 (en) 2013-07-09 2017-10-17 Oracle International Corporation Online database migration
US11157664B2 (en) 2013-07-09 2021-10-26 Oracle International Corporation Database modeling and analysis
US9098364B2 (en) 2013-07-09 2015-08-04 Oracle International Corporation Migration services for systems
US9762461B2 (en) 2013-07-09 2017-09-12 Oracle International Corporation Cloud services performance tuning and benchmarking
US9747311B2 (en) 2013-07-09 2017-08-29 Oracle International Corporation Solution to generate a scriptset for an automated database migration
US20150356056A1 (en) * 2014-06-09 2015-12-10 The Mathworks, Inc. Methods and systems for calculating joint statistical information
WO2017031082A1 (en) * 2015-08-14 2017-02-23 California Institute Of Technology Algebraic query language (aql) database management system
US11036696B2 (en) 2016-06-07 2021-06-15 Oracle International Corporation Resource allocation for database provisioning
US11256671B2 (en) 2019-09-13 2022-02-22 Oracle International Corporation Integrated transition control center

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003186737A (ja) * 2001-12-14 2003-07-04 Matsushita Electric Ind Co Ltd ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム

Family Cites Families (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS5642805A (en) * 1979-09-18 1981-04-21 Fanuc Ltd Sequence producing system for sequence controller controlling machine tool
US4885714A (en) * 1986-10-27 1989-12-05 Hewlett-Packard Company Calculator having a user-accessible object stack for the uniform application of mathematical functions and logical operations to a multiplicity of object types
US5598545A (en) * 1989-10-13 1997-01-28 Texas Instruments Incorporated Circuitry and method for performing two operating instructions during a single clock in a processing device
US5448727A (en) * 1991-04-30 1995-09-05 Hewlett-Packard Company Domain based partitioning and reclustering of relations in object-oriented relational database management systems
US5263126A (en) * 1992-09-10 1993-11-16 Chang Hou Mei H Automatic expert system
WO1995003586A1 (en) * 1993-07-21 1995-02-02 Persistence Software, Inc. Method and apparatus for generation of code for mapping relational data to objects
WO1995004960A2 (en) * 1993-08-02 1995-02-16 Persistence Software, Inc. Method and apparatus for managing relational data in an object cache
US6116768A (en) * 1993-11-30 2000-09-12 Texas Instruments Incorporated Three input arithmetic logic unit with barrel rotator
AUPM704494A0 (en) * 1994-07-25 1994-08-18 Canon Information Systems Research Australia Pty Ltd Efficient methods for the interpretation of a graphical programming language
US5606699A (en) * 1995-04-28 1997-02-25 International Business Machines Corporation Storing and querying execution information for object-oriented programs
US5787283A (en) * 1995-10-27 1998-07-28 International Business Machines Corporation Framework for manufacturing logistics decision support
US6105035A (en) * 1998-02-17 2000-08-15 Lucent Technologies, Inc. Method by which notions and constructs of an object oriented programming language can be implemented using a structured query language (SQL)
US6681383B1 (en) * 2000-04-04 2004-01-20 Sosy, Inc. Automatic software production system
US7162469B2 (en) * 2002-07-20 2007-01-09 Microsoft Corporation Querying an object for properties
US7546578B2 (en) * 2003-05-16 2009-06-09 Oracle International Corporation High level mathematical programming modeling language in an object oriented programming language
US7810080B2 (en) * 2003-09-15 2010-10-05 Thomas Plum Automated safe secure techniques for eliminating undefined behavior in computer software
SG136965A1 (en) * 2003-10-10 2007-11-29 Koninkl Philips Electronics Nv Playback of audio-video content and an associated java application from an optical disc
TW200518070A (en) * 2003-10-10 2005-06-01 Matsushita Electric Ind Co Ltd Recording medium, reproduction device, program, and reproduction method
US7565062B2 (en) * 2003-11-10 2009-07-21 Panasonic Corporation Recording medium, reproduction device, program, reproduction method, and system integrated circuit
US20050251556A1 (en) * 2004-05-07 2005-11-10 International Business Machines Corporation Continuous feedback-controlled deployment of message transforms in a distributed messaging system
EP2270803B1 (en) * 2004-07-22 2018-06-20 Panasonic Intellectual Property Management Co., Ltd. Playback apparatus for performing application-synchronized playback
KR100577366B1 (ko) * 2004-09-25 2006-05-10 삼성전자주식회사 이종의 자바 메소드를 실행하는 방법 및 장치
DE102005021749A1 (de) * 2005-05-11 2006-11-16 Fachhochschule Dortmund Verfahren und Vorrichtung zur programmgesteuerten Informationsverarbeitung
KR100818919B1 (ko) * 2006-02-24 2008-04-03 삼성전자주식회사 메소드 호출 방법 및 이를 이용한 자바 가상 머신
US8079023B2 (en) * 2007-03-22 2011-12-13 Microsoft Corporation Typed intermediate language support for existing compilers
US8010943B2 (en) * 2007-06-01 2011-08-30 The United States Of America As Represented By The Secretary Of The Navy Dynamic memory management system and method

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003186737A (ja) * 2001-12-14 2003-07-04 Matsushita Electric Ind Co Ltd ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10101980B2 (en) 2016-12-05 2018-10-16 Fujitsu Limited Compilation method and information processing apparatus
US11231917B2 (en) 2018-06-20 2022-01-25 Fujitsu Limited Information processing apparatus, computer-readable recording medium storing therein compiler program, and compiling method

Also Published As

Publication number Publication date
US8276116B2 (en) 2012-09-25
US20070299892A1 (en) 2007-12-27

Similar Documents

Publication Publication Date Title
JP2007328692A (ja) 代数演算方法及びその装置、プログラム
JP3762867B2 (ja) コンパイラ装置、コンパイル方法、およびそのためのプログラムを格納した記憶媒体
CN114328173B (zh) 软件模糊测试方法和装置、电子设备及存储介质
CN102004884A (zh) 一种获取可执行文件输入表的方法及装置
CN109766261B (zh) 覆盖测试方法、装置、计算机设备和存储介质
CN109614772B (zh) 基于应用安装包文件的代码转换方法及装置
CN115859280A (zh) 内存马的检测方法、装置、设备及存储介质
CN111309334B (zh) 生成软件安装包的方法、装置、计算机设备及存储介质
CN112115428B (zh) 代码文件的混淆方法、装置、电子设备和存储介质
CN112115041A (zh) 应用程序的动态埋点方法、装置、存储介质及计算机设备
CN117828155A (zh) 防爬虫处理方法、装置及电子设备、存储介质
CN115758424A (zh) 数据处理方法、装置、电子设备及计算机可读存储介质
US20230325476A1 (en) Obfuscation device, obfuscation method, and obfuscation program
CN112486497A (zh) 编译配置文件的生成方法、装置、电子设备及存储介质
CN108846265B (zh) 一种程序加固方法及装置
CN113285933A (zh) 用户访问控制方法、装置、电子设备与存储介质
CN111475152A (zh) 一种代码处理方法及装置
CN110874252A (zh) 一种焦点控制方法、装置及设备
CN112667974A (zh) 一种图形化编程代码保护方法、装置及终端设备
CN118467031B (zh) 一种依赖包引入方法、产品、设备及介质
CN114780952B (zh) 敏感应用调用场景的检测方法、系统及存储介质
Parandaman et al. Java code obfuscator to prevent reverse engineering of android application
CN113946804B (zh) 一种源代码的混淆方法和装置
CN114020607B (zh) Bmc调试方法、装置及计算机设备
CN111585992B (zh) 一种检测网络攻击的方法、客户端及存储介质

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20090609

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20100201

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100209

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100223

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100426

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20100525

RD01 Notification of change of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7421

Effective date: 20100630