//================================================================================================== /* ROTGEN - Runtime Overlay for Eigen Copyright : CODE RECKONS SPDX-License-Identifier: BSL-1.0 */ //================================================================================================== //================================================================================================== /* This file is a X-File to generate various svd_impl_* definitions variant */ //================================================================================================== //================================================================================================== // Internal payload //================================================================================================== struct CLASSNAME::payload { using matrix_type = Eigen::Matrix; Eigen::JacobiSVD data; payload(SOURCENAME const& src, int options) : data(src.storage()->data,options) {} }; //================================================================================================== // Constructors & Special Members //================================================================================================== CLASSNAME::CLASSNAME(SOURCENAME const& m, int options) : storage_(std::make_unique(m,options)) {} CLASSNAME::CLASSNAME(CLASSNAME const& o) : storage_(std::make_unique(*o.storage_)) { } CLASSNAME::CLASSNAME(CLASSNAME&&) noexcept = default; CLASSNAME& CLASSNAME::operator=(CLASSNAME const& o) { if (this != &o) storage_->data = o.storage_->data; return *this; } CLASSNAME& CLASSNAME::operator=(CLASSNAME&& o) noexcept { if (this != &o) storage_->data = std::move(o.storage_->data); return *this; } CLASSNAME::~CLASSNAME() = default; int CLASSNAME::rank() const { return storage_->data.rank(); } SOURCENAME CLASSNAME::U() const { SOURCENAME result; result.storage()->assign(storage_->data.matrixU()); return result; } SOURCENAME CLASSNAME::U(int r) const { SOURCENAME result; result.storage()->assign( storage_->data.matrixU().leftCols(r) ); return result; } SOURCENAME CLASSNAME::singular_values() const { SOURCENAME result; result.storage()->assign(storage_->data.singularValues()); return result; } SOURCENAME CLASSNAME::singular_values(int r) const { SOURCENAME result; result.storage()->assign(storage_->data.singularValues().head(r)); return result; } SOURCENAME CLASSNAME::D() const { SOURCENAME result; result.storage()->assign(storage_->data.singularValues().asDiagonal()); return result; } SOURCENAME CLASSNAME::D(int r) const { SOURCENAME result; result.storage()->assign(storage_->data.singularValues().head(r).asDiagonal()); return result; } SOURCENAME CLASSNAME::V() const { SOURCENAME result; result.storage()->assign(storage_->data.matrixV()); return result; } SOURCENAME CLASSNAME::V(int r) const { SOURCENAME result; result.storage()->assign( storage_->data.matrixV().leftCols(r) ); return result; }