Skip to content

v3.3.0

Compare
Choose a tag to compare
@TysonRayJones TysonRayJones released this 22 Aug 13:14
· 90 commits to master since this release

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 and createDensityQureg now include extensive documentation about their memory patterns on all hardware backends
  • added doc for QuEST_PREC, ComplexMatrix2 and ComplexMatrix4
  • 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