Coverage Report

Created: 2026-07-25 06:07

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
474
void fuzzQR(FuzzedDataProvider* stream) {
29
474
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
474
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
474
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
130k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
130k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
130k
  }
36
37
  // HouseholderQR
38
474
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
474
  (void)qr.householderQ();
40
474
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
474
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
474
  (void)cpqr.rank();
45
474
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
474
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
474
  (void)fpqr.rank();
50
474
  (void)fpqr.isInvertible();
51
474
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzQR<float>(FuzzedDataProvider*)
Line
Count
Source
28
232
void fuzzQR(FuzzedDataProvider* stream) {
29
232
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
232
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
232
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
61.7k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
61.5k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
61.5k
  }
36
37
  // HouseholderQR
38
232
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
232
  (void)qr.householderQ();
40
232
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
232
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
232
  (void)cpqr.rank();
45
232
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
232
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
232
  (void)fpqr.rank();
50
232
  (void)fpqr.isInvertible();
51
232
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzQR<double>(FuzzedDataProvider*)
Line
Count
Source
28
242
void fuzzQR(FuzzedDataProvider* stream) {
29
242
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
242
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
242
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
69.1k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
68.8k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
68.8k
  }
36
37
  // HouseholderQR
38
242
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
242
  (void)qr.householderQ();
40
242
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
242
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
242
  (void)cpqr.rank();
45
242
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
242
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
242
  (void)fpqr.rank();
50
242
  (void)fpqr.isInvertible();
51
242
}
52
53
template <typename Scalar>
54
391
void fuzzLU(FuzzedDataProvider* stream) {
55
391
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
391
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
134k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
134k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
134k
  }
60
61
  // PartialPivLU
62
391
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
391
  (void)plu.determinant();
64
391
  (void)plu.inverse();
65
66
  // FullPivLU
67
391
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
391
  (void)flu.determinant();
69
391
  (void)flu.inverse();
70
391
  (void)flu.rank();
71
391
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzLU<float>(FuzzedDataProvider*)
Line
Count
Source
54
216
void fuzzLU(FuzzedDataProvider* stream) {
55
216
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
216
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
75.1k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
74.9k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
74.9k
  }
60
61
  // PartialPivLU
62
216
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
216
  (void)plu.determinant();
64
216
  (void)plu.inverse();
65
66
  // FullPivLU
67
216
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
216
  (void)flu.determinant();
69
216
  (void)flu.inverse();
70
216
  (void)flu.rank();
71
216
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzLU<double>(FuzzedDataProvider*)
Line
Count
Source
54
175
void fuzzLU(FuzzedDataProvider* stream) {
55
175
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
175
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
59.2k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
59.1k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
59.1k
  }
60
61
  // PartialPivLU
62
175
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
175
  (void)plu.determinant();
64
175
  (void)plu.inverse();
65
66
  // FullPivLU
67
175
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
175
  (void)flu.determinant();
69
175
  (void)flu.inverse();
70
175
  (void)flu.rank();
71
175
}
72
73
template <typename Scalar>
74
500
void fuzzCholesky(FuzzedDataProvider* stream) {
75
500
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
500
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
178k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
177k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
177k
  }
80
81
  // LLT
82
500
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
500
  if (llt.info() == Eigen::Success) {
84
49
    (void)llt.matrixL();
85
49
    (void)llt.matrixU();
86
49
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
49
    (void)llt.solve(b);
88
49
  }
89
90
  // LDLT
91
500
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
500
  if (ldlt.info() == Eigen::Success) {
93
135
    (void)ldlt.matrixL();
94
135
    (void)ldlt.matrixU();
95
135
    (void)ldlt.vectorD();
96
135
    (void)ldlt.isPositive();
97
135
    (void)ldlt.isNegative();
98
135
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
135
    (void)ldlt.solve(b);
100
135
  }
101
500
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzCholesky<float>(FuzzedDataProvider*)
Line
Count
Source
74
260
void fuzzCholesky(FuzzedDataProvider* stream) {
75
260
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
260
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
90.0k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
89.7k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
89.7k
  }
80
81
  // LLT
82
260
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
260
  if (llt.info() == Eigen::Success) {
84
26
    (void)llt.matrixL();
85
26
    (void)llt.matrixU();
86
26
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
26
    (void)llt.solve(b);
88
26
  }
89
90
  // LDLT
91
260
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
260
  if (ldlt.info() == Eigen::Success) {
93
71
    (void)ldlt.matrixL();
94
71
    (void)ldlt.matrixU();
95
71
    (void)ldlt.vectorD();
96
71
    (void)ldlt.isPositive();
97
71
    (void)ldlt.isNegative();
98
71
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
71
    (void)ldlt.solve(b);
100
71
  }
101
260
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzCholesky<double>(FuzzedDataProvider*)
Line
Count
Source
74
240
void fuzzCholesky(FuzzedDataProvider* stream) {
75
240
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
240
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
88.0k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
87.8k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
87.8k
  }
80
81
  // LLT
82
240
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
240
  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
240
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
240
  if (ldlt.info() == Eigen::Success) {
93
64
    (void)ldlt.matrixL();
94
64
    (void)ldlt.matrixU();
95
64
    (void)ldlt.vectorD();
96
64
    (void)ldlt.isPositive();
97
64
    (void)ldlt.isNegative();
98
64
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
64
    (void)ldlt.solve(b);
100
64
  }
101
240
}
102
103
template <typename Scalar>
104
1.41k
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
1.41k
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
1.41k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
445k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
444k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
444k
  }
110
111
  // EigenSolver
112
1.41k
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
1.41k
  if (es.info() == Eigen::Success) {
114
741
    (void)es.eigenvalues();
115
741
    (void)es.eigenvectors();
116
741
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
1.41k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
1.41k
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
1.41k
  if (saes.info() == Eigen::Success) {
122
492
    (void)saes.eigenvalues();
123
492
    (void)saes.eigenvectors();
124
492
  }
125
1.41k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzEigenvalues<float>(FuzzedDataProvider*)
Line
Count
Source
104
767
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
767
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
767
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
243k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
243k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
243k
  }
110
111
  // EigenSolver
112
767
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
767
  if (es.info() == Eigen::Success) {
114
393
    (void)es.eigenvalues();
115
393
    (void)es.eigenvectors();
116
393
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
767
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
767
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
767
  if (saes.info() == Eigen::Success) {
122
266
    (void)saes.eigenvalues();
123
266
    (void)saes.eigenvectors();
124
266
  }
125
767
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzEigenvalues<double>(FuzzedDataProvider*)
Line
Count
Source
104
646
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
646
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
646
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
201k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
201k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
201k
  }
110
111
  // EigenSolver
112
646
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
646
  if (es.info() == Eigen::Success) {
114
348
    (void)es.eigenvalues();
115
348
    (void)es.eigenvectors();
116
348
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
646
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
646
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
646
  if (saes.info() == Eigen::Success) {
122
226
    (void)saes.eigenvalues();
123
226
    (void)saes.eigenvectors();
124
226
  }
125
646
}
126
127
template <typename Scalar>
128
1.67k
void fuzzSVD(FuzzedDataProvider* stream) {
129
1.67k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
1.67k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
1.67k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
931k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
929k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
929k
  }
135
136
  // JacobiSVD
137
1.67k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
1.67k
  if (svd.info() == Eigen::Success) {
139
1.67k
    (void)svd.singularValues();
140
1.67k
    (void)svd.matrixU();
141
1.67k
    (void)svd.matrixV();
142
1.67k
  }
143
144
  // BDCSVD
145
1.67k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
1.67k
  if (bdcsvd.info() == Eigen::Success) {
147
1.67k
    (void)bdcsvd.singularValues();
148
1.67k
    (void)bdcsvd.matrixU();
149
1.67k
    (void)bdcsvd.matrixV();
150
1.67k
  }
151
1.67k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzSVD<float>(FuzzedDataProvider*)
Line
Count
Source
128
883
void fuzzSVD(FuzzedDataProvider* stream) {
129
883
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
883
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
883
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
476k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
475k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
475k
  }
135
136
  // JacobiSVD
137
883
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
883
  if (svd.info() == Eigen::Success) {
139
883
    (void)svd.singularValues();
140
883
    (void)svd.matrixU();
141
883
    (void)svd.matrixV();
142
883
  }
143
144
  // BDCSVD
145
883
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
883
  if (bdcsvd.info() == Eigen::Success) {
147
883
    (void)bdcsvd.singularValues();
148
883
    (void)bdcsvd.matrixU();
149
883
    (void)bdcsvd.matrixV();
150
883
  }
151
883
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzSVD<double>(FuzzedDataProvider*)
Line
Count
Source
128
791
void fuzzSVD(FuzzedDataProvider* stream) {
129
791
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
791
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
791
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
455k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
454k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
454k
  }
135
136
  // JacobiSVD
137
791
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
791
  if (svd.info() == Eigen::Success) {
139
791
    (void)svd.singularValues();
140
791
    (void)svd.matrixU();
141
791
    (void)svd.matrixV();
142
791
  }
143
144
  // BDCSVD
145
791
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
791
  if (bdcsvd.info() == Eigen::Success) {
147
791
    (void)bdcsvd.singularValues();
148
791
    (void)bdcsvd.matrixU();
149
791
    (void)bdcsvd.matrixV();
150
791
  }
151
791
}
152
153
} // namespace
154
155
4.45k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
156
4.45k
  FuzzedDataProvider stream(data, size);
157
158
4.45k
  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
4.45k
  switch (type % 10) {
163
232
    case 0:
164
232
      fuzzQR<float>(&stream);
165
232
      break;
166
242
    case 1:
167
242
      fuzzQR<double>(&stream);
168
242
      break;
169
216
    case 2:
170
216
      fuzzLU<float>(&stream);
171
216
      break;
172
175
    case 3:
173
175
      fuzzLU<double>(&stream);
174
175
      break;
175
260
    case 4:
176
260
      fuzzCholesky<float>(&stream);
177
260
      break;
178
240
    case 5:
179
240
      fuzzCholesky<double>(&stream);
180
240
      break;
181
767
    case 6:
182
767
      fuzzEigenvalues<float>(&stream);
183
767
      break;
184
646
    case 7:
185
646
      fuzzEigenvalues<double>(&stream);
186
646
      break;
187
883
    case 8:
188
883
      fuzzSVD<float>(&stream);
189
883
      break;
190
791
    case 9:
191
791
      fuzzSVD<double>(&stream);
192
791
      break;
193
4.45k
  }
194
195
4.45k
  return 0;
196
4.45k
}