84 lines
2.5 KiB
C++
84 lines
2.5 KiB
C++
// 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);
|