iterative-solver 0.0
 
Loading...
Searching...
No Matches
XSpace.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_XSPACE_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_XSPACE_H
3#include <molpro/linalg/itsolv/helper.h>
4#include <molpro/linalg/itsolv/subspace/util.h>
5#include <molpro/linalg/itsolv/subspace/DSpace.h>
6#include <molpro/linalg/itsolv/subspace/Dimensions.h>
7#include <molpro/linalg/itsolv/subspace/IXSpace.h>
8#include <molpro/linalg/itsolv/subspace/PSpace.h>
9#include <molpro/linalg/itsolv/subspace/QSpace.h>
10
11#include <cassert>
12#include <memory>
13
15namespace xspace {
17template <typename T>
18struct NewData {
19 NewData(size_t nQnew, size_t nX, size_t nRHS) {
20 for (auto d : {EqnData::H, EqnData::S}) {
21 qq[d].resize({nQnew, nQnew});
22 qx[d].resize({nQnew, nX});
23 xq[d].resize({nX, nQnew});
24 }
25 qq[EqnData::rhs].resize({nQnew, nRHS});
26 }
27
31};
32
34template <class R, class Q, class P>
35auto update_qspace_data(const CVecRef<R>& params, const CVecRef<R>& actions, const CVecRef<P>& pparams,
37 const CVecRef<Q>& dactions, const CVecRef<Q>& rhs, const Dimensions& dims,
38 ArrayHandlers<R, Q, P>& handlers, Logger& logger, bool hermitian = false,
39 bool action_dot_action = false) {
40 auto nQnew = params.size();
42 auto& qq = data.qq;
43 auto& qx = data.qx;
44 auto& xq = data.xq;
45 qq[EqnData::S] = util::overlap(params, handlers.rr());
46 qx[EqnData::S].slice({0, dims.oP()}, {nQnew, dims.oP() + dims.nP}) = util::overlap(params, pparams, handlers.rp());
47 qx[EqnData::S].slice({0, dims.oQ()}, {nQnew, dims.oQ() + dims.nQ}) = util::overlap(params, qparams, handlers.rq());
48 qx[EqnData::S].slice({0, dims.oD()}, {nQnew, dims.oD() + dims.nD}) = util::overlap(params, dparams, handlers.rq());
49 qq[EqnData::H] =
50 action_dot_action ? util::overlap(actions, handlers.rr()) : util::overlap(params, actions, handlers.rr());
51 qx[EqnData::H].slice({0, dims.oQ()}, {nQnew, dims.oQ() + dims.nQ}) =
52 util::overlap(action_dot_action ? actions : params, qactions, handlers.rq());
53 qx[EqnData::H].slice({0, dims.oD()}, {nQnew, dims.oD() + dims.nD}) =
54 util::overlap(action_dot_action ? actions : params, dactions, handlers.rq());
55 if (hermitian) {
56 xq[EqnData::H].slice({dims.oP(), 0}, {dims.oP() + dims.nP, nQnew}) = util::overlap(pparams, actions, handlers.rp());
57 // xq[EqnData::H].slice({dims.oQ(), 0}, {dims.oQ() + dims.nQ, nQnew}) = util::overlap(action_dot_action ? qactions :
58 // qparams, actions, handlers.qr());
59 conjugate_transpose_copy(xq[EqnData::H].slice({dims.oQ(), 0}, {dims.oQ() + dims.nQ, nQnew}),
60 qx[EqnData::H].slice({0, dims.oQ()}, {nQnew, dims.oQ() + dims.nQ}));
61 conjugate_transpose_copy(xq[EqnData::H].slice({dims.oD(), 0}, {dims.oD() + dims.nD, nQnew}),
62 qx[EqnData::H].slice({0, dims.oD()}, {nQnew, dims.oD() + dims.nD}));
63 conjugate_transpose_copy(qx[EqnData::H].slice({0, dims.oP()}, {nQnew, dims.oP() + dims.nP}),
64 xq[EqnData::H].slice({dims.oP(), 0}, {dims.oP() + dims.nP, nQnew}));
65 } else {
66 xq[EqnData::H].slice({dims.oQ(), 0}, {dims.oQ() + dims.nQ, nQnew}) = util::overlap(qparams, actions, handlers.rq());
67 xq[EqnData::H].slice({dims.oD(), 0}, {dims.oD() + dims.nD, nQnew}) = util::overlap(dparams, actions, handlers.rq());
68 }
69 qq[EqnData::rhs] = util::overlap(params, rhs, handlers.rq());
70 conjugate_transpose_copy(xq[EqnData::S].slice({dims.oP(), 0}, {dims.oP() + dims.nP, nQnew}),
71 qx[EqnData::S].slice({0, dims.oP()}, {nQnew, dims.oP() + dims.nP}));
72 conjugate_transpose_copy(xq[EqnData::S].slice({dims.oQ(), 0}, {dims.oQ() + dims.nQ, nQnew}),
73 qx[EqnData::S].slice({0, dims.oQ()}, {nQnew, dims.oQ() + dims.nQ}));
74 conjugate_transpose_copy(xq[EqnData::S].slice({dims.oD(), 0}, {dims.oD() + dims.nD, nQnew}),
75 qx[EqnData::S].slice({0, dims.oD()}, {nQnew, dims.oD() + dims.nD}));
76 logger.data_dump("xspace::update_qspace_data() nQnew = ", nQnew);
77 logger.data_dump("Sqq = ", qq[EqnData::S]);
78 logger.data_dump("Hqq = ", qq[EqnData::H]);
79 logger.data_dump("Sqx = ", qx[EqnData::S]);
80 logger.data_dump("Hqx = ", qx[EqnData::H]);
81 logger.data_dump("Sxq = ", xq[EqnData::S]);
82 logger.data_dump("Hxq = ", xq[EqnData::H]);
83 logger.data_dump("rhs_q = ", qq[EqnData::rhs]);
84 return data;
85}
86
88template <class Q, class P>
92 const auto nP = pparams.size();
93 const auto nQ = qparams.size();
94 const auto nX = nP + nQ;
95 auto nD = dparams.size();
96 const auto nRHS = rhs.size();
99 data.qx[EqnData::S].slice({0, 0}, {nD, nP}) = util::overlap(dparams, pparams, handler_qp);
100 data.qx[EqnData::S].slice({0, nP}, {nD, nX}) = util::overlap(dparams, qparams, handler_qq);
101 data.qq[EqnData::rhs].slice() = util::overlap(dparams, rhs, handler_qq);
102 conjugate_transpose_copy(data.xq[EqnData::S].slice(), data.qx[EqnData::S].slice());
103 logger.data_dump("xspace::update_dspace_overlap_data() nD = ", nD);
104 logger.data_dump("Sdd = ", data.qq[EqnData::S]);
105 logger.data_dump("Sdx = ", data.qx[EqnData::S]);
106 logger.data_dump("rhs_d = ", data.qq[EqnData::rhs]);
107 return data;
108}
109
111template <class Q, class P>
113 const CVecRef<Q>& dparams, const CVecRef<Q>& dactions,
115 Logger& logger) {
116 const auto nP = pparams.size();
117 const auto nQ = qparams.size();
118 const auto nX = nP + nQ;
119 auto nD = dparams.size();
121 const auto e = EqnData::H;
122 data.qq[e].slice() = util::overlap(dparams, dactions, handler_qq);
123 data.xq[e].slice({0, 0}, {nP, nD}) = util::overlap(pparams, dactions, handler_qp);
124 data.xq[e].slice({nP, 0}, {nX, nD}) = util::overlap(qparams, dactions, handler_qq);
125 data.qx[e].slice({0, nP}, {nD, nX}) = util::overlap(dparams, qactions, handler_qq);
126 conjugate_transpose_copy(data.qx[e].slice({0, 0}, {nD, nP}), data.xq[e].slice({0, 0}, {nP, nD}));
127 logger.data_dump("xspace::update_dspace_action_data() nD = ", nD);
128 logger.data_dump("Hdd = ", data.qq[e]);
129 logger.data_dump("Hdx = ", data.qx[e]);
130 logger.data_dump("Hxd = ", data.xq[e]);
131 return data;
132}
133
134template <typename T>
136 const Dimensions& dims) {
137 const auto& dd = new_data.qq.at(e);
138 const auto& dx = new_data.qx.at(e);
139 const auto& xd = new_data.xq.at(e);
140 data[e].slice({dims.oD(), dims.oD()}, {dims.oD() + dims.nD, dims.oD() + dims.nD}) = dd;
141 data[e].slice({dims.oD(), dims.oP()}, {dims.oD() + dims.nD, dims.oP() + dims.nP}) =
142 dx.slice({0, 0}, {dims.nD, dims.nP});
143 data[e].slice({dims.oD(), dims.oQ()}, {dims.oD() + dims.nD, dims.oQ() + dims.nQ}) =
144 dx.slice({0, dims.nP}, {dims.nD, dims.nP + dims.nQ});
145 data[e].slice({dims.oP(), dims.oD()}, {dims.oP() + dims.nP, dims.oD() + dims.nD}) =
146 xd.slice({0, 0}, {dims.nP, dims.nD});
147 data[e].slice({dims.oQ(), dims.oD()}, {dims.oQ() + dims.nQ, dims.oD() + dims.nD}) =
148 xd.slice({dims.nP, 0}, {dims.nP + dims.nQ, dims.nD});
149}
150} // namespace xspace
151
152template <class R, class Q, class P>
153class XSpace : public IXSpace<R, Q, P> {
154public:
157 using IXSpace<R, Q, P>::data;
158
159 explicit XSpace(const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers, const std::shared_ptr<Logger>& logger)
160 : pspace(), qspace(handlers, logger), dspace(logger), m_handlers(handlers), m_logger(logger) {
162 };
163
165 void update_qspace(const CVecRef<R>& params, const CVecRef<R>& actions) override {
166 m_logger->trace("QSpace::update_qspace");
167 auto new_data =
170 qspace.update(params, actions, new_data.qq, new_data.qx, new_data.xq, m_dim, data);
172 }
173
189
190 // FIXME this must be called when XSpace is empty
192 void update_pspace(const CVecRef<P>& params, const array::Span<value_type>& pp_action_matrix) override {
193 assert(m_dim.nX() == 0);
194 if (!m_hermitian)
195 throw std::runtime_error("P space can only be used with hermitian kernels");
196 pspace.update(params, m_handlers->pp());
198 const size_t nP = m_dim.nP;
200 data[EqnData::S].resize({nP, nP});
201 data[EqnData::H].resize({nP, nP});
202 data[EqnData::S].slice() = util::overlap(params, m_handlers->pp());
203 for (size_t i = 0, ij = 0; i < nP; ++i)
204 for (size_t j = 0; j < nP; ++j, ++ij)
205 data[EqnData::H](i, j) = pp_action_matrix[ij];
206 }
207
210 m_rhs.reserve(m_rhs.size() + rhs.size());
211 for (const auto& r : rhs)
212 m_rhs.emplace_back(this->m_handlers->qr().copy(r));
213 for (const auto& r : rhs) {
214 auto d = std::abs(this->m_handlers->rr().dot(r, r));
215 if (d == 0)
216 throw std::runtime_error("RHS vector cannot be zero");
217 m_rhs_norm.emplace_back(std::sqrt(d));
218 }
221 }
222
224 CVecRef<Q> rhs() const { return cwrap(m_rhs); }
225
227 const std::vector<value_type_abs>& rhs_norm() const { return m_rhs_norm; }
228
229 const Dimensions& dimensions() const override { return m_dim; }
230
231 void erase(size_t i) override {
232 if (i >= m_dim.oP() && i < m_dim.oP() + m_dim.nP) {
233 erasep(i - m_dim.oP());
234 } else if (i >= m_dim.oQ() && i < m_dim.oQ() + m_dim.nQ) {
235 eraseq(i - m_dim.oQ());
236 } else if (i >= m_dim.oD() && i < m_dim.oD() + m_dim.nD) {
237 erased(i - m_dim.oD());
238 }
239 }
240
241 void eraseq(size_t i) override {
242 qspace.erase(i);
243 remove_data(m_dim.oQ() + i);
245 }
246
247 void erasep(size_t i) override {
248 pspace.erase(i);
249 remove_data(m_dim.oP() + i);
251 }
252
253 void erased(size_t i) override {
254 dspace.erase(i);
255 remove_data(m_dim.oD() + i);
257 }
258
259 VecRef<P> paramsp() override { return pspace.params(); }
260 VecRef<Q> paramsq() override { return qspace.params(); }
261 VecRef<Q> actionsq() override { return qspace.actions(); }
262 VecRef<Q> paramsd() override { return dspace.params(); }
263 VecRef<Q> actionsd() override { return dspace.actions(); }
264
265 CVecRef<P> paramsp() const override { return pspace.params(); }
266 CVecRef<Q> paramsq() const override { return qspace.params(); }
267 CVecRef<Q> actionsq() const override { return qspace.actions(); }
268 CVecRef<Q> paramsd() const override { return dspace.cparams(); }
269 CVecRef<Q> actionsd() const override { return dspace.cactions(); }
270
271 CVecRef<P> cparamsp() const override { return pspace.cparams(); }
272 CVecRef<Q> cparamsq() const override { return qspace.cparams(); }
273 CVecRef<Q> cactionsq() const override { return qspace.cactions(); }
274 CVecRef<Q> cparamsd() const override { return dspace.cparams(); }
275 CVecRef<Q> cactionsd() const override { return dspace.cactions(); }
276
277 void set_logger(std::shared_ptr<Logger> logger) override { m_logger = std::move(logger); }
278
281 bool get_hermiticity() { return m_hermitian; }
283
287
288protected:
291 m_dim.nRHS = m_rhs.size();
292 }
293
296 data[EqnData::rhs].resize({m_dim.nP, m_dim.nRHS});
297 data[EqnData::rhs].slice() = util::overlap(cparamsp(), rhs(), m_handlers->qp());
298 };
299
300 void remove_data(size_t i) {
301 for (auto d : {EqnData::H, EqnData::S})
302 data[d].remove_row_col(i, i);
303 if (data.find(EqnData::rhs) != std::end(data) && !data[EqnData::rhs].empty())
304 data[EqnData::rhs].remove_row(i);
305 if (data.find(EqnData::value) != std::end(data) && !data[EqnData::value].empty())
306 data[EqnData::value].remove_row(i);
307 }
308 std::shared_ptr<ArrayHandlers<R, Q, P>> m_handlers;
309 std::shared_ptr<Logger> m_logger;
311 std::vector<Q> m_rhs;
312 std::vector<value_type_abs> m_rhs_norm;
313 bool m_hermitian = false;
314 bool m_action_dot_action = false;
315};
316
317} // namespace molpro::linalg::itsolv::subspace
318#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_XSPACE_H
Enhances various operations between pairs of arrays and allows dynamic code injection with uniform in...
Definition ArrayHandler.h:163
Non-owning container taking a pointer to the data buffer and its size and exposing routines for itera...
Definition Span.h:31
Class, containing a collection of array handlers used in IterativeSolver Provides a Builder sub-class...
Definition ArrayHandlers.h:25
Definition Logger.h:442
void data_dump(std::string_view what, Ts...data) const
Definition Logger.h:526
D space stores complement of P+Q+R subspace that is necessary to reproduce the previous solutions.
Definition DSpace.h:17
CVecRef< Q > cparams() const
Definition DSpace.h:51
CVecRef< Q > cactions() const
Definition DSpace.h:55
VecRef< Q > params()
Definition DSpace.h:49
VecRef< Q > actions()
Definition DSpace.h:53
size_t size() const
Definition DSpace.h:47
void erase(size_t i)
Erases parameter i.
Definition DSpace.h:41
void update(VecRef< Q > &params, VecRef< Q > &actions)
Clears current D space and moves params and action inside.
Definition DSpace.h:26
Full subspace.
Definition IXSpace.h:19
SubspaceData< value_type > data
Equation data in the subspace.
Definition IXSpace.h:28
typename array::ArrayHandler< R, R >::value_type_abs value_type_abs
Definition IXSpace.h:25
typename array::ArrayHandler< R, R >::value_type value_type
Definition IXSpace.h:24
void update(const CVecRef< P > &params, array::ArrayHandler< P, P > &handler)
Definition PSpace.h:15
CVecRef< P > params() const
Definition PSpace.h:20
size_t size() const
Definition PSpace.h:24
void erase(size_t i)
Definition PSpace.h:26
CVecRef< P > cparams() const
Definition PSpace.h:21
CVecRef< Q > cparamsq() const override
Definition XSpace.h:272
bool get_hermiticity()
Definition XSpace.h:281
CVecRef< Q > cactionsq() const override
Definition XSpace.h:273
void remove_data(size_t i)
Definition XSpace.h:300
void update_dimensions()
Definition XSpace.h:289
std::vector< Q > m_rhs
Right hand side vectors.
Definition XSpace.h:311
CVecRef< P > cparamsp() const override
Definition XSpace.h:271
CVecRef< Q > cparamsd() const override
Definition XSpace.h:274
void update_qspace(const CVecRef< R > &params, const CVecRef< R > &actions) override
Update parameters in Q space and corresponding equation data.
Definition XSpace.h:165
void add_rhs_equations(const CVecRef< R > &rhs)
For a system of linear equations Ax=b, adds rhs vectors b.
Definition XSpace.h:209
void update_dspace(VecRef< Q > &params, VecRef< Q > &actions) override
Clears old D space container and stores new params and actions.
Definition XSpace.h:175
void erased(size_t i) override
Removes parameter i from D subspace.
Definition XSpace.h:253
VecRef< Q > actionsd() override
Definition XSpace.h:263
void update_pspace(const CVecRef< P > &params, const array::Span< value_type > &pp_action_matrix) override
Definition XSpace.h:192
std::vector< value_type_abs > m_rhs_norm
norm of RHS vectors
Definition XSpace.h:312
PSpace< R, P > pspace
Definition XSpace.h:284
CVecRef< Q > rhs() const
Access RHS vectors in linear equations.
Definition XSpace.h:224
CVecRef< Q > paramsq() const override
Definition XSpace.h:266
Dimensions m_dim
Definition XSpace.h:310
CVecRef< Q > actionsq() const override
Definition XSpace.h:267
std::shared_ptr< Logger > m_logger
Definition XSpace.h:309
VecRef< Q > paramsq() override
Definition XSpace.h:260
CVecRef< Q > paramsd() const override
Definition XSpace.h:268
VecRef< P > paramsp() override
Definition XSpace.h:259
VecRef< Q > paramsd() override
Definition XSpace.h:262
const Dimensions & dimensions() const override
Definition XSpace.h:229
bool m_hermitian
whether the matrix is Hermitian
Definition XSpace.h:313
VecRef< Q > actionsq() override
Definition XSpace.h:261
CVecRef< P > paramsp() const override
Definition XSpace.h:265
std::shared_ptr< ArrayHandlers< R, Q, P > > m_handlers
Definition XSpace.h:308
void eraseq(size_t i) override
Removes parameter i from Q subspace.
Definition XSpace.h:241
const std::vector< value_type_abs > & rhs_norm() const
Norm of RHS vectors.
Definition XSpace.h:227
auto update_rhs_with_pspace()
Update projection of RHS data onto P space.
Definition XSpace.h:295
void erasep(size_t i) override
Removes parameter i from P subspace.
Definition XSpace.h:247
QSpace< R, Q, P > qspace
Definition XSpace.h:285
void set_logger(std::shared_ptr< Logger > logger) override
Definition XSpace.h:277
void set_action_action()
Definition XSpace.h:282
CVecRef< Q > actionsd() const override
Definition XSpace.h:269
CVecRef< Q > cactionsd() const override
Definition XSpace.h:275
bool m_action_dot_action
whether the H matrix is action.action instead of action.parameter
Definition XSpace.h:314
void erase(size_t i) override
Removes parameter i from the full subspace.
Definition XSpace.h:231
DSpace< Q > dspace
Definition XSpace.h:286
XSpace(const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers, const std::shared_ptr< Logger > &logger)
Definition XSpace.h:159
void set_hermiticity(bool hermitian)
Set Hermiticity of the subspace. P space can only be used with Hermitian problems.
Definition XSpace.h:280
auto overlap(const CVecRef< R > &left, const CVecRef< Q > &right, array::ArrayHandler< Z, W > &handler) -> std::enable_if_t< detail::Z_and_W_are_one_of_R_and_Q< R, Q, Z, W >, Matrix< typename array::ArrayHandler< Z, W >::value_type > >
Calculates overlap matrix between left and right vectors.
Definition util.h:52
auto update_dspace_action_data(const CVecRef< P > &pparams, const CVecRef< Q > &qparams, const CVecRef< Q > &qactions, const CVecRef< Q > &dparams, const CVecRef< Q > &dactions, array::ArrayHandler< Q, P > &handler_qp, array::ArrayHandler< Q, Q > &handler_qq, Logger &logger)
Calculates overlap blocks between D space and the rest of the subspace.
Definition XSpace.h:112
auto update_qspace_data(const CVecRef< R > &params, const CVecRef< R > &actions, const CVecRef< P > &pparams, const CVecRef< Q > &qparams, const CVecRef< Q > &qactions, const CVecRef< Q > &dparams, const CVecRef< Q > &dactions, const CVecRef< Q > &rhs, const Dimensions &dims, ArrayHandlers< R, Q, P > &handlers, Logger &logger, bool hermitian=false, bool action_dot_action=false)
Returns new sections of equation data.
Definition XSpace.h:35
void copy_dspace_eqn_data(const NewData< T > &new_data, SubspaceData< T > &data, const subspace::EqnData e, const Dimensions &dims)
Definition XSpace.h:135
auto update_dspace_overlap_data(const CVecRef< P > &pparams, const CVecRef< Q > &qparams, const CVecRef< Q > &dparams, const CVecRef< Q > &rhs, array::ArrayHandler< Q, P > &handler_qp, array::ArrayHandler< Q, Q > &handler_qq, Logger &logger)
Calculates overlap blocks between D space and the rest of the subspace.
Definition XSpace.h:89
EqnData
Definition SubspaceData.h:7
void conjugate_transpose_copy(ML &&ml, const MR &mr)
Copies the conjugate transpose of mr into ml.
Definition Matrix.h:299
std::map< EqnData, Matrix< T > > SubspaceData
Equation data blocks of the subspace, in the scalar type of the problem.
Definition SubspaceData.h:11
auto cwrap(ForwardIt begin, ForwardIt end)
Takes a begin and end iterators and returns a vector of references to each element.
Definition wrap.h:52
std::unique_ptr< LinearEigensystem< R, Q, P > > create_LinearEigensystem(const LinearEigensystemOptions &options, const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers=std::make_shared< molpro::linalg::itsolv::ArrayHandlers< R, Q, P > >())
Definition SolverFactory.h:111
std::vector< std::reference_wrapper< const A > > CVecRef
Definition wrap.h:14
std::vector< std::reference_wrapper< A > > VecRef
Definition wrap.h:11
size_t oP() const
offset of the P block
Definition Dimensions.h:17
size_t nD
Definition Dimensions.h:14
size_t nQ
Definition Dimensions.h:13
size_t nRHS
number of rigt-hand-side vectors in the system of linear equations
Definition Dimensions.h:15
size_t nP
Definition Dimensions.h:12
size_t oQ() const
offset of the Q block
Definition Dimensions.h:18
size_t oD() const
offset of the D block
Definition Dimensions.h:19
size_t nX() const
total size of the X space
Definition Dimensions.h:16
Container storing the Q space parameters.
Definition QSpace.h:60
VecRef< Q > params()
Definition QSpace.h:160
CVecRef< Q > cactions() const
Definition QSpace.h:182
void update(const CVecRef< R > &params, const CVecRef< R > &actions, const SubspaceData< T > &qq_in, const SubspaceData< T > &qx_in, const SubspaceData< T > &xq_in, const Dimensions &dims, SubspaceData< T > &old_data)
Prepends parameters to the start of Q space.
Definition QSpace.h:84
size_t size() const
Definition QSpace.h:158
CVecRef< Q > cparams() const
Definition QSpace.h:170
void erase(size_t i)
Erases q parameter i.
Definition QSpace.h:152
VecRef< Q > actions()
Definition QSpace.h:172
New sections of equation data.
Definition XSpace.h:18
SubspaceData< T > xq
data block between current X space and new parameters
Definition XSpace.h:30
NewData(size_t nQnew, size_t nX, size_t nRHS)
Definition XSpace.h:19
SubspaceData< T > qx
data block between new parameters and current X space
Definition XSpace.h:29
SubspaceData< T > qq
data block between new paramters
Definition XSpace.h:28