blob: 806f0d982dc5a759895d377f14d4327cc60bad99 [file] [edit]
// 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);