blob: 2915dedee850202c4e0fef0d1be2e0461c39e4e3 [file]
# CodeRabbit configuration for Eigen.
# Schema: https://docs.coderabbit.ai/reference/configuration
#
# Eigen is a header-only C++14 template library, GitLab-hosted, with a strict
# ABI policy and several major downstream consumers (notably TensorFlow). The
# settings below favor signal over volume: chill profile, minimal noise on
# auto-generated docs and vendored Fortran, and explicit guidance for the
# template-heavy core.
language: en-US
# CodeRabbit caps tone_instructions at 250 chars. Keep the essential
# focus areas here; the full reviewer guidance (provenance discipline,
# numerical-tolerance policy, GPU caveats, etc.) lives in AGENTS.md
# and is loaded via knowledge_base.code_guidelines.filePatterns below.
tone_instructions: >-
Eigen, header-only C++14. Focus: correctness, numerical accuracy
(LAPACK-level; flag regressions), ABI, performance, template pitfalls,
missing tests, uncited published algorithms (LAPACK, LAWN, Higham,
Golub & van Loan). Skip style nits and C++17+.
early_access: false
enable_free_tier: true
# Pull repo-level reviewer guidance from AGENTS.md (the agent-facing
# condensation of CONTRIBUTING + wiki). Set explicitly because the
# default filePatterns list may be inactive when no patterns are
# specified by the user.
knowledge_base:
code_guidelines:
enabled: true
filePatterns:
- "AGENTS.md"
reviews:
profile: chill
request_changes_workflow: false
# Trim down the noise in the auto-posted comment: drop sections that don't
# carry weight on a numerics-heavy template library. Keep the walkthrough
# (file-by-file summary) but skip the high-level summary, the changed-files
# overview, and don't collapse the walkthrough so reviewers see it expanded.
high_level_summary: false
high_level_summary_in_walkthrough: false
poem: false
review_status: true
collapse_walkthrough: false
changed_files_summary: false
enable_prompt_for_ai_agents: true
sequence_diagrams: false
estimate_code_review_effort: false
assess_linked_issues: false
related_issues: false
related_prs: false
suggested_labels: false
suggested_reviewers: false
in_progress_fortune: false
pre_merge_checks:
# Eigen is a header-only template library where docstring coverage
# has limited value; the docstrings precheck adds noise without signal.
docstrings:
mode: off
auto_review:
enabled: true
drafts: false
# Eigen MRs often see many WIP pushes; reviewing every push burns the
# per-developer hourly rate limit on the free/OSS tier. Review the first
# diff only; further reviews can be requested with `@coderabbitai review`.
auto_incremental_review: false
base_branches:
- master
path_filters:
- "!doc/snippets/**"
- "!doc/examples/**"
- "!lapack/*.f"
- "!blas/testing/**"
- "!**/*.png"
- "!**/*.bin"
- "!**/*.svg"
- "!**/*.pdf"
path_instructions:
- path: "**"
instructions: |
Repo-wide conventions (apply across all paths):
- **SPDX / REUSE.** Every new source file (`.h`, `.cpp`, `.cu`,
`.inc`, `.cmake`, `CMakeLists.txt`, etc.) must carry the
standard Eigen MPL-2.0 SPDX + copyright header inline. The
`checkformat:reuse` CI job (`reuse lint`) blocks otherwise.
Files that can't carry inline headers (top-level docs,
generated/templated files, binary assets) are covered by
path-based annotations in `REUSE.toml` — add the path there
if creating one.
- **GitLab is upstream**; the GitHub mirror is read-only. Do
not suggest opening PRs / pushing to GitHub.
- **Commit messages** follow `Category: Short description`
(e.g. `GPU: Fix special-function test coverage`).
- path: "Eigen/src/**"
instructions: |
Eigen is a header-only C++14 template library with a strict ABI policy.
- **Numerical accuracy is a top priority.** Eigen targets accuracy
comparable to established numerical libraries such as LAPACK. Flag
any change that may degrade accuracy, condition handling, stability
under near-singular / ill-conditioned inputs, or behavior near
subnormals, infinities, NaNs, or extreme exponents. In general,
do not trade accuracy for speed.
- **Acceptable accuracy tradeoff on regular inputs only.** A faster
algorithm whose worst-case error on regular inputs is bounded to
a few ULPs by a principled analysis may be acceptable. Surface
the tradeoff and the bound clearly so a human reviewer can judge;
do not auto-approve or auto-reject these. **Special-value handling
is not subject to the few-ULP tradeoff** — IEEE-754 entities (NaN,
±0, ±∞, subnormals) and standard-library edge cases (e.g. `log(0)`,
`pow(0, 0)`) must match the cppreference / IEEE 754 spec exactly.
- **Numerical changes require numerical tests.** Any new numerical
algorithm, kernel, or accuracy-sensitive change MUST come with
tests that exercise its accuracy claims: random ill-conditioned
inputs across a range of condition numbers, edge values, and
matrices structured for the algorithm (Hilbert, Vandermonde,
Pascal, Wilkinson's W, Frank, Lehmer, KMS / Toeplitz, banded,
rank-deficient, defective / near-defective Jordan blocks,
positive-definite-but-barely — MATLAB's `gallery()` is the
standard catalog; Higham's *Accuracy and Stability of Numerical
Algorithms* / *Functions of Matrices* and Golub & van Loan are
the references). For routines with a
LAPACK counterpart, match LAPACK's TESTING/ category coverage as
the bar. Quantify accuracy in ULPs against a scalar reference,
not just relative error. Sollya / MPFR are the standard tools
for ground-truth and polynomial generation; prefer in-C++ MPFR
verification over a Python reference. If such tests are missing,
request them.
- **Performance-sensitive changes ship with a benchmark** under
`benchmarks/` or `unsupported/benchmarks/`. Don't defer to a
follow-up MR.
- **Preserve `EIGEN_DEVICE_FUNC`.** It is pervasive on coefficient-
level methods so the same code compiles for host and CUDA / HIP /
SYCL device. Dropping it silently breaks GPU builds and is rarely
caught locally — flag any removal or omission on new methods.
- **Header-only contract.** Never include from `Eigen/src/...` (or
`unsupported/Eigen/src/...`) directly; reach implementation via
the umbrella module headers (`Eigen/Core`, `Eigen/Dense`, …).
`InternalHeaderCheck.h` makes direct internal includes a hard
error. Old internal headers do not get backward-compatibility
forwarding shims when moved/renamed; only the public umbrella
headers do.
- **Aliasing in fast paths.** Aliasing safety is not a uniform
invariant. The standard product path inserts an auto-temporary
so `mat = mat * mat` is safe, but optimized fast paths that
bypass the general assignment machinery have historically
introduced aliasing bugs. When a change modifies or adds such a
fast path, check whether LHS/RHS aliasing is handled and prefer
falling back to the general path when in doubt.
- Treat the public API surface as frozen: do not propose renames or
signature changes for non-internal types.
- Performance and inlining matter; flag possible regressions in hot
paths (products, packet kernels, evaluators, decompositions).
- Watch for accidental allocations in templates that should be
allocation-free.
- C++14 is the minimum; do not suggest C++17+ features. (A migration
to C++17 is planned on a separate branch; until it lands on master,
new code must compile under C++14.)
- **Skip "modernize" advice.** Do not propose `modernize-*` or
`cppcoreguidelines-*` clang-tidy fixes; do not suggest replacing
`EIGEN_STRONG_INLINE` with `inline`; do not propose reordering
internal includes (`SortIncludes: false` is intentional); and do
not "fix" Eigen's macro indentation (`.clang-format` registers
Eigen macros as `StatementMacros` / `AttributeMacros`).
Style is `clang-format-17` exactly — the CI diff is authoritative.
- **Assertions.** Prefer `eigen_assert` (and
`eigen_internal_assert` for internal-only invariants) over raw
`assert` for runtime preconditions; prefer `EIGEN_STATIC_ASSERT`
over plain `static_assert` for compile-time conditions.
- path: "Eigen/src/Core/arch/**"
instructions: |
Per-architecture packet math (SIMD vectorization) backends. In
addition to the general `Eigen/src/**` rules:
- **Guard intrinsics by ISA macro.** Each intrinsic must be wrapped
in its own `EIGEN_VECTORIZE_*` `#ifdef` — being inside `arch/AVX/`
does not imply AVX2 / FMA / AVX-512 are available. Wrap AVX2 in
`EIGEN_VECTORIZE_AVX2`, FMA in `EIGEN_VECTORIZE_FMA`, AVX-512DQ
in `EIGEN_VECTORIZE_AVX512DQ`, etc., and provide a fallback for
the un-guarded path. Same discipline applies on NEON
(`EIGEN_VECTORIZE_NEON_FP16`), VSX (`EIGEN_VECTORIZE_VSX`), etc.
Missing guards typically compile fine on the developer's machine
and break CI on narrower ISA targets — flag any unguarded
intrinsic.
- **Backend symmetry.** New packet operations should be specialized
across **every** backend that supports the type, with
`arch/Default/` providing scalar fallbacks. A missing or divergent
backend specialization usually shows up first in
`test/packetmath.cpp` or `unsupported/test/special_packetmath.cpp`
— flag PRs that add a packet op in one backend without the others.
- path: "{Eigen/ThreadPool,Eigen/src/ThreadPool/**}"
instructions: |
Eigen's work-stealing thread pool — umbrella header `Eigen/ThreadPool`
with sources under `Eigen/src/ThreadPool/` (`NonBlockingThreadPool`,
`RunQueue`, `EventCount`, `ForkJoin`, `CoreThreadPoolDevice`). Backs
`EIGEN_GEMM_THREADPOOL` and the Tensor module's `ThreadPoolDevice`.
Originally developed for TensorFlow and still depended on there —
signatures, semantics, and performance are load-bearing. Apply the
same caution as the Tensor module: prefer additive changes, keep
header layout stable, and call out behavior changes prominently.
- path: "test/**"
instructions: |
Tests use Eigen's custom framework defined in `test/main.h`:
`VERIFY_*` assertions, `CALL_SUBTEST_N` / `EIGEN_TEST_PART_N` to
split one `.cpp` into N per-shard executables, and
`EIGEN_DECLARE_TEST(<name>) { ... }` as the entry point.
`EIGEN_REPEAT` / `EIGEN_SEED` are runtime env vars, not the shard
mechanism. Do not suggest restructuring the harness, switching to
gtest assertions, or deduplicating shards. Numerical-tolerance
comparisons (`VERIFY_IS_APPROX`) are deliberate; do not push for
exact equality. Tests may be long and procedural.
**In-flight migration to Google Test:**
[MR 2159](https://gitlab.com/libeigen/eigen/-/merge_requests/2159)
replaces `EIGEN_DECLARE_TEST` / `CALL_SUBTEST_N` with gtest
`TEST` / `TYPED_TEST` while bridging `VERIFY_*` to gtest
expectations; once it lands, the "do not switch to gtest" rule
flips for new tests.
- path: "unsupported/Eigen/**"
instructions: |
"Unsupported" here means looser API-stability guarantees, **not**
low-traffic or low-stakes. The Tensor module
(`unsupported/Eigen/Tensor`, sources under
`unsupported/Eigen/src/Tensor/`) is TensorFlow's core compute
backend; treat its signatures, header layout, semantics, and
performance on contraction / reduction / morphing kernels as
load-bearing. Prefer additive changes, keep header paths stable,
and call out behavior changes prominently. Other modules
(`TensorSymmetry`, `AutoDiff`, `Polynomials`, `MatrixFunctions`,
`NNLS`, `FFT`, `GPU`, `Splines`, `NumericalDiff`,
`IterativeSolvers`) are genuinely more permissive but should still
preserve their public API. `unsupported/Eigen/CXX11/` is backward-
compatibility forwarding shims only — do not place new headers
there.
- path: "unsupported/Eigen/src/GPU/**"
instructions: |
Host-side dispatch to NVIDIA libraries (cuBLAS / cuSOLVER / cuFFT /
cuSPARSE / cuDSS) on device-resident operands (`gpu::DeviceMatrix`).
This is **not** an expression-template layer — every supported
expression maps to a single library call, and `DeviceMatrix` does
not inherit from `MatrixBase`. Do not suggest reshaping it into an
expression-template system. Tests are deliberately compiled as
`.cpp` (not `.cu`) so NVCC does not instantiate Eigen CPU packet
ops for CUDA vector types — do not propose moving them to `.cu`.
- path: "blas/**"
instructions: |
These are Reference BLAS API wrappers around Eigen. Match the BLAS
standard exactly; do not suggest deviating from netlib semantics.
- path: "lapack/**"
instructions: |
The .f sources are vendored netlib LAPACK reference; do not review
them. The C++ wrappers should faithfully implement the LAPACK
contract.
- path: "ci/**"
instructions: |
GitLab CI configuration. Be conservative -- do not suggest
restructuring the existing job graph or changing runner tags without
strong reason.
- path: "benchmarks/**"
instructions: |
Microbenchmarks built against Google Benchmark. Clarity matters less
than realistic measurement; flag only correctness or measurement
methodology issues, not style.
chat:
auto_reply: true