| // This file is part of Eigen, a lightweight C++ template library |
| // for linear algebra. |
| // |
| // Copyright (C) 2026 The Eigen Authors |
| // |
| // This Source Code Form is subject to the terms of the Mozilla |
| // Public License v. 2.0. If a copy of the MPL was not distributed |
| // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| // SPDX-License-Identifier: MPL-2.0 |
| |
| #include <benchmark/benchmark.h> |
| |
| #include <Eigen/OrderingMethods> |
| #include <Eigen/SparseQR> |
| #include <vector> |
| |
| using namespace Eigen; |
| |
| typedef double Scalar; |
| typedef SparseMatrix<Scalar, ColMajor> SpMat; |
| |
| static SpMat makeWeakPivotMatrix(Index rows) { |
| eigen_assert(rows >= 2); |
| std::vector<Triplet<Scalar> > triplets; |
| triplets.reserve(static_cast<std::size_t>(2 * rows)); |
| |
| triplets.emplace_back(0, 0, 1.0); |
| triplets.emplace_back(0, 1, 1.0); |
| triplets.emplace_back(1, 1, 5e-13); |
| for (Index row = 1; row < rows; ++row) { |
| triplets.emplace_back(row, row + 1, 1.0); |
| } |
| |
| SpMat matrix(rows, rows + 1); |
| matrix.setFromTriplets(triplets.begin(), triplets.end()); |
| matrix.makeCompressed(); |
| return matrix; |
| } |
| |
| static SpMat makeRegularBandedMatrix(Index rows) { |
| std::vector<Triplet<Scalar> > triplets; |
| triplets.reserve(static_cast<std::size_t>(3 * rows)); |
| for (Index row = 0; row < rows; ++row) { |
| triplets.emplace_back(row, row, 2.0); |
| if (row + 1 < rows) { |
| triplets.emplace_back(row + 1, row, -0.5); |
| triplets.emplace_back(row, row + 1, 0.25); |
| } |
| } |
| |
| SpMat matrix(rows, rows); |
| matrix.setFromTriplets(triplets.begin(), triplets.end()); |
| matrix.makeCompressed(); |
| return matrix; |
| } |
| |
| static void BM_SparseQRWeakPivotLookAhead(benchmark::State& state) { |
| const Index rows = state.range(0); |
| const SpMat matrix = makeWeakPivotMatrix(rows); |
| |
| for (auto _ : state) { |
| SparseQR<SpMat, NaturalOrdering<int> > solver; |
| solver.compute(matrix); |
| benchmark::DoNotOptimize(solver.rank()); |
| benchmark::DoNotOptimize(solver.lastPivotLookAheadSkipped()); |
| } |
| state.SetItemsProcessed(state.iterations() * rows); |
| } |
| |
| static void BM_SparseQRRegularBanded(benchmark::State& state) { |
| const Index rows = state.range(0); |
| const SpMat matrix = makeRegularBandedMatrix(rows); |
| |
| for (auto _ : state) { |
| SparseQR<SpMat, NaturalOrdering<int> > solver; |
| solver.compute(matrix); |
| benchmark::DoNotOptimize(solver.rank()); |
| } |
| state.SetItemsProcessed(state.iterations() * rows); |
| } |
| |
| BENCHMARK(BM_SparseQRWeakPivotLookAhead)->Arg(8)->Arg(32)->Arg(64)->Arg(128); |
| BENCHMARK(BM_SparseQRRegularBanded)->Arg(8)->Arg(32)->Arg(64)->Arg(128); |