- Add MCMC sampler. [(#384)] (#384)
- Lightning now works with the new return types specification that is now default in PennyLane.
See the PennyLane
qml.enable_return
documentation for more information on this change. (#427)
Instead of creating potentially ragged numpy array, devices and QNode
's now return an object of the same type as that
returned by the quantum function.
>>> dev = qml.device('lightning.qubit', wires=1)
>>> @qml.qnode(dev, diff_method="adjoint")
... def circuit(x):
... qml.RX(x, wires=0)
... return qml.expval(qml.PauliY(0)), qml.expval(qml.PauliZ(0))
>>> x = qml.numpy.array(0.5)
>>> circuit(qml.numpy.array(0.5))
(array(-0.47942554), array(0.87758256))
Interfaces like Jax or Torch handle tuple outputs without issues:
>>> jax.jacobian(circuit)(jax.numpy.array(0.5))
(Array(-0.87758255, dtype=float32, weak_type=True),
Array(-0.47942555, dtype=float32, weak_type=True))
Autograd cannot differentiate an output tuple, so results must be converted to an array before
use with qml.jacobian
:
>>> qml.jacobian(lambda y: qml.numpy.array(circuit(y)))(x)
array([-0.87758256, -0.47942554])
Alternatively, the quantum function itself can return a numpy array of measurements:
>>> dev = qml.device('lightning.qubit', wires=1)
>>> @qml.qnode(dev, diff_method="adjoint")
>>> def circuit2(x):
... qml.RX(x, wires=0)
... return np.array([qml.expval(qml.PauliY(0)), qml.expval(qml.PauliZ(0))])
>>> qml.jacobian(circuit2)(np.array(0.5))
array([-0.87758256, -0.47942554])
-
Lightning wheels are now checked with
twine check
post-creation for PyPI compatibility. (#430) -
Lightning has been made compatible with the change in return types specification. (#427)
This release contains contributions from (in alphabetical order):
Christina Lee
-
Remove runtime dependency on ninja build system. (#414)
-
Allow better integration and installation support with CMake targeted binary builds. (#403)
-
Remove explicit Numpy and Scipy requirements. (#412)
-
Get
llvm
installation root from the environment variableLLVM_ROOT_DIR
(or fallback tobrew
). (#413) -
Update AVX2/512 kernel infrastructure for additional gate/generator operations. (#404)
-
Remove unnecessary lines for resolving CodeCov issue. (#415)
-
Add more AVX2/512 gate operations. (#393)
-
Ensure error raised when asking for out of order marginal probabilities. Prevents the return of incorrect results. (#416)
-
Fix Github shields in README. (#402)
Amintor Dusko, Vincent Michaud-Rioux, Lee James O'Riordan, Chae-Yeun Park
- Fix Python module versioning for Linux wheels. (#408)
This release contains contributions from (in alphabetical order):
Amintor Dusko, Shuli Shu, Trevor Vincent
- Fix Pybind11 module versioning and locations for Windows wheels. (#400)
This release contains contributions from (in alphabetical order):
Lee J. O'Riordan
- Deprecate support for Python 3.7. (#391)
-
Improve Lightning package structure for external use as a C++ library. (#369)
-
Improve the stopping condition method. (#386)
- Pin CMake to 3.24.x in wheel-builder to avoid Python not found error in CMake 3.25, when building wheels for PennyLane-Lightning-GPU. (#387)
This release contains contributions from (in alphabetical order):
Amintor Dusko, Lee J. O'Riordan
- Enable building of python 3.11 wheels and upgrade python on CI/CD workflows to 3.8. (#381)
-
Update clang-tools version in Github workflows. (#351)
-
Improve tests and checks CI/CD pipelines. (#353)
-
Implement 3 Qubits gates (CSWAP & Toffoli) & 4 Qubits gates (DoubleExcitation, DoubleExcitationMinus, DoubleExcitationPlus) in LM manner. (#362)
-
Upgrade Kokkos and Kokkos Kernels to 3.7.00, and improve sparse matrix-vector multiplication performance and memory usage. (#361)
-
Update Linux (ubuntu-latest) architecture x86_64 wheel-builder from GCC 10.x to GCC 11.x. (#373)
-
Update gcc and g++ 10.x to 11.x in CI tests. This update brings improved support for newer C++ features. (#370)
-
Change Lightning to inherit from QubitDevice instead of DefaultQubit. (#365)
- Use mutex when accessing cache in KernelMap. (#382)
This release contains contributions from (in alphabetical order):
Amintor Dusko, Chae-Yeun Park, Monit Sharma, Shuli Shu
- Fixes the transposition method used in the probability calculation. (#377)
Amintor Dusko
-
Introduces requirements-dev.txt and improves dockerfile. (#330)
-
Support
expval
for a Hamiltonian. (#333) -
Implements caching for Kokkos installation. (#316)
-
Supports measurements of operator arithmetic classes such as
Sum
,Prod
, andSProd
by deferring handling of them toDefaultQubit
. (#349)
@qml.qnode(qml.device('lightning.qubit', wires=2))
def circuit():
obs = qml.s_prod(2.1, qml.PauliZ(0)) + qml.op_sum(qml.PauliX(0), qml.PauliZ(1))
return qml.expval(obs)
-
Test updates to reflect new measurement error messages. (#334)
-
Updates to the release tagger to fix incompatibilities with RTD. (#344)
-
Update cancel-workflow-action and bot credentials. (#345)
This release contains contributions from (in alphabetical order):
Amintor Dusko, Christina Lee, Lee J. O'Riordan, Chae-Yeun Park
-
We explicitly disable support for PennyLane's parameter broadcasting. #317
-
We explicitly remove support for PennyLane's
Sum
,SProd
andProd
as observables. (#326)
-
CI builders use a reduced set of resources and redundant tests for PRs. (#319)
-
Parallelize wheel-builds where applicable. (#314)
-
AVX2/512 kernels are now available on Linux/MacOS with x86-64 architecture. (#313)
- Updated ReadTheDocs runner version from Ubuntu 20.04 to 22.04 (#327)
- Test updates to reflect new additions to PennyLane. (#318)
This release contains contributions from (in alphabetical order):
Amintor Dusko, Christina Lee, Rashid N H M, Lee J. O'Riordan, Chae-Yeun Park
-
Add
SingleExcitation
andDoubleExcitation
qchem gates and generators. (#289) -
Add a new dispatch mechanism for future kernels. (#291)
-
Add
IsingXY
gate operation. (#303) -
Support
qml.state()
in vjp and Hamiltonian in adjoint jacobian. (#294)
-
Codebase is now moving to C++20. The default compiler for Linux is now GCC10. (#295)
-
Minimum macOS version is changed to 10.15 (Catalina). (#295)
-
Split matrix operations, refactor dispatch mechanisms, and add a benchmark suits. (#274)
-
Add native support for the calculation of sparse Hamiltonians' expectation values. Sparse operations are offloaded to Kokkos and Kokkos-Kernels. (#283)
-
Device
lightning.qubit
now accepts a datatype for a statevector. (#290)
dev1 = qml.device('lightning.qubit', wires=4, c_dtype=np.complex64) # for single precision
dev2 = qml.device('lightning.qubit', wires=4, c_dtype=np.complex128) # for double precision
- Use the centralized Xanadu Sphinx Theme to style the Sphinx documentation. (#287)
-
Fix the issue with using available
clang-format
version in format. (#288) -
Fix a bug in the generator of
DoubleExcitationPlus
. (#298)
This release contains contributions from (in alphabetical order):
Mikhail Andrenkov, Ali Asadi, Amintor Dusko, Lee James O'Riordan, Chae-Yeun Park, and Shuli Shu
-
Add
generate_samples()
to lightning. (#247) -
Add Lightning GBenchmark Suite. (#249)
-
Support runtime and compile information. (#253)
-
Add
ENABLE_BLAS
build to CI checks. (#249) -
Add more
clang-tidy
checks and kernel tests. (#253) -
Add C++ code coverage to CI. (#265)
-
Skip over identity operations in
"lightning.qubit"
. (#268)
-
Update tests to remove
JacobianTape
. (#260) -
Fix tests for MSVC. (#264)
-
Fix
#include <cpuid.h>
for PPC and AArch64 in Linux. (#266) -
Remove deprecated tape execution methods. (#270)
-
Update
qml.probs
intest_measures.py
. (#280)
This release contains contributions from (in alphabetical order):
Ali Asadi, Chae-Yeun Park, Lee James O'Riordan, and Trevor Vincent
- Ensure
Identity
kernel is registered to C++ dispatcher. (#275)
- Add Docker support. (#234)
-
Update quantum tapes serialization and Python tests. (#239)
-
Clang-tidy is now enabled for both tests and examples builds under Github Actions. (#237)
-
The return type of
StateVectorBase
data is now derived-class defined. (#237) -
Update adjointJacobian and VJP methods. (#222)
-
Set GitHub workflow to upload wheels to Test PyPI. (#220)
-
Finalize the new kernel implementation. (#212)
- Use of batching with OpenMP threads is documented. (#221)
-
Fix for OOM errors when using adjoint with large numbers of observables. (#221)
-
Add virtual destructor to C++ state-vector classes. (#200)
-
Fix a bug in Python tests with operations'
matrix
calls. (#238) -
Refactor utility header and fix a bug in linear algebra function with CBLAS. (#228)
This release contains contributions from (in alphabetical order):
Ali Asadi, Chae-Yeun Park, Lee James O'Riordan
-
Add C++ only benchmark for a given list of gates. (#199)
-
Wheel-build support for Python 3.10. (#186)
-
C++ support for probability, expectation value and variance calculations. (#185)
-
Add bindings to C++ expval, var, probs. (#214)
-
setup.py
adds debug only when --debug is given (#208) -
Add new highly-performant C++ kernels for quantum gates. (#202)
The new kernels significantly improve the runtime performance of PennyLane-Lightning for both differentiable and non-differentiable workflows. Here is an example workflow using the adjoint differentiation method with a circuit of 5 strongly entangling layers:
import pennylane as qml
from pennylane import numpy as np
from pennylane.templates.layers import StronglyEntanglingLayers
from numpy.random import random
np.random.seed(42)
n_layers = 5
n_wires = 6
dev = qml.device("lightning.qubit", wires=n_wires)
@qml.qnode(dev, diff_method="adjoint")
def circuit(weights):
StronglyEntanglingLayers(weights, wires=list(range(n_wires)))
return [qml.expval(qml.PauliZ(i)) for i in range(n_wires)]
init_weights = np.random.random(StronglyEntanglingLayers.shape(n_layers=n_layers, n_wires=n_wires))
params = np.array(init_weights,requires_grad=True)
jac = qml.jacobian(circuit)(params)
The latest release shows improved performance on both single and multi-threaded evaluations!
- Ensure debug info is built into dynamic libraries. (#201)
- New guidelines on adding and benchmarking C++ kernels. (#202)
-
Update clang-format version (#219)
-
Fix failed tests on Windows. (#218)
-
Update clang-format version (#219)
-
Add virtual destructor to C++ state-vector classes. (#200)
-
Fix failed tests for the non-binary wheel. (#213)
-
Add virtual destructor to C++ state-vector classes. (#200)
This release contains contributions from (in alphabetical order):
Ali Asadi, Amintor Dusko, Chae-Yeun Park, Lee James O'Riordan
-
Fix missing header-files causing build errors in algorithms module. (#193)
-
Fix failed tests for the non-binary wheel. (#191)
- Introduce CY kernel to Lightning to avoid issues with decomposition. (#203)
This release contains contributions from (in alphabetical order):
Lee J. O'Riordan
-
Fix missing header-files causing build errors in algorithms module. (#193)
-
Fix failed tests for the non-binary wheel. (#191)
-
Add wheel-builder support for Python 3.10. (#186)
-
Add VJP support to PL-Lightning. (#181)
-
Add complex64 support in PL-Lightning. (#177)
-
Added examples folder containing aggregate gate performance test. (#165)
- Update PL-Lightning to support new features in PL. (#179)
- Lightning setup.py build process uses CMake. (#176)
This release contains contributions from (in alphabetical order):
Ali Asadi, Chae-Yeun Park, Isidor Schoch, Lee James O'Riordan
- Add Cache-Friendly DOTC, GEMV, GEMM along with BLAS Support. (#155)
-
The performance of parametric gates has been improved. (#157)
-
AVX support is enabled for Linux users on Intel/AMD platforms. (#157)
-
PennyLane-Lightning has been updated to conform with clang-tidy recommendations for modernization, offering performance improvements across all use-cases. (#153)
- Linux users on
x86_64
must have a CPU supporting AVX. (#157)
- OpenMP built with Intel MacOS CI runners causes failures on M1 Macs. OpenMP is currently disabled in the built wheels until this can be resolved with Github Actions runners. (#166)
This release contains contributions from (in alphabetical order):
Ali Asadi, Lee James O'Riordan
-
PennyLane-Lightning now provides a high-performance adjoint Jacobian method for differentiating quantum circuits. (#136)
The adjoint method operates after a forward pass by iteratively applying inverse gates to scan backwards through the circuit. The method is already available in PennyLane's
default.qubit
device, but the version provided bylightning.qubit
integrates with the C++ backend and is more performant, as shown in the plot below:The plot compares the average runtime of
lightning.qubit
anddefault.qubit
for calculating the Jacobian of a circuit using the adjoint method for a range of qubit numbers. The circuit consists of tenBasicEntanglerLayers
with aPauliZ
expectation value calculated on each wire, repeated over ten runs. We see thatlightning.qubit
provides a speedup of around two to eight times, depending on the number of qubits.The adjoint method can be accessed using the standard interface. Consider the following circuit:
import pennylane as qml wires = 3 layers = 2 dev = qml.device("lightning.qubit", wires=wires) @qml.qnode(dev, diff_method="adjoint") def circuit(weights): qml.templates.StronglyEntanglingLayers(weights, wires=range(wires)) return qml.expval(qml.PauliZ(0)) weights = qml.init.strong_ent_layers_normal(layers, wires, seed=1967)
The circuit can be executed and its gradient calculated using:
>>> print(f"Circuit evaluated: {circuit(weights)}") Circuit evaluated: 0.9801286266677633 >>> print(f"Circuit gradient:\n{qml.grad(circuit)(weights)}") Circuit gradient: [[[-1.11022302e-16 -1.63051504e-01 -4.14810501e-04] [ 1.11022302e-16 -1.50136528e-04 -1.77922957e-04] [ 0.00000000e+00 -3.92874550e-02 8.14523075e-05]] [[-1.14472273e-04 3.85963953e-02 0.00000000e+00] [-5.76791765e-05 -9.78478343e-02 0.00000000e+00] [-5.55111512e-17 0.00000000e+00 -1.11022302e-16]]]
-
PennyLane-Lightning now supports all of the operations and observables of
default.qubit
. (#124)
-
A new state-vector class
StateVectorManaged
was added, enabling memory use to be bound to statevector lifetime. (#136) -
The repository now has a well-defined component hierarchy, allowing each indepedent unit to be compiled and linked separately. (#136)
-
PennyLane-Lightning can now be installed without compiling its C++ binaries and will fall back to using the
default.qubit
implementation. Skipping compilation is achieved by setting theSKIP_COMPILATION
environment variable, e.g., Linux/MacOS:export SKIP_COMPILATION=True
, Windows:set SKIP_COMPILATION=True
. This feature is intended for building a pure-Python wheel of PennyLane-Lightning as a backup for platforms without a dedicated wheel. (#129) -
The C++-backed Python bound methods can now be directly called with wires and supplied parameters. (#125)
-
Lightning supports arbitrary unitary and non-unitary gate-calls from Python to C++ layer. (#121)
-
Added preliminary architecture diagram for package. (#131)
-
C++ API built as part of docs generation. (#131)
- Wheels for MacOS <= 10.13 will no longer be provided due to XCode SDK C++17 support requirements. (#149)
-
An indexing error in the CRY gate is fixed. (#136)
-
Column-major data in numpy is now correctly converted to row-major upon pass to the C++ layer. (#126)
This release contains contributions from (in alphabetical order):
Thomas Bromley, Lee James O'Riordan
- C++ layer now supports float (32-bit) and double (64-bit) templated complex data. (#113)
-
The PennyLane device test suite is now included in coverage reports. (#123)
-
Static versions of jQuery and Bootstrap are no longer included in the CSS theme. (#118)
-
C++ tests have been ported to use Catch2 framework. (#115)
-
Testing now exists for both float and double precision methods in C++ layer. (#113) (#115)
-
Compile-time utility methods with
constexpr
have been added. (#113) -
Wheel-build support for ARM64 (Linux and MacOS) and PowerPC (Linux) added. (#110)
-
Add support for Controlled Phase Gate (
ControlledPhaseShift
). (#114) -
Move changelog to
.github
and add a changelog reminder. (#111) -
Adds CMake build system support. (#104)
-
Removes support for Python 3.6 and adds support for Python 3.9. (#127) (#128)
-
Compilers with C++17 support are now required to build C++ module. (#113)
-
Gate classes have been removed with functionality added to StateVector class. (#113)
-
We are no longer building wheels for Python 3.6. (#106)
- PowerPC wheel-builder now successfully compiles modules. (#120)
- Added community guidelines. (#109)
This release contains contributions from (in alphabetical order):
Ali Asadi, Christina Lee, Thomas Bromley, Lee James O'Riordan
- The PennyLane-Lightning binaries are now built with NumPy 1.19.5, to avoid ABI compatibility issues with the latest NumPy 1.20 release. See the NumPy release notes for more details. (#97)
This release contains contributions from (in alphabetical order):
Josh Izaac, Antal Száva
-
For compatibility with PennyLane v0.15, the
analytic
keyword argument has been removed. Statistics can still be computed analytically by settingshots=None
. (#93) -
Inverse gates are now supported. (#89)
-
Add new lightweight backend with performance improvements. (#57)
-
Remove the previous Eigen-based backend. (#67)
- Re-add dispatch table after fixing static initialisation order issue. (#68)
This release contains contributions from (in alphabetical order):
Thomas Bromley, Theodor Isacsson, Christina Lee, Thomas Loke, Antal Száva.
- Fixes a bug where the
QNode
would swapLightningQubit
toDefaultQubitAutograd
on device execution due to the inheritedpassthru_devices
entry of thecapabilities
dictionary. (#61)
This release contains contributions from (in alphabetical order):
Antal Száva
- Extends support from 16 qubits to 50 qubits. (#52)
- Updates applying basis state preparations to correspond to the
changes in
DefaultQubit
. (#55)
This release contains contributions from (in alphabetical order):
Thomas Loke, Tom Bromley, Josh Izaac, Antal Száva
-
Updates capabilities dictionary to be compatible with core PennyLane (#45)
-
Fix install of Eigen for CI wheel building (#44)
This release contains contributions from (in alphabetical order):
Tom Bromley, Josh Izaac, Antal Száva
Initial release.
This release contains contributions from (in alphabetical order):
Tom Bromley, Josh Izaac, Nathan Killoran, Antal Száva