Coverage Report

Created: 2026-10-28 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dense_solver_fuzzer.cc
Line
Count
Source
1
// Copyright 2026 Google LLC
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//      http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#include <fuzzer/FuzzedDataProvider.h>
16
#include <Eigen/Core>
17
#include <Eigen/QR>
18
#include <Eigen/LU>
19
#include <Eigen/Cholesky>
20
#include <Eigen/Eigenvalues>
21
#include <Eigen/SVD>
22
23
namespace {
24
25
static constexpr Eigen::Index kEigenTestMaxSize = 32;
26
27
template <typename Scalar>
28
656
void fuzzQR(FuzzedDataProvider* stream) {
29
656
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
656
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
656
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
185k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
184k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
184k
  }
36
37
  // HouseholderQR
38
656
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
656
  (void)qr.householderQ();
40
656
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
656
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
656
  (void)cpqr.rank();
45
656
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
656
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
656
  (void)fpqr.rank();
50
656
  (void)fpqr.isInvertible();
51
656
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzQR<float>(FuzzedDataProvider*)
Line
Count
Source
28
343
void fuzzQR(FuzzedDataProvider* stream) {
29
343
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
343
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
343
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
98.6k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
98.3k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
98.3k
  }
36
37
  // HouseholderQR
38
343
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
343
  (void)qr.householderQ();
40
343
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
343
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
343
  (void)cpqr.rank();
45
343
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
343
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
343
  (void)fpqr.rank();
50
343
  (void)fpqr.isInvertible();
51
343
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzQR<double>(FuzzedDataProvider*)
Line
Count
Source
28
313
void fuzzQR(FuzzedDataProvider* stream) {
29
313
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
313
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
313
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
86.5k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
86.2k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
86.2k
  }
36
37
  // HouseholderQR
38
313
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
313
  (void)qr.householderQ();
40
313
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
313
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
313
  (void)cpqr.rank();
45
313
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
313
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
313
  (void)fpqr.rank();
50
313
  (void)fpqr.isInvertible();
51
313
}
52
53
template <typename Scalar>
54
413
void fuzzLU(FuzzedDataProvider* stream) {
55
413
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
413
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
172k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
171k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
171k
  }
60
61
  // PartialPivLU
62
413
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
413
  (void)plu.determinant();
64
413
  (void)plu.inverse();
65
66
  // FullPivLU
67
413
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
413
  (void)flu.determinant();
69
413
  (void)flu.inverse();
70
413
  (void)flu.rank();
71
413
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzLU<float>(FuzzedDataProvider*)
Line
Count
Source
54
217
void fuzzLU(FuzzedDataProvider* stream) {
55
217
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
217
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
89.0k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
88.8k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
88.8k
  }
60
61
  // PartialPivLU
62
217
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
217
  (void)plu.determinant();
64
217
  (void)plu.inverse();
65
66
  // FullPivLU
67
217
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
217
  (void)flu.determinant();
69
217
  (void)flu.inverse();
70
217
  (void)flu.rank();
71
217
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzLU<double>(FuzzedDataProvider*)
Line
Count
Source
54
196
void fuzzLU(FuzzedDataProvider* stream) {
55
196
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
196
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
83.2k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
83.0k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
83.0k
  }
60
61
  // PartialPivLU
62
196
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
196
  (void)plu.determinant();
64
196
  (void)plu.inverse();
65
66
  // FullPivLU
67
196
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
196
  (void)flu.determinant();
69
196
  (void)flu.inverse();
70
196
  (void)flu.rank();
71
196
}
72
73
template <typename Scalar>
74
476
void fuzzCholesky(FuzzedDataProvider* stream) {
75
476
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
476
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
167k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
167k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
167k
  }
80
81
  // LLT
82
476
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
476
  if (llt.info() == Eigen::Success) {
84
45
    (void)llt.matrixL();
85
45
    (void)llt.matrixU();
86
45
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
45
    (void)llt.solve(b);
88
45
  }
89
90
  // LDLT
91
476
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
476
  if (ldlt.info() == Eigen::Success) {
93
215
    (void)ldlt.matrixL();
94
215
    (void)ldlt.matrixU();
95
215
    (void)ldlt.vectorD();
96
215
    (void)ldlt.isPositive();
97
215
    (void)ldlt.isNegative();
98
215
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
215
    (void)ldlt.solve(b);
100
215
  }
101
476
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzCholesky<float>(FuzzedDataProvider*)
Line
Count
Source
74
234
void fuzzCholesky(FuzzedDataProvider* stream) {
75
234
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
234
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
81.6k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
81.4k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
81.4k
  }
80
81
  // LLT
82
234
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
234
  if (llt.info() == Eigen::Success) {
84
23
    (void)llt.matrixL();
85
23
    (void)llt.matrixU();
86
23
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
23
    (void)llt.solve(b);
88
23
  }
89
90
  // LDLT
91
234
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
234
  if (ldlt.info() == Eigen::Success) {
93
104
    (void)ldlt.matrixL();
94
104
    (void)ldlt.matrixU();
95
104
    (void)ldlt.vectorD();
96
104
    (void)ldlt.isPositive();
97
104
    (void)ldlt.isNegative();
98
104
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
104
    (void)ldlt.solve(b);
100
104
  }
101
234
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzCholesky<double>(FuzzedDataProvider*)
Line
Count
Source
74
242
void fuzzCholesky(FuzzedDataProvider* stream) {
75
242
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
242
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
85.8k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
85.6k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
85.6k
  }
80
81
  // LLT
82
242
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
242
  if (llt.info() == Eigen::Success) {
84
22
    (void)llt.matrixL();
85
22
    (void)llt.matrixU();
86
22
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
22
    (void)llt.solve(b);
88
22
  }
89
90
  // LDLT
91
242
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
242
  if (ldlt.info() == Eigen::Success) {
93
111
    (void)ldlt.matrixL();
94
111
    (void)ldlt.matrixU();
95
111
    (void)ldlt.vectorD();
96
111
    (void)ldlt.isPositive();
97
111
    (void)ldlt.isNegative();
98
111
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
111
    (void)ldlt.solve(b);
100
111
  }
101
242
}
102
103
template <typename Scalar>
104
2.12k
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
2.12k
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
2.12k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
500k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
497k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
497k
  }
110
111
  // EigenSolver
112
2.12k
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
2.12k
  if (es.info() == Eigen::Success) {
114
1.36k
    (void)es.eigenvalues();
115
1.36k
    (void)es.eigenvectors();
116
1.36k
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
2.12k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
2.12k
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
2.12k
  if (saes.info() == Eigen::Success) {
122
1.07k
    (void)saes.eigenvalues();
123
1.07k
    (void)saes.eigenvectors();
124
1.07k
  }
125
2.12k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzEigenvalues<float>(FuzzedDataProvider*)
Line
Count
Source
104
950
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
950
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
950
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
243k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
242k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
242k
  }
110
111
  // EigenSolver
112
950
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
950
  if (es.info() == Eigen::Success) {
114
575
    (void)es.eigenvalues();
115
575
    (void)es.eigenvectors();
116
575
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
950
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
950
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
950
  if (saes.info() == Eigen::Success) {
122
404
    (void)saes.eigenvalues();
123
404
    (void)saes.eigenvectors();
124
404
  }
125
950
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzEigenvalues<double>(FuzzedDataProvider*)
Line
Count
Source
104
1.17k
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
1.17k
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
1.17k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
256k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
255k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
255k
  }
110
111
  // EigenSolver
112
1.17k
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
1.17k
  if (es.info() == Eigen::Success) {
114
786
    (void)es.eigenvalues();
115
786
    (void)es.eigenvectors();
116
786
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
1.17k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
1.17k
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
1.17k
  if (saes.info() == Eigen::Success) {
122
670
    (void)saes.eigenvalues();
123
670
    (void)saes.eigenvectors();
124
670
  }
125
1.17k
}
126
127
template <typename Scalar>
128
3.31k
void fuzzSVD(FuzzedDataProvider* stream) {
129
3.31k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
3.31k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
3.31k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
1.60M
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
1.60M
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
1.60M
  }
135
136
  // JacobiSVD
137
3.31k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
3.31k
  if (svd.info() == Eigen::Success) {
139
3.31k
    (void)svd.singularValues();
140
3.31k
    (void)svd.matrixU();
141
3.31k
    (void)svd.matrixV();
142
3.31k
  }
143
144
  // BDCSVD
145
3.31k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
3.31k
  if (bdcsvd.info() == Eigen::Success) {
147
3.31k
    (void)bdcsvd.singularValues();
148
3.31k
    (void)bdcsvd.matrixU();
149
3.31k
    (void)bdcsvd.matrixV();
150
3.31k
  }
151
3.31k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzSVD<float>(FuzzedDataProvider*)
Line
Count
Source
128
1.56k
void fuzzSVD(FuzzedDataProvider* stream) {
129
1.56k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
1.56k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
1.56k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
782k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
780k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
780k
  }
135
136
  // JacobiSVD
137
1.56k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
1.56k
  if (svd.info() == Eigen::Success) {
139
1.56k
    (void)svd.singularValues();
140
1.56k
    (void)svd.matrixU();
141
1.56k
    (void)svd.matrixV();
142
1.56k
  }
143
144
  // BDCSVD
145
1.56k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
1.56k
  if (bdcsvd.info() == Eigen::Success) {
147
1.56k
    (void)bdcsvd.singularValues();
148
1.56k
    (void)bdcsvd.matrixU();
149
1.56k
    (void)bdcsvd.matrixV();
150
1.56k
  }
151
1.56k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzSVD<double>(FuzzedDataProvider*)
Line
Count
Source
128
1.75k
void fuzzSVD(FuzzedDataProvider* stream) {
129
1.75k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
1.75k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
1.75k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
827k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
825k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
825k
  }
135
136
  // JacobiSVD
137
1.75k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
1.75k
  if (svd.info() == Eigen::Success) {
139
1.75k
    (void)svd.singularValues();
140
1.75k
    (void)svd.matrixU();
141
1.75k
    (void)svd.matrixV();
142
1.75k
  }
143
144
  // BDCSVD
145
1.75k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
1.75k
  if (bdcsvd.info() == Eigen::Success) {
147
1.75k
    (void)bdcsvd.singularValues();
148
1.75k
    (void)bdcsvd.matrixU();
149
1.75k
    (void)bdcsvd.matrixV();
150
1.75k
  }
151
1.75k
}
152
153
} // namespace
154
155
6.98k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
156
6.98k
  FuzzedDataProvider stream(data, size);
157
158
6.98k
  uint8_t type = stream.ConsumeIntegral<uint8_t>();
159
  // 0: QR<float>, 1: QR<double>, 2: LU<float>, 3: LU<double>,
160
  // 4: Cholesky<float>, 5: Cholesky<double>, 6: Eigenvalues<float>, 7: Eigenvalues<double>,
161
  // 8: SVD<float>, 9: SVD<double>
162
6.98k
  switch (type % 10) {
163
343
    case 0:
164
343
      fuzzQR<float>(&stream);
165
343
      break;
166
313
    case 1:
167
313
      fuzzQR<double>(&stream);
168
313
      break;
169
217
    case 2:
170
217
      fuzzLU<float>(&stream);
171
217
      break;
172
196
    case 3:
173
196
      fuzzLU<double>(&stream);
174
196
      break;
175
234
    case 4:
176
234
      fuzzCholesky<float>(&stream);
177
234
      break;
178
242
    case 5:
179
242
      fuzzCholesky<double>(&stream);
180
242
      break;
181
950
    case 6:
182
950
      fuzzEigenvalues<float>(&stream);
183
950
      break;
184
1.17k
    case 7:
185
1.17k
      fuzzEigenvalues<double>(&stream);
186
1.17k
      break;
187
1.56k
    case 8:
188
1.56k
      fuzzSVD<float>(&stream);
189
1.56k
      break;
190
1.75k
    case 9:
191
1.75k
      fuzzSVD<double>(&stream);
192
1.75k
      break;
193
6.98k
  }
194
195
6.98k
  return 0;
196
6.98k
}