183 bool allocateWorkspace)
187 if (allocateOutput) {
209 if (allocateWorkspace) {
227 template <
typename _matrixOwnerTypeU,
228 typename _vectorOwnerTypeS,
229 typename _matrixOwnerTypeVt>
234 throw(std::runtime_error)
239 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Size of matrix U is incorrect."));
242 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Storage order of U is incorrect."));
244 if (!inU.IsCompact()) {
245 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Matrix U must be compact."));
247 if (! inVt.IsSquare(
NMember)) {
248 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Size of matrix Vt is incorrect."));
251 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Storage order of Vt is incorrect."));
253 if (!inVt.IsCompact()) {
254 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Matrix Vt must be compact."));
257 if (minmn != inS.size()) {
258 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Size of vector S is incorrect."));
260 if (!inS.IsCompact()) {
261 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Vector S must be compact."));
273 template <
typename _vectorOwnerTypeWorkspace>
276 throw(std::runtime_error)
282 if (lwork > inWorkspace.size()) {
283 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Workspace is too small."));
286 if (!inWorkspace.IsCompact()) {
287 cmnThrow(std::runtime_error(
"nmrSVDDynamicData: Workspace must be compact."));
302 const size_type lwork_1 = 3 * minmn + maxmn;
304 return (lwork_1 > lwork_2) ? lwork_1 : lwork_2;
312 template <
class _matrixOwnerTypeA>
327 template <
class _matrixOwnerTypeA>
344 template <
class _matrixOwnerTypeA,
class _matrixOwnerTypeS,
class _vectorOwnerTypeS>
350 throw(std::runtime_error)
352 if ((A.rows() != matrixS.rows()) || (A.cols() != matrixS.cols())) {
353 cmnThrow(std::runtime_error(
"nmrSVDDynamicData::UpdateMatrixS: Size of matrix S is incorrect."));
356 matrixS.Diagonal().Assign(vectorS);
446 template <
class _matrixOwnerTypeA>
466 template <
class _matrixOwnerTypeA,
class _vectorOwnerTypeWorkspace>
487 template <
typename _matrixOwnerTypeU,
488 typename _vectorOwnerTypeS,
489 typename _matrixOwnerTypeVt,
490 typename _vectorOwnerTypeWorkspace>
496 this->
SetRef(inU, inS, inVt, inWorkspace);
509 template <
typename _matrixOwnerTypeU,
510 typename _vectorOwnerTypeS,
511 typename _matrixOwnerTypeVt>
530 template <
class _matrixOwnerTypeA>
548 template <
class _matrixOwnerTypeA,
class _vectorOwnerTypeWorkspace>
591 template <
typename _matrixOwnerTypeU,
592 typename _vectorOwnerTypeS,
593 typename _matrixOwnerTypeVt,
594 typename _vectorOwnerTypeWorkspace>
599 throw(std::runtime_error)
601 this->
SetDimension(inU.rows(),inVt.rows(),inU.StorageOrder());
621 template <
typename _matrixOwnerTypeU,
622 typename _vectorOwnerTypeS,
623 typename _matrixOwnerTypeVt>
627 throw(std::runtime_error)
629 this->
SetDimension(inU.rows(), inVt.rows(), inU.StorageOrder());
692 template <vct::
size_type _rows, vct::
size_type _cols,
bool _storageOrder = VCT_ROW_MAJOR>
702 (
static_cast<size_type>(
M) < static_cast<size_type>(
N))
704 static_cast<size_type>(
M)
708 (3 *
static_cast<size_type>(
MIN_MN) + (static_cast<size_type>(
M)) > static_cast<size_type>(
N))
710 static_cast<size_type>(
M)
717 static_cast<size_type>(
LWORK_1)
761 inline VectorTypeS &
S(
void)
762 {
return Data.SMember; }
764 inline MatrixTypeU &
U(
void)
765 {
return Data.UMember; }
767 inline MatrixTypeVt &
Vt(
void)
768 {
return Data.VtMember; }
771 {
return Data.WorkspaceMember; }
783 inline const VectorTypeS &
S(
void)
const
789 inline const MatrixTypeU &
U(
void)
const
795 inline const MatrixTypeVt &
Vt(
void)
const
803 MatrixTypeS & matrixS )
998 template <
class _matrixOwnerType>
1002 throw (std::runtime_error)
1005 CISSTNETLIB_INTEGER Info;
1008 CISSTNETLIB_INTEGER m_Lwork =
1014 cmnThrow(std::runtime_error(
"nmrSVD: Storage order used for Allocate was different"));
1017 if ((dataFriend.
M() != A.rows()) || (dataFriend.
N() != A.cols())) {
1018 cmnThrow(std::runtime_error(
"nmrSVD: Size used for Allocate was different"));
1021 if (! A.IsCompact()) {
1022 cmnThrow(std::runtime_error(
"nmrSVD: Requires a compact matrix"));
1026 CISSTNETLIB_DOUBLE *UPtr, *VtPtr;
1027 CISSTNETLIB_INTEGER m_Lda, m_Ldu, m_Ldvt;
1029 if (A.IsColMajor()) {
1030 m_Lda = (1 > dataFriend.
M()) ? 1 : dataFriend.
M();
1031 m_Ldu = dataFriend.
M();
1032 m_Ldvt = dataFriend.
N();
1036 m_Lda = (1 > dataFriend.
N()) ? 1 : dataFriend.
N();
1037 m_Ldu = dataFriend.
N();
1038 m_Ldvt = dataFriend.
M();
1045 #if defined(CISSTNETLIB_VERSION)
1046 #if defined(CISSTNETLIB_VERSION_MAJOR)
1047 #if (CISSTNETLIB_VERSION_MAJOR >= 3)
1048 cisstNetlib_dgesvd_(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
1049 A.Pointer(), &m_Lda, dataFriend.
S().
Pointer(),
1054 #else // no major version
1055 dgesvd_(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
1056 A.Pointer(), &m_Lda, dataFriend.
S().
Pointer(),
1060 #endif // CISSTNETLIB_VERSION
1062 ftnlen jobu_len = (ftnlen)1, jobvt_len = (ftnlen)1;
1063 la_dzlapack_MP_sgesvd_nat(&m_Jobu, &m_Jobvt, &m_Ldu, &m_Ldvt,
1064 A.Pointer(), &m_Lda, dataFriend.
S().
Pointer(),
1068 jobu_len, jobvt_len);
1090 template <
class _matrixOwnerTypeA,
1091 class _matrixOwnerTypeU,
1092 class _vectorOwnerTypeS,
1093 class _matrixOwnerTypeVt,
1094 class _vectorOwnerTypeWorkspace>
1103 CISSTNETLIB_INTEGER ret_value =
nmrSVD(A, svdData);
1127 template <
class _matrixOwnerTypeA,
1128 class _matrixOwnerTypeU,
1129 class _vectorOwnerTypeS,
1130 class _matrixOwnerTypeVt>
1138 CISSTNETLIB_INTEGER ret_value =
nmrSVD(A, svdData);
1143 #ifndef SWIG // don't have fixed size containers in Python
1179 const CISSTNETLIB_INTEGER minmn =
1182 CMN_ASSERT(minmn <= static_cast<CISSTNETLIB_INTEGER>(_minmn));
1183 CISSTNETLIB_INTEGER ldu = (_storageOrder ==
VCT_COL_MAJOR) ? _rows : _cols;
1184 CISSTNETLIB_INTEGER lda = (1 > ldu) ? 1 : ldu;
1185 CISSTNETLIB_INTEGER ldvt = (_storageOrder ==
VCT_COL_MAJOR) ? _cols : _rows;
1186 CISSTNETLIB_INTEGER lwork =
1189 CMN_ASSERT(lwork <= static_cast<CISSTNETLIB_INTEGER>(_work));
1192 CISSTNETLIB_INTEGER info;
1193 CISSTNETLIB_DOUBLE *UPtr, *VtPtr;
1204 #if defined(CISSTNETLIB_VERSION)
1206 #if defined(CISSTNETLIB_VERSION_MAJOR)
1207 #if (CISSTNETLIB_VERSION_MAJOR >= 3)
1208 cisstNetlib_dgesvd_(&jobu, &jobvt, &ldu, &ldvt,
1212 workspace.
Pointer(), &lwork, &info);
1214 #else // no major version
1215 dgesvd_(&jobu, &jobvt, &ldu, &ldvt,
1219 workspace.
Pointer(), &lwork, &info);
1220 #endif // CISSTNETLIB_VERSION
1222 ftnlen jobu_len = (ftnlen)1, jobvt_len = (ftnlen)1;
1223 la_dzlapack_MP_sgesvd_nat(&jobu, &jobvt, &ldu, &ldvt,
1227 workspace.
Pointer(), &lwork, &info,
1228 jobu_len, jobvt_len);
1249 template <vct::
size_type _rows, vct::
size_type _cols, vct::
size_type _minmn,
bool _storageOrder>
1257 const CISSTNETLIB_INTEGER ret_value =
nmrSVD(A, U, S, Vt, workspace);
1287 template <vct::
size_type _rows, vct::
size_type _cols,
bool _storageOrder>
1293 CISSTNETLIB_INTEGER ret_value =
nmrSVD( A, dataFriend.
U(), dataFriend.
S(),
MatrixTypeVt VtMember
Definition: nmrSVD.h:742
nmrSVDFixedSizeData()
Definition: nmrSVD.h:778
vctFixedSizeVector< CISSTNETLIB_DOUBLE, LWORK > VectorTypeWorkspace
Definition: nmrSVD.h:738
Declaration of vctDynamicMatrix.
#define CMN_ASSERT(expr)
Definition: cmnAssert.h:90
MatrixTypeU UMember
Definition: nmrSVD.h:741
Definition: vctDynamicMatrixBase.h:42
vctFixedSizeMatrix< CISSTNETLIB_DOUBLE, _cols, _cols, _storageOrder > MatrixTypeVt
Definition: nmrSVD.h:735
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > WorkspaceReference
Definition: nmrSVD.h:138
MatrixTypeVt & Vt(void)
Definition: nmrSVD.h:767
nmrSVDDynamicData(const vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition: nmrSVD.h:447
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & Vt(void)
Definition: nmrSVD.h:380
Declaration of vctFixedSizeMatrix.
MatrixTypeU & U(void)
Definition: nmrSVD.h:764
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & S(void)
Definition: nmrSVD.h:374
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > UReference
Definition: nmrSVD.h:135
value_type SetAll(const value_type value)
Definition: vctFixedSizeMatrixBase.h:421
void SetRefWorkspace(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition: nmrSVD.h:550
Friend(nmrSVDFixedSizeData< _rows, _cols, _storageOrder > &inData)
Definition: nmrSVD.h:758
void SetDimension(size_type m, size_type n, bool storageOrder)
Definition: nmrSVD.h:154
void Allocate(const vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition: nmrSVD.h:532
size_t size_type
Definition: vctContainerTraits.h:35
DiagonalRefType Diagonal(void)
Definition: vctFixedSizeMatrixBase.h:254
const VectorTypeS & S(void) const
Definition: nmrSVD.h:783
bool StorageOrder(void) const
Definition: vctDynamicConstMatrixBase.h:656
static nsize_type MatrixSSize(const vctDynamicConstMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A)
Definition: nmrSVD.h:329
VectorTypeS SMember
Definition: nmrSVD.h:743
void SetRef(size_type size, pointer data, stride_type stride=1)
Definition: vctDynamicVectorRef.h:156
bool StorageOrderMember
Definition: nmrSVD.h:147
VectorTypeS & S(void)
Definition: nmrSVD.h:761
nmrSVDDynamicData(size_type m, size_type n, bool storageOrder)
Definition: nmrSVD.h:429
ThisType & Assign(const vctFixedSizeConstVectorBase< _size, __stride, __elementType, __dataPtrType > &other)
Definition: vctFixedSizeVectorBase.h:274
void SetSize(size_type size)
Definition: vctDynamicVector.h:315
void ThrowUnlessOutputSizeIsCorrect(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt) const
Definition: nmrSVD.h:231
Definition: vctDynamicConstMatrixBase.h:77
nmrSVDDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition: nmrSVD.h:491
Implementation of a fixed-size vector using template metaprogramming.
Definition: vctFixedSizeVector.h:52
vctFixedSizeVector< CISSTNETLIB_DOUBLE, MIN_MN > VectorTypeS
Definition: nmrSVD.h:729
nmrSVDDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition: nmrSVD.h:467
vctDynamicVector< CISSTNETLIB_DOUBLE > WorkspaceMemory
Definition: nmrSVD.h:122
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > VtReference
Definition: nmrSVD.h:136
nmrSVDDynamicData(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt)
Definition: nmrSVD.h:512
void SetRef(size_type rows, size_type cols, stride_type rowStride, stride_type colStride, pointer dataPointer)
Definition: vctDynamicMatrixRef.h:217
void ThrowUnlessWorkspaceSizeIsCorrect(vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace) const
Definition: nmrSVD.h:275
const vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & U(void) const
Definition: nmrSVD.h:650
static size_type WorkspaceSize(size_type m, size_type n)
Definition: nmrSVD.h:298
pointer Pointer(size_type rowIndex, size_type colIndex)
Definition: vctDynamicMatrixBase.h:143
vctFixedSizeMatrix< CISSTNETLIB_DOUBLE, _rows, _cols, _storageOrder > MatrixTypeS
Definition: nmrSVD.h:732
nmrSVDDynamicData()
Definition: nmrSVD.h:409
size_type rows() const
Definition: vctDynamicConstMatrixBase.h:238
vct::size_type size_type
Definition: nmrSVD.h:114
Friend(nmrSVDDynamicData &inData)
Definition: nmrSVD.h:372
size_type cols() const
Definition: vctDynamicConstMatrixBase.h:243
Data for SVD problem (Dynamic).
Definition: nmrSVD.h:106
vctDynamicVector< CISSTNETLIB_DOUBLE > OutputMemory
Definition: nmrSVD.h:129
const MatrixTypeU & U(void) const
Definition: nmrSVD.h:789
void AllocateOutputWorkspace(bool allocateOutput, bool allocateWorkspace)
Definition: nmrSVD.h:182
static vctDynamicMatrixBase< _matrixOwnerTypeS, CISSTNETLIB_DOUBLE > & UpdateMatrixS(const vctDynamicConstMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &A, const vctDynamicConstVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &vectorS, vctDynamicMatrixBase< _matrixOwnerTypeS, CISSTNETLIB_DOUBLE > &matrixS)
Definition: nmrSVD.h:347
#define cmnThrow(a)
Definition: MinimalCmn.h:4
Implementation of a fixed-size matrix using template metaprogramming.
Definition: vctFixedSizeMatrix.h:52
pointer Pointer(index_type index=0)
Definition: vctDynamicVectorBase.h:155
vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & U(void)
Definition: nmrSVD.h:377
static size_type WorkspaceSize(vctDynamicMatrixBase< _matrixOwnerTypeA, CISSTNETLIB_DOUBLE > &inA)
Definition: nmrSVD.h:314
void Allocate(size_type m, size_type n, bool storageOrder)
Definition: nmrSVD.h:573
const MatrixTypeVt & Vt(void) const
Definition: nmrSVD.h:795
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > SReference
Definition: nmrSVD.h:137
const vctDynamicMatrixRef< CISSTNETLIB_DOUBLE > & Vt(void) const
Definition: nmrSVD.h:656
Data of SVD problem (Fixed size).
Definition: nmrSVD.h:693
VectorTypeWorkspace WorkspaceMember
Definition: nmrSVD.h:744
Definition: vctDynamicConstVectorBase.h:77
size_type N(void)
Definition: nmrSVD.h:389
bool StorageOrder(void)
Definition: nmrSVD.h:392
static MatrixTypeS & UpdateMatrixS(const VectorTypeS &vectorS, MatrixTypeS &matrixS)
Definition: nmrSVD.h:802
vct::size_type size_type
Definition: nmrSVD.h:697
pointer Pointer(size_type index=0)
Definition: vctFixedSizeVectorBase.h:226
void SetRef(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt, vctDynamicVectorBase< _vectorOwnerTypeWorkspace, CISSTNETLIB_DOUBLE > &inWorkspace)
Definition: nmrSVD.h:595
void SetRefOutput(vctDynamicMatrixBase< _matrixOwnerTypeU, CISSTNETLIB_DOUBLE > &inU, vctDynamicVectorBase< _vectorOwnerTypeS, CISSTNETLIB_DOUBLE > &inS, vctDynamicMatrixBase< _matrixOwnerTypeVt, CISSTNETLIB_DOUBLE > &inVt)
Definition: nmrSVD.h:624
Declaration of the template function cmnThrow.
vctFixedSizeMatrix< CISSTNETLIB_DOUBLE, _rows, _rows, _storageOrder > MatrixTypeU
Definition: nmrSVD.h:726
VectorTypeWorkspace & Workspace(void)
Definition: nmrSVD.h:770
const bool VCT_COL_MAJOR
Definition: vctForwardDeclarations.h:46
vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & Workspace(void)
Definition: nmrSVD.h:383
CISSTNETLIB_INTEGER nmrSVD(vctDynamicMatrixBase< _matrixOwnerType, CISSTNETLIB_DOUBLE > &A, nmrSVDDynamicData &data)
Definition: nmrSVD.h:1000
vctFixedSizeMatrix< CISSTNETLIB_DOUBLE, _rows, _cols, _storageOrder > MatrixTypeA
Definition: nmrSVD.h:723
vctFixedSizeVector< size_type, 2 > nsize_type
Definition: nmrSVD.h:118
size_type MMember
Definition: nmrSVD.h:145
const vctDynamicVectorRef< CISSTNETLIB_DOUBLE > & S(void) const
Definition: nmrSVD.h:643
pointer Pointer(size_type rowIndex, size_type colIndex)
Definition: vctFixedSizeMatrixBase.h:161
Definition: vctDynamicVectorBase.h:61
size_type NMember
Definition: nmrSVD.h:146
size_type M(void)
Definition: nmrSVD.h:386