forked from RobotLocomotion/drake
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsparse_and_dense_matrix.cc
54 lines (45 loc) · 1.45 KB
/
sparse_and_dense_matrix.cc
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
#include "drake/solvers/sparse_and_dense_matrix.h"
#include <utility>
namespace drake {
namespace solvers {
namespace internal {
SparseAndDenseMatrix::SparseAndDenseMatrix(
const Eigen::SparseMatrix<double>& sparse)
: sparse_(sparse), dense_(0, 0) {}
SparseAndDenseMatrix::SparseAndDenseMatrix(Eigen::MatrixXd dense)
: sparse_(dense.sparseView()), dense_(std::move(dense)) {}
SparseAndDenseMatrix& SparseAndDenseMatrix::operator=(Eigen::MatrixXd dense) {
this->dense_ = std::move(dense);
this->sparse_ = this->dense_.sparseView();
return *this;
}
SparseAndDenseMatrix& SparseAndDenseMatrix::operator=(
const Eigen::SparseMatrix<double>& sparse) {
this->sparse_ = sparse;
this->dense_.resize(0, 0);
return *this;
}
SparseAndDenseMatrix::~SparseAndDenseMatrix() {}
const Eigen::MatrixXd& SparseAndDenseMatrix::GetAsDense() const {
if (dense_.size() != 0) {
return dense_;
} else {
// Modifies the dense_ field. For thread-safety, use a std::mutex.
std::lock_guard<std::mutex> guard(mutex_);
const_cast<SparseAndDenseMatrix*>(this)->dense_ = sparse_.toDense();
return dense_;
}
}
bool SparseAndDenseMatrix::IsFinite() const {
for (int k = 0; k < sparse_.outerSize(); ++k) {
for (Eigen::SparseMatrix<double>::InnerIterator it(sparse_, k); it; ++it) {
if (!std::isfinite(it.value())) {
return false;
}
}
}
return true;
}
} // namespace internal
} // namespace solvers
} // namespace drake