forked from LLNL/libROM
-
Notifications
You must be signed in to change notification settings - Fork 0
/
IncrementalSVDStandard.h
153 lines (138 loc) · 4.58 KB
/
IncrementalSVDStandard.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/******************************************************************************
*
* Copyright (c) 2013-2019, Lawrence Livermore National Security, LLC
* and other libROM project developers. See the top-level COPYRIGHT
* file for details.
*
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
*
*****************************************************************************/
// Description: The concrete implementation of the incremental SVD algorithm
// that is equivalent to but computationally more expensive than
// the "fast update" method.
#ifndef included_IncrementalSVDStandard_h
#define included_IncrementalSVDStandard_h
#include "IncrementalSVD.h"
namespace CAROM {
/**
* A class which embodies the standard incremental SVD algorithm.
*/
class IncrementalSVDStandard : public IncrementalSVD
{
public:
/**
* @brief Constructor.
*
* @pre dim > 0
* @pre linearity_tol > 0.0
* @pre samples_per_time_interval > 0
*
* @param[in] dim The dimension of the system on this processor.
* @param[in] linearity_tol Tolerance to determine whether or not a
* sample is linearly dependent.
* @param[in] skip_linearly_dependent If true skip linearly dependent
* samples.
* @param[in] samples_per_time_interval The number of samples to be
* collected for each time interval.
* @param[in] basis_file_name The base part of the name of the file
* containing the basis vectors. Each process
* will append its process ID to this base
* name.
* @param[in] save_state If true the state of the SVD will be written to
* disk when the object is deleted. If there are
* multiple time intervals then the state will not
* be saved as restoring such a state makes no
* sense.
* @param[in] restore_state If true the state of the SVD will be restored
* when the object is created.
* @param[in] debug_algorithm If true results of the algorithm will be
* printed to facilitate debugging.
*/
IncrementalSVDStandard(
int dim,
double linearity_tol,
bool skip_linearly_dependent,
int max_basis_dimension,
int samples_per_time_interval,
const std::string& basis_file_name,
bool save_state = false,
bool restore_state = false,
bool updateRightSV = false,
bool debug_algorithm = false);
/**
* @brief Destructor.
*/
~IncrementalSVDStandard();
private:
/**
* @brief Unimplemented default constructor.
*/
IncrementalSVDStandard();
/**
* @brief Unimplemented copy constructor.
*/
IncrementalSVDStandard(
const IncrementalSVDStandard& other);
/**
* @brief Unimplemented assignment operator.
*/
IncrementalSVDStandard&
operator = (
const IncrementalSVDStandard& rhs);
/**
* @brief Constructs the first svd.
*
* @pre u != 0
* @pre time >= 0.0
*
* @param[in] u The first state.
* @param[in] time The simulation time for the first state.
*/
virtual
void
buildInitialSVD(
double* u,
double time);
/**
* @brief Computes the current basis vectors.
*/
virtual
void
computeBasis();
/**
* Add a linearly dependent sample to the svd.
*
* @pre A != 0
* @pre sigma != 0
*
* @param[in] A The left singular vectors.
* @param[in] W The right singular vectors.
* @param[in] sigma The singular values.
*/
void
addLinearlyDependentSample(
const Matrix* A,
const Matrix* W,
const Matrix* sigma);
/**
* @brief Add a new, unique sample to the svd.
*
* @pre j != 0
* @pre A != 0
* @pre W != 0
* @pre sigma != 0
*
* @param[in] j The new column of d_U.
* @param[in] A The left singular vectors.
* @param[in] W The right singular vectors.
* @param[in] sigma The singular values.
*/
void
addNewSample(
const Vector* j,
const Matrix* A,
const Matrix* W,
Matrix* sigma);
};
}
#endif