void ExplicitUnitary ( ElementalMatrix<F>& APre, bool thinQR, const QRCtrl<Base<F>>& ctrl ) { DEBUG_CSE DistMatrixReadWriteProxy<F,F,MC,MR> AProx( APre ); auto& A = AProx.Get(); const Grid& g = A.Grid(); DistMatrix<F,MD,STAR> householderScalars(g); DistMatrix<Base<F>,MD,STAR> signature(g); if( ctrl.colPiv ) { DistPermutation Omega(g); QR( A, householderScalars, signature, Omega, ctrl ); } else QR( A, householderScalars, signature ); if( thinQR ) { A.Resize( A.Height(), householderScalars.Height() ); ExpandPackedReflectors ( LOWER, VERTICAL, CONJUGATED, 0, A, householderScalars ); DiagonalScale( RIGHT, NORMAL, signature, A ); } else { auto ACopy = A; // TODO: Use an extension of ExpandPackedReflectors to make this faster Identity( A, A.Height(), A.Height() ); qr::ApplyQ( LEFT, NORMAL, ACopy, householderScalars, signature, A ); } }
inline void Explicit( DistMatrix<F>& A, DistMatrix<F>& R, bool colPiv=false ) { #ifndef RELEASE CallStackEntry cse("qr::Explicit"); #endif const Grid& g = A.Grid(); DistMatrix<F,MD,STAR> t(g); if( colPiv ) { DistMatrix<Int,VR,STAR> p(g); QR( A, t, p ); } else { QR( A, t ); } DistMatrix<F> AT(g), AB(g); PartitionDown ( A, AT, AB, Min(A.Height(),A.Width()) ); R = AT; MakeTriangular( UPPER, R ); ExpandPackedReflectors( LOWER, VERTICAL, UNCONJUGATED, 0, A, t ); }
void ExplicitUnitary ( Matrix<F>& A, bool thinQR, const QRCtrl<Base<F>>& ctrl ) { DEBUG_CSE Matrix<F> householderScalars; Matrix<Base<F>> signature; if( ctrl.colPiv ) { Permutation Omega; QR( A, householderScalars, signature, Omega, ctrl ); } else QR( A, householderScalars, signature ); if( thinQR ) { A.Resize( A.Height(), householderScalars.Height() ); ExpandPackedReflectors ( LOWER, VERTICAL, CONJUGATED, 0, A, householderScalars ); DiagonalScale( RIGHT, NORMAL, signature, A ); } else { auto ACopy = A; // TODO: Use an extension of ExpandPackedReflectors to make this faster Identity( A, A.Height(), A.Height() ); qr::ApplyQ( LEFT, NORMAL, ACopy, householderScalars, signature, A ); } }
void ExplicitUnitary ( Matrix<F>& A, bool thinQR, const QRCtrl<Base<F>>& ctrl ) { DEBUG_ONLY(CSE cse("qr::ExplicitUnitary")) Matrix<F> t; Matrix<Base<F>> d; if( ctrl.colPiv ) { Permutation Omega; QR( A, t, d, Omega, ctrl ); } else QR( A, t, d ); if( thinQR ) { A.Resize( A.Height(), t.Height() ); ExpandPackedReflectors( LOWER, VERTICAL, CONJUGATED, 0, A, t ); DiagonalScale( RIGHT, NORMAL, d, A ); } else { auto ACopy = A; // TODO: Use an extension of ExpandPackedReflectors to make this faster Identity( A, A.Height(), A.Height() ); qr::ApplyQ( LEFT, NORMAL, ACopy, t, d, A ); } }
inline void Explicit( Matrix<F>& A, Matrix<F>& R, bool colPiv=false ) { #ifndef RELEASE CallStackEntry cse("qr::Explicit"); #endif Matrix<F> t; if( colPiv ) { Matrix<Int> p; QR( A, t, p ); } else { QR( A, t ); } Matrix<F> AT, AB; PartitionDown ( A, AT, AB, Min(A.Height(),A.Width()) ); R = AT; MakeTriangular( UPPER, R ); ExpandPackedReflectors( LOWER, VERTICAL, UNCONJUGATED, 0, A, t ); }
inline void ExpandPackedReflectors ( UpperOrLower uplo, VerticalOrHorizontal dir, Conjugation conjugation, int offset, DistMatrix<Complex<R> >& H, const DistMatrix<Complex<R>,STAR,STAR>& t ) { #ifndef RELEASE CallStackEntry entry("ExpandPackedReflectors"); #endif DistMatrix<Complex<R>,MD,STAR> tDiag(H.Grid()); tDiag.AlignWithDiagonal( H, offset ); tDiag = t; ExpandPackedReflectors( uplo, dir, conjugation, offset, H, tDiag ); }
inline void Explicit( Matrix<F>& A, bool colPiv=false ) { DEBUG_ONLY(CallStackEntry cse("qr::Explicit")) Matrix<F> t; if( colPiv ) { Matrix<Int> p; QR( A, t, p ); } else { QR( A, t ); } ExpandPackedReflectors( LOWER, VERTICAL, CONJUGATED, 0, A, t ); }
void ExplicitUnitary( Matrix<F>& A, const QRCtrl<Base<F>>& ctrl ) { DEBUG_ONLY(CallStackEntry cse("qr::ExplicitUnitary")) Matrix<F> t; Matrix<Base<F>> d; if( ctrl.colPiv ) { Matrix<Int> p; QR( A, t, d, p, ctrl ); } else QR( A, t, d ); A.Resize( A.Height(), t.Height() ); ExpandPackedReflectors( LOWER, VERTICAL, CONJUGATED, 0, A, t ); DiagonalScale( RIGHT, NORMAL, d, A ); }
inline void Explicit( Matrix<F>& A, bool colPiv=false ) { #ifndef RELEASE CallStackEntry cse("qr::Explicit"); #endif Matrix<F> t; if( colPiv ) { Matrix<Int> p; QR( A, t, p ); } else { QR( A, t ); } ExpandPackedReflectors( LOWER, VERTICAL, UNCONJUGATED, 0, A, t ); }
void Explicit ( ElementalMatrix<F>& APre, ElementalMatrix<F>& R, bool thinQR, const QRCtrl<Base<F>>& ctrl ) { DEBUG_ONLY(CSE cse("qr::Explicit")) DistMatrixReadWriteProxy<F,F,MC,MR> AProx( APre ); auto& A = AProx.Get(); const Grid& g = A.Grid(); DistMatrix<F,MD,STAR> t(g); DistMatrix<Base<F>,MD,STAR> d(g); if( ctrl.colPiv ) { DistPermutation Omega(g); QR( A, t, d, Omega, ctrl ); } else QR( A, t, d ); const Int m = A.Height(); const Int n = A.Width(); const Int numIts = t.Height(); auto AT = A( IR(0,numIts), IR(0,n) ); Copy( AT, R ); MakeTrapezoidal( UPPER, R ); if( thinQR ) { A.Resize( m, numIts ); ExpandPackedReflectors( LOWER, VERTICAL, CONJUGATED, 0, A, t ); DiagonalScale( RIGHT, NORMAL, d, A ); } else { auto ACopy = A; // TODO: Use an extension of ExpandPackedReflectors to make this faster Identity( A, A.Height(), A.Height() ); qr::ApplyQ( LEFT, NORMAL, ACopy, t, d, A ); } }
void Explicit ( ElementalMatrix<F>& APre, ElementalMatrix<F>& R, ElementalMatrix<Int>& OmegaFull, bool thinQR, const QRCtrl<Base<F>>& ctrl ) { DEBUG_CSE DistMatrixReadWriteProxy<F,F,MC,MR> AProx( APre ); auto& A = AProx.Get(); const Grid& g = A.Grid(); DistMatrix<F,MD,STAR> householderScalars(g); DistMatrix<Base<F>,MD,STAR> signature(g); DistPermutation Omega(g); QR( A, householderScalars, signature, Omega, ctrl ); const Int m = A.Height(); const Int n = A.Width(); const Int numIts = householderScalars.Height(); auto AT = A( IR(0,numIts), IR(0,n) ); Copy( AT, R ); MakeTrapezoidal( UPPER, R ); if( thinQR ) { A.Resize( m, numIts ); ExpandPackedReflectors ( LOWER, VERTICAL, CONJUGATED, 0, A, householderScalars ); DiagonalScale( RIGHT, NORMAL, signature, A ); } else { auto ACopy = A; // TODO: Use an extension of ExpandPackedReflectors to make this faster Identity( A, A.Height(), A.Height() ); qr::ApplyQ( LEFT, NORMAL, ACopy, householderScalars, signature, A ); } Omega.ExplicitMatrix( OmegaFull ); }
inline void Explicit( DistMatrix<F>& A, bool colPiv=false ) { #ifndef RELEASE CallStackEntry cse("qr::Explicit"); #endif const Grid& g = A.Grid(); DistMatrix<F,MD,STAR> t(g); if( colPiv ) { DistMatrix<Int,VR,STAR> p(g); QR( A, t, p ); } else { QR( A, t ); } ExpandPackedReflectors( LOWER, VERTICAL, UNCONJUGATED, 0, A, t ); }
void Explicit ( Matrix<F>& A, Matrix<F>& R, bool thinQR, const QRCtrl<Base<F>>& ctrl ) { DEBUG_CSE Matrix<F> householderScalars; Matrix<Base<F>> signature; if( ctrl.colPiv ) { Permutation Omega; QR( A, householderScalars, signature, Omega, ctrl ); } else QR( A, householderScalars, signature ); const Int m = A.Height(); const Int n = A.Width(); const Int numIts = householderScalars.Height(); auto AT = A( IR(0,numIts), IR(0,n) ); R = AT; MakeTrapezoidal( UPPER, R ); if( thinQR ) { A.Resize( m, numIts ); ExpandPackedReflectors ( LOWER, VERTICAL, CONJUGATED, 0, A, householderScalars ); DiagonalScale( RIGHT, NORMAL, signature, A ); } else { auto ACopy = A; // TODO: Use an extension of ExpandPackedReflectors to make this faster Identity( A, A.Height(), A.Height() ); qr::ApplyQ( LEFT, NORMAL, ACopy, householderScalars, signature, A ); } }
inline ValueInt<BASE(F)> QDWHDivide ( UpperOrLower uplo, DistMatrix<F>& A, DistMatrix<F>& G, bool returnQ=false ) { DEBUG_ONLY(CallStackEntry cse("herm_eig::QDWHDivide")) // G := sgn(G) // G := 1/2 ( G + I ) herm_polar::QDWH( uplo, G ); UpdateDiagonal( G, F(1) ); Scale( F(1)/F(2), G ); // Compute the pivoted QR decomposition of the spectral projection const Grid& g = A.Grid(); DistMatrix<F,MD,STAR> t(g); DistMatrix<Int,VR,STAR> p(g); elem::QR( G, t, p ); // A := Q^H A Q MakeHermitian( uplo, A ); const Base<F> oneA = OneNorm( A ); if( returnQ ) { ExpandPackedReflectors( LOWER, VERTICAL, CONJUGATED, 0, G, t ); DistMatrix<F> B(g); Gemm( ADJOINT, NORMAL, F(1), G, A, B ); Gemm( NORMAL, NORMAL, F(1), B, G, A ); } else { qr::ApplyQ( LEFT, ADJOINT, G, t, A ); qr::ApplyQ( RIGHT, NORMAL, G, t, A ); } // Return || E21 ||1 / || A ||1 and the chosen rank auto part = ComputePartition( A ); part.value /= oneA; return part; }
void Explicit ( Matrix<F>& A, Matrix<F>& R, Matrix<Int>& OmegaFull, bool thinQR, const QRCtrl<Base<F>>& ctrl ) { DEBUG_ONLY(CSE cse("qr::Explicit")) Matrix<F> t; Matrix<Base<F>> d; Permutation Omega; QR( A, t, d, Omega, ctrl ); const Int m = A.Height(); const Int n = A.Width(); const Int numIts = t.Height(); auto AT = A( IR(0,numIts), IR(0,n) ); R = AT; MakeTrapezoidal( UPPER, R ); if( thinQR ) { A.Resize( m, numIts ); ExpandPackedReflectors( LOWER, VERTICAL, CONJUGATED, 0, A, t ); DiagonalScale( RIGHT, NORMAL, d, A ); } else { auto ACopy = A; // TODO: Use an extension of ExpandPackedReflectors to make this faster Identity( A, A.Height(), A.Height() ); qr::ApplyQ( LEFT, NORMAL, ACopy, t, d, A ); } Omega.ExplicitMatrix( OmegaFull ); }