Changelog
All notable changes to LIFT are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Planned (v0.5)
- State-vector quantum simulator (CPU, up to ~25 qubits)
- Tensor interpreter (numpy-like execution of tensor ops)
- Real LLVM IR lowering with cuBLAS/cuDNN runtime calls
- Functional importers — ONNX, PyTorch FX, OpenQASM 3 (currently stubs)
- SABRE-style dynamic qubit re-placement
Planned (v0.6)
- True automatic differentiation (backward graph construction)
- PyO3 Python bindings
- Multi-file support (
include/ linking) - v1.0 release — full pipeline, benchmarks, arXiv paper
[0.4.8] — 2026-08-26
Fixed
gate-cancellationfalsely cancelled a 2-qubit gate pair sharing only one wire (e.g.CX(q0,q1)thenCX(q0,q2)), and rewired only wire 0 on cancellation, leaving a dangling reference to a deleted value on any other wire. Cancellation now requires every wire to match and rewires all of them.noise-aware-scheduleunconditionally hoisted every non-quantum op (includingcore.return) before all quantum ops when reordering, discarding program order — dormant today since nothing yet writes differinggate_time_us, but would corrupt any circuit ending in a return the moment it does. Now preserves every non-quantum op's original position.dcedid not protectcore.call(a recognised, side-effecting core op) from removal when its result was unused.gate-decomposition:ibm_kyotoprovider metadata folded intoIbmEagleinstead ofIbmKyoto.- Tensor shape/FLOP inference (
infer_output_shape/compute_flops/compute_memory_bytes, now taking an optional attrs argument):- Conv1D/2D/3D and
DilatedConv2Dignored stride/padding/dilation entirely (alwaysin - kernel + 1), soDilatedConv2Dbehaved exactly like a plain Conv2D. Now readstride/padding/dilationattrs, withDilatedConv2Ddefaulting dilation to 2 so it differs from Conv2D even unconfigured. MaxPool2D/AvgPool2Dreturned the input shape unchanged instead of reducing spatial dimensions when given a kernel-shaped second input.compute_memory_bytesonly counted the output's bytes forMatMul/SparseMatMul; every other op (Conv*, activations, norms, ...) silently omitted the output from the memory-traffic total (understating real traffic by ~46% for a typical Conv2D).
- Conv1D/2D/3D and
- ONNX export:
tensor.siluexported as a bareSigmoidnode — computingsigmoid(x)instead ofSiLU(x) = x*sigmoid(x), wrong at every input, not an approximation. Now expands toSigmoid+Mul. - QASM export:
MCX/MCZhardcoded exactly 3 qubits, silently dropping every control qubit past the third. Now emits every input qubit. - Importers (QASM/ONNX/PyTorch FX): validated only top-level structure,
then returned
Ok(())with an empty module — silently discarding every gate/node, so a caller checking only theResultwould believe the import succeeded. Now return an explicit error, since none of the three perform real translation yet (tracked under Planned v0.5 above). - Verifier:
verify_ssaonly checked that a used value was defined somewhere in the context, with no ordering, so a use-before-def within a block passed verification. Added a dominance check scoped to each block's own program order. - Also independently re-verified that the #1 and #2 GitHub issue fixes (round-trip parsing, QASM qubit-index-from-operands) still hold, with no further changes needed there.
[0.4.7] — 2026-08-26
Changed
- Rewrote README.md for length and clarity (507 → 261 lines): merged two redundant intro paragraphs and two overlapping crate tables into one each, dropped a full ONNX op-mapping table that already lives in docs/LIFT_Guide.md and docs/LIFT_Manual.md, and cut a 12-line wall of near-identical CLI invocations down to the essentials. Every command and code sample that survived was re-tested against the current release, not just reviewed.
[0.4.6] — 2026-08-25
Fixed
cargo install lift-clinow installs a binary namedlift, notlift-cli. Every piece of documentation (README, the book, this changelog) has always shownlift verify ...— but the package had no[[bin]] nameoverride, so Cargo defaulted the binary to the package name. Added[[bin]] name = "lift"tocrates/lift-cli/Cargo.toml.examples/validate_all.shhardcodedcargo run --bin lift-cli --, which broke under the rename; fixed to--bin lift.
[0.4.5] — 2026-08-25
Fixed
- Printer/parser round trip —
optimise --output out.lifproduced a.liffile the parser could not read back (the printer emitted disconnected signature names plus a^bb0(...):block label with no grammar rule for it). The signature now prints the entry block's real argument names, and the redundant block header is no longer emitted. - QASM export qubit indexing — gates were numbered from a running counter
instead of their actual operand, so any two gates in a row could land on
different qubits and
CX's control/target could come out swapped. Qubit indices are now resolved by walking each operand's SSA def chain back to its owning qubit. Also fixed gate export order (was iterating the ops slotmap, which drifts once a pass frees a slot and a later pass reuses it; now walksblock.opsin program order) and per-function qubit counting (was summing qubit-typed block args across every function in the module). gate-decompositionno longer doubles the transformation — the pass built a native decomposition chain but left the original gate in the block, still wired to produce its own result, so e.g. decomposingTsilently producedRz(pi/4)followed by the still-presentT(i.e.S, notT's actual decomposition). The original gate's results are now redirected to the decomposition chain's output and the original op is removed.- RX decomposition sign error — the first
Rzin the nativeRX(theta)sequence had the wrong sign, soRX(0)compiled toZinstead of the identity, for every angle. Contributed by @cleitonaugusto (#4), verified independently against the closed-formRX(theta)matrix at 8 angles. - CLI
--versionwas hardcoded to"0.3.0"from an earlier release; now reads the real crate version viaCARGO_PKG_VERSION.
Added
predict --energy [--num-gpus N]— energy (J/kWh) and CO2 estimates, wiring the existingEnergyModelinto the CLI.predict --quantum <hardware> [--precision P]— quantum fidelity, shot count, and execution-time prediction (superconducting,trapped_ion,neutral_atom), wiring the existingpredict_quantuminto the CLI.CODE_OF_CONDUCT.md,SECURITY.md, and an issue-template chooser (.github/ISSUE_TEMPLATE/config.yml). Private vulnerability reporting is now enabled on the repository soSECURITY.md's instructions work.
Changed
- Removed 25 declared-but-unused dependencies across the workspace (found
with
cargo-machete, each verified by hand before removal). - Eliminated needless
Veccollects and redundant clones onlift-opt's hot paths (flash-attention, quantisation-pass, real-routing). lift-test/(root) moved tocrates/lift-demo/— it was the only workspace member outsidecrates/, and its name was one character from the unrelatedcrates/lift-testsintegration-test crate.- Consolidated secondary docs (
CAPABILITIES.md,DIALECTS.md,LIFT_design.md,LIFT_Guide.md,LIFT_Manual.md,PUBLISHING.md,STRATEGY.md) intodocs/;README.md,LICENSE,CHANGELOG.md, andCONTRIBUTING.mdstay at the root. - Translated
docs/CAPABILITIES.mdfrom French to English (it was the last fully-French document in the project) and corrected several claims that had gone stale since it was written, including two caught by this release's own fixes (QASM qubit indexing, gate-decomposition).
[0.4.4] — 2026-08-05
Changed
- Automated releases via crates.io Trusted Publishing (OIDC) — no API
token needed. All 13 crates configured with
rustnew/Liftworkflowpublish.yml; pushing av*tag publishes every crate in dependency order from CI (.github/workflows/publish.yml). - Version bump 0.4.3 → 0.4.4 across workspace and docs.
[0.4.3] — 2026-08-05
Changed
- Optimised crate descriptions for discoverability: every description now leads with "LIFT compiler", so the crates surface in crates.io searches for "compiler", "compiler framework", "quantum compiler", and "AI compiler".
- All 13 crates republished to crates.io at v0.4.3.
[0.4.2] — 2026-08-05
Fixed
- LICENSE now ships in every published crate package (was missing from crates.io tarballs because Cargo only auto-includes LICENSE files located in each package directory, not the workspace root).
- Repository field corrected to
rustnew/Liftin all published manifests (the GitHub rename fromLitf-IRhad not been propagated to crates.io). - Docs version references bumped to 0.4.2.
Changed
- All 13 crates republished to crates.io at v0.4.2.
[0.4.1] — 2026-08-05
Fixed
- Corrected op/gate counts in docs (110 tensor ops, 48 quantum gates, 21 hybrid ops).
- README examples now compile against the real API (
GateDecomposition::new(Provider::IbmKyoto),DataTypere-export frommodel_builder). - Repository references updated to
rustnew/Lift(renamed fromLitf-IR).
Changed
- Architecture diagrams moved to Mermaid (pipeline, dependency layers, roadmap).
- All 13 crates republished to crates.io at v0.4.1.
[0.4.0] — 2026-08-05
Added
- Optimisation levels
O0–O3with explicit-pass override and per-pass enable/disable. - Semantic verification (op arity vs dialect signatures).
- 13 optimisation passes including generic tensor fusion, hardware-native gate decomposition, real qubit routing (SWAP + BFS), non-adjacent gate cancellation & rotation merging.
- All 13 crates published to crates.io (first full workspace release).
[0.3.0] — 2026-04-30
Added
- Tensor / quantum / hybrid dialects.
- Cost modelling (FLOPs, memory, energy/carbon).
- Performance prediction (roofline analysis).
- Export backends (LLVM IR, ONNX, OpenQASM 3.0).
[0.2.1] — 2026-04-30
Changed
- Stability tuning.
[0.2.0] — 2026-03-31
Added
- Initial public release of the LIFT compiler framework.
- SSA-based intermediate representation.
- Tensor, quantum, and hybrid dialects.
- Core compiler infrastructure (types, values, operations, blocks, regions, verifier).