# 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 `contrib/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
          `contrib/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 `contrib/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: "contrib/Eigen/**"
      instructions: |
        The `contrib/` tree means looser API-stability guarantees, **not**
        low-traffic or low-stakes. The Tensor module
        (`contrib/Eigen/Tensor`, sources under
        `contrib/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: "contrib/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
