Coverage Report

Created: 2026-09-14 07:13

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
615
void fuzzQR(FuzzedDataProvider* stream) {
29
615
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
615
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
615
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
166k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
165k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
165k
  }
36
37
  // HouseholderQR
38
615
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
615
  (void)qr.householderQ();
40
615
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
615
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
615
  (void)cpqr.rank();
45
615
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
615
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
615
  (void)fpqr.rank();
50
615
  (void)fpqr.isInvertible();
51
615
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzQR<float>(FuzzedDataProvider*)
Line
Count
Source
28
311
void fuzzQR(FuzzedDataProvider* stream) {
29
311
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
311
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
311
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
82.1k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
81.8k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
81.8k
  }
36
37
  // HouseholderQR
38
311
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
311
  (void)qr.householderQ();
40
311
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
311
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
311
  (void)cpqr.rank();
45
311
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
311
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
311
  (void)fpqr.rank();
50
311
  (void)fpqr.isInvertible();
51
311
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzQR<double>(FuzzedDataProvider*)
Line
Count
Source
28
304
void fuzzQR(FuzzedDataProvider* stream) {
29
304
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
304
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
304
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
84.1k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
83.8k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
83.8k
  }
36
37
  // HouseholderQR
38
304
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
304
  (void)qr.householderQ();
40
304
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
304
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
304
  (void)cpqr.rank();
45
304
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
304
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
304
  (void)fpqr.rank();
50
304
  (void)fpqr.isInvertible();
51
304
}
52
53
template <typename Scalar>
54
423
void fuzzLU(FuzzedDataProvider* stream) {
55
423
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
423
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
184k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
184k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
184k
  }
60
61
  // PartialPivLU
62
423
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
423
  (void)plu.determinant();
64
423
  (void)plu.inverse();
65
66
  // FullPivLU
67
423
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
423
  (void)flu.determinant();
69
423
  (void)flu.inverse();
70
423
  (void)flu.rank();
71
423
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzLU<float>(FuzzedDataProvider*)
Line
Count
Source
54
227
void fuzzLU(FuzzedDataProvider* stream) {
55
227
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
227
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
98.0k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
97.8k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
97.8k
  }
60
61
  // PartialPivLU
62
227
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
227
  (void)plu.determinant();
64
227
  (void)plu.inverse();
65
66
  // FullPivLU
67
227
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
227
  (void)flu.determinant();
69
227
  (void)flu.inverse();
70
227
  (void)flu.rank();
71
227
}
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
86.6k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
86.4k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
86.4k
  }
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
515
void fuzzCholesky(FuzzedDataProvider* stream) {
75
515
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
515
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
189k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
188k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
188k
  }
80
81
  // LLT
82
515
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
515
  if (llt.info() == Eigen::Success) {
84
44
    (void)llt.matrixL();
85
44
    (void)llt.matrixU();
86
44
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
44
    (void)llt.solve(b);
88
44
  }
89
90
  // LDLT
91
515
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
515
  if (ldlt.info() == Eigen::Success) {
93
129
    (void)ldlt.matrixL();
94
129
    (void)ldlt.matrixU();
95
129
    (void)ldlt.vectorD();
96
129
    (void)ldlt.isPositive();
97
129
    (void)ldlt.isNegative();
98
129
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
129
    (void)ldlt.solve(b);
100
129
  }
101
515
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzCholesky<float>(FuzzedDataProvider*)
Line
Count
Source
74
274
void fuzzCholesky(FuzzedDataProvider* stream) {
75
274
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
274
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
102k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
101k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
101k
  }
80
81
  // LLT
82
274
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
274
  if (llt.info() == Eigen::Success) {
84
24
    (void)llt.matrixL();
85
24
    (void)llt.matrixU();
86
24
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
24
    (void)llt.solve(b);
88
24
  }
89
90
  // LDLT
91
274
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
274
  if (ldlt.info() == Eigen::Success) {
93
63
    (void)ldlt.matrixL();
94
63
    (void)ldlt.matrixU();
95
63
    (void)ldlt.vectorD();
96
63
    (void)ldlt.isPositive();
97
63
    (void)ldlt.isNegative();
98
63
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
63
    (void)ldlt.solve(b);
100
63
  }
101
274
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzCholesky<double>(FuzzedDataProvider*)
Line
Count
Source
74
241
void fuzzCholesky(FuzzedDataProvider* stream) {
75
241
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
241
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
87.1k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
86.9k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
86.9k
  }
80
81
  // LLT
82
241
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
241
  if (llt.info() == Eigen::Success) {
84
20
    (void)llt.matrixL();
85
20
    (void)llt.matrixU();
86
20
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
20
    (void)llt.solve(b);
88
20
  }
89
90
  // LDLT
91
241
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
241
  if (ldlt.info() == Eigen::Success) {
93
66
    (void)ldlt.matrixL();
94
66
    (void)ldlt.matrixU();
95
66
    (void)ldlt.vectorD();
96
66
    (void)ldlt.isPositive();
97
66
    (void)ldlt.isNegative();
98
66
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
66
    (void)ldlt.solve(b);
100
66
  }
101
241
}
102
103
template <typename Scalar>
104
1.49k
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
1.49k
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
1.49k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
475k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
474k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
474k
  }
110
111
  // EigenSolver
112
1.49k
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
1.49k
  if (es.info() == Eigen::Success) {
114
812
    (void)es.eigenvalues();
115
812
    (void)es.eigenvectors();
116
812
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
1.49k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
1.49k
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
1.49k
  if (saes.info() == Eigen::Success) {
122
519
    (void)saes.eigenvalues();
123
519
    (void)saes.eigenvectors();
124
519
  }
125
1.49k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzEigenvalues<float>(FuzzedDataProvider*)
Line
Count
Source
104
801
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
801
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
801
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
260k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
259k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
259k
  }
110
111
  // EigenSolver
112
801
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
801
  if (es.info() == Eigen::Success) {
114
425
    (void)es.eigenvalues();
115
425
    (void)es.eigenvectors();
116
425
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
801
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
801
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
801
  if (saes.info() == Eigen::Success) {
122
261
    (void)saes.eigenvalues();
123
261
    (void)saes.eigenvectors();
124
261
  }
125
801
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzEigenvalues<double>(FuzzedDataProvider*)
Line
Count
Source
104
698
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
698
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
698
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
215k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
214k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
214k
  }
110
111
  // EigenSolver
112
698
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
698
  if (es.info() == Eigen::Success) {
114
387
    (void)es.eigenvalues();
115
387
    (void)es.eigenvectors();
116
387
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
698
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
698
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
698
  if (saes.info() == Eigen::Success) {
122
258
    (void)saes.eigenvalues();
123
258
    (void)saes.eigenvectors();
124
258
  }
125
698
}
126
127
template <typename Scalar>
128
2.12k
void fuzzSVD(FuzzedDataProvider* stream) {
129
2.12k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
2.12k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
2.12k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
1.29M
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
1.29M
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
1.29M
  }
135
136
  // JacobiSVD
137
2.12k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
2.12k
  if (svd.info() == Eigen::Success) {
139
2.12k
    (void)svd.singularValues();
140
2.12k
    (void)svd.matrixU();
141
2.12k
    (void)svd.matrixV();
142
2.12k
  }
143
144
  // BDCSVD
145
2.12k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
2.12k
  if (bdcsvd.info() == Eigen::Success) {
147
2.12k
    (void)bdcsvd.singularValues();
148
2.12k
    (void)bdcsvd.matrixU();
149
2.12k
    (void)bdcsvd.matrixV();
150
2.12k
  }
151
2.12k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzSVD<float>(FuzzedDataProvider*)
Line
Count
Source
128
1.12k
void fuzzSVD(FuzzedDataProvider* stream) {
129
1.12k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
1.12k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
1.12k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
667k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
666k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
666k
  }
135
136
  // JacobiSVD
137
1.12k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
1.12k
  if (svd.info() == Eigen::Success) {
139
1.12k
    (void)svd.singularValues();
140
1.12k
    (void)svd.matrixU();
141
1.12k
    (void)svd.matrixV();
142
1.12k
  }
143
144
  // BDCSVD
145
1.12k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
1.12k
  if (bdcsvd.info() == Eigen::Success) {
147
1.12k
    (void)bdcsvd.singularValues();
148
1.12k
    (void)bdcsvd.matrixU();
149
1.12k
    (void)bdcsvd.matrixV();
150
1.12k
  }
151
1.12k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzSVD<double>(FuzzedDataProvider*)
Line
Count
Source
128
1.00k
void fuzzSVD(FuzzedDataProvider* stream) {
129
1.00k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
1.00k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
1.00k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
626k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
625k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
625k
  }
135
136
  // JacobiSVD
137
1.00k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
1.00k
  if (svd.info() == Eigen::Success) {
139
1.00k
    (void)svd.singularValues();
140
1.00k
    (void)svd.matrixU();
141
1.00k
    (void)svd.matrixV();
142
1.00k
  }
143
144
  // BDCSVD
145
1.00k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
1.00k
  if (bdcsvd.info() == Eigen::Success) {
147
1.00k
    (void)bdcsvd.singularValues();
148
1.00k
    (void)bdcsvd.matrixU();
149
1.00k
    (void)bdcsvd.matrixV();
150
1.00k
  }
151
1.00k
}
152
153
} // namespace
154
155
5.17k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
156
5.17k
  FuzzedDataProvider stream(data, size);
157
158
5.17k
  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
5.17k
  switch (type % 10) {
163
311
    case 0:
164
311
      fuzzQR<float>(&stream);
165
311
      break;
166
304
    case 1:
167
304
      fuzzQR<double>(&stream);
168
304
      break;
169
227
    case 2:
170
227
      fuzzLU<float>(&stream);
171
227
      break;
172
196
    case 3:
173
196
      fuzzLU<double>(&stream);
174
196
      break;
175
274
    case 4:
176
274
      fuzzCholesky<float>(&stream);
177
274
      break;
178
241
    case 5:
179
241
      fuzzCholesky<double>(&stream);
180
241
      break;
181
801
    case 6:
182
801
      fuzzEigenvalues<float>(&stream);
183
801
      break;
184
698
    case 7:
185
698
      fuzzEigenvalues<double>(&stream);
186
698
      break;
187
1.12k
    case 8:
188
1.12k
      fuzzSVD<float>(&stream);
189
1.12k
      break;
190
1.00k
    case 9:
191
1.00k
      fuzzSVD<double>(&stream);
192
1.00k
      break;
193
5.17k
  }
194
195
5.17k
  return 0;
196
5.17k
}