From 05e0d157a309e7a41e7b0c207ccac4e316c81185 Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Sun, 11 Feb 2024 15:43:16 -0800 Subject: [PATCH 1/3] StaticSVD::ComputeSVD - copies the sample snapshot matrix for SVD operation and deletes it after SVD. --- lib/linalg/svd/StaticSVD.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/linalg/svd/StaticSVD.cpp b/lib/linalg/svd/StaticSVD.cpp index 484d59cc0..900361991 100644 --- a/lib/linalg/svd/StaticSVD.cpp +++ b/lib/linalg/svd/StaticSVD.cpp @@ -262,10 +262,9 @@ StaticSVD::computeSVD() // transpose matrix if sample size > dimension. bool transpose = d_total_dim < d_num_samples; + snapshot_matrix = new SLPK_Matrix; if (transpose) { // create a transposed matrix if sample size > dimension. - snapshot_matrix = new SLPK_Matrix; - int d_blocksize_tr = d_num_samples / d_nprow; if (d_num_samples % d_nprow != 0) { d_blocksize_tr += 1; @@ -282,8 +281,12 @@ StaticSVD::computeSVD() } } else { - // use d_samples if sample size <= dimension. - snapshot_matrix = d_samples.get(); + // copy d_samples if sample size <= dimension. + // SVD operation does not preserve the original snapshot matrix. + initialize_matrix(snapshot_matrix, d_total_dim, d_num_samples, + d_nprow, d_npcol, d_blocksize, d_blocksize); + copy_matrix(snapshot_matrix, 1, 1, d_samples.get(), 1, 1, d_total_dim, + d_num_samples); } // This block does the actual ScaLAPACK call to do the factorization. @@ -372,11 +375,9 @@ StaticSVD::computeSVD() } } - if (transpose) { - // Delete the transposed snapshot matrix. - free_matrix_data(snapshot_matrix); - delete snapshot_matrix; - } + // Delete the snapshot matrix. + free_matrix_data(snapshot_matrix); + delete snapshot_matrix; } void From aed51fbf973aefa83bac3d0253f6e67309b899d6 Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Thu, 15 Feb 2024 11:18:54 -0800 Subject: [PATCH 2/3] option for StaticSVD to preserve snapshot. --- lib/linalg/Options.h | 5 +++++ lib/linalg/svd/StaticSVD.cpp | 31 ++++++++++++++++++++++--------- lib/linalg/svd/StaticSVD.h | 5 +++++ 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/lib/linalg/Options.h b/lib/linalg/Options.h index 87153f8ef..a7c6a1fb7 100644 --- a/lib/linalg/Options.h +++ b/lib/linalg/Options.h @@ -345,6 +345,11 @@ class Options * incremental SVD algorithm. */ double max_sampling_time_step_scale = 5.0; + + /** + * @brief Option to preserve snapshot in StaticSVD::computeSVD. + */ + bool static_svd_preserve_snapshot = false; }; } diff --git a/lib/linalg/svd/StaticSVD.cpp b/lib/linalg/svd/StaticSVD.cpp index 900361991..91635805a 100644 --- a/lib/linalg/svd/StaticSVD.cpp +++ b/lib/linalg/svd/StaticSVD.cpp @@ -38,7 +38,8 @@ StaticSVD::StaticSVD( d_samples(new SLPK_Matrix), d_factorizer(new SVDManager), d_this_interval_basis_current(false), d_max_basis_dimension(options.max_basis_dimension), - d_singular_value_tol(options.singular_value_tol) + d_singular_value_tol(options.singular_value_tol), + d_preserve_snapshot(options.static_svd_preserve_snapshot) { // Get the rank of this process, and the number of processors. int mpi_init; @@ -234,6 +235,8 @@ StaticSVD::getSingularValues() const Matrix* StaticSVD::getSnapshotMatrix() { + if ((!d_preserve_snapshot) && (thisIntervalBasisCurrent()) && (d_basis != 0)) + CAROM_ERROR("StaticSVD: snapshot matrix is modified after computeSVD. To preserve the snapshots, set Options::static_svd_preserve_snapshot to be true!\n"); if (d_snapshots) delete d_snapshots; d_snapshots = new Matrix(d_dim, d_num_samples, false); @@ -262,9 +265,9 @@ StaticSVD::computeSVD() // transpose matrix if sample size > dimension. bool transpose = d_total_dim < d_num_samples; - snapshot_matrix = new SLPK_Matrix; if (transpose) { // create a transposed matrix if sample size > dimension. + snapshot_matrix = new SLPK_Matrix; int d_blocksize_tr = d_num_samples / d_nprow; if (d_num_samples % d_nprow != 0) { d_blocksize_tr += 1; @@ -281,12 +284,19 @@ StaticSVD::computeSVD() } } else { - // copy d_samples if sample size <= dimension. + // use d_samples if sample size <= dimension. // SVD operation does not preserve the original snapshot matrix. - initialize_matrix(snapshot_matrix, d_total_dim, d_num_samples, - d_nprow, d_npcol, d_blocksize, d_blocksize); - copy_matrix(snapshot_matrix, 1, 1, d_samples.get(), 1, 1, d_total_dim, - d_num_samples); + if (d_preserve_snapshot) + { + snapshot_matrix = new SLPK_Matrix; + initialize_matrix(snapshot_matrix, d_total_dim, d_num_samples, + d_nprow, d_npcol, d_blocksize, d_blocksize); + copy_matrix(snapshot_matrix, 1, 1, d_samples.get(), 1, 1, d_total_dim, + d_num_samples); + } + else + // use the original snapshot matrix, which will be modified. + snapshot_matrix = d_samples.get(); } // This block does the actual ScaLAPACK call to do the factorization. @@ -376,8 +386,11 @@ StaticSVD::computeSVD() } // Delete the snapshot matrix. - free_matrix_data(snapshot_matrix); - delete snapshot_matrix; + if ((transpose) || (d_preserve_snapshot)) + { + free_matrix_data(snapshot_matrix); + delete snapshot_matrix; + } } void diff --git a/lib/linalg/svd/StaticSVD.h b/lib/linalg/svd/StaticSVD.h index 78140a9b3..bb8d29cbf 100644 --- a/lib/linalg/svd/StaticSVD.h +++ b/lib/linalg/svd/StaticSVD.h @@ -244,6 +244,11 @@ class StaticSVD : public SVD StaticSVD& operator = ( const StaticSVD& rhs); + + /** + * @brief option to preserve snapshot in computeSVD. + */ + bool d_preserve_snapshot; }; } From c1b1627e43203061e36f50e3851ab8838d544c08 Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Thu, 22 Feb 2024 15:03:50 -0800 Subject: [PATCH 3/3] line break for long message. --- lib/linalg/svd/StaticSVD.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/linalg/svd/StaticSVD.cpp b/lib/linalg/svd/StaticSVD.cpp index 91635805a..085336f10 100644 --- a/lib/linalg/svd/StaticSVD.cpp +++ b/lib/linalg/svd/StaticSVD.cpp @@ -236,7 +236,8 @@ const Matrix* StaticSVD::getSnapshotMatrix() { if ((!d_preserve_snapshot) && (thisIntervalBasisCurrent()) && (d_basis != 0)) - CAROM_ERROR("StaticSVD: snapshot matrix is modified after computeSVD. To preserve the snapshots, set Options::static_svd_preserve_snapshot to be true!\n"); + CAROM_ERROR("StaticSVD: snapshot matrix is modified after computeSVD." + " To preserve the snapshots, set Options::static_svd_preserve_snapshot to be true!\n"); if (d_snapshots) delete d_snapshots; d_snapshots = new Matrix(d_dim, d_num_samples, false);