以下に、図面を参照して、本発明にかかる情報処理装置、情報処理方法、および情報処理プログラムの実施の形態を詳細に説明する。
(情報処理方法の一実施例)
まず、図1〜図4を用いて、本実施の形態にかかる情報処理方法の一実施例について説明する。図1〜図4において、情報処理装置100は、複素非対称スパース行列AをLU分解した結果を格納するメモリ領域量を決定するコンピュータである。
スパース行列とは、行列の要素として零である要素を多く含む行列である。スパース行列は、疎行列とも呼ばれる。複素非対称スパース行列は、当該複素スパース行列の転置行列と一致しない行列である。LU分解とは、ある行列を、下三角行列Lと上三角行列Uとの積で表現することである。下三角行列とは、対角要素より上にある要素がすべて零である行列である。対角要素とは、行番号と列番号が一致する位置にある要素である。上三角行列とは、対角要素より下にある要素がすべて零である行列である。以下の説明では、零である要素を「零要素」と表記する場合がある。また、以下の説明では、零ではない要素を「非零要素」と表記する場合がある。
複素非対称スパース行列AをLU分解した結果を格納する領域として、複素非対称スパース行列Aと複素非対称スパース行列Aの転置行列A^Tとの和になる対称行列PをLL^T分解した結果を格納するための領域を確保することが考えられる。この場合、例えば、演算装置は、対称行列PをLL^T分解する場合の各列の依存関係を示すエリミネーションツリー(elimination tree)を生成して、対称行列PをLL^T分解した結果を格納するための領域を算出することになる。
LL^T分解とは、LU分解の一つである。LL^T分解とは、ある対称行列を、下三角行列Lと、下三角行列Lの転置行列L^Tとの積で表現することである。LL^T分解は、コレスキー分解とも呼ばれる。エリミネーションツリーとは、対称行列Pの各列の依存関係を示すツリーである。エリミネーションツリーは、各列に関するノード(node)を含むツリーである。エリミネーションツリーは、消去木とも呼ばれる。ノードは、節点とも呼ばれる。以下の説明では、j列目に関するノードを「ノード[j]」と表記する場合がある。また、以下の説明では、ノード[j]における「j」を「インデックス」と表記する場合がある。
しかしながら、この場合、複素非対称スパース行列AをLU分解した結果を格納する領域は、格納しなくてもよい零要素を格納するための領域までも含んでしまう。すなわち、複素非対称スパース行列Aが大きくなるにつれて、確保する領域が足りなくなって、複素非対称スパース行列AをLU分解することができなくなることがある。また、LU分解において行わなくてもよい零要素に関する演算を演算装置が行ってしまい、LU分解にかかる処理時間の増大を招いてしまう。
特に、非対称スパース行列Aの非対称度合いが大きくなると、複素非対称スパース行列Aの互いに対称位置にある要素の組み合わせの多くが非零要素と零要素との組み合わせになってしまう場合がある。この場合、複素非対称スパース行列Aから生成した対称行列Pにおいて、複素非対称スパース行列Aでは零要素があった位置に対応する位置にも、非零要素が出現してしまう。このため、対称行列Pの非零要素が対称行列PをLL^T分解した結果に影響し、対称行列PをLL^T分解した結果に含まれる非零要素の数を、複素非対称スパース行列AをLU分解した結果に含まれる非零要素よりも増大させてしまう。結果として、対称行列PをLL^T分解した結果に基づいて確保された、複素非対称スパース行列AをLU分解した結果を格納する領域は、格納しなくてもよい零要素を格納するための領域までも含んでしまう。
そこで、本実施の形態では、複素非対称スパース行列のLU分解を効率的に行うことができる情報処理方法について説明する。この情報処理方法によれば、格納しなくてもよい零要素を格納する領域を確保してしまうことを抑制し、複素非対称スパース行列のLU分解を効率的に行うことができる。以下の説明では、複素非対称スパース行列Aを「スパース行列A」と表記する場合がある。
まず、情報処理装置100は、LU分解するスパース行列Aを取得する。LU分解するスパース行列Aは、例えば、11行11列の行列である。以下の説明では、スパース行列Aのi行j列にある要素を「要素a[i,j]」と表記する場合がある。ここで、図1を用いて、LU分解するスパース行列Aの非零要素のパターンの一例について説明する。
図1は、LU分解するスパース行列Aの非零要素のパターンの一例を示す説明図である。図1の方眼101のi行j列目の升目は、スパース行列Aのi行j列目の要素に対応し、スパース行列Aのi行j列目の要素が対角要素、零要素、および非零要素のいずれであるかを示す。例えば、対角要素は、「対角要素があるスパース行列Aの行番号i(=列番号j)」で示される。また、零要素は、「空白」で示される。また、非零要素は、「●」で示される。図1に示すように、スパース行列Aの7,10行目には、対角要素を除いて非零要素はない。
次に、情報処理装置100は、スパース行列Aとスパース行列A^Tとの和となる、スパース行列Aを対称化した対称行列PをLL^T分解して、下三角行列L(P)と下三角行列L(P)の転置行列L(P)^Tとの積で表現する。
以下の説明では、下三角行列L(P)のi行j列にある要素を「要素l[i,j]」と表記する場合がある。また、下三角行列L(P)の転置行列L(P)^Tのi行j列にある要素を「要素lt[i,j]」と表記する場合がある。ここで、図2を用いて、対称行列PをLL^T分解して得られる、下三角行列L(P)と、下三角行列L(P)の転置行列L(P)^Tとの非零要素のパターンの一例について説明する。
図2は、下三角行列L(P)と下三角行列L(P)の転置行列L(P)^Tとの非零要素のパターンの一例を示す説明図である。図2の方眼201は、対角要素で分割された下三角部分によって下三角行列L(P)の非零要素のパターンを示し、対角要素で分割された上三角部分によって下三角行列L(P)の転置行列L(P)^Tの非零要素のパターンを示す。
図2の方眼201のi行j列目の升目は、i>jの場合には、下三角行列L(P)のi行j列目の要素に対応し、下三角行列L(P)のi行j列目の要素が対角要素、零要素、非零要素、およびフィルインのいずれであるかを示す。フィルインとは、下三角行列L(P)のi行j列目の要素l[i,j]であって、対称行列Pにおいて同じ位置にあるi行j列目の要素p[i,j]が零要素であるのに、非零要素になってしまう要素である。例えば、フィルインは、「○」で示される。
一方で、図2の方眼201のi行j列目の升目は、i<jの場合には、下三角行列L(P)の転置行列L(P)^Tのi行j列目の要素に対応し、転置行列L(P)^Tのi行j列目の要素が対角要素、零要素、非零要素、およびフィルインのいずれであるかを示す。
ここで、対称行列Pの非零要素のパターンは、スパース行列Aの非零要素のパターンを包含する。このため、スパース行列Aの非零要素が影響して下三角行列L(A)において非零要素が出現する位置は、スパース行列Aの非零要素と同じ位置にある対称行列Pの非零要素が影響して下三角行列L(P)において非零要素が出現する位置と一致する。同様に、上三角行列U(A)において非零要素が出現する位置は、転置行列L(P)^Tにおいて非零要素が出現する位置と一致する。
一方で、スパース行列Aにおいて零要素がある位置にも対称行列Pにおいては非零要素があるため、当該非零要素が影響して、下三角行列L(A)において非零要素が出現しない位置にも下三角行列L(P)においては非零要素が出現する。同様に、上三角行列U(A)において非零要素が出現しない位置にも転置行列L(P)^Tにおいては非零要素が出現する。これらのことから、対称行列PをLL^T分解した場合の下三角行列L(P)や転置行列L(P)^Tの非零要素のパターンは、スパース行列AをLU分解した場合の下三角行列L(A)や上三角行列U(A)の非零要素のパターンを包含する。
次に、情報処理装置100は、対称行列PをLL^T分解した結果に基づいて、対称行列Pのエリミネーションツリーを生成する。ここで、図3を用いて、図2に示した下三角行列L(P)や下三角行列L(P)の転置行列L(P)^Tの非零要素のパターンに基づくエリミネーションツリーについて説明する。
図3は、エリミネーションツリー301を示す説明図である。情報処理装置100は、i>jであるノード[i]とノード[j]とがある場合に、min{i|i>jかつl[i,j]≠0}を満たせば、ノード[i]をノード[j]の親ノード(parent)として、エリミネーションツリー301を生成する。エリミネーションツリー301において、ノード[i]がノード[j]の祖先でなければ、LL^T分解した下三角行列L(P)のi列目の要素を算出する際に、LL^T分解した下三角行列L(P)のj列目の要素が影響することはない。
ここでは、情報処理装置100が、エリミネーションツリー301を、対称行列PをLL^T分解した結果に基づいて生成する場合について説明したが、これに限らない。例えば、情報処理装置100は、エリミネーションツリー301を、対称行列PをLL^T分解しなくても、スパース行列Aに基づいて生成することができるし、LL^T分解する前の対称行列Pの下三角行列C(P)に基づいて生成することもできる。
次に、情報処理装置100は、エリミネーションツリー301に基づいて、スパース行列AをLU分解した場合の下三角行列L(A)と上三角行列U(A)との非零要素のパターンを特定する。ここで、下三角行列L(A)のi行目の非零要素のパターンは、下三角行列L(A)のi行目において対角要素がある列に関するノードを根ノード(root)として含む、エリミネーションツリー301のロウサブツリー(row subtree)で、近似して表現される。同様に、上三角行列U(A)の転置行列U(A)^Tのi行目の非零要素のパターンは、転置行列U(A)^Tのi行目において対角要素がある列に関するノードを根ノードとして含む、エリミネーションツリー301のロウサブツリーで、近似して表現される。以下の説明では、ロウサブツリーを「部分木」と表記する場合がある。
このため、情報処理装置100は、下三角行列C(A)のi行目において対角要素がある列に関するノードを根ノードとして特定し、対角要素以外の非零要素がある列に関するノードを葉ノード(leaf)として特定する。次に、情報処理装置100は、下三角行列L(A)のi行目の非零要素のパターンを、特定した根ノードと葉ノードとを含むエリミネーションツリー301の部分木によって近似する。そして、情報処理装置100は、下三角行列L(A)の各行の非零要素のパターンに基づいて、下三角行列L(A)の各列にある非零要素の数を算出する。
同様に、情報処理装置100は、上三角行列R(A)の転置行列R(A)^Tのi行目において対角要素がある列に関するノードを根ノードとして特定し、対角要素以外の非零要素がある列に関するノードを葉ノードとして特定する。次に、情報処理装置100は、上三角行列U(A)の転置行列U(A)^Tのi行目の非零要素のパターンを、特定した根ノードと葉ノードとを含むエリミネーションツリー301の部分木によって近似する。そして、情報処理装置100は、転置行列U(A)^Tの各行の非零要素のパターンに基づいて、転置行列U(A)^Tの各列にある非零要素の数を算出する。
情報処理装置100は、例えば、図1のスパース行列Aの下三角行列C(A)の7行目の非零要素のパターンから、LU分解した下三角行列L(A)の7行目に葉ノードはないと特定する。そして、情報処理装置100は、ノード[7]を含む部分木によって下三角行列L(A)の7行目の非零要素のパターンを近似する。
また、情報処理装置100は、図1のスパース行列Aの下三角行列C(A)の10行目の非零要素のパターンから、下三角行列L(A)の10行目に葉ノードはないと特定する。そして、情報処理装置100は、ノード[10]を含む部分木によって下三角行列L(A)の10行目の非零要素のパターンを近似する。ここで、図4を用いて、スパース行列AをLU分解して得られた下三角行列L(A)と上三角行列U(A)との近似された非零要素のパターンの一例について説明する。
図4は、下三角行列L(A)と上三角行列U(A)との近似された非零要素のパターンの一例を示す説明図である。図4の方眼401では、対角要素で分割された下三角部分によって下三角行列L(A)の近似された非零要素のパターンを示し、対角要素で分割された上三角部分によって上三角行列U(A)の近似された非零要素のパターンを示す。
図4の方眼401のi行j列目の升目は、i>jの場合には、下三角行列L(A)のi行j列目の要素に対応し、下三角行列L(A)のi行j列目の要素が対角要素、零要素、非零要素、フィルイン、および偽フィルインのいずれであるかを示す。偽フィルインとは、実際にはフィルインにならないが、非零要素のパターンを近似したためにフィルインになった要素である。例えば、偽フィルインは、「◎」で示される。
一方で、図4の方眼401のi行j列目の升目は、i<jの場合には、上三角行列U(A)のi行j列目の要素に対応し、上三角行列U(A)のi行j列目の要素が対角要素、零要素、非零要素、フィルイン、および偽フィルインのいずれであるかを示す。
ここで、対称行列Pにおいて非零要素がある位置であってもスパース行列Aにおいては非零要素がない場合がある。このため、下三角行列L(A)の非零要素のパターンを、対称行列Pとエリミネーションツリー301の組み合わせから近似するよりも、スパース行列Aとエリミネーションツリー301の組み合わせから近似する方が、非零要素の影響が少なくなる。結果として、実際にLU分解した下三角行列L(A)では非零要素にならない要素を、非零要素になると判定することが抑制される。同様に、実際にLU分解した上三角行列U(A)では非零要素にならない要素を、非零要素になると判定することが抑制される。
換言すれば、図4の非零要素のパターンは、対称行列PをLL^T分解した場合の図2に示した非零要素のパターンに包含され、対称行列PをLL^T分解した場合の非零要素のパターンよりもフィルインの数が少なくなることがある。図4の例では、図4の非零要素のパターンにおける7,10行目にあるフィルインの数は、対称行列PをLL^T分解した場合の非零要素のパターンにおける7,10行目にあるフィルインの数よりも少なくなる。
また、エリミネーションツリー301は、スパース行列AをLU分解する場合の各列の依存関係を示したツリーではないため、実際にLU分解する場合には依存関係のない列同士が依存関係のある列同士とされることがある。しかしながら、少なくとも、実際にLU分解する場合に依存関係のある列同士は、依存関係のある列同士として示される。このため、スパース行列Aの非零要素が影響して、非零要素が出現する下三角行列L(A)の位置については、少なくとも、非零要素が出現する位置として判定されることになる。同様に、スパース行列Aの非零要素が影響して、非零要素が出現する上三角行列U(A)の位置については、少なくとも、非零要素が出現する位置として判定されることになる。
換言すれば、図4の非零要素のパターンは、スパース行列AをLU分解した場合の非零要素のパターンよりもフィルインの数が多くなることがあるが、少なくともスパース行列AをLU分解した場合の非零要素のパターンを包含することになる。
これにより、情報処理装置100は、下三角行列L(A)を格納する領域の大きさを精度よく算出することができるようになる。情報処理装置100は、例えば、対称行列PをLL^T分解した場合の非零要素のパターンに基づく領域よりも小さく、かつ、実際にスパース行列AをLU分解した場合の下三角行列L(A)や上三角行列U(A)を格納可能な領域の大きさを算出することができる。情報処理装置100は、具体的には、下三角行列L(A)と上三角行列U(A)を格納する領域として、下三角行列L(A)の各列と上三角行列U(A)の各行との非零要素があるインデックスを格納する領域と非零要素を格納する領域とを用意する。
このように、情報処理装置100は、LU分解した結果を格納する領域の大きさを低減することができ、スパース行列Aが大きくなってもLU分解した結果を格納することができるようになる。例えば、スパース行列Aの非対称度合いが大きく、下三角行列C(A)のみに非零要素があるような場合がある。この場合であれば、情報処理装置100は、対称行列PをLL^T分解した場合の非零要素のパターンに基づいて領域の大きさを算出する場合に比べて、領域の大きさを約半分まで低減することができる可能性がある。
また、情報処理装置100は、LU分解において行わなくてもよい演算を省略することができ、効率よくLU分解することができる可能性がある。例えば、スパース行列Aの非対称度合いが大きく、下三角行列C(A)のみに非零要素があるような場合がある。この場合であれば、情報処理装置100は、演算量も約半分に低減することができる可能性がある。
ここで、情報処理装置100が、実際にLU分解する場合を例に挙げて、演算量を低減することについて説明する。情報処理装置100は、実際にLU分解する際には、エリミネーションツリー301を深さ優先探索(depth first search)して、ポストオーダー(postorder)を付与する。次に、情報処理装置100は、付与したポストオーダーの順にleft lookingおよびupward lookingによって、下三角行列L(A)の各列および上三角行列U(A)の各行を更新する。
left lookingとは、スパース行列AのLU分解において、下三角行列L(A)のj列にある要素を、下三角行列L(A)のj列よりも左側にある列の要素を参照して更新することである。また、upward lookingとは、スパース行列AのLU分解において、上三角行列U(A)のi行にある要素を、上三角行列U(A)のi行よりも上側の行の要素を参照して更新することである。以下の説明では、下三角行列L(A)のi行j列目の要素を「la[i,j]」と表記する場合がある。また、以下の説明では、上三角行列U(A)のi行j列目の要素を「ua[i,j]」と表記する場合がある。
例えば、情報処理装置100は、上三角行列U(A)の7行目の要素ua[7,j]を更新する場合がある。この場合には、情報処理装置100は、下三角行列L(A)の7行目の非零要素la[7,i](i<7)と、当該非零要素の列番号と同じ値を行番号として有する上三角行列U(A)の要素ua[i,j]を乗算して、a[7,j]から減算する。しかしながら、情報処理装置100は、下三角行列L(A)の要素la[7,i](i<7)に非零要素がなければ、上三角行列U(A)の7行目を更新する場合の演算を行わなくてもよいことになる。
このため、情報処理装置100は、下三角行列L(A)の非零要素のパターンが図4の例になる場合であれば、上三角行列U(A)の7行目を更新する演算を省略することにより、LU分解の際に演算量を低減することができる。具体的には、情報処理装置100は、下三角行列L(A)の7行目に関して領域が確保されているか否かを判定し、確保されていなければ下三角行列L(A)の7行目は非零要素であるため、上三角行列U(A)の7行目についての演算を省略する。
ここで、情報処理装置100が、上述した演算の中で、非零要素がある位置をどのように特定するのかについて説明する。情報処理装置100は、非零要素がある位置を特定する際には、各ノードを、付与されたポストオーダーの順に辿ればよい。情報処理装置100は、例えば、各ノードを、付与されたポストオーダーの順に辿り、当該ノードの子ノード(child node)のインデックスの集合と、当該ノードに応じてLU分解する列の非零要素があるインデックスの集合の和を算出する。これにより、情報処理装置100は、下三角行列L(A)の各列の非零要素のインデックスを特定することができる。
同様に、情報処理装置100は、各ノードを、付与されたポストオーダーの順に辿り、当該ノードの子ノードのインデックスの集合と、当該ノードに応じてLU分解する行の非零要素があるインデックスの集合の和を算出する。これにより、情報処理装置100は、上三角行列U(A)の各行の非零要素のインデックスを特定することができる。
これらのことから、情報処理装置100によれば、スパース行列AをLU分解した結果を格納する領域の大きさを削減することができる。そして、情報処理装置100によれば、確保しなくてもよい零要素を格納する領域を確保しないため、LU分解にかかる処理量を抑えて、処理時間の増大を防ぎ、LU分解を効率的に行うことができる。
これにより、例えば、電磁場、音響、量子力学、および回路などの解析における複素非対称スパース行列を用いた連立1次方程式を解く際に、LU分解した結果を格納する領域の大きさを削減して、大規模問題に対応することが可能となる。
(情報処理方法の他の実施例)
まず、情報処理装置100は、図1に示す非零要素のパターンとは異なる非零要素のパターンを有する、LU分解するスパース行列Aを取得する。LU分解するスパース行列Aは、例えば、11行11列の行列である。ここで、図5を用いて、LU分解するスパース行列Aの非零要素のパターンの別の例を示す。
図5は、LU分解するスパース行列Aの非零要素のパターンの別の例を示す説明図である。図5の方眼501のi行j列目の升目は、スパース行列Aのi行j列目の要素に対応し、スパース行列Aのi行j列目の要素が対角要素、零要素、および非零要素のいずれであるかを示す。図5に示すように、スパース行列Aは、対称度合いが大きい行列であって、スパース行列Aの下三角行列C(A)にある非零要素が上三角行列R(A)にある非零要素よりも多い。
次に、情報処理装置100は、スパース行列Aを対称化した対称行列Pを生成し、生成した対称行列PをLL^T分解して下三角行列L(P)と下三角行列L(P)の転置行列L(P)^Tとの積で表現する。ここで、図6を用いて、対称行列PをLL^T分解して得られた下三角行列L(P)と下三角行列L(P)の転置行列L(P)^Tとの非零要素のパターンの別の例について説明する。
図6は、下三角行列L(P)と下三角行列L(P)の転置行列L(P)^Tとの非零要素のパターンの別の例を示す説明図である。図6の方眼601では、対角要素で分割された下三角部分によって下三角行列L(P)の非零要素のパターンを示し、対角要素で分割された上三角部分によって下三角行列L(P)の転置行列L(P)^Tの非零要素のパターンを示す。
図6の方眼601のi行j列目の升目は、i>jの場合には、下三角行列L(P)のi行j列目の要素に対応し、下三角行列L(P)のi行j列目の要素が対角要素、零要素、非零要素、およびフィルインのいずれであるかを示す。一方で、図6の方眼601のi行j列目の升目は、i<jの場合には、下三角行列L(P)の転置行列L(P)^Tのi行j列目の要素に対応し、転置行列L(P)^Tのi行j列目の要素が対角要素、零要素、非零要素、およびフィルインのいずれであるかを示す。
ここで、対称行列PをLL^T分解した場合の下三角行列L(P)や転置行列L(P)^Tの非零要素のパターンは、スパース行列AをLU分解した場合の下三角行列L(A)や上三角行列U(A)の非零要素のパターンを包含する。
次に、情報処理装置100は、対称行列PをLL^T分解した結果に基づいて、対称行列Pのエリミネーションツリー701を生成する。ここで、図7を用いて、図6に示した下三角行列L(P)や下三角行列L(P)の転置行列L(P)^Tの非零要素のパターンに基づくエリミネーションツリー701について説明する。
図7は、エリミネーションツリー701を示す説明図である。情報処理装置100は、i>jであるノード[i]とノード[j]とがある場合に、min{i|i>jかつl[i,j]≠0}を満たせば、ノード[i]をノード[j]の親ノード(親ノード)として、エリミネーションツリー701を生成する。
次に、情報処理装置100は、エリミネーションツリー701に基づいて、スパース行列AをLU分解した場合の下三角行列L(A)と上三角行列U(A)との非零要素のパターンを特定する。
例えば、情報処理装置100は、下三角行列C(A)のi行目において対角要素がある列に関するノードを根ノードとして特定し、対角要素以外の非零要素がある列に関するノードを葉ノード(leaf)として特定する。次に、情報処理装置100は、下三角行列L(A)のi行目の非零要素のパターンを、特定した根ノードと葉ノードとを含むエリミネーションツリー701の部分木によって近似する。そして、情報処理装置100は、下三角行列L(A)の各行の非零要素のパターンに基づいて、下三角行列L(A)の各列にある非零要素の数を算出する。
同様に、情報処理装置100は、上三角行列R(A)の転置行列R(A)^Tのi行目において対角要素がある列に関するノードを根ノードとして特定し、対角要素以外の非零要素がある列に関するノードを葉ノードとして特定する。次に、情報処理装置100は、上三角行列U(A)の転置行列U(A)^Tのi行目の非零要素のパターンを、特定した根ノードと葉ノードとを含むエリミネーションツリー701の部分木によって近似する。そして、情報処理装置100は、転置行列U(A)^Tの各行の非零要素のパターンに基づいて、転置行列U(A)^Tの各列にある非零要素の数を算出する。
情報処理装置100は、例えば、図5のスパース行列Aの上三角行列R(A)の転置行列R(A)^Tの1,2,4,6〜9,11行目の非零要素のパターンを特定する。次に、情報処理装置100は、特定した非零要素のパターンから、上三角行列U(A)の転置行列U(A)^Tの1,2,4,6〜9,11行目に葉ノードはないと特定する。そして、情報処理装置100は、上三角行列U(A)の転置行列U(A)^Tの1,2,4,6〜9,11行目に対応する部分木によって上三角行列U(A)の転置行列U(A)^Tの1,2,4,6〜9,11行目の非零要素のパターンを近似する。
また、情報処理装置100は、図5のスパース行列Aの下三角行列C(A)の転置行列C(A)^Tの3,5,10行目の非零要素のパターンから、上三角行列U(A)の転置行列U(A)^Tの3,5,10行目にある葉ノードを特定する。そして、情報処理装置100は、上三角行列U(A)の転置行列U(A)^Tの3,5,10行目に対応する部分木によって上三角行列U(A)の転置行列U(A)^Tの3,5,10行目の非零要素のパターンを近似する。ここで、図8を用いて、スパース行列AをLU分解して得られた下三角行列L(A)と上三角行列U(A)との近似された非零要素のパターンの別の例について説明する。
図8は、下三角行列L(A)と上三角行列U(A)との近似された非零要素のパターンの別の例を示す説明図である。図8の方眼801では、対角要素で分割された下三角部分によって下三角行列L(A)の近似された非零要素のパターンを示し、対角要素で分割された上三角部分によって上三角行列U(A)の近似された非零要素のパターンを示す。
図8の方眼801のi行j列目の升目は、i>jの場合には、下三角行列L(A)のi行j列目の要素に対応し、下三角行列L(A)のi行j列目の要素が対角要素、零要素、非零要素、フィルイン、および偽フィルインのいずれであるかを示す。一方で、図8の方眼801のi行j列目の升目は、i<jの場合には、上三角行列U(A)のi行j列目の要素に対応し、上三角行列U(A)のi行j列目の要素が対角要素、零要素、非零要素、フィルイン、および偽フィルインのいずれであるかを示す。
ここで、図8の非零要素のパターンは、スパース行列AをLU分解した場合の非零要素のパターンよりもフィルインの数が多くなることがあるが、スパース行列AをLU分解した場合の非零要素のパターンを包含することになる。一方で、図8の非零要素のパターンは、対称行列PをLL^T分解した場合の図6に示した非零要素のパターンに包含され、対称行列PをLL^T分解した場合の非零要素のパターンよりもフィルインの数が少なくなることがある。図8の例では、図8の非零要素のパターンにおける各行にあるフィルインの数は、対称行列PをLL^T分解した場合の非零要素のパターンにおける各行にあるフィルインの数よりも少なくなる。
これにより、情報処理装置100は、下三角行列L(A)を格納する領域の大きさを精度よく算出することができるようになる。情報処理装置100は、例えば、対称行列PをLL^T分解した場合の非零要素のパターンに基づく領域よりも小さく、かつ、実際にスパース行列AをLU分解した場合の下三角行列L(A)や上三角行列U(A)を格納可能な領域の大きさを算出することができる。情報処理装置100は、具体的には、下三角行列L(A)と上三角行列U(A)を格納する領域として、下三角行列L(A)の各列と上三角行列U(A)の各行との非零要素があるインデックスを格納する領域と非零要素を格納する領域とを用意する。
このように、情報処理装置100は、LU分解した結果を格納する領域の大きさを低減することができ、スパース行列Aが大きくなってもLU分解した結果を格納することができるようになる。例えば、スパース行列Aの非対称度合いが大きく、下三角行列C(A)のみに非零要素があるような場合がある。この場合であれば、情報処理装置100は、対称行列PをLL^T分解した場合の非零要素のパターンに基づいて領域の大きさを算出する場合に比べて、領域の大きさを約半分に低減することができる可能性がある。
また、情報処理装置100は、LU分解において行わなくてもよい演算を省略することができ、効率よくLU分解することができる。例えば、スパース行列Aの非対称度合いが大きく、下三角行列C(A)のみに非零要素があるような場合がある。この場合であれば、情報処理装置100は、演算量も約半分に低減することができる可能性がある。
(情報処理装置100のハードウェア)
次に、図9を用いて、実施の形態にかかる情報処理装置100のハードウェアの一例について説明する。
図9は、実施の形態にかかる情報処理装置100のハードウェアの一例を示すブロック図である。図9において、情報処理装置100は、CPU(Central Processing Unit)901と、ROM(Read Only Memory)902と、RAM(Random Access Memory)903と、を有する。また、情報処理装置100は、さらに、ディスクドライブ904と、ディスク905と、インターフェース(I/F:Interface)906と、を有する。
また、CPU901と、ROM902と、RAM903と、ディスクドライブ904と、I/F906とは、バス900によってそれぞれ接続されている。情報処理装置100は、例えば、サーバ、PC(Personal Computer)、ノートPC、タブレット型PCなどである。
CPU901は、情報処理装置100の全体の制御を司る。ROM902は、ブートプログラム、情報処理プログラムなどの各種プログラムを記憶する。RAM903は、CPU901のワークエリアとして使用される。また、RAM903は、各種プログラムの実行により得られたデータなどの各種データを記憶する。ディスクドライブ904は、CPU901の制御により、ディスク905に対するデータのリード/ライトを制御する。ディスク905は、ディスクドライブ904の制御により書き込まれたデータを記憶する。
I/F906は、通信回線を通じてネットワーク910に接続され、このネットワーク910を介して他の装置に接続される。ネットワーク910は、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどである。I/F906は、ネットワーク910と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F906は、例えば、モデムやLANアダプタなどである。
情報処理装置100は、ディスクドライブ904とディスク905との代わりに、SSD(Solid State Drive)と半導体メモリとを有していてもよい。また、情報処理装置100は、光ディスク、ディスプレイ、キーボード、マウス、スキャナ、およびプリンタの少なくともいずれか一つを有してもよい。
(情報処理装置100の機能的構成例)
次に、図10を用いて、情報処理装置100の機能的構成例について説明する。
図10は、情報処理装置100の機能的構成例を示すブロック図である。情報処理装置100は、制御部となる機能として、取得部1001と、算出部1002と、分解部1003とを含む。
取得部1001は、LU分解する行列を取得する。LU分解する行列は、例えば、図1や図5に示した非零要素のパターンを有するスパース行列Aである。これにより、取得部1001は、算出部1002にスパース行列AをLU分解した結果を格納する領域の大きさを算出させるために、算出部1002にスパース行列Aを入力することができる。
取得されたデータは、例えば、RAM903、ディスク905などの記憶領域に記憶される。取得部1001は、例えば、図9に示したROM902、RAM903、ディスク905などの記憶装置に記憶されたプログラムをCPU901に実行させることにより、または、I/F906により、その機能を実現する。
算出部1002は、スパース行列Aから、スパース行列Aの対称行列Pのエリミネーションツリーを生成する。算出部1002は、例えば、スパース行列Aの対称行列Pの非零要素のパターンを特定して、対称行列Pのエリミネーションツリーを生成する。
ここで、算出部1002は、対称行列Pの非零要素のパターンを特定することができれば、対称行列Pを生成しなくてもよい。また、算出部1002は、例えば、スパース行列Aの互いに対称位置にある要素a[i,j]とa[j,i]とから、対称行列Pを生成せずに、対称行列Pのエリミネーションツリーを生成してもよい。対称位置とは、対角要素に対して対称な位置であり、i行j列目の位置とj行i列目の位置とである。エリミネーションツリーを生成する詳細は、後述する実施例1の第1の工程〜第4の工程において説明する。
算出部1002は、生成したエリミネーションツリーに基づいて、スパース行列Aの下三角行列C(A)の各行の部分木を抽出する。各行の部分木とは、各行に対応するロウサブツリーである。各行の部分木は、当該行の行番号と同じ値をインデックスとして有するノードを根ノードとし、当該行において非零要素がある列の列番号と同じ値をインデックスとして有するノードを葉ノードとする、エリミネーションツリーの部分木である。そして、算出部1002は、抽出した下三角行列C(A)の各行の部分木のうち、エリミネーションツリーの各ノードを含む部分木の数を算出する。
算出部1002は、例えば、スパース行列Aの下三角行列C(A)の非零要素のパターンを特定して、下三角行列C(A)の各行の部分木を抽出する。そして、算出部1002は、エリミネーションツリーのノードごとに、当該ノードを含む部分木がいくつあるかを計数し、当該ノードを含む部分木の数を算出する。
ここで、算出部1002は、下三角行列C(A)の非零要素のパターンを特定することができれば、下三角行列C(A)を生成しなくてもよい。部分木の数を算出する詳細は、後述する実施例1の第5の工程において説明する。
算出部1002は、生成したエリミネーションツリーに基づいて、スパース行列Aの上三角行列R(A)の転置行列R(A)^Tの各行の部分木を抽出する。そして、算出部1002は、抽出した転置行列R(A)^Tの各行の部分木のうち、エリミネーションツリーの各ノードを含む部分木の数を算出する。
算出部1002は、例えば、スパース行列Aの上三角行列R(A)の転置行列R(A)^Tの非零要素のパターンを特定して、転置行列R(A)^Tの各行の部分木を抽出する。そして、算出部1002は、エリミネーションツリーのノードごとに、当該ノードを含む部分木がいくつあるかを計数し、当該ノードを含む部分木の数を算出する。
ここで、算出部1002は、転置行列R(A)^Tの非零要素のパターンを特定することができれば、上三角行列R(A)や転置行列R(A)^Tを生成しなくてもよい。部分木の数を算出する詳細は、後述する実施例1の第6の工程において説明する。
算出部1002は、生成したエリミネーションツリーの各ノードを含む部分木の数に基づいて、スパース行列AのLU分解結果を格納するメモリ領域量を算出する。メモリ領域量とは、LU分解した結果を格納する領域の大きさである。算出部1002は、例えば、生成したエリミネーションツリーの各ノードを含む、下三角行列C(A)から得られた部分木の数を、スパース行列AをLU分解した場合の下三角行列L(A)の各列の非零要素の数とする。
また、算出部1002は、生成したエリミネーションツリーの各ノードを含む、転置行列R(A)^Tから得られた部分木の数を、スパース行列AをLU分解した場合の上三角行列U(A)の転置行列U(A)^Tの各列の非零要素の数とする。転置行列U(A)^Tの各列の非零要素の数は、上三角行列U(A)の各行の非零要素の数に対応する。そして、算出部1002は、下三角行列L(A)の各列の非零要素の数と上三角行列U(A)の各行の非零要素の数とに基づいて、LU分解した結果を格納する領域の大きさを算出する。メモリ領域量を算出する詳細は、後述する実施例1の第7の工程において説明する。
これにより、算出部1002は、スパース行列AをLU分解した結果を格納する領域の大きさを低減することができる。算出結果は、例えば、RAM903、ディスク905などの記憶領域に記憶される。算出部1002は、例えば、図9に示したROM902、RAM903、ディスク905などの記憶装置に記憶されたプログラムをCPU901に実行させることにより、その機能を実現する。
分解部1003は、算出部1002が算出した領域の大きさを確保して、スパース行列AをLU分解する。分解部1003は、例えば、RAM903、ディスク905などの記憶領域に、算出部1002が算出した大きさ分の領域を確保して、スパース行列AをLU分解し、スパース行列Aを分解した結果を確保した領域に格納する。分解部1003は、例えば、図9に示したROM902、RAM903、ディスク905などの記憶装置に記憶されたプログラムをCPU901に実行させることにより、その機能を実現する。
(実施例1)
次に、図11〜17を用いて、実施例1について説明する。実施例1において、情報処理装置100は、スパース行列AをLU分解した結果を格納する領域の大きさを、スパース行列AをLU分解するのに先立って近似的に算出し、LU分解した結果を格納する領域を確保してからLU分解を行う。
ここでは、図5に示した非零要素のパターンを有するスパース行列Aを例に挙げて、情報処理装置100が、スパース行列AをLU分解した場合の下三角行列L(A)と上三角行列U(A)とを格納する領域の大きさを算出する各種工程について説明する。
<第1の工程>
まず、第1の工程について説明する。第1の工程は、情報処理装置100が、スパース行列Aから、下三角行列C(A)と上三角行列R(A)とを生成し、下三角行列C(A)と上三角行列R(A)との非零要素のパターンを特定する工程である。ここで、情報処理装置100は、下三角行列C(A)と上三角行列R(A)とのそれぞれを、対角要素が非零要素である行列として生成する。
情報処理装置100は、例えば、スパース行列Aと同じ大きさであって、スパース行列Aの対角要素よりも右側および上側にある要素a[i,j](i<j)を零要素に変更した行列を、下三角行列C(A)として生成する。以下の説明では、下三角行列C(A)のi行j列にある要素を「要素c[i,j]」と表記する場合がある。そして、情報処理装置100は、生成した下三角行列C(A)を、圧縮列格納法を用いて格納しておく。圧縮列格納法については、図17を用いて後述する。
また、情報処理装置100は、スパース行列Aと同じ大きさであって、スパース行列Aの対角要素よりも左側および下側にある要素a[i,j](i>j)を零要素にした行列を、上三角行列R(A)として生成する。以下の説明では、上三角行列R(A)のi行j列にある要素を「要素r[i,j]」と表記する場合がある。そして、情報処理装置100は、生成した上三角行列R(A)を、圧縮行格納法を用いて格納しておく。圧縮行格納法については、図17を用いて後述する。
換言すれば、情報処理装置100は、実質的に、生成した上三角行列R(A)の転置行列R(A)^Tを、圧縮列格納法で格納しておくことになる。ここで、図11を用いて、下三角行列C(A)と上三角行列R(A)との非零要素のパターンについて説明する。
図11は、下三角行列C(A)と上三角行列R(A)との非零要素のパターンを示す説明図である。図11の方眼1101は、下三角行列C(A)の非零要素のパターンを示す。図11の方眼1101のi行j列目の升目は、下三角行列C(A)のi行j列目の要素c[i,j]に対応し、下三角行列C(A)のi行j列目の要素c[i,j]が対角要素、零要素、および非零要素のいずれであるかを示す。
図11の例では、図11の方眼1101の1行1列目の升目は、対応する下三角行列C(A)の1行1列目の要素c[1,1]が対角要素であるため、行番号「1」で示される。また、例えば、図11の方眼1101の2行3列目の升目は、対応する下三角行列C(A)の2行3列目の要素c[2,3]が、スパース行列Aの2行3列目の要素a[2,3]に関わらず零要素に変更されたため、「空白」で示される。また、例えば、図11の方眼1101の3行2列目の升目は、対応する下三角行列C(A)の3行2列目の要素c[3,2]が、スパース行列Aの3行2列目の要素a[3,2]そのものであり、非零要素であるため、「●」で示される。
一方で、図11の方眼1102は、上三角行列R(A)の非零要素のパターンを示す。図11の方眼1102のi行j列目の升目は、上三角行列R(A)のi行j列目の要素r[i,j]に対応し、上三角行列R(A)のi行j列目の要素r[i,j]が対角要素、零要素、および非零要素のいずれであるかを示す。
図11の例では、図11の方眼1102の1行1列目の升目は、対応する上三角行列R(A)の1行1列目の要素r[1,1]が対角要素であるため、行番号「1」で示される。また、例えば、図11の方眼1102の2行3列目の升目は、対応する上三角行列R(A)の2行3列目の要素r[2,3]が、スパース行列Aの2行3列目の要素a[2,3]そのものであり、非零要素であるため、「●」で示される。また、例えば、図11の方眼1102の3行2列目の升目は、対応する上三角行列R(A)の3行2列目の要素r[3,2]が、スパース行列Aの3行2列目の要素a[3,2]に関わらず零要素に変更されたため、「空白」で示される。
ここでは、情報処理装置100が、下三角行列C(A)と、上三角行列R(A)の転置行列R(A)^Tとを生成する場合について説明したが、これに限らない。例えば、情報処理装置100は、下三角行列C(A)と転置行列R(A)^Tとの非零要素のパターンを特定することができれば、下三角行列C(A)と転置行列R(A)^Tを生成しなくてもよい。次に、情報処理装置100は、第2の工程に移行する。
<第2の工程>
次に、第2の工程について説明する。第2の工程は、情報処理装置100が、下三角行列C(A)と、上三角行列R(A)とから、スパース行列Aを対称化した対称行列P=A+A^Tの下三角行列C(P)を生成する工程である。
情報処理装置100は、例えば、下三角行列C(A)の非零要素のパターンと、上三角行列R(A)の転置行列R(A)^Tの非零要素のパターンとを結合して、スパース行列Aを対称化した対称行列Pの下三角行列C(P)を生成する。以下の説明では、対称行列Pのi行j列にある要素を「要素p[i,j]」と表記する場合がある。また、以下の説明では、下三角行列C(P)のi行j列にある要素を「要素cp[i,j]」と表記する場合がある。i>jであれば、要素p[i,j]=要素cp[i,j]である。そして、情報処理装置100は、生成した下三角行列C(P)の非零要素のパターンを特定する。ここで、図12を用いて、下三角行列C(P)の非零要素のパターンについて説明する。
図12は、下三角行列C(P)の非零要素のパターンを示す説明図である。図12の方眼1201のi行j列目の升目は、下三角行列C(P)のi行j列目の要素cp[i,j]に対応し、下三角行列C(P)のi行j列目の要素cp[i,j]が対角要素、零要素、および非零要素のいずれであるかを示す。
図12の例では、図12の方眼1201の2行3列目の升目は、対応する下三角行列C(P)の2行3列目の要素cp[2,3]が、零要素であるため、「空白」で示される。また、例えば、図12の方眼1201の3行2列目の升目は、対応する下三角行列C(P)の3行2列目の要素cp[3,2]が、非零要素であるため、「●」で示される。下三角行列C(P)の3行2列目の要素cp[3,2]は、スパース行列Aの下三角行列C(A)の3行2列目の要素c[3,2]と上三角行列R(A)の転置行列R(A)^Tの3行2列目の要素r[3,2]との和である。
ここでは、情報処理装置100が、下三角行列C(P)を生成する場合について説明したが、これに限らない。例えば、情報処理装置100は、下三角行列C(P)の非零要素のパターンを特定することができれば、下三角行列C(P)を生成しなくてもよい。次に、情報処理装置100は、第3の工程に移行する。
<第3の工程>
次に、第3の工程について説明する。第3の工程は、情報処理装置100が、対称行列PをLL^T分解した場合の下三角行列L(P)に基づいて、対称行列Pのエリミネーションツリーを生成する工程である。まず、情報処理装置100は、対称行列Pの下三角行列C(P)の非零要素のパターンに基づいて、対称行列PをLL^T分解した場合の下三角行列L(P)を生成する。以下の説明では、下三角行列L(P)のi行j列にある要素を「要素l[i,j]」と表記する場合がある。
ここで、LL^T分解の定義より、「対称行列P=下三角行列L(P)・下三角行列L(P)の転置行列L(P)^T」であるため、対称行列Pの各要素p[i,j]について、下記式(1)が成立することになる。
さらに、上記式(1)を変形することにより、下三角行列L(P)の各要素l[i,j](i>j)について、下記式(2)および下記式(3)が成立することになる。
上記式(2)および上記式(3)が成立するため、情報処理装置100は、下三角行列L(P)を生成する際には、下三角行列L(P)の対角要素l[j,j]をj=1から順番に決定することになる。さらに、情報処理装置100は、下三角行列L(P)の対角要素l[j,j]を決定すると、下三角行列L(P)のj列目の各要素l[1,j]〜l[j−1,j]をj=1から順番に決定することになる。ここで、図13を用いて、下三角行列L(P)の非零要素のパターンについて説明する。
図13は、下三角行列L(P)の非零要素のパターンを示す説明図である。図13の方眼1301のi行j列目の升目は、下三角行列L(P)のi行j列目の要素に対応し、下三角行列L(P)のi行j列目の要素が対角要素、零要素、および非零要素のいずれであるかを示す。図13の例では、図13の方眼1301の2行3列目の升目は、対応する下三角行列L(P)の2行3列目の要素l[2,3]が、零要素であるため、「空白」で示される。また、例えば、図13の方眼1301の3行2列目の升目は、対応する下三角行列L(P)の3行2列目の要素l[3,2]が、非零要素であるため、「●」で示される。また、例えば、図13の方眼1301の7行6列目の升目は、対応する下三角行列L(P)の7行6列目の要素l[7,6]が、フィルインであるため、「○」で示される。
次に、情報処理装置100は、下三角行列L(P)の非零要素のパターンに基づいて、対称行列PをLL^T分解してL(P)・L(P)^Tで表現する場合の対称行列Pのエリミネーションツリーを生成する。
ここで、上記式(2)および上記式(3)によれば、下三角行列L(P)のi行k列目が非零要素であれば、下三角行列L(P)のi列目の要素を算出する際に、下三角行列L(P)のk列目の要素が影響することになる。一方で、下三角行列L(P)のi行k列目が零要素であれば、下三角行列L(P)のi列目の要素を算出する際に、下三角行列L(P)のk列目の要素が影響することはない。
エリミネーションツリーは、下三角行列L(P)の各列に関するノードを含み、i列目の要素についてj列目の要素が影響する場合に、i列目に関するノードとj列目に関するノードとを連結して親子関係とする。エリミネーションツリーは、例えば、i列目の要素についてj列目の要素が影響すれば、i列目に関するノードを親ノードとし、j列目に関するノードを子ノードとする。
このため、j列目に関するノード[j]の親ノードは、min{i|i>jかつL[i,j]≠0}を満たすi列目に関するノード[i]になる。換言すれば、j列目に関するノード[j]の親ノードは、下三角行列L(P)のj列目において、対角要素以外の非零要素であって、最も対角要素の近くにある要素がある行の行番号と一致する列番号の列に関するノード[i]になる。
生成したエリミネーションツリーは、LL^T分解によってフィルインが発生する箇所を表現するツリーになる。また、ノード[j]とノード[i]との親子関係を、例えば、配列nparent[j]を用いて、nparent[j]=iとして表現する場合がある。ここで、図14を用いて、エリミネーションツリーについて説明する。
図14は、エリミネーションツリー1401を示す説明図である。エリミネーションツリー1401は、1列目〜11列目に関するノード[1]〜ノード[11]を含む。図14の例では、エリミネーションツリー1401において、ノード[1]の親ノードは、ノード[6]である。ノード[1]とノード[6]との親子関係は、LL^T分解の過程で、下三角行列L(P)の1列目の要素が下三角行列L(P)の6列目の要素に影響し、下三角行列L(P)の6列目にフィルインが発生する可能性があることを示している。
また、エリミネーションツリー1401において、ノード[6]の親ノードは、ノード[7]である。ノード[6]とノード[7]との親子関係は、LL^T分解の過程で、下三角行列L(P)の6列目の要素が下三角行列L(P)の7列目の要素に影響し、下三角行列L(P)の7列目にフィルインが発生する可能性があることを示している。このとき、下三角行列L(P)の1列目の要素が間接的に下三角行列L(P)の7列目の要素に影響し、下三角行列L(P)の7列目にフィルインが発生する可能性がある。次に、情報処理装置100は、第4の工程に移行する。
<第4の工程>
次に、第4の工程について説明する。第4の工程は、情報処理装置100が、エリミネーションツリー1401に関するパラメータを設定する工程である。情報処理装置100は、例えば、親ノードを辿り、親ノードが辿れなくなったノードをエリミネーションツリー1401の根ノードとして設定する。また、情報処理装置100は、あるノード[q]の親ノードをノード[p]としたとき、ノード[q]をノード[p]の子ノードとして設定する。
また、情報処理装置100は、エリミネーションツリー1401の根ノードから深さ優先探索した場合に各ノードが探索された順番を、各ノードのポストオーダーとして付与する。図14の例では、情報処理装置100は、エリミネーションツリー1401のノード[2,3,1,6,7,4,5,8,9,10,11]の順に、ポストオーダー「1〜11」のそれぞれを割り振る。また、情報処理装置100は、エリミネーションツリー1401の根ノードから深さ優先探索した場合に、あるノードよりも深く探索することができなければ、当該ノードを葉ノードとして設定する。
また、情報処理装置100は、各葉ノードから親ノードを辿り、エリミネーションツリー1401の根ノードまで遡った経路にある各ノードに、当該葉ノードを対応付けておく。また、情報処理装置100は、各ノードに対応付ける葉ノードが複数ある場合には、複数の葉ノードの中で付与されたポストオーダーの最も小さいものを対応付ける。また、情報処理装置100は、あるノードに対応付けた葉ノードを、あるノードの第1子孫(first descendant)として設定する。次に、情報処理装置100は、第5の工程に移行する。
<第5の工程>
次に、第5の工程について説明する。第5の工程は、情報処理装置100が、スパース行列AをLU分解したときの下三角行列L(A)の各列の非零要素の数を算出する工程である。
情報処理装置100は、例えば、エリミネーションツリー1401と、スパース行列Aの下三角行列C(A)の非零要素のパターンとに基づいて、スパース行列AをLU分解したときの下三角行列L(A)の各列の非零要素の数を算出する。
ここで、対称行列Pの下三角行列C(P)のj列目のベクトルをbjとしたとき、LU分解した下三角行列L(A)の非零要素のパターンは、bjと、ノード[j]の子ノード[k]に関する下三角行列L(A)のk列目のベクトルbkとの和集合になる。このため、下三角行列L(A)のi行目の非零要素は、エリミネーションツリー1401の部分木として表現することができる。例えば、下三角行列L(A)のi行目の非零要素は、ノード[i]を根ノードとする部分木として表現することができる。ここで、図15および図16を用いて、部分木の一例について説明する。
図15は、7行目の非零要素を表現する部分木1501の一例を示す説明図である。ここで、情報処理装置100は、対角要素以外の非零要素がある列番号を特定して、部分木1501を抽出する。図15の例では、情報処理装置100は、スパース行列Aの7行目の非零要素が、対角要素を除いて、1,3列目にあると特定する。
7行目の非零要素を表現する部分木1501であるため、7列目に関するノード[7]が根ノードになる。また、非零要素がある1列目に関するノード[1]が、葉ノードになり、ノード[6]を経由して、根ノードになるノード[7]まで連結されている。また、非零要素がある3列目に関するノード[3]が、葉ノードになり、ノード[7]まで連結されている。
このため、ノード[7]を根ノードとする部分木1501は、エリミネーションツリー1401のうちのノード[1,6,3,7]を含むツリーになる。ノード[1,3]は、葉ノードである。ここで、図15の部分木1501は、スパース行列AをLU分解した場合の下三角行列L(A)の7行目において、1,3,6列目にフィルインが発生する可能性があることを表現している。
図16は、11行目の非零要素を表現する部分木1601の一例を示す説明図である。ここで、情報処理装置100は、対角要素以外の非零要素がある列番号を特定して、部分木1601を抽出する。図16の例では、情報処理装置100は、スパース行列Aの11行目の非零要素が、対角要素を除いて、1,5,8列目にあると特定する。
11行目の非零要素を表現する部分木1601であるため、11列目に関するノード[11]が根ノードになる。また、非零要素がある1列目に関するノード[1]が、葉ノードになり、ノード[6,7,8,9,10]を経由して、根ノードになるノード[11]まで連結されている。また、非零要素がある5列目に関するノード[5]が、葉ノードになり、ノード[8,9,10]を経由して、ノード[11]まで連結されている。また、非零要素がある8列目に関するノード[8]が、ノード[9,10]を経由して、ノード[11]まで連結されている。
このため、ノード[11]を根ノードとする部分木1601は、エリミネーションツリー1401のうちのノード[1,5〜11]を含むツリーになる。ノード[1,5]は、葉ノードである。ここで、図16の部分木1601は、スパース行列AをLU分解した場合の下三角行列L(A)の11行目において、1,5〜11列目にフィルインが発生する可能性があることを表現している。
情報処理装置100は、具体的には、下三角行列C(A)の11行目にある非零要素がある列に関するノードを、付与されたポストオーダーの順に取り出す。ここで、1,5,8列目の要素に関するノード[1,5,8]のそれぞれの第1子孫はノード[1,4,2]が設定されている。情報処理装置100は、ノード[1]を最初に取り出したため、ノード[1]を葉ノードにする。
また、情報処理装置100は、ノード[5]を取り出すと、ノード[5]の第1子孫となるノード[4]に付与されたポストオーダーが、ノード[1]に付与されたポストオーダーより大きいことを検出する。このため、情報処理装置100は、分枝ノードで枝分かれしているとして、ノード[5]も葉ノードにする。また、情報処理装置100は、ノード[8]の第1子孫となるノード[2]に付与されたポストオーダーが、ノード[5]に付与されたポストオーダーより小さいため、ノード[5,8]の間で枝分かれはないとして、ノード[8]を葉ノードにしない。そして、情報処理装置100は、エリミネーションツリー1401から、各葉ノードから根ノードまでを含む部分木1601を抽出する。
このように、情報処理装置100は、スパース行列Aの行の非零要素がある列に関するノードを、付与されたポストオーダーの順に取り出す。次に、情報処理装置100は、一つ前に取り出したノードに付与されたポストオーダーと、現在取り出したノードの第1子孫に付与されたポストオーダーを比較する。ここで、一つ前に取り出したノードと、現在取り出したノードとの2つのノードは、深さ優先探索でポストオーダーを付与したため、現在取り出したノードの第1子孫に付与されたポストオーダーの方が大きければ、共通の祖先で分枝していることになる。そして、情報処理装置100は、比較した結果、現在取り出したノードの第1子孫のほうが大きければ、現在取り出したノードを葉ノードにして、エリミネーションツリー1401から部分木1601を抽出する。
また、情報処理装置100は、行の非零要素がある列に関するノードを、付与されたポストオーダーの順に取り出して、一つ前のノードを記憶しておく代わりに、一つ前の葉ノードを記憶しておき新たな葉ノードが見つかったときに更新するようにしてもよい。
ここで、部分木1501,1601などは、各行の非零要素を表現している。このため、下三角行列L(A)のj番目の列の非零要素の数は、部分木1501,1601などといったエリミネーションツリー1401の部分木のうちの、ノード[j]を含む部分木の数になる。これにより、情報処理装置100は、O(|L(A)|)の演算量で、非零要素の数を算出することができる。ここで、|L(A)|は行列L(A)の非零要素の数を表す。
ここで、下三角行列C(A)および上三角行列R(A)の非零要素のパターンは、対称行列Pの非零要素のパターンの部分集合になる。このため、下三角行列C(A)および上三角行列R(A)の非零要素のパターンと、対称行列Pの非零要素のパターンとには包含関係があり、下三角行列C(A)⊆対称行列P、かつ、上三角行列R(A)の転置行列R(A)^T⊆対称行列Pが成立する。
また、下三角行列C(A)または上三角行列R(A)の転置行列R(A)^Tの非零要素を調べて抽出した部分木は、対称行列Pから抽出した部分木よりもノードの数が少なくなる。また、対称行列Pのエリミネーションツリー1401を使っているので、上述した第5の工程において算出した非零要素の数は、実際の非零要素の数より多くなる可能性がある。すなわち、下三角行列C(A)および上三角行列R(A)の転置行列R(A)^Tの各列の非零要素の数(column count)は、対応する対称行列Pの各列の非零要素の数以下となる。
<第5の工程の他の例>
次に、第5の工程の他の例について説明する。第5の工程の他の例は、情報処理装置100が、特性関数を用いて、スパース行列AをLU分解したときの下三角行列L(A)の各列の非零要素の数を算出する一例である。
ここで、下記式(4)および下記式(5)に示す特性関数を用意する。row subtree iは、i行目のロウサブツリーである。
特性関数は、部分木1601の葉ノードに1を設定しておき、葉ノード以外であれば0を設定しておく。そして、特性関数は、情報処理装置100によって、各ノードに付与されたポストオーダーの順にエリミネーションツリー1401が辿られ、子ノードの特性関数の値が伝播され加算されることにより、更新される。
例えば、特性関数は、部分木1601の葉ノードのときは、1を設定しておく。また、特性関数は、部分木1601の構成ノードであって、部分木1601の葉ノードに行き当たる子ノードがd個あるとき、1−dを加算する。また、特性関数は、部分木1601の根ノードの親ノードなら−1を加算する。
情報処理装置100は、実際には、部分木1601の根ノードに対応する行をポストオーダーの順にスキャンして、一つ前の葉ノードとペアにして、ペアのcommon ancestorのノードに−1を加えることで算出することができる。ancestorは、祖先のノードである。common ancestorは、ペアのノードに共通する祖先のノードであって、ペアのノードから最も近いノードである。
情報処理装置100は、各ノードに対して変数column countを用意し、ポストオーダーの順にノードを辿り、親ノードのcolumn countに子ノードのcolumn countを加算していく。これにより、各部分木1601に含まれれば、葉ノードに設定した「1」がエリミネーションツリー1401の枝を伝播していき、特性関数を実現することができる。子ノードが多いノードでは値が調整され、部分木1601の根ノードの親ノードで値の伝播がキャンセルされる。
<第6の工程>
次に、第6の工程について説明する。第6の工程は、情報処理装置100が、スパース行列AをLU分解したときの上三角行列U(A)の転置行列U(A)^Tの各列の非零要素の数を算出する工程である。情報処理装置100は、例えば、エリミネーションツリー1401と、スパース行列Aの上三角行列R(A)の転置行列R(A)^Tの非零要素のパターンとから、転置行列U(A)^Tの各列の非零要素の数を算出する。
ここで、情報処理装置100は、第5の工程におけるスパース行列Aの下三角行列C(A)を、スパース行列Aの上三角行列R(A)の転置行列R(A)^Tに置き換えれば、同様に、転置行列U(A)^Tの各列の非零要素の数を算出することができる。このため、転置行列U(A)^Tの各列の非零要素の数を算出する説明については省略する。
<第7の工程>
次に、第7の工程について説明する。第7の工程は、情報処理装置100が、スパース行列AをLU分解した結果を格納する領域の大きさを算出する工程である。
情報処理装置100は、例えば、スパース行列AをLU分解したときの下三角行列L(A)の非零要素の総数に基づいて、スパース行列AをLU分解したときの下三角行列L(A)を格納する領域の大きさを算出する。また、情報処理装置100は、スパース行列AをLU分解したときの上三角行列U(A)の転置行列U(A)^Tの非零要素の総数に基づいて、スパース行列AをLU分解したときの上三角行列U(A)の転置行列U(A)^Tを格納する領域の大きさを算出する。
情報処理装置100は、具体的には、下三角行列L(A)の各列のcolumn countをすべて加算することにより下三角行列L(A)の列を圧縮列格納法で格納するときに必要な領域の大きさを算出する。上三角行列U(A)は、単位上三角行列であるため、上三角行列U(A)の対角要素は1である。すなわち、上三角行列U(A)の対角要素は、格納しなくてもよい。ここで、上三角行列U(A)の転置行列U(A)^Tの各列のcolumn countは、上三角行列U(A)の各行の非零要素の数になる。このため、情報処理装置100は、上三角行列U(A)の各行の非零要素の数から1を減算した値をすべて加算することにより、対角要素を除いた非零要素を圧縮行格納法で格納するときに必要な領域の大きさを算出する。
・圧縮列格納法の一例
ここで、図17を用いて、圧縮列格納法の一例について説明する。図17は、圧縮列格納法の一例を示す説明図である。
情報処理装置100は、図17の行列matの各列の非零要素を圧縮して、配列aに順次格納する。次に、情報処理装置100は、配列aに格納された要素が、何行目に位置する要素であるかを示す情報を、配列nrowに同じ順序で格納する。そして、情報処理装置100は、各列の最初の非零要素が、何番目の配列aに格納されるかを示す情報を、配列nfcnzに格納する。
ここで、行列matの次数をn、非零要素の総数をnzとしたとき、1次元配列nfcnzの大きさはn+1になり、配列nfcnzの6つ目の要素にはnz+1となる仮想位置が格納される。配列nfcnzは、配列nrowに対しても、配列aと同様に位置を示す。配列aおよび配列nrowは大きさnzの1次元配列である。
配列aは、例えば、倍精度複素数型である。配列nfcnzや配列nrowは、例えば、整数型である。ここで、圧縮行格納法は、格納する行列を転置して圧縮列格納法で格納する場合と同様であるため、説明を省略する。
(算出処理手順の一例)
次に、図18を用いて、実施例1にかかる算出処理手順の一例について説明する。
図18は、実施例1にかかる算出処理手順の一例を示すフローチャートである。図18において、まず、情報処理装置100は、スパース行列Aから、スパース行列Aの下三角行列C(A)と上三角行列R(A)とを生成する(ステップS1801)。
次に、情報処理装置100は、下三角行列C(A)と上三角行列R(A)の転置行列R(A)^Tとの非零要素のパターンをマージして、スパース行列Aの対称行列Pの下三角行列C(P)の非零要素のパターンを生成する(ステップS1802)。そして、情報処理装置100は、対称行列Pの下三角行列C(P)の非零要素のパターンから、対称行列Pのエリミネーションツリー1401を生成する(ステップS1803)。
次に、情報処理装置100は、エリミネーションツリー1401に関するパラメータを特定する(ステップS1804)。そして、情報処理装置100は、エリミネーションツリー1401と、スパース行列Aの下三角行列C(A)の非零要素のパターンとから、スパース行列AをLU分解した場合の下三角行列L(A)の各列の非零要素の数を近似する(ステップS1805)。
次に、情報処理装置100は、エリミネーションツリー1401と、スパース行列Aの上三角行列R(A)の転置行列R(A)^Tの非零要素のパターンとから、スパース行列AをLU分解した場合の上三角行列U(A)の各行の非零要素の数を近似する(ステップS1806)。そして、情報処理装置100は、下三角行列L(A)の各列の非零要素の数の総和を算出し、下三角行列L(A)の非零要素を格納する領域の大きさを算出する(ステップS1807)。
次に、情報処理装置100は、上三角行列U(A)の各行の非零要素の数の総和を算出し、上三角行列U(A)の非零要素を格納する領域の大きさを算出する(ステップS1808)。そして、情報処理装置100は、算出処理を終了する。これにより、情報処理装置100は、スパース行列AをLU分解した結果を格納する領域の大きさを算出することができる。
(実施例2)
次に、実施例2について説明する。実施例2は、情報処理装置100が、スーパーノードを用いて下三角行列L(A)と上三角行列U(A)とを格納する領域の大きさを算出する一例である。実施例2において、情報処理装置100は、実施例1と同様に、第1の工程〜第6の工程によって、スパース行列AをLU分解したときの下三角行列L(A)の各列の非零要素の数と、上三角行列U(A)の転置行列U(A)^Tの各列の非零要素の数とを算出する。
実施例2では、情報処理装置100は、対称行列Pの非零要素のパターンから、対称行列Pの各行のcolumn countを算出して、対称行列PをLL^T分解するときの複数のノードを纏めたスーパーノードを特定する。スーパーノードは、エリミネーションツリー1401の連続する複数のノードを纏めたものである。スーパーノードは、インデックスが大きい方のノードに対応する列にある非零要素のパターンが、インデックスが小さい方のノードに対応する列にある非零要素のパターンと一致する場合に、複数のノードを纏めたものである。
また、スーパーノードは、インデックスが大きい方のノードに対応する列にある非零要素のパターンが、インデックスが小さい方のノードに対応する列にある非零要素のパターンと類似する場合に、複数のノードを纏めたものであってもよい。スーパーノードとして纏められた複数のノードに対応する複数の列をパネル(panel)とする。
ここで、スーパーノードとして纏められる複数のノードが満たす条件は、複数のノードのうちの親ノードが、スーパーノードとして纏められる複数のノードに対応する複数の列を纏めたパネルの右終端の列になることである。そして、スーパーノードとして纏められる複数のノードが満たす条件は、複数のノードのうちの他ノードが当該親ノードの子孫になることである。さらに、スーパーノードとして纏められる複数のノードが満たす条件は、当該親ノードと当該子孫との間にある他ノードが含まれることである。子ノードをマージしてスーパーノードを生成するとき、親ノードがパネルの右終端の列に対応するようにすれば、対角部分以外での非零要素の数は、親ノードの「column count−1」となる。
情報処理装置100は、対称行列PをLL^T分解するときのスーパーノードとして纏められた複数のノードを、スパース行列AをLU分解するときの下三角行列L(A)についてのスーパーノードとして纏める複数のノードとして採用する。情報処理装置100は、対称行列PをLL^T分解するときのスーパーノードとして纏められた複数のノードを、スパース行列AをLU分解するときの上三角行列U(A)の転置行列U(A)^Tについてのスーパーノードとして纏める複数のノードとして採用する。これにより、情報処理装置100は、下三角行列L(A)と上三角行列U(A)の転置行列U(A)^Tとについて、スーパーノードを格納する領域の大きさを計算できる。
スーパーノードの大きさとしてスーパーノードに含まれるノードの数をbとし、右端のノードをeとすれば、スーパーノードに対応する下三角行列L(A)の複数の列は、纏めて、(b+lcc(e)−1)×bの大きさのパネルに格納される。ここで、lcc(e)は、下三角行列L(A)のノードeのcolumn countである。また、スーパーノードに対応する上三角行列U(A)の複数の列は、対角要素は下三角行列L(A)のpanelに格納されるため、残りの要素を(utcc(e)−1)×bのパネルに格納される。ここで、utcc(e)は、上三角行列U(A)のノードeのcolumn countである。
情報処理装置100は、エリミネーションツリー1401において連続するノードの集合であり、ノードに対応する列にある非零要素のパターンが一致するものを纏めたスーパーノードについて、非零要素がある列または行を圧縮した形式で格納することができる。このため、情報処理装置100は、非零要素がある列または行のデータを格納し、非零要素がない列または行のデータを格納しなくてもよくなり、格納する領域の大きさを低減することができる。
(算出処理手順の一例)
次に、図19を用いて、実施例2にかかる算出処理手順の一例について説明する。
図19は、実施例2にかかる算出処理手順の一例を示すフローチャートである。図19において、まず、情報処理装置100は、スパース行列Aから、スパース行列Aの下三角行列C(A)と上三角行列R(A)とを生成する(ステップS1901)。
次に、情報処理装置100は、下三角行列C(A)と上三角行列R(A)の転置行列R(A)^Tとの非零要素のパターンをマージして、スパース行列Aの対称行列Pの下三角行列C(P)の非零要素のパターンを生成する(ステップS1902)。そして、情報処理装置100は、対称行列Pの下三角行列C(P)の非零要素のパターンから、対称行列Pのエリミネーションツリー1401を生成する(ステップS1903)。
次に、情報処理装置100は、エリミネーションツリー1401に関するパラメータを特定する(ステップS1904)。そして、情報処理装置100は、対称行列Pの下三角行列C(P)から、対称行列PをLL^T分解した場合の下三角行列L(P)の各列の非零要素の数を算出する(ステップS1905)。
次に、情報処理装置100は、エリミネーションツリー1401と、スパース行列Aの下三角行列C(A)の非零要素のパターンとから、スパース行列AをLU分解した場合の下三角行列L(A)の各列の非零要素の数を近似する(ステップS1906)。そして、情報処理装置100は、エリミネーションツリー1401と、スパース行列Aの上三角行列R(A)の転置行列R(A)^Tの非零要素のパターンとから、スパース行列AをLU分解した場合の上三角行列U(A)の各行の非零要素の数を近似する(ステップS1907)。ステップS1906とステップS1907との処理は、より具体的には、後述するcolumn countを算出する処理を行うことにより実現される。
次に、情報処理装置100は、対称行列PをLL^T分解した場合のスーパーノードを特定する(ステップS1908)。そして、情報処理装置100は、下三角行列L(A)と上三角行列U(A)とのスーパーノードに対応する部分を格納するパネル(panel)の大きさを算出する(ステップS1909)。
次に、情報処理装置100は、下三角行列L(A)のスーパーノードに対応するパネルの大きさを加えて、下三角行列L(A)を格納する領域の大きさを算出する(ステップS1910)。そして、情報処理装置100は、上三角行列U(A)のスーパーノードに対応するパネルの大きさを加えて、上三角行列U(A)を格納する領域の大きさを算出する(ステップS1911)。その後、情報処理装置100は、算出処理を終了する。これにより、情報処理装置100は、スパース行列AをLU分解した結果を格納する領域の大きさを算出することができる。
(column countを算出する詳細)
次に、情報処理装置100が、column countを算出する詳細について説明する。column countを算出する処理は、スパース行列AをLU分解した場合の下三角行列L(A)の各列の非零要素の数と、上三角行列U(A)の各行の非零要素の数とを近似する、ステップS1906とステップS1907との処理に対応する。
ここで、ノードの数をnとする。ノード[j]がノード[i]の親ノードであることをj=nparent(i)とする。情報処理装置100は、1次元配列nrow(nz)を用意する。nzは下三角行列の非零要素の総数である。1次元配列nrow(nz)は、各列の非零要素の行番号が格納される配列である。また、情報処理装置100は、1次元配列nparent(n)を用意する。1次元配列nparent(n)は、エリミネーションツリー1401を表現する配列である。また、情報処理装置100は、1次元配列nposto(n)を用意する。1次元配列nposto(n)は、ポストオーダーが格納される配列である。
また、情報処理装置100は、1次元配列npostoinv(n)を用意する。1次元配列npostoinv(n)は、ポストオーダー順にノードが格納される配列である。また、情報処理装置100は、1次元配列nfirstdescendant(n)を用意する。1次元配列nfirstdescendant(n)は、各ノードのfirst descendantが格納される配列である。
また、情報処理装置100は、1次元配列nprevp(n)を用意する。1次元配列nprevp(n)は、ロウサブツリーの一つ前に検出された葉ノードが格納される配列である。1次元配列nprevp(n)の初期値は0である。また、情報処理装置100は、1次元配列nrowsubflag(n)を用意する。1次元配列nrowsubflag(n)は、ロウサブツリーが葉ノードを持つか否かを示す情報が格納される配列である。1次元配列nrowsubflag(n)の初期値は0である。
また、情報処理装置100は、1次元配列nskeletonmat(n)を用意する。1次元配列nskeletonmat(i)は、ノード[i]がロウサブツリーの葉ノードであれば1が加算される。1次元配列nskeletonmat(i)の初期値は0である。また、情報処理装置100は、1次元配列ndelta(n)を用意する。1次元配列ndelta(n)は、葉ノードのペアにとってのcommon ancestor icaに対応する要素が格納され、−1を加算される。1次元配列ndelta(n)の初期値は0である。
また、情報処理装置100は、1次元配列nccount(n)を用意する。1次元配列nccount(n)は、各ノード対する列の非零要素数column countが格納される配列である。また、情報処理装置100は、1次元配列nancestor(n)を用意する。1次元配列nancestor(n)は、ポストオーダー順に処理した親ノードを格納する。1次元配列nancestor(n)の初期値はiである。
<column countの計数処理手順>
次に、図20〜図22を用いて、column countの計数処理手順について説明する。以下の説明では、「a==b」はaとbが一致することを示す。「a.ne.b」はaとbが一致しないことを示す。「a=b」はaにbを代入することを示す。「a:b」はa〜bを示す。
図20〜図22は、column countの計数処理手順の一例を示すフローチャートである。図20において、情報処理装置100は、配列を初期化する(ステップS2001)。情報処理装置100は、例えば、1次元配列nprevp(1:n)=0、1次元配列nskeletonmat(1:n)=0、1次元配列ndelta(1:n)=0、1次元配列nrowsubflag(1:n)=0を設定する。また、情報処理装置100は、例えば、1次元配列nancestor(k)=k、k=1,・・・,n、i=1を設定する。
次に、情報処理装置100は、nodep=nposto(i)として、ポストオーダーが「i」であるノードのインデックスを取得する(ステップS2002)。そして、情報処理装置100は、j=nfcnz(nodep)とする(ステップS2003)。
次に、情報処理装置100は、nodeu=nrow(j)とする(ステップS2004)。そして、情報処理装置100は、nodeu>nodepであるか否かを判定する(ステップS2005)。ここで、nodeu>nodepではない場合(ステップS2005:No)、情報処理装置100は、ステップS2106の処理に移行する。
一方で、nodeu>nodepである場合(ステップS2005:Yes)、情報処理装置100は、nrowsubflag(nodeu)==0であるか否かを判定する(ステップS2006)。ここで、nrowsubflag(nodeu)==0ではない場合(ステップS2006:No)、情報処理装置100は、ステップS2008の処理に移行する。
一方で、nrowsubflag(nodeu)==0である場合(ステップS2006:Yes)、情報処理装置100は、nrowsubflag(nodeu)=1とする(ステップS2007)。次に、情報処理装置100は、nprevnbrnodeu=nprevp(nodeu)とする(ステップS2008)。
そして、情報処理装置100は、nprevnbrnodeu≠0であるか否かを判定する(ステップS2009)。ここで、nprevnbrnodeu≠0ではない場合(ステップS2009:No)、情報処理装置100は、ステップS2101の処理に移行する。
一方で、nprevnbrnodeu≠0である場合(ステップS2009:Yes)、情報処理装置100は、nprevnbrnodeu=npostoinv(nprevnbrnodeu)として、nprevnbrnodeuのポストオーダーを取得する(ステップS2010)。次に、情報処理装置100は、図21のステップS2101の処理に移行する。
図21において、情報処理装置100は、葉ノードであるか否かをチェックするために、npostoinv(nfirstdescendant(nodep))>nprevnbrnodeuであるか否かを判定する(ステップS2101)。ここで、npostoinv(nfirstdescendant(nodep))>nprevnbrnodeuではない場合(ステップS2101:No)、情報処理装置100は、ステップS2106の処理に移行する。
一方で、npostoinv(nfirstdescendant(nodep))>nprevnbrnodeuである場合(ステップS2101:Yes)、情報処理装置100は、ステップS2102の処理に移行する。ステップS2102において、情報処理装置100は、nskeletonmat(nodep)=nskeletonmat(nodep)+1とし、nodepp=nprevp(nodeu)とする(ステップS2102)。
次に、情報処理装置100は、nodepp≠0であるか否かを判定する(ステップS2103)。ここで、nodepp≠0ではない場合(ステップS2103:No)、情報処理装置100は、ステップS2105の処理に移行する。
一方で、nodepp≠0である場合(ステップS2103:Yes)、情報処理装置100は、common ancestorを探索し、nodeq=nodeppとし、nodeq=nancestor(nodeq)とする。そして、情報処理装置100は、条件(nodeq.ne.nancestor(nodeq))を満たすまでnodeq=nancestor(nodeq)を繰り返し、ndelta(nodeq)=ndelta(nodeq)−1とする(ステップS2104)。
次に、情報処理装置100は、nprevp(nodeu)=nodepとする(ステップS2105)。そして、情報処理装置100は、j=j+1とする(ステップS2106)。次に、情報処理装置100は、j>nfcnz(node+1)−1であるか否かを判定する(ステップS2107)。ここで、j>nfcnz(node+1)−1ではない場合(ステップS2107:No)、情報処理装置100は、ステップS2004の処理に移行する。
一方で、j>nfcnz(node+1)−1である場合(ステップS2107:Yes)、情報処理装置100は、nparent(nodep)≠0であるか否かを判定する(ステップS2108)。ここで、nparent(nodep)≠0ではない場合(ステップS2108:No)、情報処理装置100は、ステップS2110の処理に移行する。
一方で、nparent(nodep)≠0である場合(ステップS2108:Yes)、情報処理装置100は、nancestor(nodep)=nparent(nodep)とする(ステップS2109)。次に、情報処理装置100は、i=i+1とする(ステップS2110)。そして、情報処理装置100は、i>Nであるか否かを判定する(ステップS2111)。ここで、i>Nではない場合(ステップS2111:No)、情報処理装置100は、ステップS2002の処理に移行する。一方で、i>Nである場合(ステップS2111:Yes)、情報処理装置100は、図22のステップS2201の処理に移行する。
図22において、情報処理装置100は、nccount(i)=nskeletonmat(i)+ndelta(i)とし、nrowsubflag(i)==0であればnccount(i)=nccount(i)+1とする処理をi=1〜nまで繰り返す(ステップS2201)。
次に、情報処理装置100は、j=nposto(i)とし、nparent(j).ne.0であればnccount(nparent(i))=nccount(nparent(j))+(nccount(j)−1)とする処理をi=1〜nまで繰り返す(ステップS2202)。
そして、情報処理装置100は、nccount(i)を返値としてreturnし(ステップS2203)、計数処理を終了する。これにより、情報処理装置100は、分枝するノードがロウサブツリーにある場合には、複数の子ノードからの伝播をキャンセルして、1つの子ノードからの特性関数の値を伝播させることができる。そして、情報処理装置100は、column countを計数することができる。
ここで、情報処理装置100が、2つのノードのcommon ancestorを探索することについて説明する。情報処理装置100は、例えば、各ノードのancestorを示す情報をnancestorに設定する。情報処理装置100は、各ノード自体をancestorとして初期化する。情報処理装置100は、ポストオーダー順にノードiを取り出して、ノードiのancestor(i)=nparent(i)を設定する。情報処理装置100は、ノードiに関する列にある非零要素の行番号rに関して、ノードiがr番目の行に対応するロウサブツリーの葉ノードか否かを判定する。
情報処理装置100は、ノードrのひとつ前の葉ノードuをnprevp(r)に記憶する。情報処理装置100は、ノードiが葉ノードであれば、ノードuのancestorを辿ったときにancestorがノードiでない最後のノードを、common ancestorのノードicaとする。
以上説明したように、情報処理装置100によれば、スパース行列Aを対称化した対称行列Pのエリミネーションツリー1401から、スパース行列AをLU分解した場合の下三角行列L(A)や上三角行列U(A)の非零要素の数を算出することができる。これにより、情報処理装置100は、スパース行列AをLU分解した結果を格納する領域の大きさを低減することができ、スパース行列Aが大きくなってもLU分解した結果を格納する領域を確保しやすくすることができる。また、情報処理装置100は、LU分解において行わなくてもよい演算を省略することができ、効率よくスパース行列AをLU分解することができる。
また、情報処理装置100によれば、スパース行列Aから対称行列Pを生成しなくても、スパース行列Aの互いに対称位置にある要素から、エリミネーションツリー1401を生成することができる。これにより、情報処理装置100は、エリミネーションツリー1401の生成にかかる演算を簡略化することができ、効率よくエリミネーションツリー1401を生成することができる。
また、情報処理装置100によれば、スーパーノードを用いてスパース行列AをLU分解した結果を格納する領域を算出することができる。これにより、情報処理装置100は、スパース行列AをLU分解した結果を格納する領域の大きさを低減することができる。
なお、本実施の形態で説明した情報処理方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本情報処理プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本情報処理プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)複素非対称スパース行列から、前記複素非対称スパース行列の対称行列のエリミネーションツリーを生成し、
生成した前記エリミネーションツリーに基づいて、前記複素非対称スパース行列の下三角行列の各行のロウサブツリーと、前記複素非対称スパース行列の上三角行列の転置行列の各行のロウサブツリーとを抽出し、
抽出した前記下三角行列の各行のロウサブツリーのうち、前記エリミネーションツリーの各ノードを含むロウサブツリーの数と、抽出した前記上三角行列の転置行列の各行のロウサブツリーのうち、前記エリミネーションツリーの各ノードを含むロウサブツリーの数とに基づいて、前記複素非対称スパース行列のLU分解結果を格納するメモリ領域量を決定する、
制御部を有することを特徴とする情報処理装置。
(付記2)前記制御部は、前記複素非対称スパース行列の対称位置にある要素の組み合わせから、前記対称行列のエリミネーションツリーを生成する、ことを特徴とする付記1に記載の情報処理装置。
(付記3)前記制御部は、前記対称行列のLU分解結果において非零要素のパターンが共通する複数の列または行をまとめたスーパーノードに基づいて、前記複素非対称スパース行列のLU分解結果を格納するメモリ領域量を決定する、ことを特徴とする付記1または2に記載の情報処理装置。
(付記4)コンピュータが、
複素非対称スパース行列から、前記複素非対称スパース行列の対称行列のエリミネーションツリーを生成し、
生成した前記エリミネーションツリーに基づいて、前記複素非対称スパース行列の下三角行列の各行のロウサブツリーと、前記複素非対称スパース行列の上三角行列の転置行列の各行のロウサブツリーとを抽出し、
抽出した前記下三角行列の各行のロウサブツリーのうち、前記エリミネーションツリーの各ノードを含むロウサブツリーの数と、抽出した前記上三角行列の転置行列の各行のロウサブツリーのうち、前記エリミネーションツリーの各ノードを含むロウサブツリーの数とに基づいて、前記複素非対称スパース行列のLU分解結果を格納するメモリ領域量を決定する、
処理を実行することを特徴とする情報処理方法。
(付記5)コンピュータに、
複素非対称スパース行列から、前記複素非対称スパース行列の対称行列のエリミネーションツリーを生成し、
生成した前記エリミネーションツリーに基づいて、前記複素非対称スパース行列の下三角行列の各行のロウサブツリーと、前記複素非対称スパース行列の上三角行列の転置行列の各行のロウサブツリーとを抽出し、
抽出した前記下三角行列の各行のロウサブツリーのうち、前記エリミネーションツリーの各ノードを含むロウサブツリーの数と、抽出した前記上三角行列の転置行列の各行のロウサブツリーのうち、前記エリミネーションツリーの各ノードを含むロウサブツリーの数とに基づいて、前記複素非対称スパース行列のLU分解結果を格納するメモリ領域量を決定する、
処理を実行させることを特徴とする情報処理プログラム。