iterative-solver 0.0
QSpace.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_QSPACE_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_QSPACE_H
3#include <array>
4#include <cassert>
5#include <list>
6
7#include <molpro/linalg/itsolv/ArrayHandlers.h>
8#include <molpro/linalg/itsolv/Logger.h>
9#include <molpro/linalg/itsolv/subspace/Dimensions.h>
10#include <molpro/linalg/itsolv/subspace/PSpace.h>
11#include <molpro/linalg/itsolv/wrap.h>
12#include <molpro/linalg/itsolv/util.h>
13#include <molpro/linalg/itsolv/helper-implementation.h>
14
16
17namespace qspace {
21template <class Q>
22struct QParam {
23 std::unique_ptr<Q> param;
24 std::unique_ptr<Q> action;
25 size_t id;
26};
27
29template <class Q, class ForwardIt>
30auto cwrap_params(ForwardIt begin, ForwardIt end) {
31 auto param_action = std::array<CVecRef<Q>, 2>{};
32 for (auto it = begin; it != end; ++it) {
33 param_action[0].emplace_back(*it->param);
34 param_action[1].emplace_back(*it->action);
35 }
36 return param_action;
37}
38
39template <class Q, class ForwardIt>
40auto wrap_params(ForwardIt begin, ForwardIt end) {
41 auto param_action = std::array<VecRef<Q>, 2>{};
42 for (auto it = begin; it != end; ++it) {
43 param_action[0].emplace_back(*it->param);
44 param_action[1].emplace_back(*it->action);
45 }
46 return param_action;
47}
48} // namespace qspace
49
57template <class Rt, class Qt, class Pt>
58struct QSpace {
59 using R = Rt;
60 using Q = Qt;
61 using P = Pt;
64
65 explicit QSpace(std::shared_ptr<ArrayHandlers<R, Q, P>> handlers, std::shared_ptr<Logger> logger)
66 : m_handlers(std::move(handlers)), m_logger(std::move(logger)) {}
67
78 void update(const CVecRef<R>& params, const CVecRef<R>& actions, const SubspaceData& qq, const SubspaceData& qx,
79 const SubspaceData& xq, const Dimensions& dims, SubspaceData& old_data) {
80 m_logger->msg("QSpace::update", Logger::Trace);
81 auto it_begin = m_params.begin();
82 for (size_t i = 0; i < params.size(); ++i) {
83 m_params.emplace(it_begin,
84 qspace::QParam<Q>{std::make_unique<Q>(m_handlers->qr().copy(params.at(i))),
85 std::make_unique<Q>(m_handlers->qr().copy(actions.at(i))), m_unique_id++});
86 }
87 size_t nQnew = params.size();
88 if (nQnew>1) {
89 auto s = Matrix<double>({nQnew,nQnew});
90 s.slice() = qq.at(EqnData::S).slice({0,0},{nQnew,nQnew});
92 1e-8, *m_logger);
93 nQnew -= rp.size();
94 for (auto& p : rp) {m_params.pop_back();}
95 }
96 const auto nXnew = dims.nX + nQnew;
97 auto data = old_data;
98 for (auto d : {EqnData::H, EqnData::S}) {
99 data[d].resize({dims.nX + nQnew, dims.nX + nQnew});
100 data[d].slice({dims.oQ + nQnew, dims.oQ + nQnew}, {data[d].rows(), data[d].cols()}) =
101 old_data[d].slice({dims.oQ, dims.oQ}, {dims.nX, dims.nX});
102 data[d].slice({dims.oQ, dims.oQ}, {dims.oQ + nQnew, dims.oQ + nQnew}) = qq.at(d).slice({0,0},{nQnew,nQnew});
103 data[d].slice({dims.oQ, 0}, {dims.oQ + nQnew, dims.oQ}) = qx.at(d).slice({0, 0}, {nQnew, dims.oQ});
104 data[d].slice({dims.oQ, dims.oQ + nQnew}, {dims.oQ + nQnew, nXnew}) =
105 qx.at(d).slice({0, dims.oQ}, {nQnew, dims.nX});
106 data[d].slice({0, dims.oQ}, {dims.oQ, dims.oQ + nQnew}) = xq.at(d).slice({0, 0}, {dims.oQ, nQnew});
107 data[d].slice({dims.oQ + nQnew, dims.oQ}, {nXnew, dims.oQ + nQnew}) =
108 xq.at(d).slice({dims.oQ, 0}, {dims.nX, nQnew});
109 data[d].slice({0, 0}, {dims.oQ, dims.oQ}) = old_data[d].slice({0, 0}, {dims.oQ, dims.oQ});
110 data[d].slice({0, dims.oQ + nQnew}, {dims.oQ, nXnew}) = old_data[d].slice({0, dims.oQ}, {dims.oQ, dims.nX});
111 data[d].slice({dims.oQ + nQnew, 0}, {nXnew, dims.oQ}) = old_data[d].slice({dims.oQ, 0}, {dims.nX, dims.oQ});
112 old_data[d] = data[d];
113 }
114 if (!qq.at(EqnData::rhs).empty()) {
115 data[EqnData::rhs].resize({dims.nX + nQnew, dims.nRHS});
116 data[EqnData::rhs].slice({dims.oQ, 0}, {dims.oQ + nQnew, dims.nRHS}) = qq.at(EqnData::rhs).slice();
117 data[EqnData::rhs].slice({dims.oQ + nQnew, 0}, {dims.nX + nQnew, dims.nRHS}) =
118 old_data[EqnData::rhs].slice({dims.oQ, 0}, {dims.nX, dims.nRHS});
119 old_data[EqnData::rhs] = data[EqnData::rhs];
120 }
121 if (m_logger->data_dump) {
122 m_logger->msg("S = " + as_string(data.at(EqnData::S)), Logger::Info);
123 m_logger->msg("H = " + as_string(data.at(EqnData::H)), Logger::Info);
124 m_logger->msg("rhs = " + as_string(data.at(EqnData::rhs)), Logger::Info);
125 }
126 }
127
128 void clear() { m_params.clear(); }
129
131 void erase(size_t i) {
132 assert(m_params.size() > i);
133 auto it = std::next(begin(m_params), i);
134 m_params.erase(it);
135 }
136
137 size_t size() const { return m_params.size(); }
138
140 auto qparams = qspace::wrap_params<Q>(m_params.begin(), m_params.end());
141 return qparams[0];
142 }
143
145 auto qparams = qspace::cwrap_params<Q>(m_params.begin(), m_params.end());
146 return qparams[0];
147 }
148
149 CVecRef<Q> cparams() const { return params(); }
150
152 auto qparams = qspace::wrap_params<Q>(m_params.begin(), m_params.end());
153 return qparams[1];
154 }
155
157 auto qparams = qspace::cwrap_params<Q>(m_params.begin(), m_params.end());
158 return qparams[1];
159 }
160
161 CVecRef<Q> cactions() const { return actions(); }
162
163protected:
164 std::shared_ptr<ArrayHandlers<R, Q, P>> m_handlers;
165 std::shared_ptr<Logger> m_logger;
166 size_t m_unique_id{0};
167 std::list<qspace::QParam<Q>> m_params;
168};
169
170} // namespace molpro::linalg::itsolv::subspace
171
172#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_QSPACE_H
decltype(value_type_L{} *value_type_R{}) value_type
Definition: ArrayHandler.h:181
decltype(check_abs< value_type >()) value_type_abs
Definition: ArrayHandler.h:182
Class, containing a collection of array handlers used in IterativeSolver Provides a Builder sub-class...
Definition: ArrayHandlers.h:25
Matrix container that allows simple data access, slicing, copying and resizing without loosing data.
Definition: Matrix.h:28
Slice slice(coord_type upper_left, coord_type bottom_right)
Access a rectangular slice of the matrix.
Definition: Matrix.h:97
auto redundant_parameters(const subspace::Matrix< value_type > &overlap, const size_t oR, const size_t nR, const value_type_abs svd_thresh, Logger &logger)
Deduces a set of parameters that are redundant due to linear dependencies.
Definition: helper-implementation.h:693
auto wrap_params(ForwardIt begin, ForwardIt end)
Definition: QSpace.h:40
auto cwrap_params(ForwardIt begin, ForwardIt end)
Generates vector of reference wrappers to param and action in a range of QParam objects.
Definition: QSpace.h:30
Definition: PSpace.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
std::vector< std::reference_wrapper< const A > > CVecRef
Definition: wrap.h:14
std::vector< std::reference_wrapper< A > > VecRef
Definition: wrap.h:11
@ 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 nX
Definition: Dimensions.h:11
size_t nRHS
number of rigt-hand-side vectors in the system of linear equations
Definition: Dimensions.h:15
Container storing the Q space parameters.
Definition: QSpace.h:58
typename array::ArrayHandler< R, R >::value_type_abs value_type_abs
Definition: QSpace.h:63
std::shared_ptr< ArrayHandlers< R, Q, P > > m_handlers
Definition: QSpace.h:164
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:78
VecRef< Q > params()
Definition: QSpace.h:139
typename array::ArrayHandler< R, R >::value_type value_type
Definition: QSpace.h:62
CVecRef< Q > cactions() const
Definition: QSpace.h:161
size_t size() const
Definition: QSpace.h:137
void clear()
Definition: QSpace.h:128
CVecRef< Q > cparams() const
Definition: QSpace.h:149
size_t m_unique_id
unique id for any new parameter set
Definition: QSpace.h:166
void erase(size_t i)
Erases q parameter i.
Definition: QSpace.h:131
std::list< qspace::QParam< Q > > m_params
q parameter sets with new parameters first
Definition: QSpace.h:167
std::shared_ptr< Logger > m_logger
Definition: QSpace.h:165
VecRef< Q > actions()
Definition: QSpace.h:151
QSpace(std::shared_ptr< ArrayHandlers< R, Q, P > > handlers, std::shared_ptr< Logger > logger)
Definition: QSpace.h:65
CVecRef< Q > params() const
Definition: QSpace.h:144
CVecRef< Q > actions() const
Definition: QSpace.h:156
Parameter in the Q space.
Definition: QSpace.h:22
std::unique_ptr< Q > param
parameter
Definition: QSpace.h:23
std::unique_ptr< Q > action
corresponding action
Definition: QSpace.h:24
size_t id
unique id
Definition: QSpace.h:25