// 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 #include #include #include using namespace Eigen; typedef double Scalar; typedef SparseMatrix SpMat; static SpMat makeWeakPivotMatrix(Index rows) { eigen_assert(rows >= 2); std::vector > triplets; triplets.reserve(static_cast(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 > triplets; triplets.reserve(static_cast(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 > 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 > 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);