Changelog
Notable Changes
Replaced Dask with the new BQSKit Runtime
Previously, we used the Dask library to parallelize and distribute our
compilation pipeline across a multi-core system or a cluster of computers.
However, we had many problems and complaints with this, specifically, with
the robustness of it. Long-running compilation tasks would occasionally
crash with a CancelledError for one of many reasons. We ended up building
our runtime for our compile time. For most users, this change will
happen in the background, leading to slightly faster compile times and
confidence in long-running or distributed jobs. The documentation is updated
with a guide for launching a runtime on a cluster of nodes if you decide
to parallelize your workload over a compute cluster or supercomputer.
Greatly improved Qudit Support
With the help of algorithm and hardware scientists, we greatly expanded
support for qudit simulation, compilation, and information science within
the BQSKit framework. Most notably, we added several new gates and support
for qudit compilation in the off-the-shelf `compile` function.
State and Multi-State Synthesis Support
Added support for `StateVector` and `StateSystem` inputs to the
`bqskit.`compile` function now allows state preparation circuit synthesis
and state mapping synthesis. See the [paper](https://arxiv.org/abs/2305.01816)
for more info on multi-state synthesis.
Optimization level 4 with Permutation-Aware Synthesis and Mapping
Added permutation-aware synthesis and mapping passes, which serve as the
base for the optimization level 4 workflow. See the
[paper](https://arxiv.org/abs/2305.02939) for more info.
New Features
- Added Barrier Support
- Added `with_mapping`flag to the `compile` function to optionally return the
initial and final logical-to-physical qudit mapping
- Added the `Workflow` class
- Added the `PassData` class
- Added the `GateSet` class
- Added the `StateSystem` class
- Added `Sequence` support for inputs the `compile` function. Now you can pass
a list of circuits (or any input) to be compiled, which will all be compiled in
parallel.
- Qfactor support for qudits
- `disable_logging` function
- Implemented the `compute_su_generators` math function
New Circuit/IR Methods
- Implemented `Circuit.is_empty`
- Implemented `Circuit.gate_set_no_blocks`
- Implemented `Circuit.last_on`
- Implemented `Circuit.first_on`
- Implemented `Circuit.get_statevector`
- Implemented `Circuit.perform`
- Implemented `Operation.get_inverse`
- Implemented `Gate.get_inverse`
- Implemented `Gate.get_inverse_params`
New Gates
- Implemented `BGate`
- Implemented `ClockGate`
- Implemented `PDGate`
- Implemented `MargolusGate`
- Implemented `RC3XGate`
- Implemented `RCCXGate`
- Implemented `ShiftGate`
- Implemented `SubSwapGate`
- Implemented `CCPGate`
- Implemented `CKMGate`
- Implemented `CKMdgGate`
- Implemented `ArbitraryCPhaseGate`
- Implemented `CUGate`
- Implemented `RSU3Gate`
- Implemented `EmbeddedGate`
- Implemented `BarrierPlaceholder`
- Implemented `QuditGate`
- Implemented `GeneralGate`
New Passes and PassPredicates
- Implemented `AutoRebase2QuditGatePass`
- Implemented `GeneralSQDecomposition`
- Implemented `StructureAnalysisPass`
- Implemented `SubTopologySelectionPass`
- Implemented `PAMLayoutPass`
- Implemented `PAMRoutingPass`
- Implemented `EmbedAllPermutationPass`
- Implemented `ToVariablePass`
- Implemented `OrPredicate`
- Implemented `ManyQuditGatesPredicate`
- Implemented `NoSingleQuditGatesInModel`
- Implemented `HasGeneralSingleQuditGate`
- Implemented `ZXGatePredicate`
- Implemented `AllConstantSingleQuditGates`
Changed
- Layer Generators now intelligently place gates to avoid unnecessary gates
- `Circuit.get_inverse` now works differently to avoid `DaggerGate`s when not necessary
- Many passes and layer generators where given "smart defaults" picked from the `PassData.model`
- Improved performance of `active_qudit` calculation
- `ForEachBlockPass` replace filter option can now be a string that describes the filter
- Layer generator selection in QSearch and LEAP now reacts to seeds in `PassData`
- `SeedLayerGenerator` has been significantly improved
- `MachineModel.is_compatible` now takes an optional `placement` parameter
- `ControlledGate` is now significantly more general and can handle qudit and even mixed qudit controls and targets.
- Many gates now take an optional `radix` parameter that can be set to generalize them to higher dimensions
- `FillSingleQuditGatesPass` no longer uses unnecessary instantiation
Fixed
- Fixed a performance bug in `CouplingGraph`
- Fixed an issue with seeds and reproducible circuits (107)
- Fixed bug when popping an idle qudit
Deprecated
- Honeywell QPU gate sets and Models (replaced with Quantinuum)
- `enable_dashboard` and `disable_dashboard` (dask no longer works)
- `enable_parallelism` and `disable_parallelism` (use `Compiler(num_workers=x)` to control parallelism)
- `BasePass.get_model`, `BassPass.get_placement`, `BassPass.get_connectivity`, `BassPass.get_target` have
all been replaced with the `PassData` version.
- `BassPass.in_parallel` and `BassPass.execute` (`in_parallel` is no longer necessary and `execute` has been replaced with `await get_runtime().map(...)`)
- The direct use of a `CompilationTask` has been deprecated and is no longer needed.
Instead, you can pass the circuit and workflow directly into `Compiler.compile` and similar functions.
- `multistart_gen` in `Circuit.instantiate` (been moved directly to the `Instantiater.instantiate`)
- `batch_size` in `ForEachBlockSize`
- `GreedyPartitioner`
- `Rebase2QuditGatePass` has moved from `bqskit.passes.processing` to `bqskit.passes.retarget`
**Full Changelog**: [1.0.4...1.1.0](https://github.com/BQSKit/bqskit/compare/1.0.4...1.1.0)