v3.3.0
Overview
This release adds some powerful new operators including pauli gadgets with any number of control qubits, diagonal operators expressed as general exponential-polynomial phase functions, and optimised implementations of the quantum Fourier transform and multi-controlled multi-target X gates. It brings the ability to efficiently calculate batches of probabilities of arbitrary quantum substates, and functions for creating diagonal operators from Ising Hamiltonians. These utilities are useful for high-performance simulation of quantum chemistry algorithms. Finally, we add an example implementation of Grover's algorithm, and the documentation is given a welcome face-lift.
New features
In addition to calcProbOfOutcome
for calculating the probability of a single qubit outcome, one can now efficiently obtain the entire set of probabilities for the classical outcomes of entire sub-registers.
calcProbOfAllOutcomes()
Added optimised algorithmic methods for simultaneously applying multiple Pauli X gates. These run as fast as a single invocation of pauliX()
, even in distributed mode!
multiQubitNot()
multiControlledMultiQubitNot()
.
With the help of Milos Prokop, Ising Hamiltonians expressed in the Pauli basis can now be loaded directly into diagonal operators, for much faster simulation.
initDiagonalOpFromPauliHamil()
createDiagonalOpFromPauliHamilFile()
Added controlled versions of the existing phase gadgets and Pauli gadgets.
multiControlledMultiRotateZ()
multiControlledMultiRotatePauli()
Added an efficient implementation of the quantum Fourier transform (QFT), which can be applied to both state-vectors and density-matrices, on an arbitrary sub-register.
applyQFT()
applyFullQFT()
With the help of Richard Meister, diagonal unitaries can be applied directly to a state, specified as a phase function, and requiring no dedicated memory. This includes phase functions specified as one-dimensional exponential-polynomials...
applyPhaseFunc()
applyPhaseFuncOverrides()
or as multi-variable exponential-polynomials...
applyMultiVarPhaseFunc()
applyMultiVarPhaseFuncOverrides()
or as one of many named phase functions, including several useful for quantum chemistry simulations, like measures of distance between registers representing signed integers in two's complement!
applyNamedPhaseFunc()
applyNamedPhaseFuncOverrides()
applyParamNamedPhaseFunc()
applyParamNamedPhaseFuncOverrides()
Finally, some changes to documentation.
- updated the tutorial (
examples/README.md
) with extensive compilation and testing guidance - added example implementation of Grover's search
createQureg
andcreateDensityQureg
now include extensive documentation about their memory patterns on all hardware backends- added doc for
QuEST_PREC
,ComplexMatrix2
andComplexMatrix4
- added 'see more' sections to most functions, linking to related functions
- linked all doc to
invalidQuESTInputError()
, if thrown - function exceptions are now formatted cleanly in lists
- code snippets now use syntax highlighting
- removed ugly borders around circuit diagrams
Bug fixes
- patched
syncDiagonalOp
which previously did not copy all of a state-vector into GPU memory - supressed CMake build warnings (by Gleb Struchalin)
- fixed doc rendering issue (via regrettable js/html hacks)
- fixed all doxygen warnings
- patched unit tests to compile precision agnostically
- patched QASM output to compile precision agnostically
- patched distributed file IO unit tests (like
createPauliHamilFromFile
), which sometimes seg-faulted