29 #ifndef __TSQR_Tsqr_TwoLevelDistTsqr_hpp 30 #define __TSQR_Tsqr_TwoLevelDistTsqr_hpp 32 #include <Tsqr_DistTsqr.hpp> 33 #include <Tsqr_MpiCommFactory.hpp> 47 template<
class LocalOrdinal,
49 class DistTsqrType = DistTsqr< LocalOrdinal, Scalar > >
52 typedef Scalar scalar_type;
53 typedef LocalOrdinal ordinal_type;
54 typedef DistTsqrType dist_tsqr_type;
55 typedef typename dist_tsqr_type::rank_type rank_type;
57 typedef typename dist_tsqr_type::FactorOutput DistTsqrFactorOutput;
58 typedef std::pair< DistTsqrFactorOutput, DistTsqrFactorOutput > FactorOutput;
63 worldMess_ (
TSQR::MPI::makeMpiCommWorld()),
64 nodeDistTsqr_ (
TSQR::MPI::makeMpiCommNode()),
65 networkDistTsqr_ (
TSQR::MPI::makeMpiCommNetwork())
76 return nodeDistTsqr_->QR_produces_R_factor_with_nonnegative_diagonal() &&
77 networkDistTsqr_->QR_produces_R_factor_with_nonnegative_diagonal();
98 factor (MatView< LocalOrdinal, Scalar > R_mine)
100 DistTsqrFactorOutput nodeOutput = nodeDistTsqr_->factor (R_mine);
101 DistTsqrFactorOutput networkOutput = networkDistTsqr_->factor (R_mine);
102 return std::make_pair (nodeOutput, networkOutput);
106 apply (
const ApplyType& applyType,
107 const LocalOrdinal ncols_C,
108 const LocalOrdinal ncols_Q,
110 const LocalOrdinal ldc_mine,
111 const FactorOutput& factorOutput)
113 if (applyType.transposed())
115 nodeDistTsqr_->apply (applyType, ncols_C, ncols_Q,
116 C_mine, ldc_mine, factorOutput.first);
117 networkDistTsqr_->apply (applyType, ncols_C, ncols_Q,
118 C_mine, ldc_mine, factorOutput.second);
122 networkDistTsqr_->apply (applyType, ncols_C, ncols_Q,
123 C_mine, ldc_mine, factorOutput.second);
124 nodeDistTsqr_->apply (applyType, ncols_C, ncols_Q,
125 C_mine, ldc_mine, factorOutput.first);
130 explicit_Q (
const LocalOrdinal ncols_Q,
132 const LocalOrdinal ldq_mine,
133 const FactorOutput& factorOutput)
135 typedef MatView< LocalOrdinal, Scalar > matview_type;
136 matview_type Q_view (ncols_Q, ncols_Q, Q_mine, ldq_mine, Scalar(0));
137 Q_view.fill (Scalar(0));
139 const rank_type myRank = worldMess_->rank();
142 if (networkMess_->rank() != 0)
144 std::ostringstream os;
145 os <<
"My rank with respect to MPI_COMM_WORLD is 0, but my rank " 146 "with respect to MPI_COMM_NETWORK is nonzero (= " 147 << networkMess_->rank() <<
"). We could deal with this by " 148 "swapping data between those two ranks, but we haven\'t " 149 "implemented that fix yet.";
150 throw std::logic_error (os.str());
152 for (LocalOrdinal j = 0; j < ncols_Q; ++j)
153 Q_view(j, j) = Scalar (1);
155 apply (ApplyType::NoTranspose, ncols_Q, ncols_Q,
156 Q_mine, ldq_mine, factorOutput);
161 dist_tsqr_ptr nodeDistTsqr_, networkDistTsqr_;
166 #endif // __TSQR_Tsqr_TwoLevelDistTsqr_hpp bool QR_produces_R_factor_with_nonnegative_diagonal() const
~TwoLevelDistTsqr()
Destructor.
FactorOutput factor(MatView< LocalOrdinal, Scalar > R_mine)
Compute QR factorization of R factors, one per MPI process.
Interprocess part of TSQR.
TwoLevelDistTsqr()
Constructor.