Skip to content

v0.6.0 — Population Annealing + refreshed qqa4co-bench suite

Latest

Choose a tag to compare

@Yuma-Ichikawa Yuma-Ichikawa released this 20 Apr 14:19
· 12 commits to main since this release

Highlights since v0.5.0

This is a cumulative release absorbing 0.5.1, 0.5.2, 0.5.3 (which
lived in git history but were never uploaded to PyPI).

Major additions

  • Population Annealing backend (qqa.population_annealing): parallel
    chain sampling with importance resampling between inverse temperatures,
    full free-energy / log-Z estimates, and an optional genealogy /
    ancestry record. PAResult dataclass and qqa solve --backend pa CLI
    expose the new path.
  • MaxCut G-set family via scripts/fetch_gset_data.py and the
    qqa4co-bench dataset.
  • qqa.bench public Python API (run, plot, list_suites,
    resolve_suite) mirroring the qqa bench CLI so notebooks can
    dispatch a benchmark without subprocess boilerplate.
  • Polished benchmark report figure (scripts/plot_benchmarks.py)
    with stable per-family colours, KPI band, radar, per-subset bars,
    feasibility bars and per-instance violin+strip plots, A/B/C ready.
  • Backend-aware Visualize page: PQQA-only tabs for PQQA runs
    (family tree, PCA embedding, diversity, parallel coordinates) and
    PA-only tabs for PA runs (ESS, free-energy trajectory, equilibration
    diagnostic, Thermodynamics, Lineage vs energy, Ancestry Sankey).
  • Up-front PA capability probe in Solve: problems PA cannot sample
    (categorical / structured binary, e.g. TSP, QAP, Coloring, NQueens)
    now show a clear warning banner instead of failing mid-run.

Quality-of-life

  • Uniform polish contract across QQA / SA / PA: every backend now
    accepts polish=True/False and exposes a polished_sol, routed
    through the single qqa.polish.apply_polish_if_improves helper.
  • _validate_chain_problem now rejects structured BinaryRelaxation
    (e.g. TSP) with an actionable error that steers users to
    qqa.anneal.
  • Hugging Face dataset renamed to Yuma-Ichikawa/qqa4co-bench
    (from the legacy discs-co-bench id). scripts/setup_*.sh and all
    docs updated.

Internal / refactor

  • qqa.polish.apply_polish_if_improves is the single entry point for
    the greedy 1-flip QUBO polish — removes five copies of the same
    if polish and Q_mat is not None: … block across annealing / SA /
    PA / PI-GNN trainers.
  • tests/conftest.py exposes shared fixtures (APP, PAGE_DIR,
    make_problem_config, set_slider); test_gui_apptest.py is 60
    lines lighter.
  • app/_common.retheme_plotly + as_numpy replace per-page clones.
  • SpinRelaxation.perturb_ now inherits from BinaryRelaxation
    both share the same [0, 1] latent cube.
  • qqa.bench collapsed two near-identical sys.path / importlib
    call sites into one _load_scripts_module(name).

Maintenance

  • Renamed LICENCE.txtLICENSE so GitHub's licensee and PyPI
    license classifier auto-detect the license. License terms unchanged
    (BSD-3-Clause-Clear; the NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS clause distinguishes it from plain
    BSD-3-Clause).
  • Fixed Hugging Face account handle typo Yuma-Ichikawsa
    Yuma-Ichikawa in README, docs, data/*, and setup scripts
    (17 occurrences across 11 files).

Removed

  • qqa.sa._qubo_glauber_sweep deprecated alias dropped — it
    forwarded to _qubo_seq_glauber_sweep and the buggy parallel-update
    semantics it warned about have been gone since 0.4.0.

Install

pip install qqa==0.6.0
pip install "qqa[gui]==0.6.0"

Upgrade notes

  • Python 3.10+ (unchanged).
  • No public API breakage: all user-facing entry points kept their
    signatures; only the private _qubo_glauber_sweep alias was removed.
  • If you pin qqa>=0.5.1,<0.6, there is nothing on PyPI in that range;
    bump directly to qqa>=0.6.0.

Detailed changelog

See CHANGELOG.md
for the per-version breakdown of 0.5.1 / 0.5.2 / 0.5.3 / 0.6.0.