15 #include "IncrementalSVDStandard.h"
16 #include "utils/HDFDatabase.h"
25 IncrementalSVDStandard::IncrementalSVDStandard(
27 const std::string& basis_file_name) :
37 if (options.restore_state && d_state_database) {
39 d_state_database->close();
40 delete d_state_database;
47 IncrementalSVDStandard::~IncrementalSVDStandard()
55 if (d_save_state && (!isFirstSample())) {
58 d_state_database->create(d_state_file_name);
63 IncrementalSVDStandard::buildInitialSVD(
69 d_S =
new Vector(1,
false);
70 Vector u_vec(u, d_dim,
true);
71 double norm_u = u_vec.norm();
72 d_S->item(0) = norm_u;
75 d_U =
new Matrix(d_dim, 1,
true);
76 for (
int i = 0; i < d_dim; ++i) {
77 d_U->item(i, 0) = u[i]/norm_u;
81 if (d_update_right_SV) {
82 d_W =
new Matrix(1, 1,
false);
83 d_W->item(0, 0) = 1.0;
94 IncrementalSVDStandard::computeBasis()
98 d_basis =
new Matrix(*d_U);
100 if (d_update_right_SV)
102 delete d_basis_right;
103 d_basis_right =
new Matrix(*d_W);
108 IncrementalSVDStandard::addLinearlyDependentSample(
113 CAROM_VERIFY(A != 0);
114 CAROM_VERIFY(sigma != 0);
118 Matrix Amod(d_num_samples, d_num_samples,
false);
119 for (
int row = 0; row < d_num_samples; ++row) {
120 for (
int col = 0; col < d_num_samples; ++col) {
121 Amod.item(row, col) = A->item(row, col);
124 d_S->item(col) = sigma->item(row, col);
130 Matrix* U_times_Amod = d_U->mult(Amod);
136 if (d_update_right_SV) {
137 new_d_W =
new Matrix(d_num_rows_of_W+1, d_num_samples,
false);
138 for (
int row = 0; row < d_num_rows_of_W; ++row) {
139 for (
int col = 0; col < d_num_samples; ++col) {
140 double new_d_W_entry = 0.0;
141 for (
int entry = 0; entry < d_num_samples; ++entry) {
142 new_d_W_entry += d_W->item(row, entry)*W->item(entry, col);
144 new_d_W->item(row, col) = new_d_W_entry;
147 for (
int col = 0; col < d_num_samples; ++col) {
148 new_d_W->item(d_num_rows_of_W, col) = W->item(d_num_samples, col);
157 if (d_num_samples > d_total_dim) {
158 max_U_dim = d_num_samples;
161 max_U_dim = d_total_dim;
163 if (fabs(checkOrthogonality(d_U)) >
164 std::numeric_limits<double>::epsilon()*
static_cast<double>(max_U_dim)) {
165 d_U->orthogonalize();
170 IncrementalSVDStandard::addNewSample(
177 Matrix tmp(d_dim, d_num_samples+1,
true);
178 for (
int row = 0; row < d_dim; ++row) {
179 for (
int col = 0; col < d_num_samples; ++col) {
180 tmp.item(row, col) = d_U->item(row, col);
182 tmp.item(row, d_num_samples) = j->item(row);
188 if (d_update_right_SV) {
189 new_d_W =
new Matrix(d_num_rows_of_W+1, d_num_samples+1,
false);
190 for (
int row = 0; row < d_num_rows_of_W; ++row) {
191 for (
int col = 0; col < d_num_samples+1; ++col) {
192 double new_d_W_entry = 0.0;
193 for (
int entry = 0; entry < d_num_samples; ++entry) {
194 new_d_W_entry += d_W->item(row, entry)*W->item(entry, col);
196 new_d_W->item(row, col) = new_d_W_entry;
199 for (
int col = 0; col < d_num_samples+1; ++col) {
200 new_d_W->item(d_num_rows_of_W, col) = W->item(d_num_samples, col);
207 int num_dim = std::min(sigma->numRows(), sigma->numColumns());
208 d_S =
new Vector(num_dim,
false);
209 for (
int i = 0; i < num_dim; i++) {
210 d_S->item(i) = sigma->item(i,i);
219 if (d_num_samples > d_total_dim) {
220 max_U_dim = d_num_samples;
223 max_U_dim = d_total_dim;
225 if (fabs(checkOrthogonality(d_U)) >
226 std::numeric_limits<double>::epsilon()*
static_cast<double>(max_U_dim)) {
227 d_U->orthogonalize();
229 if (d_update_right_SV) {
230 if (fabs(checkOrthogonality(d_W)) >
231 std::numeric_limits<double>::epsilon()*d_num_samples) {
232 d_W->orthogonalize();