forked from LLNL/libROM
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIncrementalSVDFastUpdate.h
161 lines (145 loc) · 4.8 KB
/
IncrementalSVDFastUpdate.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
154
155
156
157
158
159
160
161
/******************************************************************************
*
* 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
// using Matthew Brand's "fast update" method.
#ifndef included_IncrementalSVDFastUpdate_h
#define included_IncrementalSVDFastUpdate_h
#include "IncrementalSVD.h"
namespace CAROM {
/**
* IncrementalSVDFastUpdate implements Brand's fast update incremental SVD
* algorithm by implementing the pure virtual methods of the IncrementalSVD
* base class.
*/
class IncrementalSVDFastUpdate : 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.
*/
IncrementalSVDFastUpdate(
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.
*/
~IncrementalSVDFastUpdate();
private:
/**
* @brief Unimplemented default constructor.
*/
IncrementalSVDFastUpdate();
/**
* @brief Unimplemented copy constructor.
*/
IncrementalSVDFastUpdate(
const IncrementalSVDFastUpdate& other);
/**
* @brief Unimplemented assignment operator.
*/
IncrementalSVDFastUpdate&
operator = (
const IncrementalSVDFastUpdate& 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();
/**
* @brief 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);
/**
* @brief The matrix U'.
*
* U' is not distributed and the entire matrix exists on each processor.
*/
Matrix* d_Up;
};
}
#endif