# 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
