iterative-solver 0.0
XSpace.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_XSPACE_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_XSPACE_H
3#include <cassert>
4#include <molpro/linalg/itsolv/helper.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
12namespace xspace {
14struct NewData {
15 NewData(size_t nQnew, size_t nX, size_t nRHS) {
16 for (auto d : {EqnData::H, EqnData::S}) {
17 qq[d].resize({nQnew, nQnew});
18 qx[d].resize({nQnew, nX});
19 xq[d].resize({nX, nQnew});
20 }
21 qq[EqnData::rhs].resize({nQnew, nRHS});
22 }
23
24 SubspaceData qq = null_data<EqnData::H, EqnData::S>();
25 SubspaceData qx = null_data<EqnData::H, EqnData::S>();
26 SubspaceData xq = null_data<EqnData::H, EqnData::S>();
27};
28
30template <class R, class Q, class P>
31auto update_qspace_data(const CVecRef<R>& params, const CVecRef<R>& actions, const CVecRef<P>& pparams,
32 const CVecRef<Q>& qparams, const CVecRef<Q>& qactions, const CVecRef<Q>& dparams,
33 const CVecRef<Q>& dactions, const CVecRef<Q>& rhs, const Dimensions& dims,
34 ArrayHandlers<R, Q, P>& handlers, Logger& logger, bool hermitian = false,
35 bool action_dot_action = false) {
36 auto nQnew = params.size();
37 auto data = NewData(nQnew, dims.nX, rhs.size());
38 auto& qq = data.qq;
39 auto& qx = data.qx;
40 auto& xq = data.xq;
41 qq[EqnData::S] = util::overlap(params, handlers.rr());
42 qx[EqnData::S].slice({0, dims.oP}, {nQnew, dims.oP + dims.nP}) = util::overlap(params, pparams, handlers.rp());
43 qx[EqnData::S].slice({0, dims.oQ}, {nQnew, dims.oQ + dims.nQ}) = util::overlap(params, qparams, handlers.rq());
44 qx[EqnData::S].slice({0, dims.oD}, {nQnew, dims.oD + dims.nD}) = util::overlap(params, dparams, handlers.rq());
45 qq[EqnData::H] =
46 action_dot_action ? util::overlap(actions, handlers.rr()) : util::overlap(params, actions, handlers.rr());
47 qx[EqnData::H].slice({0, dims.oQ}, {nQnew, dims.oQ + dims.nQ}) =
48 util::overlap(action_dot_action ? actions : params, qactions, handlers.rq());
49 qx[EqnData::H].slice({0, dims.oD}, {nQnew, dims.oD + dims.nD}) =
50 util::overlap(action_dot_action ? actions : params, dactions, handlers.rq());
51 if (hermitian) {
52 xq[EqnData::H].slice({dims.oP, 0}, {dims.oP + dims.nP, nQnew}) = util::overlap(pparams, actions, handlers.rp());
53 // xq[EqnData::H].slice({dims.oQ, 0}, {dims.oQ + dims.nQ, nQnew}) = util::overlap(action_dot_action ? qactions :
54 // qparams, actions, handlers.qr());
55 transpose_copy(xq[EqnData::H].slice({dims.oQ, 0}, {dims.oQ + dims.nQ, nQnew}),
56 qx[EqnData::H].slice({0, dims.oQ}, {nQnew, dims.oQ + dims.nQ}));
57 transpose_copy(xq[EqnData::H].slice({dims.oD, 0}, {dims.oD + dims.nD, nQnew}),
58 qx[EqnData::H].slice({0, dims.oD}, {nQnew, dims.oD + dims.nD}));
59 transpose_copy(qx[EqnData::H].slice({0, dims.oP}, {nQnew, dims.oP + dims.nP}),
60 xq[EqnData::H].slice({dims.oP, 0}, {dims.oP + dims.nP, nQnew}));
61 } else {
62 xq[EqnData::H].slice({dims.oQ, 0}, {dims.oQ + dims.nQ, nQnew}) = util::overlap(qparams, actions, handlers.rq());
63 xq[EqnData::H].slice({dims.oD, 0}, {dims.oD + dims.nD, nQnew}) = util::overlap(dparams, actions, handlers.rq());
64 }
65 qq[EqnData::rhs] = util::overlap(params, rhs, handlers.rq());
66 transpose_copy(xq[EqnData::S].slice({dims.oP, 0}, {dims.oP + dims.nP, nQnew}),
67 qx[EqnData::S].slice({0, dims.oP}, {nQnew, dims.oP + dims.nP}));
68 transpose_copy(xq[EqnData::S].slice({dims.oQ, 0}, {dims.oQ + dims.nQ, nQnew}),
69 qx[EqnData::S].slice({0, dims.oQ}, {nQnew, dims.oQ + dims.nQ}));
70 transpose_copy(xq[EqnData::S].slice({dims.oD, 0}, {dims.oD + dims.nD, nQnew}),
71 qx[EqnData::S].slice({0, dims.oD}, {nQnew, dims.oD + dims.nD}));
72 if (logger.data_dump) {
73 logger.msg("xspace::update_qspace_data() nQnew = " + std::to_string(nQnew), Logger::Info);
74 logger.msg("Sqq = " + as_string(qq[EqnData::S]), Logger::Info);
75 logger.msg("Hqq = " + as_string(qq[EqnData::H]), Logger::Info);
76 logger.msg("Sqx = " + as_string(qx[EqnData::S]), Logger::Info);
77 logger.msg("Hqx = " + as_string(qx[EqnData::H]), Logger::Info);
78 logger.msg("Sxq = " + as_string(xq[EqnData::S]), Logger::Info);
79 logger.msg("Hxq = " + as_string(xq[EqnData::H]), Logger::Info);
80 logger.msg("rhs_q = " + as_string(qq[EqnData::rhs]), Logger::Info);
81 }
82 return data;
83}
84
86template <class Q, class P>
87auto update_dspace_overlap_data(const CVecRef<P>& pparams, const CVecRef<Q>& qparams, const CVecRef<Q>& dparams,
88 const CVecRef<Q>& rhs, array::ArrayHandler<Q, P>& handler_qp,
89 array::ArrayHandler<Q, Q>& handler_qq, Logger& logger) {
90 const auto nP = pparams.size();
91 const auto nQ = qparams.size();
92 const auto nX = nP + nQ;
93 auto nD = dparams.size();
94 const auto nRHS = rhs.size();
95 auto data = NewData(nD, nX, nRHS);
96 data.qq[EqnData::S].slice() = util::overlap(dparams, handler_qq);
97 data.qx[EqnData::S].slice({0, 0}, {nD, nP}) = util::overlap(dparams, pparams, handler_qp);
98 data.qx[EqnData::S].slice({0, nP}, {nD, nX}) = util::overlap(dparams, qparams, handler_qq);
99 data.qq[EqnData::rhs].slice() = util::overlap(dparams, rhs, handler_qq);
100 transpose_copy(data.xq[EqnData::S].slice(), data.qx[EqnData::S].slice());
101 if (logger.data_dump) {
102 logger.msg("xspace::update_dspace_overlap_data() nD = " + std::to_string(nD), Logger::Info);
103 logger.msg("Sdd = " + as_string(data.qq[EqnData::S]), Logger::Info);
104 logger.msg("Sdx = " + as_string(data.qx[EqnData::S]), Logger::Info);
105 logger.msg("rhs_d = " + as_string(data.qq[EqnData::rhs]), Logger::Info);
106 }
107 return data;
108}
109
111template <class Q, class P>
112auto update_dspace_action_data(const CVecRef<P>& pparams, const CVecRef<Q>& qparams, const CVecRef<Q>& qactions,
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();
120 auto data = NewData(nD, nX, 0);
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 transpose_copy(data.qx[e].slice({0, 0}, {nD, nP}), data.xq[e].slice({0, 0}, {nP, nD}));
127 if (logger.data_dump) {
128 logger.msg("xspace::update_dspace_action_data() nD = " + std::to_string(nD), Logger::Info);
129 logger.msg("Hdd = " + as_string(data.qq[e]), Logger::Info);
130 logger.msg("Hdx = " + as_string(data.qx[e]), Logger::Info);
131 logger.msg("Hxd = " + as_string(data.xq[e]), Logger::Info);
132 }
133 return data;
134}
135
136inline void copy_dspace_eqn_data(const NewData& new_data, SubspaceData& data, const subspace::EqnData e,
137 const Dimensions& dims) {
138 const auto& dd = new_data.qq.at(e);
139 const auto& dx = new_data.qx.at(e);
140 const auto& xd = new_data.xq.at(e);
141 data[e].slice({dims.oD, dims.oD}, {dims.oD + dims.nD, dims.oD + dims.nD}) = dd;
142 data[e].slice({dims.oD, dims.oP}, {dims.oD + dims.nD, dims.oP + dims.nP}) = 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}) = xd.slice({0, 0}, {dims.nP, dims.nD});
146 data[e].slice({dims.oQ, dims.oD}, {dims.oQ + dims.nQ, dims.oD + dims.nD}) =
147 xd.slice({dims.nP, 0}, {dims.nP + dims.nQ, dims.nD});
148}
149} // namespace xspace
150
151template <class R, class Q, class P>
152class XSpace : public IXSpace<R, Q, P> {
153public:
154 using typename IXSpace<R, Q, P>::value_type;
156 using IXSpace<R, Q, P>::data;
157
158 explicit XSpace(const std::shared_ptr<ArrayHandlers<R, Q, P>>& handlers, const std::shared_ptr<Logger>& logger)
159 : pspace(), qspace(handlers, logger), dspace(logger), m_handlers(handlers), m_logger(logger) {
160 data = null_data<EqnData::H, EqnData::S, EqnData::rhs>();
161 };
162
164 void update_qspace(const CVecRef<R>& params, const CVecRef<R>& actions) override {
165 m_logger->msg("QSpace::update_qspace", Logger::Trace);
166 auto new_data =
169 qspace.update(params, actions, new_data.qq, new_data.qx, new_data.xq, m_dim, data);
171 }
172
174 void update_dspace(VecRef<Q>& params, VecRef<Q>& actions) override {
175 dspace.update(params, actions);
177 for (auto e : {EqnData::H, EqnData::S})
178 data[e].resize({m_dim.nX, m_dim.nX});
180 m_handlers->qp(), m_handlers->qq(), *m_logger);
182 auto new_data_action = xspace::update_dspace_action_data(
185 data[EqnData::rhs].resize({m_dim.nX, m_dim.nRHS});
186 data[EqnData::rhs].slice({m_dim.oD, 0}, {m_dim.oD + m_dim.nD, m_dim.nRHS}) = new_data.qq[EqnData::rhs].slice();
187 }
188
189 // FIXME this must be called when XSpace is empty
191 void update_pspace(const CVecRef<P>& params, const array::Span<value_type>& pp_action_matrix) override {
192 assert(m_dim.nX == 0);
193 if (!m_hermitian)
194 throw std::runtime_error("P space can only be used with hermitian kernels");
195 pspace.update(params, m_handlers->pp());
197 const size_t nP = m_dim.nP;
199 data[EqnData::S].resize({nP, nP});
200 data[EqnData::H].resize({nP, nP});
201 data[EqnData::S].slice() = util::overlap(params, m_handlers->pp());
202 for (size_t i = 0, ij = 0; i < nP; ++i)
203 for (size_t j = 0; j < nP; ++j, ++ij)
204 data[EqnData::H](i, j) = pp_action_matrix[ij];
205 }
206
209 m_rhs.reserve(m_rhs.size() + rhs.size());
210 for (const auto& r : rhs)
211 m_rhs.emplace_back(this->m_handlers->qr().copy(r));
212 for (const auto& r : rhs) {
213 auto d = std::abs(this->m_handlers->rr().dot(r, r));
214 if (d == 0)
215 throw std::runtime_error("RHS vector cannot be zero");
216 m_rhs_norm.emplace_back(std::sqrt(d));
217 }
220 }
221
223 CVecRef<Q> rhs() const { return cwrap(m_rhs); }
224
226 const std::vector<value_type_abs>& rhs_norm() const { return m_rhs_norm; }
227
228 const Dimensions& dimensions() const override { return m_dim; }
229
230 void erase(size_t i) override {
231 if (m_dim.oP >= i && i < m_dim.oP + m_dim.nP) {
232 erasep(i - m_dim.oP);
233 } else if (m_dim.oQ >= i && i < m_dim.oQ + m_dim.nQ) {
234 eraseq(i - m_dim.oQ);
235 } else if (m_dim.oD >= i && i < m_dim.oD + m_dim.nD) {
236 erased(i - m_dim.oD);
237 }
238 }
239
240 void eraseq(size_t i) override {
241 qspace.erase(i);
242 remove_data(m_dim.oQ + i);
244 }
245
246 void erasep(size_t i) override {
247 pspace.erase(i);
248 remove_data(m_dim.oP + i);
250 }
251
252 void erased(size_t i) override {
253 dspace.erase(i);
254 remove_data(m_dim.oD + i);
256 }
257
258 VecRef<P> paramsp() override { return pspace.params(); }
259 VecRef<Q> paramsq() override { return qspace.params(); }
260 VecRef<Q> actionsq() override { return qspace.actions(); }
261 VecRef<Q> paramsd() override { return dspace.params(); }
262 VecRef<Q> actionsd() override { return dspace.actions(); }
263
264 CVecRef<P> paramsp() const override { return pspace.params(); }
265 CVecRef<Q> paramsq() const override { return qspace.params(); }
266 CVecRef<Q> actionsq() const override { return qspace.actions(); }
267 CVecRef<Q> paramsd() const override { return dspace.cparams(); }
268 CVecRef<Q> actionsd() const override { return dspace.cactions(); }
269
270 CVecRef<P> cparamsp() const override { return pspace.cparams(); }
271 CVecRef<Q> cparamsq() const override { return qspace.cparams(); }
272 CVecRef<Q> cactionsq() const override { return qspace.cactions(); }
273 CVecRef<Q> cparamsd() const override { return dspace.cparams(); }
274 CVecRef<Q> cactionsd() const override { return dspace.cactions(); }
275
277 void set_hermiticity(bool hermitian) { m_hermitian = hermitian; }
278 bool get_hermiticity() { return m_hermitian; }
280
284
285protected:
288 m_dim.nRHS = m_rhs.size();
289 }
290
293 data[EqnData::rhs].resize({m_dim.nP, m_dim.nRHS});
294 data[EqnData::rhs].slice() = util::overlap(cparamsp(), rhs(), m_handlers->qp());
295 };
296
297 void remove_data(size_t i) {
298 for (auto d : {EqnData::H, EqnData::S})
299 data[d].remove_row_col(i, i);
300 if (data.find(EqnData::rhs) != std::end(data) && !data[EqnData::rhs].empty())
301 data[EqnData::rhs].remove_row(i);
302 if (data.find(EqnData::value) != std::end(data) && !data[EqnData::value].empty())
303 data[EqnData::value].remove_row(i);
304 }
305 std::shared_ptr<ArrayHandlers<R, Q, P>> m_handlers;
306 std::shared_ptr<Logger> m_logger;
308 std::vector<Q> m_rhs;
309 std::vector<value_type_abs> m_rhs_norm;
310 bool m_hermitian = false;
311 bool m_action_dot_action = false;
312};
313
314} // namespace molpro::linalg::itsolv::subspace
315#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:162
Non-owning container taking a pointer to the data buffer and its size and exposing routines for itera...
Definition: Span.h:28
Class, containing a collection of array handlers used in IterativeSolver Provides a Builder sub-class...
Definition: ArrayHandlers.h:25
auto & rp()
Definition: ArrayHandlers.h:44
auto & rr()
Definition: ArrayHandlers.h:39
auto & rq()
Definition: ArrayHandlers.h:42
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:13
SubspaceData data
Equation data in the subspace.
Definition: IXSpace.h:22
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:271
bool get_hermiticity()
Definition: XSpace.h:278
CVecRef< Q > cactionsq() const override
Definition: XSpace.h:272
void remove_data(size_t i)
Definition: XSpace.h:297
void update_dimensions()
Definition: XSpace.h:286
std::vector< Q > m_rhs
Right hand side vectors.
Definition: XSpace.h:308
CVecRef< P > cparamsp() const override
Definition: XSpace.h:270
CVecRef< Q > cparamsd() const override
Definition: XSpace.h:273
void update_qspace(const CVecRef< R > &params, const CVecRef< R > &actions) override
Update parameters in Q space and corresponding equation data.
Definition: XSpace.h:164
void add_rhs_equations(const CVecRef< R > &rhs)
For a system of linear equations Ax=b, adds rhs vectors b.
Definition: XSpace.h:208
void update_dspace(VecRef< Q > &params, VecRef< Q > &actions) override
Clears old D space container and stores new params and actions.
Definition: XSpace.h:174
void erased(size_t i) override
Removes parameter i from D subspace.
Definition: XSpace.h:252
VecRef< Q > actionsd() override
Definition: XSpace.h:262
void update_pspace(const CVecRef< P > &params, const array::Span< value_type > &pp_action_matrix) override
Definition: XSpace.h:191
std::vector< value_type_abs > m_rhs_norm
norm of RHS vectors
Definition: XSpace.h:309
PSpace< R, P > pspace
Definition: XSpace.h:281
CVecRef< Q > rhs() const
Access RHS vectors in linear equations.
Definition: XSpace.h:223
CVecRef< Q > paramsq() const override
Definition: XSpace.h:265
Dimensions m_dim
Definition: XSpace.h:307
CVecRef< Q > actionsq() const override
Definition: XSpace.h:266
std::shared_ptr< Logger > m_logger
Definition: XSpace.h:306
VecRef< Q > paramsq() override
Definition: XSpace.h:259
CVecRef< Q > paramsd() const override
Definition: XSpace.h:267
VecRef< P > paramsp() override
Definition: XSpace.h:258
VecRef< Q > paramsd() override
Definition: XSpace.h:261
const Dimensions & dimensions() const override
Definition: XSpace.h:228
bool m_hermitian
whether the matrix is Hermitian
Definition: XSpace.h:310
VecRef< Q > actionsq() override
Definition: XSpace.h:260
CVecRef< P > paramsp() const override
Definition: XSpace.h:264
std::shared_ptr< ArrayHandlers< R, Q, P > > m_handlers
Definition: XSpace.h:305
void eraseq(size_t i) override
Removes parameter i from Q subspace.
Definition: XSpace.h:240
const std::vector< value_type_abs > & rhs_norm() const
Norm of RHS vectors.
Definition: XSpace.h:226
auto update_rhs_with_pspace()
Update projection of RHS data onto P space.
Definition: XSpace.h:292
void erasep(size_t i) override
Removes parameter i from P subspace.
Definition: XSpace.h:246
QSpace< R, Q, P > qspace
Definition: XSpace.h:282
void set_action_action()
Definition: XSpace.h:279
CVecRef< Q > actionsd() const override
Definition: XSpace.h:268
CVecRef< Q > cactionsd() const override
Definition: XSpace.h:274
bool m_action_dot_action
whether the H matrix is action.action instead of action.parameter
Definition: XSpace.h:311
void erase(size_t i) override
Removes parameter i from the full subspace.
Definition: XSpace.h:230
DSpace< Q > dspace
Definition: XSpace.h:283
XSpace(const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers, const std::shared_ptr< Logger > &logger)
Definition: XSpace.h:158
void set_hermiticity(bool hermitian)
Set Hermiticity of the subspace. P space can only be used with Hermitian problems.
Definition: XSpace.h:277
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< double > >
Calculates overlap matrix between left and right vectors.
Definition: util.h:49
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:31
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:87
void copy_dspace_eqn_data(const NewData &new_data, SubspaceData &data, const subspace::EqnData e, const Dimensions &dims)
Definition: XSpace.h:136
Definition: PSpace.h:7
EqnData
Definition: SubspaceData.h:7
std::map< EqnData, Matrix< double > > SubspaceData
Definition: SubspaceData.h:9
std::string as_string(const Mat &m, int precision=6)
Definition: Matrix.h:289
void transpose_copy(ML &&ml, const MR &mr)
Definition: Matrix.h:281
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::vector< std::reference_wrapper< const A > > CVecRef
Definition: wrap.h:14
std::vector< std::reference_wrapper< A > > VecRef
Definition: wrap.h:11
A dummy structured logger.
Definition: Logger.h:40
void msg(const std::string &message, Level log_lvl)
Definition: Logger.cpp:16
bool data_dump
highest level of warning/error that can be logged
Definition: Logger.h:69
@ Info
Definition: Logger.h:49
@ Trace
Definition: Logger.h:49
Stores partitioning of XSpace into P, Q and R blocks with sizes and offsets for each one.
Definition: Dimensions.h:5
size_t oQ
Definition: Dimensions.h:13
size_t nD
Definition: Dimensions.h:10
size_t nX
Definition: Dimensions.h:11
size_t nQ
Definition: Dimensions.h:9
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:8
size_t oP
Definition: Dimensions.h:12
size_t oD
Definition: Dimensions.h:14
void update(const CVecRef< R > &params, const CVecRef< R > &actions, const SubspaceData &qq, const SubspaceData &qx, const SubspaceData &xq, const Dimensions &dims, SubspaceData &old_data)
Prepends parameters to the start of Q space.
Definition: QSpace.h:76
VecRef< Q > params()
Definition: QSpace.h:129
CVecRef< Q > cactions() const
Definition: QSpace.h:151
size_t size() const
Definition: QSpace.h:127
CVecRef< Q > cparams() const
Definition: QSpace.h:139
void erase(size_t i)
Erases q parameter i.
Definition: QSpace.h:121
VecRef< Q > actions()
Definition: QSpace.h:141
New sections of equation data.
Definition: XSpace.h:14
SubspaceData qq
data block between new paramters
Definition: XSpace.h:24
SubspaceData qx
data block between new parameters and current X space
Definition: XSpace.h:25
NewData(size_t nQnew, size_t nX, size_t nRHS)
Definition: XSpace.h:15
SubspaceData xq
data block between current X space and new parameters
Definition: XSpace.h:26