Changelog

Version 1.6.1

Added

  • Specialized transverse-field propagators and QAOA helpers for hypercube mixers, with native MPI and wavefront implementations

  • Expanded topology verification tooling and richer QUOP_DUMP_COMM_INFO diagnostics for backend, binding, and GPU visibility checks

  • Line-trace profiling support for MPI execution debugging

  • Benchmark coverage for comparing sparse and transverse-field QAOA propagation paths

Changed

  • Parallel Jacobian worker coordination now keys communicator leadership and splits from worker identity instead of assuming world rank 0

  • Sparse CSR inputs now use canonical 0-based contiguous buffers when compliant; legacy 1-based or unsorted inputs are normalized in Python with a deprecation warning and validated again at the native boundary

  • Environment install/build scripts are quieter by default and more portable across Bash and Z shell environments

  • MPI test coverage expanded across topology negotiation, communicator lifecycle, logging, sampling, and propagator behavior

Fixed

  • Wavefront parallel HDF5 saves now use correct collective file creation and dataspace handling

  • MPI-collective Python exceptions now propagate consistently

  • NUMA detection and worker splitting fixes improve mixed CPU/GPU wavefront setups

  • Single-rank and backend-specific MPI paths corrected for FFTW planning and MPI_IN_PLACE handling

Version 1.6.1 (Unreleased)

Added

  • Wavefront backend support across sparse, circulant, momentum, and composite propagators for GPU/CPU workflows

  • Robust GPU topology discovery and rank-to-device assignment via PCI bus IDs with NUMA-aware fallback mapping

  • SHAFFT-based wavefront FFT handling with layout negotiation support

  • Development standards documentation for Python, Fortran, and extension-module conventions

  • Curated ASX ticker candidate dataset for the portfolio rebalancing example

  • Profile-based installer (environments/install.sh) with installation profiles replacing the Spack-driven setup

  • Unified benchmark submission script with single (intra) - and multi-node configurations

  • run_tests.sh test runner covering unit, MPI, parallel-Jacobian and example tests

  • Example test suite that runs example scripts and validates results against expected bounds

  • Test documentation in the README

Changed

  • Migrated build system to scikit-build-core

  • config.toml is now the single source of truth for profile-specific module lists and environment settings

  • Environment installer libraries split into sourced modules with shared helpers in common.sh

  • Linux wavefront wheels are now repaired with auditwheel/patchelf to include shared library dependencies

  • SHAFFT dependency caching and library install paths improved

  • CMake minimum version raised; Fortran preprocessing uses Fortran_PREPROCESS property (fixes Ninja builds)

  • Communicator/layout lifecycle refactor (including NODECOMM creation) with consistent backend-aware negotiation behavior

  • quop_mpi_layout_t is now encapsulated behind explicit getter/setter APIs in wrappers and tests

  • Native context and propagator paths now return explicit status codes with end-to-end wrapper plumbing

  • Deterministic lifecycle management for Python wrappers and Ansatz cleanup replaces finalizer-driven teardown

  • Build and dependency configuration updated for wavefront workflows (including optional hipfort auto-build and GPU-aware MPI controls)

  • Canonical API naming now uses QAOA/QWOA/QMOA/QOWE, Swarm, and <propagator>.Unitary with deprecation warnings for legacy lowercase aliases

  • UnitaryBase is now the canonical base class export (quop_mpi.UnitaryBase), with quop_mpi.Unitary retained as a deprecated alias

  • Canonical module imports are now lowercase (quop_mpi.ansatz and quop_mpi.unitary); legacy CamelCase submodules were removed

  • Public Python API now includes comprehensive type annotations across core classes and propagators

  • Portfolio rebalancing example flow updated for deterministic ticker selection and simplified usage

Fixed

  • Deadlocks and synchronization issues in communicator teardown, transfer paths, and GPU-enabled test execution

  • Sparse CSR redistribution bug for non-contiguous GPU ranks within NODECOMM

  • Single-rank and small-system edge cases in FFT/planning and backend-specific execution paths

  • Context scalar getter behavior so reductions are consistently returned on all active SUBCOMM ranks

  • Swarm.execute_swarm now applies tracker-assigned seeds to each Ansatz instance before execution

  • NLopt wrapper defaults no longer use mutable arguments (constraints/bounds helpers), preventing cross-call state leakage

  • Portfolio rebalancing live-data fetch now handles partial Yahoo responses more robustly and falls back cleanly to bundled sample data

  • Bash 3 compatibility for environment scripts (guarded empty expansions under set -u)

  • F2PY wrapper module dependencies and build targets corrected for parallel builds

  • CMAKE_ARGS parsing fixed for environment-driven configuration

  • hipfort module compatibility verification added to wavefront builds

Version 1.5.0 (2026-01-28)

Added

  • Chebyshev polynomial expansion for sparse matrix exponentiation, replacing scaling-and-squaring method

  • Unit-valued sparse propagator optimization: automatically detects matrices where all non-zero entries are 1.0 and skips value storage/computation for improved performance

Fixed

  • Sparse propagator crash when running with single MPI rank (uninitialized arrays in graph communicator setup)

Version 1.4.0 (2026-01-27)

Added

  • Bindable base class in _utils/_bindable.py providing extensible attribute discovery for QuOp Functions

  • Ansatz.prepare() method to fully initialize the Ansatz for inspection without running optimization

  • Ansatz.print_all_bindable_attributes() method to display bindable attributes for Ansatz and all Unitaries

  • get_bindable_attributes() and print_bindable_attributes() methods on both Ansatz and Unitary classes

  • Extensible BINDABLE_ATTRIBUTES class variable pattern – subclasses (algorithms, propagators) can define their own bindable attributes

  • Comprehensive QuOp Functions documentation with implementation patterns (plain function, factory/closure, callable class)

  • Bindable attributes tables in documentation for both Ansatz and Unitary

  • Naming convention recommendation (underscore prefix) for custom QuOp Function parameters

  • Comprehensive MPI-enabled test suite with pytest-mpi (380+ tests)

  • Unit tests for toolkit module (kronecker, pauli, string functions)

  • Unit tests for NLopt wrapper module

  • New mpi_momentum Fortran module for multivariable momentum-space propagation with FFTW MPI

  • Performance profiling support via QUOP_PROFILE=1 environment variable

  • set_objective method for custom objective functions

  • Documentation restructure with navigable API reference

  • Quick Start example in documentation

  • Changelog documentation

Changed

  • Ansatz now inherits from Bindable base class

  • Unitary now inherits from Bindable base class

  • _interface.py now properly skips *args and **kwargs when parsing function signatures

  • Major refactor of Ansatz.py: Extracted cohesive subsystems into mixins for improved maintainability

    • _sampling.py: Simulated quantum measurement functionality

    • _logging.py: CSV logging and HDF5 parallel I/O

    • _communicator.py: MPI subcommunicator management

    • _optimization/parallel_jacobian.py: Parallel gradient computation

    • _optimization/finite_differences.py: Numerical gradient approximation methods

    • _benchmark.py: Systematic depth study workflow

  • Reorganized internal module structure with consistent naming conventions

    • Renamed __lib/ -> _lib/, __utils/ -> _utils/, __profile/ -> _profile/

    • Renamed internal modules from __*.py to _*.py (single underscore for private modules)

    • Moved _utils/_nlopt_wrap.py -> _optimization/nlopt_wrap.py

  • Circulant propagator now queries FFTW for optimal MPI distribution when determining max communicator size

  • Replaced legacy qhost_fourier.f08 with modern mpi_momentum.f90 implementation

  • Refactored optional dependencies in pyproject.toml ([dev] replaces [all])

  • Updated documentation sidebar with grouped navigation

  • NumPy 2.x compatibility

Removed

  • Orphaned algorithm/multivariable.py (duplicate of algorithm/multivariable/)

Fixed

  • FFTW MPI crash with system_size=1 (edge case in circulant propagator)

  • Deadlock in Ansatz.__post() when MPI ranks are excluded from subcomm

  • Profiler crash during Sphinx doc builds (outside MPI context)

  • OpenMP thread contention causing apparent deadlock with >2 MPI processes

  • Circulant eigenvalue generation bug when graph is complete

  • Parallel Jacobian implementation compatibility with parameter maps

  • Docstring formatting warnings (unescaped asterisks)

Version 1.2.1 (2025-03-07)

Changed

  • Build system update with modern GitHub Actions workflow

  • Bumped dawidd6/action-download-artifact from 2 to 6

  • Updated dependency version ranges

  • Removed outdated test directory

Version 1.2.0 (2024-08-13)

Added

  • Parameter mapping functionality for flexible variational parameter control (#11, #12)

  • Parallel gradient evaluation with MPI subcommunicators

  • Broadcast of variational parameters from root of MPI_COMM_WORLD

  • Basic profiling functionality with OpenMP support in release builds

  • Interleaved local spMV with parallel communication for improved performance

  • Documentation build GitHub workflow

Changed

  • CMake build requires cmake>=3.5,<4

  • Removed self.Ns from operator dict

Version 1.1.0 (2022-10-12)

Added

  • Composite Ansatz class for multivariable optimization problems

  • Multivariable optimization examples

  • QMOA (Quantum Multivariable Optimization Algorithm) experiments

  • Link to preprint article

Changed

  • Evaluate returns results to all calling MPI ranks

  • Support for Python 3.6 and 3.7 builds

Version 1.0.0 (2021-09-30)

This is the first major release, coinciding with the Journal of Computational Science publication.

Added

  • Complete API redesign with modular Ansatz architecture

  • QAOA and QWOA algorithm implementations

  • Circulant, diagonal, and sparse propagator classes

  • Observable and state modules

  • Toolkit for common quantum operators (Pauli matrices, Kronecker products)

  • MPI-parallel state vector simulation

  • Parallel HDF5 I/O for saving and loading simulation data

  • Support for NLopt optimizers alongside SciPy

  • Benchmark infrastructure for performance evaluation

  • Comprehensive documentation with Sphinx

  • GitHub Actions CI/CD pipeline

  • Installation scripts for Ubuntu 20.04

  • Singularity container support

  • License (GPLv3) and contributor acknowledgements

Changed

  • Refactored pre-post execution cycle for unitaries

  • Communicator resizing for optimal MPI process utilization

  • Default optimizer changed to L-BFGS-B

  • Parallel post methods with total_params tracking

Fixed

  • Circulant operators FFTW compatibility

  • Deadlock issues in communicator shrinking

  • Various MPI edge cases for ranks with zero-length local arrays

  • evolve_state converts list parameters into ndarray

  • Check for pre or post on cold call to evolve_state

Version 0.0.2 (2020-02-23)

Added

  • Zenodo DOI for citation

  • Support for multiple mixing operators in QAOA class

  • Custom optimizer support beyond default SciPy minimize

  • Basin-hopping optimization option

  • Process-independent quality generation using integers or random floats

  • Updated sparse matrix exponentiation subroutines

  • Benchmark construct with parameter reuse option

  • Parallel HDF5 write functionality

  • MPI hypercube mixer

  • Objective function mapping to custom scalar values

  • MacOS installation support

Changed

  • QuOp_MPI now minimizes the objective function (was maximizing)

  • Optimizer result ‘success’ field renamed to ‘optimizer_success’

  • ‘success’ metric replaced by ‘quality cutoff’

  • Method log_success replaced by log_results (breaking change from 0.0.1)

  • Switched to L-BFGS-B optimizer

  • Split QAOA and QWOA into separate classes

  • Networkx added as required dependency

Fixed

  • Bug fix in MPI.py (#1)

  • Handling of zero-length quality arrays at local MPI process

  • Initial state handling when rank 0 has local_i = 0

  • Fourier transform ordering

  • Initial state defaults to equal superposition if undefined

Version 0.0.1 (2020-01-12)

Initial release.

  • QWAO_MPI: Quantum Walk-Assisted Optimizer with MPI parallelization

  • Basic CTQW (Continuous-Time Quantum Walk) implementation

  • Parallel eigenvalue computation with FFTW

  • Parallel HDF5 output support

  • Draft documentation