Program Listing for File bfgs-preconditioners.hpp
↰ Return to documentation for file (include/nanoeigenpy/solvers/bfgs-preconditioners.hpp
)
#pragma once
#include "nanoeigenpy/fwd.hpp"
#include "nanoeigenpy/solvers/basic-preconditioners.hpp"
#include <Eigen/IterativeLinearSolvers>
namespace nanoeigenpy {
namespace nb = nanobind;
template <typename Preconditioner>
struct BFGSPreconditionerBaseVisitor
: nb::def_visitor<BFGSPreconditionerBaseVisitor<Preconditioner>> {
using VectorType = Eigen::VectorXd;
template <typename... Ts>
void execute(nb::class_<Preconditioner, Ts...>& cl) {
using namespace nb::literals;
cl.def(PreconditionerBaseVisitor<Preconditioner>())
.def("rows", &Preconditioner::rows,
"Returns the number of rows in the preconditioner.")
.def("cols", &Preconditioner::rows,
"Returns the number of cols in the preconditioner.")
.def("dim", &Preconditioner::dim,
"Returns the dimension of the BFGS preconditioner.")
.def("update", &Preconditioner::update, "s"_a, "y"_a,
"Update the BFGS estimate of the matrix A.",
nb::rv_policy::reference)
.def("reset", &Preconditioner::reset, "Reset the BFGS estimate.");
}
static void expose(nb::module_& m, const char* name) {
if (check_registration_alias<Preconditioner>(m)) {
return;
}
nb::class_<Preconditioner>(m, name)
.def(BFGSPreconditionerBaseVisitor<Preconditioner>())
.def(IdVisitor());
}
};
template <typename Preconditioner>
void exposeBFGSPreconditionerBase(nb::module_& m, const char* name) {
BFGSPreconditionerBaseVisitor<Preconditioner>::expose(m, name);
}
template <typename Preconditioner>
struct LimitedBFGSPreconditionerBaseVisitor
: nb::def_visitor<LimitedBFGSPreconditionerBaseVisitor<Preconditioner>> {
template <typename... Ts>
void execute(nb::class_<Preconditioner, Ts...>& cl) {
using namespace nb::literals;
cl.def(PreconditionerBaseVisitor<Preconditioner>())
.def(BFGSPreconditionerBaseVisitor<Preconditioner>())
.def("resize", &Preconditioner::resize, "dim"_a,
"Resizes the preconditionner with size dim.",
nb::rv_policy::reference);
}
static void expose(nb::module_& m, const char* name) {
if (check_registration_alias<Preconditioner>(m)) {
return;
}
nb::class_<Preconditioner>(m, name)
.def(LimitedBFGSPreconditionerBaseVisitor<Preconditioner>())
.def(IdVisitor());
}
};
template <typename Preconditioner>
void exposeLimitedBFGSPreconditionerBase(nb::module_& m, const char* name) {
LimitedBFGSPreconditionerBaseVisitor<Preconditioner>::expose(m, name);
}
} // namespace nanoeigenpy