Base<Field> ProductLanczosDecomp ( const DistSparseMatrix<Field>& A, DistMultiVec<Field>& V, AbstractDistMatrix<Base<Field>>& T, DistMultiVec<Field>& v, Int basisSize ) { EL_DEBUG_CSE const Int m = A.Height(); const Int n = A.Width(); mpi::Comm comm = A.Comm(); DistMultiVec<Field> S(comm); // Cache the adjoint // ----------------- DistSparseMatrix<Field> AAdj(comm); Adjoint( A, AAdj ); if( m >= n ) { auto applyA = [&]( const DistMultiVec<Field>& X, DistMultiVec<Field>& Y ) { Zeros( S, m, X.Width() ); Multiply( NORMAL, Field(1), A, X, Field(0), S ); Zeros( Y, n, X.Width() ); Multiply( NORMAL, Field(1), AAdj, S, Field(0), Y ); }; return LanczosDecomp( n, applyA, V, T, v, basisSize ); } else { auto applyA = [&]( const DistMultiVec<Field>& X, DistMultiVec<Field>& Y ) { Zeros( S, n, X.Width() ); Multiply( NORMAL, Field(1), AAdj, X, Field(0), S ); Zeros( Y, m, X.Width() ); Multiply( NORMAL, Field(1), A, S, Field(0), Y ); }; return LanczosDecomp( m, applyA, V, T, v, basisSize ); } }
Base<F> LanczosDecomp ( const DistSparseMatrix<F>& A, DistMultiVec<F>& V, ElementalMatrix<Base<F>>& T, DistMultiVec<F>& v, Int basisSize ) { DEBUG_CSE const Int n = A.Height(); if( n != A.Width() ) LogicError("A was not square"); auto applyA = [&]( const DistMultiVec<F>& X, DistMultiVec<F>& Y ) { Zeros( Y, n, X.Width() ); Multiply( NORMAL, F(1), A, X, F(0), Y ); }; return LanczosDecomp( n, applyA, V, T, v, basisSize ); }
Base<Field> LanczosDecomp ( const SparseMatrix<Field>& A, Matrix<Field>& V, Matrix<Base<Field>>& T, Matrix<Field>& v, Int basisSize ) { EL_DEBUG_CSE const Int n = A.Height(); if( n != A.Width() ) LogicError("A was not square"); auto applyA = [&]( const Matrix<Field>& X, Matrix<Field>& Y ) { Zeros( Y, n, X.Width() ); Multiply( NORMAL, Field(1), A, X, Field(0), Y ); }; return LanczosDecomp( n, applyA, V, T, v, basisSize ); }