1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_PROPOSE_RSPACE_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_PROPOSE_RSPACE_H
4#include <molpro/linalg/itsolv/IterativeSolver.h>
5#include <molpro/linalg/itsolv/helper.h>
6#include <molpro/linalg/itsolv/qspace_options.h>
7#include <molpro/linalg/itsolv/rspace_options.h>
8#include <molpro/linalg/itsolv/subspace/Dimensions.h>
9#include <molpro/linalg/itsolv/subspace/ISubspaceSolver.h>
10#include <molpro/linalg/itsolv/subspace/IXSpace.h>
11#include <molpro/linalg/itsolv/subspace/QSpace.h>
12#include <molpro/linalg/itsolv/subspace/gram_schmidt.h>
13#include <molpro/linalg/itsolv/subspace/util.h>
14#include <molpro/linalg/itsolv/util.h>
15#include <molpro/linalg/itsolv/wrap_util.h>
16#include <molpro/profiler/Profiler.h>
39 for (
auto&
p : params) {
42 if (dot >
thresh and std::isfinite(dot)) {
43 handler.
scal(1. / dot,
p);
45 logger.
warn(
"parameter's length is too small for normalisation, dot = " + std::format(
"{:.2e}",
double(dot)));
59template <
typename value_type>
62 logger.
trace(
"construct_projected_solution()");
66 for (
size_t i = 0;
i <
nSol; ++
i) {
67 for (
size_t j = 0;
j <
nQd; ++
j) {
70 for (
size_t j = 0;
j <
dims.nD; ++
j) {
92template <
typename value_type>
97 logger.
trace(
"construct_projected_solution_overlap()");
101 for (
size_t i = 0;
i <
nSol; ++
i) {
102 for (
size_t ii = 0;
ii <=
i; ++
ii) {
103 for (
size_t j = 0;
j <
nQd; ++
j) {
104 for (
size_t k = 0;
k <
nQd; ++
k) {
108 for (
size_t k = 0;
k <
dims.nD; ++
k) {
113 for (
size_t j = 0;
j <
dims.nD; ++
j) {
114 for (
size_t k = 0;
k <
dims.nD; ++
k) {
118 for (
size_t k = 0;
k <
nQd; ++
k) {
136template <
typename value_type,
typename value_type_abs>
138 const value_type_abs norm_thresh,
Logger& logger) {
139 logger.
trace(
"remove_null_norm_and_normalise()");
140 const auto nSol = parameters.
rows();
142 for (
size_t i = 0;
i <
nSol; ++
i)
144 for (
size_t i = 0,
j = 0;
i <
nSol; ++
i) {
152 overlap.remove_row_col(
j,
j);
153 std::stringstream
ss;
154 ss << std::setprecision(3) <<
"remove projected solution parameter i = " <<
i <<
", norm = " <<
norm_proj[
i];
159 logger.
data_dump(
"parameters after normalisation = ", parameters);
160 logger.
data_dump(
"overlap of parameters = ", overlap);
175template <
typename value_type,
typename value_type_abs>
179 logger.
trace(
"remove_null_projected_solutions()");
181 value_type*
m =
const_cast<std::vector<value_type>&
>(
overlap_proj.data()).data();
183 std::numeric_limits<value_type_abs>::max(),
true);
190 for (
size_t i = 0;
i < nD; ++
i, ++
svd)
192 for (
size_t k = 0;
k < nX; ++
k)
207template <
typename value_type>
215 for (
size_t i = 0;
i <
dims.nD; ++
i) {
221 for (
size_t i = 0,
j = 0;
i <
dims.nQ; ++
i) {
236 for (
size_t k = 0;
k <
nQd; ++
k)
238 for (
size_t k = 0;
k <
dims.nD; ++
k)
242 for (
size_t i = 0;
i <
nDnew; ++
i) {
243 for (
size_t j = 0;
j <
dims.nP; ++
j)
245 for (
size_t j = 0,
jj = 0;
j <
dims.nQ; ++
j)
248 for (
size_t j = 0;
j <
nR; ++
j)
251 for (
size_t i = 0;
i <
nDnew; ++
i) {
252 for (
size_t j = 0;
j <=
i; ++
j) {
253 for (
size_t k = 0;
k <
nQd; ++
k) {
254 for (
size_t l = 0; l <
nQd; ++l)
257 for (
size_t l = 0; l <
dims.nD; ++l)
261 for (
size_t k = 0;
k <
dims.nD; ++
k) {
262 for (
size_t l = 0; l <
nQd; ++l)
265 for (
size_t l = 0; l <
dims.nD; ++l)
288template <
class R,
class Q,
class P,
typename value_type>
292 logger.
trace(
"append_overlap_with_r()");
294 const auto nX = nP + nQ + nD +
nN;
296 const auto oQ = oP + nP;
297 const auto oD = oQ + nQ;
298 const auto oN = oD + nD;
306 for (
size_t i = 0;
i < nX; ++
i)
307 for (
size_t j = 0;
j <
nN; ++
j)
325template <
typename value_type>
328 using value_type_abs =
decltype(std::abs(solutions(0, 0)));
329 using contrib_pair = std::pair<std::size_t, value_type_abs>;
333 logger.
trace(
"limit_qspace_size()");
350 const std::size_t
nSol = solutions.
rows();
355 for (std::size_t
idx : std::ranges::views::iota(std::size_t(0),
dims.nQ)) {
358 for (
size_t j = 0;
j <
nSol; ++
j) {
359 const value_type_abs
current = std::abs(solutions(
j,
dims.oQ() +
idx));
366 logger.
trace(
"contribution to solutions =",
375 logger.
warn(
"deleted Q vector with max. contribution = ",
contrib);
377 logger.
debug(
"deleted Q vector with max. contribution = ",
contrib);
397template <
class R,
class Q,
class P,
typename value_type,
typename value_type_abs>
399 const std::vector<std::size_t>&
q_delete,
const value_type_abs norm_thresh,
412 assert(
svd_vecs.empty() &&
"P+Q+D subspace should be stable by construction");
421 Q
const*
q =
nullptr;
427 for (
size_t i = 0;
i < nD; ++
i) {
435 for (
size_t i = 0;
i < nD; ++
i) {
440 for (
size_t j = 0;
j <
dims.nD; ++
j) {
445 for (
size_t i = 0;
i < nD; ++
i) {
447 if (
norm < norm_thresh) {
449 std::format(
"construct_dspace: skipping normalisation of D vector {} with near-zero norm = {:.2e}",
i,
norm));
476template <
class R,
class Q,
class P,
typename value_type,
typename value_type_abs>
480 const value_type_abs norm_thresh,
482 logger.
trace(
"modified_gram_schmidt()");
491 prof->start(
"orthoganalise");
492 const auto nX = nP + nQ + nD;
493 if (
nR > 0
and nX > 0) {
494 using EMatrix = Eigen::Matrix<value_type, Eigen::Dynamic, Eigen::Dynamic>;
496 for (
size_t i = 0;
i < nX; ++
i)
497 for (
size_t j = 0;
j < nX; ++
j)
498 S(
i,
j) = overlap(
i,
j);
500 Eigen::Vector<value_type, Eigen::Dynamic>
scale(nX);
501 for (
size_t i = 0;
i < nX; ++
i)
502 scale(
i) = std::abs(S(
i,
i)) > 0 ? 1 / std::sqrt(std::abs(S(
i,
i))) : 0;
503 const auto Sinv = (
scale.asDiagonal() * S *
scale.asDiagonal()).eval().completeOrthogonalDecomposition();
506 for (
size_t i = 0;
i < nX; ++
i)
507 for (
size_t j = 0;
j <
nR; ++
j)
514 for (
size_t i = 0;
i <
n; ++
i)
515 for (
size_t j = 0;
j <
nR; ++
j)
524 prof->start(
"get null_params");
526 for (
size_t i = 0;
i <
nR; ++
i) {
528 if (
norm > norm_thresh) {
530 for (
size_t j =
i + 1;
j <
nR; ++
j) {
581template <
class R,
class Q,
class P>
589 logger.
trace(
"itsolv::detail::propose_rspace");
592 profiler.
start(
"itsolv::ISubspaceSolver::solutions");
598 auto prof = profiler.
push(
"construct_dspace");
617 profiler.
start(
"normalise");
620 profiler.
start(
"append_overlap_with_r");
621 prof->
start(
"append_overlap_with_r");
627 prof->
start(
"redundant_indices");
634 auto kept = std::vector<size_t>{};
639 for (
size_t j = 0;
j <
kept.size(); ++
j)
640 for (
size_t i = 0;
i < nX; ++
i)
643 profiler.
start(
"modified_gram_schmidt");
644 prof->
start(
"modified_gram_schmidt");
657 profiler.
start(
"get_new_working_set");
Enhances various operations between pairs of arrays and allows dynamic code injection with uniform in...
Definition ArrayHandler.h:163
virtual value_type dot(const AL &x, const AR &y)=0
The hermitian inner product <x|y>: conjugate-linear in x, linear in y.
virtual void scal(value_type alpha, AL &x)=0
virtual AL copy(const AR &source)=0
virtual void axpy(value_type alpha, const AR &x, AL &y)=0
virtual void fill(value_type alpha, AL &x)=0
decltype(check_abs< value_type >()) value_type_abs
Definition ArrayHandler.h:183
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
Base class defining the interface common to all iterative solvers.
Definition IterativeSolver.h:209
virtual const std::vector< int > & working_set() const =0
Working set of roots that are not yet converged.
void info(std::string_view message, Ts &&...args) const
Definition Logger.h:505
void warn(std::string_view message, Ts &&...args) const
Definition Logger.h:510
void debug(std::string_view message, Ts &&...args) const
Definition Logger.h:500
void data_dump(std::string_view what, Ts...data) const
Definition Logger.h:526
void trace(std::string_view message, Ts &&...args) const
Definition Logger.h:495
Full subspace.
Definition IXSpace.h:19
SubspaceData< value_type > data
Equation data in the subspace.
Definition IXSpace.h:28
virtual CVecRef< Q > cparamsq() const =0
virtual CVecRef< P > cparamsp() const =0
virtual CVecRef< Q > cactionsd() const =0
virtual void eraseq(size_t i)=0
Removes parameter i from Q subspace.
virtual CVecRef< Q > cactionsq() const =0
virtual CVecRef< Q > cparamsd() const =0
virtual const Dimensions & dimensions() const =0
virtual void update_dspace(VecRef< Q > ¶ms, VecRef< Q > &actions)=0
Updates D space with the new parameters.
Slice & scal(T a)
Scale all elements of the slice.
Definition Matrix.h:230
Matrix container that allows simple data access, slicing, copying and resizing without loosing data.
Definition Matrix.h:32
Slice row(size_t i)
Access row slice.
Definition Matrix.h:122
void remove_row(index_type row)
removes a row from the matrix
Definition Matrix.h:146
index_type rows() const
Definition Matrix.h:169
Profiler & start(const std::string &name)
Profiler & stop(const std::string &name="")
Proxy push(const std::string &name)
static std::shared_ptr< Profiler > single()
auto construct_projected_solution(const subspace::Matrix< value_type > &solutions, const subspace::Dimensions &dims, const std::vector< std::size_t > &remove_qspace, Logger &logger)
Projects solution from the full subspace on to Q_{delete} and current D space.
Definition propose_rspace.h:60
auto construct_projected_solutions_overlap(const subspace::Matrix< value_type > &solutions_proj, const subspace::Matrix< value_type > &overlap, const subspace::Dimensions &dims, const std::vector< std::size_t > &remove_qspace, Logger &logger)
Constructs overlap matrix for projected solutions.
Definition propose_rspace.h:93
auto remove_null_projected_solutions(const subspace::Matrix< value_type > &solutions_proj, const subspace::Matrix< value_type > &overlap_proj, const value_type_abs svd_thresh, Logger &logger)
Transforms to a stable subspace of projected solutions via SVD.
Definition propose_rspace.h:176
void remove_null_norm_and_normalise(subspace::Matrix< value_type > ¶meters, subspace::Matrix< value_type > &overlap, const value_type_abs norm_thresh, Logger &logger)
Removes parameters with norm less than threshold and normalises the rest.
Definition propose_rspace.h:137
auto construct_full_subspace_overlap(const subspace::Matrix< value_type > &solutions_proj, const subspace::Dimensions &dims, const std::vector< std::size_t > &remove_qspace, const subspace::Matrix< value_type > &overlap, const size_t nR)
Constructs overlap matrix of P+Q+R+(projected solutions) subspaces, where Q is without removed parame...
Definition propose_rspace.h:208
Definition helper-dispatch.h:140
void normalise(const size_t n_roots, const VecRef< R > ¶ms, const VecRef< R > &actions, array::ArrayHandler< R, R > &handler, Logger &logger)
Definition IterativeSolverTemplate.h:84
auto propose_rspace(IterativeSolver< R, Q, P > &solver, const VecRef< R > ¶meters, const VecRef< R > &residuals, subspace::IXSpace< R, Q, P > &xspace, subspace::ISubspaceSolver< R, Q, P > &subspace_solver, ArrayHandlers< R, Q, P > &handlers, Logger &logger, const RSpaceOptions< typename array::ArrayHandler< R, R >::value_type_abs > &r_opts, const QSpaceOptions &q_opts, molpro::profiler::Profiler &profiler)
Proposes new parameters for the subspace from the preconditioned residuals.
Definition propose_rspace.h:582
auto construct_dspace(const subspace::Matrix< value_type > &solutions, const subspace::IXSpace< R, Q, P > &xspace, const std::vector< std::size_t > &q_delete, const value_type_abs norm_thresh, const value_type_abs svd_thresh, array::ArrayHandler< Q, Q > &handler, Logger &logger)
Constructs the new D space by projecting the solutions onto Qd+D subspace and ensuring they are well ...
Definition propose_rspace.h:398
auto modified_gram_schmidt(const VecRef< R > &rparams, const subspace::Matrix< value_type > &overlap, const subspace::Matrix< value_type > &rx_overlap, const subspace::Dimensions &dims, const CVecRef< P > &pparams, const CVecRef< Q > &qparams, const CVecRef< Q > &dparams, const value_type_abs norm_thresh, ArrayHandlers< R, Q, P > &handlers, Logger &logger)
Orthogonalises R parameters against P+Q+D subspace (and themselves)
Definition propose_rspace.h:477
auto get_new_working_set(const std::vector< int > &working_set, const CVecRef< R > ¶ms, const CVecRef< R > &wparams)
Returns new working set based on parameters included in wparams.
Definition propose_rspace.h:544
auto append_overlap_with_r(const subspace::Matrix< value_type > &overlap, const CVecRef< R > ¶ms, const CVecRef< P > &pparams, const CVecRef< Q > &qparams, const CVecRef< Q > &dparams, ArrayHandlers< R, Q, P > &handlers, Logger &logger)
Constructs overlap of the full subspace by appending overlap with new parameters to the overlap of pr...
Definition propose_rspace.h:289
std::vector< std::size_t > limit_qspace_size(const subspace::Dimensions &dims, const QSpaceOptions &opts, const subspace::Matrix< value_type > &solutions, Logger &logger)
Ensures that size Q space is within limit by proposing Q parameters for deletion.
Definition propose_rspace.h:326
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:856
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
void delete_parameters(std::vector< int > indices, Container ¶ms)
Removes parameters.
Definition util.h:98
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
auto wrap(ForwardIt begin, ForwardIt end)
Takes a begin and end iterators and returns a vector of references to each element.
Definition wrap.h:32
std::vector< std::reference_wrapper< const A > > CVecRef
Definition wrap.h:14
std::list< SVD< value_type > > svd_system(size_t nrows, size_t ncols, const array::Span< value_type > &m, real_type_t< value_type > threshold, bool hermitian=false, bool reduce_to_rank=false)
Performs singular value decomposition and returns SVD objects for singular values less than threshold...
Definition helper-implementation.h:262
std::vector< std::reference_wrapper< A > > VecRef
Definition wrap.h:11
std::vector< size_t > find_ref(const VecRef< R > &wparams, ForwardIt begin, ForwardIt end)
Given wrapped references in wparams and a range of original parameters [begin, end),...
Definition wrap_util.h:17
real_type_t< T > real_part(const T &x)
The real part of a scalar; the value itself for a real type.
Definition scalar_traits.h:58
T conjugate(const T &x)
Complex conjugate, staying within the scalar type; the identity for a real type.
Definition scalar_traits.h:47
Definition Dimensions.h:9
size_t nD
Definition Dimensions.h:14
size_t nQ
Definition Dimensions.h:13
size_t nP
Definition Dimensions.h:12
size_t nX() const
total size of the X space
Definition Dimensions.h:16
Manages solution of the subspace problem and storage of those solutions.
Definition ISubspaceSolver.h:21