Coverage Report

Created: 2026-10-05 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
662
void fuzzQR(FuzzedDataProvider* stream) {
29
662
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
662
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
662
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
191k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
190k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
190k
  }
36
37
  // HouseholderQR
38
662
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
662
  (void)qr.householderQ();
40
662
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
662
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
662
  (void)cpqr.rank();
45
662
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
662
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
662
  (void)fpqr.rank();
50
662
  (void)fpqr.isInvertible();
51
662
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzQR<float>(FuzzedDataProvider*)
Line
Count
Source
28
331
void fuzzQR(FuzzedDataProvider* stream) {
29
331
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
331
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
331
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
95.4k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
95.0k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
95.0k
  }
36
37
  // HouseholderQR
38
331
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
331
  (void)qr.householderQ();
40
331
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
331
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
331
  (void)cpqr.rank();
45
331
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
331
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
331
  (void)fpqr.rank();
50
331
  (void)fpqr.isInvertible();
51
331
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzQR<double>(FuzzedDataProvider*)
Line
Count
Source
28
331
void fuzzQR(FuzzedDataProvider* stream) {
29
331
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
30
331
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
31
32
331
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
33
96.1k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
34
95.8k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
35
95.8k
  }
36
37
  // HouseholderQR
38
331
  Eigen::HouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> qr(m);
39
331
  (void)qr.householderQ();
40
331
  (void)qr.matrixQR().template triangularView<Eigen::Upper>();
41
42
  // ColPivHouseholderQR
43
331
  Eigen::ColPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> cpqr(m);
44
331
  (void)cpqr.rank();
45
331
  (void)cpqr.isInvertible();
46
47
  // FullPivHouseholderQR
48
331
  Eigen::FullPivHouseholderQR<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> fpqr(m);
49
331
  (void)fpqr.rank();
50
331
  (void)fpqr.isInvertible();
51
331
}
52
53
template <typename Scalar>
54
409
void fuzzLU(FuzzedDataProvider* stream) {
55
409
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
409
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
175k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
175k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
175k
  }
60
61
  // PartialPivLU
62
409
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
409
  (void)plu.determinant();
64
409
  (void)plu.inverse();
65
66
  // FullPivLU
67
409
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
409
  (void)flu.determinant();
69
409
  (void)flu.inverse();
70
409
  (void)flu.rank();
71
409
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzLU<float>(FuzzedDataProvider*)
Line
Count
Source
54
224
void fuzzLU(FuzzedDataProvider* stream) {
55
224
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
224
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
97.8k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
97.6k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
97.6k
  }
60
61
  // PartialPivLU
62
224
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
224
  (void)plu.determinant();
64
224
  (void)plu.inverse();
65
66
  // FullPivLU
67
224
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
224
  (void)flu.determinant();
69
224
  (void)flu.inverse();
70
224
  (void)flu.rank();
71
224
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzLU<double>(FuzzedDataProvider*)
Line
Count
Source
54
185
void fuzzLU(FuzzedDataProvider* stream) {
55
185
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
56
185
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
57
77.9k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
58
77.7k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
59
77.7k
  }
60
61
  // PartialPivLU
62
185
  Eigen::PartialPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> plu(m);
63
185
  (void)plu.determinant();
64
185
  (void)plu.inverse();
65
66
  // FullPivLU
67
185
  Eigen::FullPivLU<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> flu(m);
68
185
  (void)flu.determinant();
69
185
  (void)flu.inverse();
70
185
  (void)flu.rank();
71
185
}
72
73
template <typename Scalar>
74
514
void fuzzCholesky(FuzzedDataProvider* stream) {
75
514
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
514
  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
514
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
514
  if (llt.info() == Eigen::Success) {
84
53
    (void)llt.matrixL();
85
53
    (void)llt.matrixU();
86
53
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
53
    (void)llt.solve(b);
88
53
  }
89
90
  // LDLT
91
514
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
514
  if (ldlt.info() == Eigen::Success) {
93
124
    (void)ldlt.matrixL();
94
124
    (void)ldlt.matrixU();
95
124
    (void)ldlt.vectorD();
96
124
    (void)ldlt.isPositive();
97
124
    (void)ldlt.isNegative();
98
124
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
124
    (void)ldlt.solve(b);
100
124
  }
101
514
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzCholesky<float>(FuzzedDataProvider*)
Line
Count
Source
74
279
void fuzzCholesky(FuzzedDataProvider* stream) {
75
279
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
279
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
77
107k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
78
107k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
79
107k
  }
80
81
  // LLT
82
279
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
279
  if (llt.info() == Eigen::Success) {
84
29
    (void)llt.matrixL();
85
29
    (void)llt.matrixU();
86
29
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
87
29
    (void)llt.solve(b);
88
29
  }
89
90
  // LDLT
91
279
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
279
  if (ldlt.info() == Eigen::Success) {
93
62
    (void)ldlt.matrixL();
94
62
    (void)ldlt.matrixU();
95
62
    (void)ldlt.vectorD();
96
62
    (void)ldlt.isPositive();
97
62
    (void)ldlt.isNegative();
98
62
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
62
    (void)ldlt.solve(b);
100
62
  }
101
279
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzCholesky<double>(FuzzedDataProvider*)
Line
Count
Source
74
235
void fuzzCholesky(FuzzedDataProvider* stream) {
75
235
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
76
235
  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
235
  Eigen::LLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> llt(m);
83
235
  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
235
  Eigen::LDLT<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> ldlt(m);
92
235
  if (ldlt.info() == Eigen::Success) {
93
62
    (void)ldlt.matrixL();
94
62
    (void)ldlt.matrixU();
95
62
    (void)ldlt.vectorD();
96
62
    (void)ldlt.isPositive();
97
62
    (void)ldlt.isNegative();
98
62
    Eigen::Matrix<Scalar, Eigen::Dynamic, 1> b = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>::Random(size);
99
62
    (void)ldlt.solve(b);
100
62
  }
101
235
}
102
103
template <typename Scalar>
104
2.15k
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
2.15k
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
2.15k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
527k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
524k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
524k
  }
110
111
  // EigenSolver
112
2.15k
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
2.15k
  if (es.info() == Eigen::Success) {
114
1.41k
    (void)es.eigenvalues();
115
1.41k
    (void)es.eigenvectors();
116
1.41k
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
2.15k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
2.15k
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
2.15k
  if (saes.info() == Eigen::Success) {
122
1.08k
    (void)saes.eigenvalues();
123
1.08k
    (void)saes.eigenvectors();
124
1.08k
  }
125
2.15k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzEigenvalues<float>(FuzzedDataProvider*)
Line
Count
Source
104
992
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
992
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
992
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
257k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
256k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
256k
  }
110
111
  // EigenSolver
112
992
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
992
  if (es.info() == Eigen::Success) {
114
590
    (void)es.eigenvalues();
115
590
    (void)es.eigenvectors();
116
590
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
992
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
992
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
992
  if (saes.info() == Eigen::Success) {
122
427
    (void)saes.eigenvalues();
123
427
    (void)saes.eigenvectors();
124
427
  }
125
992
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzEigenvalues<double>(FuzzedDataProvider*)
Line
Count
Source
104
1.16k
void fuzzEigenvalues(FuzzedDataProvider* stream) {
105
1.16k
  Eigen::Index size = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
106
1.16k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(size, size);
107
270k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
108
268k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
109
268k
  }
110
111
  // EigenSolver
112
1.16k
  Eigen::EigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> es(m);
113
1.16k
  if (es.info() == Eigen::Success) {
114
826
    (void)es.eigenvalues();
115
826
    (void)es.eigenvectors();
116
826
  }
117
118
  // SelfAdjointEigenSolver (on a symmetric matrix)
119
1.16k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> symm = m + m.transpose();
120
1.16k
  Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> saes(symm);
121
1.16k
  if (saes.info() == Eigen::Success) {
122
655
    (void)saes.eigenvalues();
123
655
    (void)saes.eigenvectors();
124
655
  }
125
1.16k
}
126
127
template <typename Scalar>
128
3.32k
void fuzzSVD(FuzzedDataProvider* stream) {
129
3.32k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
3.32k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
3.32k
  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.32k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
3.32k
  if (svd.info() == Eigen::Success) {
139
3.32k
    (void)svd.singularValues();
140
3.32k
    (void)svd.matrixU();
141
3.32k
    (void)svd.matrixV();
142
3.32k
  }
143
144
  // BDCSVD
145
3.32k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
3.32k
  if (bdcsvd.info() == Eigen::Success) {
147
3.32k
    (void)bdcsvd.singularValues();
148
3.32k
    (void)bdcsvd.matrixU();
149
3.32k
    (void)bdcsvd.matrixV();
150
3.32k
  }
151
3.32k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzSVD<float>(FuzzedDataProvider*)
Line
Count
Source
128
1.53k
void fuzzSVD(FuzzedDataProvider* stream) {
129
1.53k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
1.53k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
1.53k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
764k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
762k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
762k
  }
135
136
  // JacobiSVD
137
1.53k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
1.53k
  if (svd.info() == Eigen::Success) {
139
1.53k
    (void)svd.singularValues();
140
1.53k
    (void)svd.matrixU();
141
1.53k
    (void)svd.matrixV();
142
1.53k
  }
143
144
  // BDCSVD
145
1.53k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
1.53k
  if (bdcsvd.info() == Eigen::Success) {
147
1.53k
    (void)bdcsvd.singularValues();
148
1.53k
    (void)bdcsvd.matrixU();
149
1.53k
    (void)bdcsvd.matrixV();
150
1.53k
  }
151
1.53k
}
dense_solver_fuzzer.cc:void (anonymous namespace)::fuzzSVD<double>(FuzzedDataProvider*)
Line
Count
Source
128
1.78k
void fuzzSVD(FuzzedDataProvider* stream) {
129
1.78k
  Eigen::Index rows = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
130
1.78k
  Eigen::Index cols = stream->ConsumeIntegralInRange<Eigen::Index>(1, kEigenTestMaxSize);
131
1.78k
  Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> m(rows, cols);
132
845k
  for (Eigen::Index i = 0; i < m.size(); ++i) {
133
843k
    m(i) = stream->ConsumeFloatingPoint<Scalar>();
134
843k
  }
135
136
  // JacobiSVD
137
1.78k
  Eigen::JacobiSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
138
1.78k
  if (svd.info() == Eigen::Success) {
139
1.78k
    (void)svd.singularValues();
140
1.78k
    (void)svd.matrixU();
141
1.78k
    (void)svd.matrixV();
142
1.78k
  }
143
144
  // BDCSVD
145
1.78k
  Eigen::BDCSVD<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>> bdcsvd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
146
1.78k
  if (bdcsvd.info() == Eigen::Success) {
147
1.78k
    (void)bdcsvd.singularValues();
148
1.78k
    (void)bdcsvd.matrixU();
149
1.78k
    (void)bdcsvd.matrixV();
150
1.78k
  }
151
1.78k
}
152
153
} // namespace
154
155
7.06k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
156
7.06k
  FuzzedDataProvider stream(data, size);
157
158
7.06k
  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
7.06k
  switch (type % 10) {
163
331
    case 0:
164
331
      fuzzQR<float>(&stream);
165
331
      break;
166
331
    case 1:
167
331
      fuzzQR<double>(&stream);
168
331
      break;
169
224
    case 2:
170
224
      fuzzLU<float>(&stream);
171
224
      break;
172
185
    case 3:
173
185
      fuzzLU<double>(&stream);
174
185
      break;
175
279
    case 4:
176
279
      fuzzCholesky<float>(&stream);
177
279
      break;
178
235
    case 5:
179
235
      fuzzCholesky<double>(&stream);
180
235
      break;
181
992
    case 6:
182
992
      fuzzEigenvalues<float>(&stream);
183
992
      break;
184
1.16k
    case 7:
185
1.16k
      fuzzEigenvalues<double>(&stream);
186
1.16k
      break;
187
1.53k
    case 8:
188
1.53k
      fuzzSVD<float>(&stream);
189
1.53k
      break;
190
1.78k
    case 9:
191
1.78k
      fuzzSVD<double>(&stream);
192
1.78k
      break;
193
7.06k
  }
194
195
7.06k
  return 0;
196
7.06k
}