<!-- Entries in each category are sorted by merge time, with the latest PRs appearing first. -->

# Changelog

All notable changes to this project will be documented in this file.

The format is based on a mixture of [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Common Changelog](https://common-changelog.org).
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), with the exception that minor
releases may include breaking changes.

## [Unreleased](https://github.com/marcelwa/aigverse/compare/v0.1.5...HEAD)

### Added

- ✨ Expose each ABC command wrapper’s switch translation as `.cmd(...)`, which builds
  the `abc.Command` the wrapper would run instead of running it, so a parameterized
  command reaches `run_script` and `run_many` as itself rather than as a hand-written
  switch string ([#486](https://github.com/marcelwa/aigverse/pull/486)) ([**@marcelwa**](https://github.com/marcelwa))
- 📝 Add an ABC example to the README ([#489](https://github.com/marcelwa/aigverse/pull/489)) ([**@marcelwa**](https://github.com/marcelwa))
- 👷 Add a `cpp-lint` nox session that reproduces the `🚨 Clang-Tidy` check locally, running
  the same `cpp-linter` invocation CI runs over the files that differ from `origin/main`
  ([#488](https://github.com/marcelwa/aigverse/pull/488)) ([**@marcelwa**](https://github.com/marcelwa))
- ✨ Add `run_many` to the `aigverse.abc` bridge, running one ABC script over many
  networks in parallel and reporting each failure in place instead of losing the
  batch to the first bad design ([#467](https://github.com/marcelwa/aigverse/pull/467)) ([**@marcelwa**](https://github.com/marcelwa))

### Changed

- 🔧 Drop the global `CMAKE_POSITION_INDEPENDENT_CODE` override; mockturtle now builds its
  own archives as position-independent code ([#501](https://github.com/marcelwa/aigverse/pull/501)) ([**@marcelwa**](https://github.com/marcelwa))
- 👷 Run native Linux CI and Read the Docs on Ubuntu 26.04 with the runner’s default
  compiler ([#513](https://github.com/marcelwa/aigverse/pull/513)) ([**@marcelwa**](https://github.com/marcelwa))
- 🔧 Stop the extensions from re-exporting the internals of the static libraries they
  embed ([#490](https://github.com/marcelwa/aigverse/pull/490)) ([**@marcelwa**](https://github.com/marcelwa))
- ⚡️ Run `examples/abc_recipe_study.py`’s sweep as one batch per recipe instead of one
  ABC call at a time, with a new `--jobs` flag. Its CSV loses the `seconds` column,
  which a concurrent run cannot measure per item ([#467](https://github.com/marcelwa/aigverse/pull/467)) ([**@marcelwa**](https://github.com/marcelwa))
- ⚡️ Release the GIL in the `generators` bindings, so random and structured
  network construction overlaps across threads instead of blocking every other
  worker ([#478](https://github.com/marcelwa/aigverse/pull/478)) ([**@marcelwa**](https://github.com/marcelwa))
- ⚡️ Release the GIL in the `io` bindings, so reading networks and writing AIGER
  overlaps across threads instead of serializing against every other worker
  ([#477](https://github.com/marcelwa/aigverse/pull/477), [#481](https://github.com/marcelwa/aigverse/pull/481)) ([**@marcelwa**](https://github.com/marcelwa))

### Fixed

- 🐛 Use a NumPy version with Python 3.15 wheels when resolving minimum dependencies ([#439](https://github.com/marcelwa/aigverse/pull/439))
  ([**@marcelwa**](https://github.com/marcelwa))
- 🐛 Hide C++ implementation symbols from Linux extensions while preserving
  nanobind’s shared exception ABI ([#531](https://github.com/marcelwa/aigverse/pull/531)) ([**@marcelwa**](https://github.com/marcelwa))
- 📝 Correct the README’s Stable ABI and free-threading claims ([#489](https://github.com/marcelwa/aigverse/pull/489)) ([**@marcelwa**](https://github.com/marcelwa))
- 🐛 Stop `equivalence_checking`, `aig_cut_rewriting`, `balancing`, and `cleanup_dangling`
  from returning silently wrong results when several threads call them on one shared
  network. Each wrote traversal state into the caller’s network through a mockturtle view
  while the GIL was released ([#483](https://github.com/marcelwa/aigverse/pull/483)) ([**@marcelwa**](https://github.com/marcelwa))
- 🐛 Look the ABC executable up on `PATH` once per `run_script` call instead of twice.
  The second lookup ran after ABC finished purely to name the binary in an error, so a
  binary that disappeared mid-run discarded a successful result ([#467](https://github.com/marcelwa/aigverse/pull/467))
  ([**@marcelwa**](https://github.com/marcelwa))

## [0.1.5](https://github.com/marcelwa/aigverse/releases/tag/v0.1.5) - 2026-08-24

### Added

- ✨ Add `simulate_sequential`, which runs a `SequentialAig` over a number of clock
  cycles from its reset state and returns the primary output values and the register
  values per cycle ([#458](https://github.com/marcelwa/aigverse/pull/458)) ([**@marcelwa**](https://github.com/marcelwa))
- 👷 Run `nox -s minimums` in CI across the full platform matrix, so the declared
  dependency floors are actually installed and tested instead of only claimed
  ([#453](https://github.com/marcelwa/aigverse/pull/453)) ([**@marcelwa**](https://github.com/marcelwa))
- ✨ Add a `--full` flag to the `tests` and `minimums` nox sessions that installs
  every optional dependency group and selects every marker, replacing the
  implicit `CI` environment check ([#453](https://github.com/marcelwa/aigverse/pull/453)) ([**@marcelwa**](https://github.com/marcelwa))
- ✨ Add an `examples/` directory of standalone, PEP 723 scripts that run with
  `uv run` and no setup, starting with an ABC recipe study that asks whether one
  best recipe exists ([#410](https://github.com/marcelwa/aigverse/pull/410)) ([**@marcelwa**](https://github.com/marcelwa))
- 👷 Smoke-run the examples in the ABC workflow, so a library change that breaks
  one is caught by CI rather than by the next person to run it ([#410](https://github.com/marcelwa/aigverse/pull/410))
  ([**@marcelwa**](https://github.com/marcelwa))
- ✨ Support `SequentialAig` in the `aigverse.abc` bridge, carrying registers
  through ABC along with their reset values in the classic namespace ([#406](https://github.com/marcelwa/aigverse/pull/406))
  ([**@marcelwa**](https://github.com/marcelwa))

### Changed

- 👷 Restructure CI into a thin `ci.yml` caller over one reusable workflow per
  concern, gated by change detection and aggregated into a single required
  `🚦 Check` ([#422](https://github.com/marcelwa/aigverse/pull/422)) ([**@marcelwa**](https://github.com/marcelwa))
- ⚡️ Adopt nanobind 3.0’s split mode, so one `abi3` wheel per platform covers
  every supported Python from 3.10 up instead of three. Cold build time drops
  3.15x and the shipped payload 4.3x; the extensions themselves shrink 26% by no
  longer each carrying their own copy of the nanobind library, which is now the
  separate `nanobind-backend` runtime dependency. Free-threaded interpreters are
  not supported until Python 3.15 brings them a stable ABI ([#463](https://github.com/marcelwa/aigverse/pull/463))
  ([**@marcelwa**](https://github.com/marcelwa))
- ⚡️ Build the extension once per wheel tag in the `tests` and `minimums` nox
  sessions instead of once per interpreter, so interpreters sharing a tag reuse
  one wheel rather than each getting a purpose-built one ([#456](https://github.com/marcelwa/aigverse/pull/456))
  ([**@marcelwa**](https://github.com/marcelwa))

### Fixed

- 🐛 Refuse an AIGER file with latches in `read_aiger_into_aig` and
  `read_ascii_aiger_into_aig`, which used to segfault or silently drop the
  registers, and point users at the sequential reader instead ([#457](https://github.com/marcelwa/aigverse/pull/457))
  ([**@marcelwa**](https://github.com/marcelwa))
- 👷 Cache Windows compiles. `scikit-build-core` defaults to the Visual Studio
  generator, which ignores `CMAKE_<LANG>_COMPILER_LAUNCHER`, so the compiler
  cache was configured on Windows and then never invoked – every job rebuilt
  every translation unit once per interpreter. Windows now builds with Ninja and
  caches with `sccache`, whose MSVC support, unlike ccache’s, actually hits
  ([#456](https://github.com/marcelwa/aigverse/pull/456)) ([**@marcelwa**](https://github.com/marcelwa))
- 🐛 Forward `-h` and `--help` to `sphinx-build` in the `docs` nox session, which
  its own argument parser used to intercept ([#453](https://github.com/marcelwa/aigverse/pull/453)) ([**@marcelwa**](https://github.com/marcelwa))
- 🐛 Gate the `numpy` and `torch` floors by Python version. Both predate every
  interpreter in the matrix except 3.10, so resolving them as the lowest direct
  versions fell back to a NumPy source build that fails and to a PyTorch release
  with no installable distribution ([#453](https://github.com/marcelwa/aigverse/pull/453)) ([**@marcelwa**](https://github.com/marcelwa))

## [0.1.4](https://github.com/marcelwa/aigverse/releases/tag/v0.1.4) - 2026-08-19

### Added

- 📝 Add a changelog and an upgrade guide to the documentation ([#448](https://github.com/marcelwa/aigverse/pull/448))
  ([**@marcelwa**](https://github.com/marcelwa))
- ✨ Add the `aigverse.abc` module, a bridge that runs the optimization scripts
  and commands of an externally installed ABC ([#405](https://github.com/marcelwa/aigverse/pull/405)) ([**@marcelwa**](https://github.com/marcelwa))

### Changed

- 🔧 Raise the CMake policy upper bound to 4.4, so the project no longer runs
  under three-release-old policy defaults on CMake 4.2-4.4 ([#447](https://github.com/marcelwa/aigverse/pull/447))
  ([**@marcelwa**](https://github.com/marcelwa))
- 🔧 Add `Developers`, `Information Technology`, and
  `Software Development :: Libraries :: Python Modules` trove classifiers, so
  `aigverse` surfaces on PyPI for its non-research audience too ([#447](https://github.com/marcelwa/aigverse/pull/447))
  ([**@marcelwa**](https://github.com/marcelwa))
- 🔧 Derive the version from `vcs-versioning` instead of `setuptools-scm`,
  dropping the transitive `setuptools` dependency from every wheel build
  ([#447](https://github.com/marcelwa/aigverse/pull/447)) ([**@marcelwa**](https://github.com/marcelwa))
- 🔧 Drop the no-op submodule checkout steps from `.readthedocs.yaml` and
  `docs/DevelopmentGuide.md`; the project has no submodules ([#447](https://github.com/marcelwa/aigverse/pull/447))
  ([**@marcelwa**](https://github.com/marcelwa))
- ⬆️ Update `nanobind` to version 2.15.0 ([#430](https://github.com/marcelwa/aigverse/pull/430), [#445](https://github.com/marcelwa/aigverse/pull/445))

### Fixed

- 🏷️ Fix the one-hot encoding annotations in the NetworkX adapter, which pinned
  `int8` regardless of the `dtype` the caller passed ([#435](https://github.com/marcelwa/aigverse/pull/435)) ([**@marcelwa**](https://github.com/marcelwa))

## [0.1.3](https://github.com/marcelwa/aigverse/releases/tag/v0.1.3) - 2026-08-04

### Added

- ✨ Add a benchmark loader that fetches and caches the EPFL suite on demand
  ([#409](https://github.com/marcelwa/aigverse/pull/409)) ([**@marcelwa**](https://github.com/marcelwa))
- ✨ Emit `llms.txt` and `llms-full.txt` from the documentation build, so agents
  read the docs as markdown instead of scraping HTML ([#417](https://github.com/marcelwa/aigverse/pull/417)) ([**@marcelwa**](https://github.com/marcelwa))
- 📝 Add a visualization page to the documentation ([#419](https://github.com/marcelwa/aigverse/pull/419)) ([**@marcelwa**](https://github.com/marcelwa))

### Changed

- 👷 Track the pinned `mockturtle` revision with a Renovate custom manager
  ([#404](https://github.com/marcelwa/aigverse/pull/404)) ([**@marcelwa**](https://github.com/marcelwa))

### Fixed

- 🐛 Raise `IndexError` instead of segfaulting on an out-of-range node ID
  ([#420](https://github.com/marcelwa/aigverse/pull/420)) ([**@marcelwa**](https://github.com/marcelwa))
- 🐛 Fix the named AIG example in the AIG documentation ([#407](https://github.com/marcelwa/aigverse/pull/407))
  ([**@marcelwa**](https://github.com/marcelwa))
- 👷 Drop the `cp313t-*` `cibuildwheel` skip selector, which matched a group the
  project never enables and made every wheel job warn ([#421](https://github.com/marcelwa/aigverse/pull/421)) ([**@marcelwa**](https://github.com/marcelwa))

## [0.1.2](https://github.com/marcelwa/aigverse/releases/tag/v0.1.2) - 2026-07-24

### Added

- ✨ Add cut enumeration over AIGs ([#368](https://github.com/marcelwa/aigverse/pull/368)) ([**@wjrforcyber**](https://github.com/wjrforcyber))
- ✨ Add `to_graph_tensors`, which exports an AIG as DLPack sparse tensors for
  zero-copy interop with PyTorch, JAX, and TensorFlow ([#308](https://github.com/marcelwa/aigverse/pull/308)) ([**@marcelwa**](https://github.com/marcelwa))
- 👷 Add a Zizmor workflow that scans the GitHub Actions workflows and uploads
  its findings to code scanning ([#392](https://github.com/marcelwa/aigverse/pull/392)) ([**@marcelwa**](https://github.com/marcelwa))
- 📝 Add `AGENTS.md` and `WORKFLOW.md` to steer agentic coding tools ([#382](https://github.com/marcelwa/aigverse/pull/382))
  ([**@marcelwa**](https://github.com/marcelwa))
- 📝 Document edge lists in the AIG guide ([#389](https://github.com/marcelwa/aigverse/pull/389)) ([**@marcelwa**](https://github.com/marcelwa))
- 📝 Document the gitmoji convention for commit messages and pull request titles
  ([#390](https://github.com/marcelwa/aigverse/pull/390)) ([**@marcelwa**](https://github.com/marcelwa))

### Changed

- ⬆️ Update `mockturtle` to the latest `mnt` revision ([#388](https://github.com/marcelwa/aigverse/pull/388)) ([**@marcelwa**](https://github.com/marcelwa))
- ⬆️ Update `nanobind` to version 2.13.0 ([#369](https://github.com/marcelwa/aigverse/pull/369))

### Fixed

- 🐛 Fix ASCII AIGER parsing for constant outputs ([#394](https://github.com/marcelwa/aigverse/pull/394)) ([**@marcelwa**](https://github.com/marcelwa))
- 📝 Fix role rendering and broken links in the documentation, and the PyTorch
  sparse tensor warning it raised ([#395](https://github.com/marcelwa/aigverse/pull/395)) ([**@marcelwa**](https://github.com/marcelwa))

## [0.1.1](https://github.com/marcelwa/aigverse/releases/tag/v0.1.1) - 2026-05-18

### Fixed

- 🐛 Stop `to_edge_list` from collapsing duplicate primary outputs ([#358](https://github.com/marcelwa/aigverse/pull/358))
  ([**@marcelwa**](https://github.com/marcelwa))

## [0.1.0](https://github.com/marcelwa/aigverse/releases/tag/v0.1.0) - 2026-05-09

*If you are upgrading: please see [`UPGRADING.md`](UPGRADING.html.md#id1).*

### Added

- ✨ Expose the network generators through the new `aigverse.generators` module
  ([#305](https://github.com/marcelwa/aigverse/pull/305)) ([**@marcelwa**](https://github.com/marcelwa))
- 📝 Add docstrings to every module and symbol ([#303](https://github.com/marcelwa/aigverse/pull/303)) ([**@marcelwa**](https://github.com/marcelwa))

### Changed

- 💥 Split the monolithic package into the `networks`, `algorithms`, `io`, and
  `utils` extension modules ([#285](https://github.com/marcelwa/aigverse/pull/285)) ([**@marcelwa**](https://github.com/marcelwa))
- 💥 Rework the API to be Pythonic: the optimization passes return a new cleaned
  `Aig` by default and take `inplace`, and `cleanup_dangling` moves to
  `aigverse.algorithms` ([#298](https://github.com/marcelwa/aigverse/pull/298)) ([**@marcelwa**](https://github.com/marcelwa))
- 💥 Make every optimization parameter except the input network keyword-only
  ([#306](https://github.com/marcelwa/aigverse/pull/306)) ([**@marcelwa**](https://github.com/marcelwa))
- ♻️ Migrate the bindings from `pybind11` to `nanobind` ([#297](https://github.com/marcelwa/aigverse/pull/297))
  ([**@marcelwa**](https://github.com/marcelwa))
- 🔧 Modernize the tooling and adopt the Scientific Python repo review ([#314](https://github.com/marcelwa/aigverse/pull/314),
  [#335](https://github.com/marcelwa/aigverse/pull/335)) ([**@marcelwa**](https://github.com/marcelwa))
- ✅ Restructure the test suite around markers and shared fixtures ([#313](https://github.com/marcelwa/aigverse/pull/313))
  ([**@marcelwa**](https://github.com/marcelwa))
- 📝 Streamline the README and the documentation ([#334](https://github.com/marcelwa/aigverse/pull/334)) ([**@marcelwa**](https://github.com/marcelwa))

### Fixed

- 🐛 Fix the `stubgen` pattern file so the generated stubs come out as intended
  ([#336](https://github.com/marcelwa/aigverse/pull/336)) ([**@marcelwa**](https://github.com/marcelwa))

<!-- Version links -->
<!-- PR links -->
<!-- Contributor -->
<!-- General links -->
