Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Copilot Instructions

## Repository Overview

This repository provides Python bindings for the [easySBA](https://users.ics.forth.gr/~lourakis/sba/) sparse bundle adjustment C library, using [pybind11](https://pybind11.readthedocs.io/).

## Repository Layout

- `src/` – Original C/C++ sources for the easySBA library and the license.
- `easysba/` – Python package: `__init__.py` re-exports `easy_sba` from the compiled pybind11 extension (`_easysba.cpp`).
- `tests/` – `unittest`-based test suite run with `pytest`.
- `docs/` – Usage documentation (`USAGE.md`).
- `pyproject.toml` / `setup.py` – Build configuration (setuptools + pybind11 C extension, cibuildwheel for wheels).

## Build Requirements

- Python 3.11+
- C/C++ toolchain
- BLAS/LAPACK development libraries (e.g. `libblas-dev`, `liblapack-dev`, `liblapacke-dev`)
- Python packages: `numpy`, `pybind11`, `setuptools`, `wheel`

On Ubuntu/Debian:

```bash
sudo apt-get install -y build-essential libblas-dev liblapack-dev liblapacke-dev gfortran
```

Install the package locally (editable or regular):

```bash
pip install -v .
# or with uv
uv pip install -v .
```

## Running Tests

```bash
pytest
```

Tests that actually run the SBA solver require the environment variable `EASYSBA_RUN_SOLVER=1`:

```bash
EASYSBA_RUN_SOLVER=1 pytest
```

## Code Style and Conventions

- Python code follows standard PEP 8 conventions.
- C/C++ code in `src/` and `easysba/_easysba.cpp` follows the style of the existing sources.
- Tests live in `tests/` and use `unittest.TestCase` classes, discovered and run via `pytest`.
Copy link

Copilot AI Feb 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The statement "Tests live in tests/ and use unittest.TestCase classes" is not entirely accurate. While test_smoke.py uses unittest.TestCase, test_sba_steps.py uses plain pytest functions with pytest decorators like @pytest.mark.parametrize. Consider updating this to reflect both testing styles: "Tests live in tests/ and use either unittest.TestCase classes or plain pytest functions, discovered and run via pytest."

Suggested change
- Tests live in `tests/` and use `unittest.TestCase` classes, discovered and run via `pytest`.
- Tests live in `tests/` and use either `unittest.TestCase` classes or plain pytest functions, discovered and run via `pytest`.

Copilot uses AI. Check for mistakes.
- Keep the public Python API minimal: `easysba.easy_sba(...)` is the single entry point.

## Key Files

| File | Purpose |
|---|---|
| `easysba/_easysba.cpp` | pybind11 binding: wraps the C `easy_sba` function |
| `easysba/__init__.py` | Re-exports `easy_sba` for the public package API |
| `src/sba_levmar.c` | Core Levenberg-Marquardt SBA implementation |
| `tests/test_smoke.py` | Smoke tests (import check + optional solver run) |
| `tests/test_sba_steps.py` | Step-by-step SBA tests |
| `pyproject.toml` | Build system and cibuildwheel configuration |