1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_QSPACE_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_SUBSPACE_QSPACE_H
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>
27template <
class Q,
class ForwardIt>
29 auto param_action = std::array<CVecRef<Q>, 2>{};
30 for (
auto it = begin; it != end; ++it) {
31 param_action[0].emplace_back(*it->param);
32 param_action[1].emplace_back(*it->action);
37template <
class Q,
class ForwardIt>
39 auto param_action = std::array<VecRef<Q>, 2>{};
40 for (
auto it = begin; it != end; ++it) {
41 param_action[0].emplace_back(*it->param);
42 param_action[1].emplace_back(*it->action);
55template <
class Rt,
class Qt,
class Pt>
80 for (
size_t i = 0; i <
params.size(); ++i) {
85 const size_t nQnew =
params.size();
86 const auto nXnew = dims.
nX + nQnew;
89 data[d].resize({dims.
nX + nQnew, dims.
nX + nQnew});
90 data[d].slice({dims.
oQ + nQnew, dims.
oQ + nQnew}, {data[d].rows(), data[d].cols()}) =
91 old_data[d].slice({dims.
oQ, dims.
oQ}, {dims.
nX, dims.
nX});
92 data[d].slice({dims.
oQ, dims.
oQ}, {dims.
oQ + nQnew, dims.
oQ + nQnew}) = qq.at(d);
93 data[d].slice({dims.
oQ, 0}, {dims.
oQ + nQnew, dims.
oQ}) = qx.at(d).slice({0, 0}, {nQnew, dims.
oQ});
94 data[d].slice({dims.
oQ, dims.
oQ + nQnew}, {dims.
oQ + nQnew, nXnew}) =
95 qx.at(d).slice({0, dims.
oQ}, {nQnew, dims.
nX});
96 data[d].slice({0, dims.
oQ}, {dims.
oQ, dims.
oQ + nQnew}) = xq.at(d).slice({0, 0}, {dims.
oQ, nQnew});
97 data[d].slice({dims.
oQ + nQnew, dims.
oQ}, {nXnew, dims.
oQ + nQnew}) =
98 xq.at(d).slice({dims.
oQ, 0}, {dims.
nX, nQnew});
99 data[d].slice({0, 0}, {dims.
oQ, dims.
oQ}) = old_data[d].slice({0, 0}, {dims.
oQ, dims.
oQ});
100 data[d].slice({0, dims.
oQ + nQnew}, {dims.
oQ, nXnew}) = old_data[d].slice({0, dims.
oQ}, {dims.
oQ, dims.
nX});
101 data[d].slice({dims.
oQ + nQnew, 0}, {nXnew, dims.
oQ}) = old_data[d].slice({dims.
oQ, 0}, {dims.
nX, dims.
oQ});
102 old_data[d] = data[d];
123 auto it = std::next(begin(
m_params), i);
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
auto wrap_params(ForwardIt begin, ForwardIt end)
Definition: QSpace.h:38
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:28
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:56
typename array::ArrayHandler< R, R >::value_type_abs value_type_abs
Definition: QSpace.h:61
std::shared_ptr< ArrayHandlers< R, Q, P > > m_handlers
Definition: QSpace.h:154
void update(const CVecRef< R > ¶ms, 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
typename array::ArrayHandler< R, R >::value_type value_type
Definition: QSpace.h:60
CVecRef< Q > cactions() const
Definition: QSpace.h:151
Pt P
Definition: QSpace.h:59
size_t size() const
Definition: QSpace.h:127
void clear()
Definition: QSpace.h:118
CVecRef< Q > cparams() const
Definition: QSpace.h:139
size_t m_unique_id
unique id for any new parameter set
Definition: QSpace.h:156
void erase(size_t i)
Erases q parameter i.
Definition: QSpace.h:121
std::list< qspace::QParam< Q > > m_params
q parameter sets with new parameters first
Definition: QSpace.h:157
Rt R
Definition: QSpace.h:57
std::shared_ptr< Logger > m_logger
Definition: QSpace.h:155
Qt Q
Definition: QSpace.h:58
VecRef< Q > actions()
Definition: QSpace.h:141
QSpace(std::shared_ptr< ArrayHandlers< R, Q, P > > handlers, std::shared_ptr< Logger > logger)
Definition: QSpace.h:63
CVecRef< Q > params() const
Definition: QSpace.h:134
CVecRef< Q > actions() const
Definition: QSpace.h:146
Parameter in the Q space.
Definition: QSpace.h:20
std::unique_ptr< Q > param
parameter
Definition: QSpace.h:21
std::unique_ptr< Q > action
corresponding action
Definition: QSpace.h:22
size_t id
unique id
Definition: QSpace.h:23