From 21bbbb1a78b79b019d061369b2647a4e7028c046 Mon Sep 17 00:00:00 2001 From: trbromley Date: Tue, 24 Oct 2023 15:32:47 -0400 Subject: [PATCH 01/18] Update release notes --- doc/releases/changelog-0.33.0.md | 507 ++++++++++++++++++------------- 1 file changed, 289 insertions(+), 218 deletions(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index 553087421e2..0f7ec462c7a 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -4,31 +4,59 @@

New features since last release

-* Approximate metrix exponentiation with random product formulas is available with the new `QDrift` - operation. - [(#4671)](https://github.com/PennyLaneAI/pennylane/pull/4671) +

Postselection and statistics in mid-circuit measurements 📌

+ +* Requesting postselection after making mid-circuit measurements is now possible by specifying the + `postselect` keyword argument in `qml.measure` as either `0` or `1`, corresponding to the basis states. + [(#4604)](https://github.com/PennyLaneAI/pennylane/pull/4604) - The product terms in `QDrift` are generated by randomly sampling from the Hamiltonian terms with - a probability that depends on the Hamiltonian coefficients. - ```python - coeffs = [0.25, 0.75] - ops = [qml.PauliX(0), qml.PauliZ(0)] - H = qml.dot(coeffs, ops) + dev = qml.device("default.qubit", wires=3) - dev = qml.device("default.qubit", wires=2) + @qml.qnode(dev) + def circuit(phi): + qml.RX(phi, wires=0) + m = qml.measure(0, postselect=1) + qml.cond(m, qml.PauliX)(wires=1) + return qml.probs(wires=1) + ``` + + ```pycon + >>> circuit(np.pi) + tensor([0., 1.], requires_grad=True) + ``` + + Here, we measure a probability of one on wire 1 as we postselect on the :math:`|1\rangle` state on + wire 0, thus resulting in the circuit being projected onto the state corresponding to the + measurement outcome :math:`|1\rangle` on wire 0. + +* Measurement statistics can now be collected for mid-circuit measurements. + [(#4544)](https://github.com/PennyLaneAI/pennylane/pull/4544) + + ```python + dev = qml.device("default.qubit") @qml.qnode(dev) - def circuit(): - qml.Hadamard(0) - qml.QDrift(H, time=1.2, n = 10) - return qml.probs() + def circ(x, y): + qml.RX(x, wires=0) + qml.RY(y, wires=1) + m0 = qml.measure(1) + return qml.expval(qml.PauliZ(0)), qml.expval(m0), qml.sample(m0) ``` ```pycon - >>> circuit() - array([0.61814334, 0. , 0.38185666, 0. ]) + >>> circ(1.0, 2.0, shots=10000) + (0.5606, 0.7089, array([0, 1, 1, ..., 1, 1, 1])) ``` + + Support is provided for both + [finite-shot and analytic modes](https://docs.pennylane.ai/en/stable/introduction/circuits.html#shots) + and devices default to using the + [deferred measurement](https://docs.pennylane.ai/en/stable/code/api/pennylane.defer_measurements.html) + principle to enact the mid-circuit measurements. + + In future releases, we will be exploring the ability to combine and manipulate mid-circuit + measurements such as `qml.expval(m0 @ m1)` or `qml.expval(m0 @ qml.PauliZ(0))`.

Exponentiate Hamiltonians with flexible Trotter products 🐖

@@ -65,116 +93,44 @@ It is recommended to switch over to use of `TrotterProduct` because `ApproxTimeEvolution` will be deprecated and removed in upcoming releases. -* Support drawing QJIT QNode from Catalyst. - [(#4609)](https://github.com/PennyLaneAI/pennylane/pull/4609) - - ```python - import catalyst - - @catalyst.qjit - @qml.qnode(qml.device("lightning.qubit", wires=3)) - def circuit(x, y, z, c): - """A quantum circuit on three wires.""" - - @catalyst.for_loop(0, c, 1) - def loop(i): - qml.Hadamard(wires=i) +* Approximating matrix exponentiation with random product formulas, qDrift, is now available with the new `QDrift` + operation. + [(#4671)](https://github.com/PennyLaneAI/pennylane/pull/4671) - qml.RX(x, wires=0) - loop() # pylint: disable=no-value-for-parameter - qml.RY(y, wires=1) - qml.RZ(z, wires=2) - return qml.expval(qml.PauliZ(0)) + As shown in [1811.08017](https://arxiv.org/pdf/1811.08017.pdf), qDrift is a Markovian process that can provide + a speedup in Hamiltonian simulation. At a high level, qDrift works by randomly sampling from the Hamiltonian + terms with a probability that depends on the Hamiltonian coefficients. This method for Hamiltonian + simulation is now ready to use in PennyLane with the `QDrift` operator. Simply specify the evolution `time` + and the number of samples drawn from the Hamiltonian, `n`: - draw = qml.draw(circuit, decimals=None)(1.234, 2.345, 3.456, 1) - ``` - - ```pycon - >>>draw - "0: ──RX──H──┤ \n1: ──H───RY─┤ \n2: ──RZ─────┤ " - ``` - -* Measurement statistics can now be collected for mid-circuit measurements. Currently, - `qml.expval`, `qml.var`, `qml.probs`, `qml.sample`, and `qml.counts` are supported on - `default.qubit`, `default.mixed`, and the new `DefaultQubit2` device. - [(#4544)](https://github.com/PennyLaneAI/pennylane/pull/4544) - ```python + coeffs = [0.25, 0.75] + ops = [qml.PauliX(0), qml.PauliZ(0)] + H = qml.dot(coeffs, ops) + dev = qml.device("default.qubit", wires=2) @qml.qnode(dev) - def circ(x, y): - qml.RX(x, wires=0) - qml.RY(y, wires=1) - m0 = qml.measure(1) - return qml.expval(qml.PauliZ(0)), qml.sample(m0) - ``` - - QNodes can be executed as usual when collecting mid-circuit measurement statistics: - - ```pycon - >>> circ(1.0, 2.0, shots=5) - (array(0.6), array([1, 1, 1, 0, 1])) + def circuit(): + qml.Hadamard(0) + qml.QDrift(H, time=1.2, n = 10) + return qml.probs() ``` -* Users can now request postselection after making mid-circuit measurements. They can do so - by specifying the `postselect` keyword argument for `qml.measure` as either `0` or `1`, - corresponding to the basis states. - [(#4604)](https://github.com/PennyLaneAI/pennylane/pull/4604) - - ```python - dev = qml.device("default.qubit", wires=3) - - @qml.qnode(dev) - def circuit(phi): - qml.RX(phi, wires=0) - m = qml.measure(0, postselect=1) - qml.cond(m, qml.PauliX)(wires=1) - return qml.probs(wires=1) - ``` ```pycon - >>> circuit(np.pi) - tensor([0., 1.], requires_grad=True) + >>> circuit() + array([0.61814334, 0. , 0.38185666, 0. ]) ``` - Here, we measure a probability of one on wire 1 as we postselect on the $|1\rangle$ state on wire - 0, thus resulting in the circuit being projected onto the state corresponding to the measurement - outcome $|1\rangle$ on wire 0. - -* Operator transforms `qml.matrix`, `qml.eigvals`, `qml.generator`, and `qml.transforms.to_zx` are updated - to the new transform program system. - [(#4573)](https://github.com/PennyLaneAI/pennylane/pull/4573) - -* Transforms can be applied on devices following the new device API. - [(#4667)](https://github.com/PennyLaneAI/pennylane/pull/4667) - -* `commutation_dag`, `shadow_expval`, `shadow_state`, `circuit_spectrum`, `map_wires` are updated to the new transform - program system. - [(#4686)](https://github.com/PennyLaneAI/pennylane/pull/4686) +

Building blocks for quantum phase estimation 🧱

-* All gradient transforms are updated to the new transform program system. - [(#4595)](https://github.com/PennyLaneAI/pennylane/pull/4595) - -* All quantum functions transforms are update to the new transform program system. - [(#4439)](https://github.com/PennyLaneAI/pennylane/pull/4439) - -* All batch transforms are updated to the new transform program system. - [(#4440)](https://github.com/PennyLaneAI/pennylane/pull/4440) - [(#4686)](https://github.com/PennyLaneAI/pennylane/pull/4686) - -* Quantum information transforms are updated to the new transform program system. - [(#4569)](https://github.com/PennyLaneAI/pennylane/pull/4569) - -* `default.qubit` now implements the new device API. The old version of the device is still - accessible by the short name `default.qubit.legacy`, or directly via `qml.devices.DefaultQubitLegacy`. - [(#4594)](https://github.com/PennyLaneAI/pennylane/pull/4594) - [(#4436)](https://github.com/PennyLaneAI/pennylane/pull/4436) - [(#4620)](https://github.com/PennyLaneAI/pennylane/pull/4620) - [(#4632)](https://github.com/PennyLaneAI/pennylane/pull/4632) - -* The `CosineWindow` template has been added to prepare an initial state based on a cosine wave function. +* A new operator called `CosineWindow` has been added to prepare an initial state based on a cosine wave function. [(#4683)](https://github.com/PennyLaneAI/pennylane/pull/4683) + As outlined in [2110.09590](https://arxiv.org/pdf/2110.09590.pdf), the cosine tapering window is part of a modification + to quantum phase estimation that can provide a cubic improvement to the algorithm's error rate. Using `CosineWindow` will + prepare a state whose amplitudes follow a cosinusoidal distribution over the computational basis. + ```python import pennylane as qml import matplotlib.pyplot as plt @@ -188,78 +144,140 @@ output = example_circuit() # Graph showing state amplitudes + plt.style.use("pennylane.drawer.plot") plt.bar(range(len(output)), output) plt.show() ``` - We can show how this operator is built: + - ```python - import pennylane as qml +

New device capabilities, integration with Catalyst, and more! ⚗️

+ +* `default.qubit` now uses the new `qml.devices.Device` API and functionality in + `qml.devices.qubit`. If you experience any issues with the updated `default.qubit`, please let us + know by [posting an issue](https://github.com/PennyLaneAI/pennylane/issues/new/choose). + The old version of the device is still + accessible by the short name `default.qubit.legacy`, or directly via `qml.devices.DefaultQubitLegacy`. + [(#4594)](https://github.com/PennyLaneAI/pennylane/pull/4594) + [(#4436)](https://github.com/PennyLaneAI/pennylane/pull/4436) + [(#4620)](https://github.com/PennyLaneAI/pennylane/pull/4620) + [(#4632)](https://github.com/PennyLaneAI/pennylane/pull/4632) - dev = qml.device("default.qubit", wires=5) + This changeover has a number of benefits for `default.qubit`, including: - op = qml.CosineWindow(wires=range(5)) - - @qml.qnode(dev) - def circuit(): - op.decomposition() - return qml.state() + * The number of wires is now optional — simply having `qml.device("default.qubit")` is valid! If + wires are not provided at instantiation, the device automatically infers the required number of + wires for each circuit provided for execution. + + ```python + dev = qml.device("default.qubit") - print(qml.draw(circuit)()) + @qml.qnode(dev) + def circuit(): + qml.PauliZ(0) + qml.RZ(0.1, wires=1) + qml.Hadamard(2) + return qml.state() + ``` + + ```pycon + >>> print(qml.draw(circuit)()) + 0: ──Z────────┤ State + 1: ──RZ(0.10)─┤ State + 2: ──H────────┤ State + ``` + + * `default.qubit` is no longer silently swapped out with an interface-appropriate device when the + backpropagation differentiation method is used. For example, consider: + + ```python + dev = qml.device("default.qubit", wires=1) + + @qml.qnode(dev, diff_method="backprop") + def f(x): + qml.RX(x, wires=0) + return qml.expval(qml.PauliX(0)) + + f(jax.numpy.array(0.2)) + ``` + + In previous versions of PennyLane, the device will be swapped for the JAX equivalent: + + ```pycon + >>> f.device + + >>> f.device == dev + False + ``` + + Now, `default.qubit` can itself dispatch to all of the interfaces in a backprop-compatible way + and hence does not need to be swapped: + + ```pycon + >>> f.device + + >>> f.device == dev + True + ``` + +* A QNode that has been decorated with `qjit` from PennyLane's + [Catalyst](https://docs.pennylane.ai/projects/catalyst) library for just-in-time hybrid + compilation is now compatible with `qml.draw`. + [(#4609)](https://github.com/PennyLaneAI/pennylane/pull/4609) + + ```python + import catalyst + @catalyst.qjit + @qml.qnode(qml.device("lightning.qubit", wires=3)) + def circuit(x, y, z, c): + """A quantum circuit on three wires.""" + + @catalyst.for_loop(0, c, 1) + def loop(i): + qml.Hadamard(wires=i) + + qml.RX(x, wires=0) + loop() + qml.RY(y, wires=1) + qml.RZ(z, wires=2) + return qml.expval(qml.PauliZ(0)) + + draw = qml.draw(circuit, decimals=None)(1.234, 2.345, 3.456, 1) ``` ```pycon - - 0: ──────────────╭QFT†──Rϕ(1.57)─┤ State - 1: ──────────────├QFT†──Rϕ(0.79)─┤ State - 2: ──────────────├QFT†──Rϕ(0.39)─┤ State - 3: ──────────────├QFT†──Rϕ(0.20)─┤ State - 4: ──H──RZ(3.14)─╰QFT†──Rϕ(0.10)─┤ State + >>> print(draw) + 0: ──RX──H──┤ + 1: ──H───RY─┤ + 2: ──RZ─────┤ + ``` - ``` + Stay tuned for more integration of Catalyst into PennyLane!

Improvements 🛠

-* Multi-controlled operations with a single qubit special unitary target can now automatically decompose. - [(#4697)](https://github.com/PennyLaneAI/pennylane/pull/4697) +

More PyTrees!

-* `pennylane.devices.preprocess` now offers the transforms `decompose`, `validate_observables`, `validate_measurements`, - `validate_device_wires`, `validate_multiprocessing_workers`, `warn_about_trainable_observables`, - and `no_sampling` to assist in the construction of devices under the new `devices.Device` API. - [(#4659)](https://github.com/PennyLaneAI/pennylane/pull/4659) +* `MeasurementProcess` and `QuantumScript` objects are now registered as JAX PyTrees. + [(#4607)](https://github.com/PennyLaneAI/pennylane/pull/4607) + [(#4608)](https://github.com/PennyLaneAI/pennylane/pull/4608) -* `pennylane.defer_measurements` will now exit early if the input does not contain mid circuit measurements. - [(#4659)](https://github.com/PennyLaneAI/pennylane/pull/4659) + It is now possible to JIT-compile functions with arguments that are a `MeasurementProcess` or + a `QuantumScript`: -* `default.qubit` now tracks the number of equivalent qpu executions and total shots - when the device is sampling. Note that `"simulations"` denotes the number of simulation passes, where as - `"executions"` denotes how many different computational bases need to be sampled in. Additionally, the - new `default.qubit` also tracks the results of `device.execute`. - [(#4628)](https://github.com/PennyLaneAI/pennylane/pull/4628) - [(#4649)](https://github.com/PennyLaneAI/pennylane/pull/4649) + ```python + tape0 = qml.tape.QuantumTape([qml.RX(1.0, 0), qml.RY(0.5, 0)], [qml.expval(qml.PauliZ(0))]) + dev = qml.device('lightning.qubit', wires=5) -* The `JacobianProductCalculator` abstract base class and implementations `TransformJacobianProducts` - `DeviceDerivatives`, and `DeviceJacobianProducts` have been added to `pennylane.interfaces.jacobian_products`. - [(#4435)](https://github.com/PennyLaneAI/pennylane/pull/4435) - [(#4527)](https://github.com/PennyLaneAI/pennylane/pull/4527) - [(#4637)](https://github.com/PennyLaneAI/pennylane/pull/4637) + execute_kwargs = {"device": dev, "gradient_fn": qml.gradients.param_shift, "interface":"jax"} -* Extended ``qml.qchem.import_state`` to import wavefunctions from MPS DMRG and SHCI classical - calculations performed with the Block2 and Dice libraries, incorporating new tests and wavefunction - input selection logic. - [#4523](https://github.com/PennyLaneAI/pennylane/pull/4523) - [#4524](https://github.com/PennyLaneAI/pennylane/pull/4524) - [#4626](https://github.com/PennyLaneAI/pennylane/pull/4626) - [#4634](https://github.com/PennyLaneAI/pennylane/pull/4634) + jitted_execute = jax.jit(qml.execute, static_argnames=execute_kwargs.keys()) -* `MeasurementProcess` and `QuantumScript` objects are now registered as jax pytrees. - [(#4607)](https://github.com/PennyLaneAI/pennylane/pull/4607) - [(#4608)](https://github.com/PennyLaneAI/pennylane/pull/4608) + jitted_execute((tape0, ), **execute_kwargs) + ``` -* Tensor-network template `qml.MPS` now supports changing `offset` between subsequent blocks for more flexibility. - [(#4531)](https://github.com/PennyLaneAI/pennylane/pull/4531) +

Improving QChem and existing algorithms

* The qchem ``fermionic_dipole`` and ``particle_number`` functions are updated to use a ``FermiSentence``. The deprecated features for using tuples to represent fermionic operations are @@ -267,37 +285,53 @@ [(#4546)](https://github.com/PennyLaneAI/pennylane/pull/4546) [(#4556)](https://github.com/PennyLaneAI/pennylane/pull/4556) -* Add the method ``add_transform`` and ``insert_front_transform`` transform in the ``TransformProgram``. - [(#4559)](https://github.com/PennyLaneAI/pennylane/pull/4559) +* Tensor-network template `qml.MPS` now supports changing `offset` between subsequent blocks for more flexibility. + [(#4531)](https://github.com/PennyLaneAI/pennylane/pull/4531) -* Dunder ``__add__`` method is added to the ``TransformProgram`` class, therefore two programs can be added using ``+`` . - [(#4549)](https://github.com/PennyLaneAI/pennylane/pull/4549) +* Improve builtin types support with `qml.pauli_decompose`. + [(#4577)](https://github.com/PennyLaneAI/pennylane/pull/4577) -* `qml.sample()` in the new device API now returns a `np.int64` array instead of `np.bool8`. - [(#4539)](https://github.com/PennyLaneAI/pennylane/pull/4539) +* `AmplitudeEmbedding` now inherits from `StatePrep`, allowing for it to not be decomposed + when at the beginning of a circuit, thus behaving like `StatePrep`. + [(#4583)](https://github.com/PennyLaneAI/pennylane/pull/4583) + +

Next-generation device API

+ +* `default.qubit` now tracks the number of equivalent qpu executions and total shots + when the device is sampling. Note that `"simulations"` denotes the number of simulation passes, where as + `"executions"` denotes how many different computational bases need to be sampled in. Additionally, the + new `default.qubit` also tracks the results of `device.execute`. + [(#4628)](https://github.com/PennyLaneAI/pennylane/pull/4628) + [(#4649)](https://github.com/PennyLaneAI/pennylane/pull/4649) + +* `DefaultQubit2` can now accept a `jax.random.PRNGKey` as a `seed`, to set the key for the JAX pseudo random + number generator when using the JAX interface. This corresponds to the `prng_key` on + `DefaultQubitJax` in the old API. + [(#4596)](https://github.com/PennyLaneAI/pennylane/pull/4596) + +* The `JacobianProductCalculator` abstract base class and implementations `TransformJacobianProducts` + `DeviceDerivatives`, and `DeviceJacobianProducts` have been added to `pennylane.interfaces.jacobian_products`. + [(#4435)](https://github.com/PennyLaneAI/pennylane/pull/4435) + [(#4527)](https://github.com/PennyLaneAI/pennylane/pull/4527) + [(#4637)](https://github.com/PennyLaneAI/pennylane/pull/4637) + +* `DefaultQubit2` dispatches to a faster implementation for applying `ParametrizedEvolution` to a state + when it is more efficient to evolve the state than the operation matrix. + [(#4598)](https://github.com/PennyLaneAI/pennylane/pull/4598) + [(#4620)](https://github.com/PennyLaneAI/pennylane/pull/4620) * Wires can be provided to the new device API. [(#4538)](https://github.com/PennyLaneAI/pennylane/pull/4538) [(#4562)](https://github.com/PennyLaneAI/pennylane/pull/4562) +* `qml.sample()` in the new device API now returns a `np.int64` array instead of `np.bool8`. + [(#4539)](https://github.com/PennyLaneAI/pennylane/pull/4539) + * The new device API now has a `repr()` [(#4562)](https://github.com/PennyLaneAI/pennylane/pull/4562) -* The density matrix aspects of `StateMP` have been split into their own measurement - process, `DensityMatrixMP`. - [(#4558)](https://github.com/PennyLaneAI/pennylane/pull/4558) - -* `qml.exp` returns a more informative error message when decomposition is unavailable for non-unitary operator. - [(#4571)](https://github.com/PennyLaneAI/pennylane/pull/4571) - -* The `StateMP` measurement now accepts a wire order (eg. a device wire order). The `process_state` - method will re-order the given state to go from the inputted wire-order to the process's wire-order. - If the process's wire-order contains extra wires, it will assume those are in the zero-state. - [(#4570)](https://github.com/PennyLaneAI/pennylane/pull/4570) - [(#4602)](https://github.com/PennyLaneAI/pennylane/pull/4602) - -* Improve builtin types support with `qml.pauli_decompose`. - [(#4577)](https://github.com/PennyLaneAI/pennylane/pull/4577) +* `DefaultQubit2` now works as expected with measurement processes that don't specify wires. + [(#4580)](https://github.com/PennyLaneAI/pennylane/pull/4580) * The function `integrals.py` is modified to replace indexing with slicing in the computationally expensive functions `electron_repulsion` and `_hermite_coulomb`, for a better compatibility with @@ -313,31 +347,61 @@ specifies an interface, the result will be computed with that interface. [(#4582)](https://github.com/PennyLaneAI/pennylane/pull/4582) -* `DefaultQubit2` now works as expected with measurement processes that don't specify wires. - [(#4580)](https://github.com/PennyLaneAI/pennylane/pull/4580) +* `ShotAdaptiveOptimizer` has been updated to pass shots to QNode executions instead of overriding + device shots before execution. This makes it compatible with the new device API. + [(#4599)](https://github.com/PennyLaneAI/pennylane/pull/4599) -* `AmplitudeEmbedding` now inherits from `StatePrep`, allowing for it to not be decomposed - when at the beginning of a circuit, thus behaving like `StatePrep`. - [(#4583)](https://github.com/PennyLaneAI/pennylane/pull/4583) +* `pennylane.devices.preprocess` now offers the transforms `decompose`, `validate_observables`, `validate_measurements`, + `validate_device_wires`, `validate_multiprocessing_workers`, `warn_about_trainable_observables`, + and `no_sampling` to assist in the construction of devices under the new `devices.Device` API. + [(#4659)](https://github.com/PennyLaneAI/pennylane/pull/4659) -* `DefaultQubit2` can now accept a `jax.random.PRNGKey` as a `seed`, to set the key for the JAX pseudo random - number generator when using the JAX interface. This corresponds to the `prng_key` on - `DefaultQubitJax` in the old API. - [(#4596)](https://github.com/PennyLaneAI/pennylane/pull/4596) +

Other improvements

-* DefaultQubit2 dispatches to a faster implementation for applying `ParametrizedEvolution` to a state - when it is more efficient to evolve the state than the operation matrix. - [(#4598)](https://github.com/PennyLaneAI/pennylane/pull/4598) - [(#4620)](https://github.com/PennyLaneAI/pennylane/pull/4620) +* Add the method ``add_transform`` and ``insert_front_transform`` transform in the ``TransformProgram``. + [(#4559)](https://github.com/PennyLaneAI/pennylane/pull/4559) -* `ShotAdaptiveOptimizer` has been updated to pass shots to QNode executions instead of overriding - device shots before execution. This makes it compatible with the new device API. - [(#4599)](https://github.com/PennyLaneAI/pennylane/pull/4599) +* Dunder ``__add__`` method is added to the ``TransformProgram`` class, therefore two programs can be added using ``+`` . + [(#4549)](https://github.com/PennyLaneAI/pennylane/pull/4549) + +* Transforms can be applied on devices following the new device API. + [(#4667)](https://github.com/PennyLaneAI/pennylane/pull/4667) + +* All gradient transforms are updated to the new transform program system. + [(#4595)](https://github.com/PennyLaneAI/pennylane/pull/4595) +* Multi-controlled operations with a single qubit special unitary target can now automatically decompose. + [(#4697)](https://github.com/PennyLaneAI/pennylane/pull/4697) + +* `pennylane.defer_measurements` will now exit early if the input does not contain mid circuit measurements. + [(#4659)](https://github.com/PennyLaneAI/pennylane/pull/4659) + +* `qml.qchem.import_state` has been extended to import more quantum chemistry wavefunctions, + from MPS, DMRG and SHCI classical calculations performed with the Block2 and Dice libraries. + [#4523](https://github.com/PennyLaneAI/pennylane/pull/4523) + [#4524](https://github.com/PennyLaneAI/pennylane/pull/4524) + [#4626](https://github.com/PennyLaneAI/pennylane/pull/4626) + [#4634](https://github.com/PennyLaneAI/pennylane/pull/4634) + + Check out our [how-to guide](https://pennylane.ai/qml/demos/tutorial_initial_state_preparation) + to learn more about how PennyLane integrates with your favourite quantum chemistry libraries. + +* The density matrix aspects of `StateMP` have been split into their own measurement + process, `DensityMatrixMP`. + [(#4558)](https://github.com/PennyLaneAI/pennylane/pull/4558) + +* The `StateMP` measurement now accepts a wire order (e.g., a device wire order). The `process_state` + method will re-order the given state to go from the inputted wire-order to the process's wire-order. + If the process's wire-order contains extra wires, it will assume those are in the zero-state. + [(#4570)](https://github.com/PennyLaneAI/pennylane/pull/4570) + [(#4602)](https://github.com/PennyLaneAI/pennylane/pull/4602) * `StateMeasurement.process_state` now assumes the input is flat. `ProbabilityMP.process_state` has been updated to reflect this assumption and avoid redundant reshaping. [(#4602)](https://github.com/PennyLaneAI/pennylane/pull/4602) +* `qml.exp` returns a more informative error message when decomposition is unavailable for non-unitary operator. + [(#4571)](https://github.com/PennyLaneAI/pennylane/pull/4571) + * Added `qml.math.get_deep_interface` to get the interface of a scalar hidden deep in lists or tuples. [(#4603)](https://github.com/PennyLaneAI/pennylane/pull/4603) @@ -453,14 +517,6 @@ * The CV observables ``qml.X`` and ``qml.P`` are removed. Please use ``qml.QuadX`` and ``qml.QuadP`` instead. [(#4533)](https://github.com/PennyLaneAI/pennylane/pull/4533) -* The method ``tape.unwrap()`` and corresponding ``UnwrapTape`` and ``Unwrap`` classes are removed. - Instead of ``tape.unwrap()``, use :func:`~.transforms.convert_to_numpy_parameters`. - [(#4535)](https://github.com/PennyLaneAI/pennylane/pull/4535) - -* The ``RandomLayers.compute_decomposition`` keyword argument ``ratio_imprivitive`` has been changed to - ``ratio_imprim`` to match the call signature of the operation. - [(#4552)](https://github.com/PennyLaneAI/pennylane/pull/4552) - * The ``sampler_seed`` argument of ``qml.gradients.spsa_grad`` has been removed. Instead, the ``sampler_rng`` argument should be set, either to an integer value, which will be used to create a PRNG internally, or to a NumPy pseudo-random number generator (PRNG) created via @@ -471,6 +527,21 @@ been removed. Please use ``QuantumScript.bind_new_parameters`` instead. [(#4548)](https://github.com/PennyLaneAI/pennylane/pull/4548) +* The method ``tape.unwrap()`` and corresponding ``UnwrapTape`` and ``Unwrap`` classes are removed. + Instead of ``tape.unwrap()``, use ``qml.transforms.convert_to_numpy_parameters``. + [(#4535)](https://github.com/PennyLaneAI/pennylane/pull/4535) + +* `MeasurementProcess.eigvals()` now raises an `EigvalsUndefinedError` if the measurement observable + does not have eigenvalues. + [(#4544)](https://github.com/PennyLaneAI/pennylane/pull/4544) + +* The device test suite now converts device kwargs to integers or floats if they can be converted to integers or floats. + [(#4640)](https://github.com/PennyLaneAI/pennylane/pull/4640) + +* The ``RandomLayers.compute_decomposition`` keyword argument ``ratio_imprivitive`` has been changed to + ``ratio_imprim`` to match the call signature of the operation. + [(#4552)](https://github.com/PennyLaneAI/pennylane/pull/4552) + * The private `TmpPauliRot` operator used for `SpecialUnitary` no longer decomposes to nothing when the theta value is trainable. [(#4585)](https://github.com/PennyLaneAI/pennylane/pull/4585) @@ -479,35 +550,32 @@ which effectively just called `marginal_prob` with `np.abs(state) ** 2`. [(#4602)](https://github.com/PennyLaneAI/pennylane/pull/4602) -* `default.qubit` now implements the new device API. If you initialize a device - with `qml.device("default.qubit")`, all functions and properties that were tied to the old - device API will no longer be on the device. The legacy version can still be accessed with - `qml.device("default.qubit.legacy", wires=n_wires)`. - [(#4436)](https://github.com/PennyLaneAI/pennylane/pull/4436) -

Deprecations 👋

-* The ``prep`` keyword argument in ``QuantumScript`` is deprecated and will be removed from `QuantumScript`. - ``StatePrepBase`` operations should be placed at the beginning of the `ops` list instead. - [(#4554)](https://github.com/PennyLaneAI/pennylane/pull/4554) - * The following decorator syntax for transforms has been deprecated and will raise a warning: + [(#4457)](https://github.com/PennyLaneAI/pennylane/pull/4457/) + ```python @transform_fn(**transform_kwargs) @qml.qnode(dev) def circuit(): ... ``` + If you are using a transform that has supporting `transform_kwargs`, please call the transform directly using `circuit = transform_fn(circuit, **transform_kwargs)`, or use `functools.partial`: + ```python @functools.partial(transform_fn, **transform_kwargs) @qml.qnode(dev) def circuit(): ... ``` - [(#4457)](https://github.com/PennyLaneAI/pennylane/pull/4457/) + +* The ``prep`` keyword argument in ``QuantumScript`` is deprecated and will be removed from `QuantumScript`. + ``StatePrepBase`` operations should be placed at the beginning of the `ops` list instead. + [(#4554)](https://github.com/PennyLaneAI/pennylane/pull/4554) * `qml.gradients.pulse_generator` becomes `qml.gradients.pulse_odegen` to adhere to paper naming conventions. During v0.33, `pulse_generator` is still available but raises a warning. @@ -578,11 +646,14 @@ This release contains contributions from (in alphabetical order): Guillermo Alonso, Utkarsh Azad, +Thomas Bromley, +Isaac De Vlugt, Jack Brown, Stepan Fomichev, Joana Fraxanet, Diego Guala, Soran Jahangiri, +Edward Jiang, Korbinian Kottmann, Ivana Kurecic, Christina Lee, @@ -593,4 +664,4 @@ Daniel F. Nino, Lee James O'Riordan, Mudit Pandey, Matthew Silverman, -Jay Soni, +Jay Soni. From c6f76834847c3a5b9a17ae71aae70aa72afddc60 Mon Sep 17 00:00:00 2001 From: trbromley Date: Tue, 24 Oct 2023 15:42:56 -0400 Subject: [PATCH 02/18] Add image --- doc/_static/cosine_window.png | Bin 0 -> 68634 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/_static/cosine_window.png diff --git a/doc/_static/cosine_window.png b/doc/_static/cosine_window.png new file mode 100644 index 0000000000000000000000000000000000000000..2b88019be86f6e91da24cace4714a4e490bc8c7a GIT binary patch literal 68634 zcmeEvcU+VA+BbbX>S-O6s-Vn@tyX17ktGDQGO8$4L_k1Lu(Ck}SplN8Rd#GGOOaF% z5fKoXG95swjEKk{(L@M4h7m>}d9U9ch9K?J_j%qw-aif>Pmd$xzJKHTUDtP9ckmAe zdTTxt{Y*eWV9kN=wT%P>R^SB${?+jB74SC$rR${N|I|En%sh{}o$>TOb?!%j!>2sY zI=gu~JJ@{b_2W4Y2RBzmIaRq`GGE$zdY<*zBQNhV_X0V$b9VAdnK`NOA)lW8{kKLvv$ zF8nKE`Pkym=_kn@~$%Xd<2`3BcJiQC*+JERf>RTM2Ou7wTjcR z6swHJWpIrG0vCRN5iW`SPC($OUFJ&cw_hrR;`o0Te7qkn8h*a7vJu37v)4u##tZ#? zk=4ZijH@x_{ExU$Cd20c+gE4)zx=3%SKXid;GAPFJ2^S2J7w%Q*ppmP)Dr8N~cf`zXe8%4A@ylI{&ZZ-D0Z;G~XD+$4B9$iJ<)JB&! z{v9th8vbYC?JX^PdK)9g<#}JXw6uus67@1kGfDKWY`8U0ldg6o#aL8TdgBd~=h_*k zZykI1a>sG|$U`Fsh0VVX?a3|(;INO7e6QN^b7Z+jtXMdQdRj_Yb zslta&T|BVaVdh<{(ti78_QPU&OvrwQ)8%iJUHR7-{OIAz-*!Y-*48#F*ocLEpL#mM zl>e17*$21!eGPBc$;x)jgcn5~tnKyk`|6Kl-`4JgOM-ugOIlZqK0M*LdG#ah<=98= z)i#@5Ak}jVL^EsUZ}%Gej-=LK&aLb`hlV)f-xYV3{-~U$We4gVbD9c#D_^qX2Gj2v z?^q))6n1#&YwMl6mHCC~()MM_xkut21%U1#S@vF|B%|$}#ao((XGi$M zv4WR)$Q|LY_0NT7m$=dV5~uWEyxlwMw|edB)h>D2xw=YHun zOhMI6t&G}d7e4)qdpgnl5B6VXl&+va%ysiL;Z_dkN^WaQYocXtpg!v_1_6!Js2^@J zZ%ygHb8>T(&hFl&x%72AmUM3CFRRP>4_AIs>7%w8zjeu%zPwj1`Taek6z#^gL0!RR zTW`+})S^XIYRO+z4_3|(`^S+5?O}nVM^o!*%_VkMa_zjUBF;5W%9bZC{i)dc>KolC zzOl&xZ?a5p8NF_H?9I`F=TAwkOj?&k{C{Ehb24Zr{>v1jl=ZS{XX@suo9@FMe8!>v@4~}eu$;Lihzo8`%$Hu|xSGG;1+YWE zNUe7am;A3oAxnO*{rvZO{3!U)T)Z7C6aIuW~f@8eX`uWTB)%tcw78NQ|o~9**Q7kEy-C~ikh5eN=2=nl*CSx`$6;w zb-BRNRO@nmtD)aSoGmFD!-tB7Z!*KkQUr|>R=8VPYX>{`Q>o!Mmjo+HID<~N;NbQ- z;y)A}F1at$(%(K&557}A>^rJhKe`-w|F^5$-#=MNRwEFMq{oSYO19d4ZRp|$Sc`E;*KQS`MW2MZ_pM>+lc z>@j)9A?JZ9TZ21JXH7E+S|<0+gb43f5*}C(r`s5sB5>Htl}-(9l4`Wm;xwblrb#e; z^rqUW)9tsV#$W(-=gzP*#-~K^>Ba1pyC$jbEe^>8Y};sgYf1fRxo|fEr}aphiJkKy z0w<3kCUU~_i1@ibH?!KAf!=wVcssHUaW;-CraZ`V=e!jpY=i?RLai%iJC56AOAObS zFW%j7|MFMo$Q_BQ3KF>N+9rCq))FHgg z=R!y1q7xIdY|E6_|2n(Xn>5TKn9kiBGuP<6`*0YpVrzP^Xt<`yt#mq}un>QctUC4n z*%oP9g!*6%+lF#o$;qbkMWljVOkU(kLmF~( z7li4_z9gSN3{%&W8fQc7^`!dm7ZXuSr zlO;r8ZJ@nt*rV)R@2Di{*L}-}$Dv9I2^AL?!@ql%p^aP0X=f&6WXN|_#jeZnt#+cx zy7`7uM)_yr)-<>&L9MB?+J~6KE>UtPLGU#2Zt~vfh(4hB4;`zRYa`r$gJta9lWSyag0vhygCR56rr&9EG4a<};YRbB! zQtV)ED^+=UjhGF+BK%rMsd9y#BrHZ)1dyKTGObf}imix23=?f~!EX)>%8~0;nw{s= z4ko<{qGn)ej+YZDxI#TPpz3+thrhn9b~xpvO-NgRBQ=p+_(zgxB$dD^aoq0blsI<0 zX^%#7^`*}445GN3ev0I<#bq*Qv<@PWN36m1IYpP2HRB zfP$Sl_VQYJ6wfZ>GRF3Vi5A6e9^cOXYFXEnJv`=^4KsswgOHE{fjhNbD$#gHd6Dn% z#ENPas<;Z(-^0I4kra$}J;Zmzu#i)Bf|}zewY6c4 zwSuCeqI|{*sS?}b&VDCjU82E;X@Cd*O);&sPZ@X0O?8aVBHg#QI&Cob3;#6EFV9(Gv@hJ~&+_=gH%U~An zoR9Mz?kb-g?Mpr%R%fV%GtinI5h`WBe#nKv%QB5~^oqB)dQ>*-z}I4C5x#rxQ_;hDwmuMTW0S7XGjo1UI# z{UYyw%G~1*-^1Al*XTSLF8#S_!ussqU+W!5VQpJkY`@Ro?NrRjSbq!_V0&asnfiD8 z`p4CyJOo1eCm5exeG;)#xhU62d(F>w;bOa#9h~`aAyd*T0tr2htKL4}MhZiR{T8Ce7qCb0 z;sGPIieCMClD=Q9ReN{UEZhFb)MR66{I4RbX8BNpfXz#FPv+l*VZ*)!Rrtz4fJ~FvRm4!h|>RP{H2Yip-^?B zRj%4VulSdJaa#+CYMnRgJh>6aUaN(xz&GNO2U_!(Lrl|6jMriC6}Y_O;ejUDF>9ua zof25=u`%*Z?=}TmBhjz!Mnam)h#GTM+Er6FN}Z&o{rvo3g~rFn-?A|dCCAB7N ziDyn{Ug?5US zY3X>_f$#rk%GUAtn#E3nPEA*60 z;IP>tE!|apLnV>i4ym|vOZIlF$yd=e-R{`gexd6Jh>Sr&8+Mv#!})r{wZP#Zv6NLI zW}8vW4tcg#-TAVfaxP)Ikq{mf1lb8emx!m}#>(EjIavfZN2;a&W)1JVIM8~f1Pb%S zEB~^6HCx#YB>5Gk+j3r-;t!;*zxH9;0@d(Ijh&|HVLT3xTT1V<=K1-*Stiw#MozaX z-V-={gIc!9E>0-&VCQntw-4ar$>@NDs$|n-e|+o^#3>j`l+Vv?eNbiGTRWX=c}Mi76S3GA|<3o=uHTV}^t;Gj~z0e(9)KlK!fQ zkMr;o*rNU)6*bH|Ci@#UiJ-@_(6<=kGNqzUT~ z#*sHb<;s>!)@M}k*rn5Mtjj7zr*w&Hu-Vyt<*6K7TN@q5wSYS%lLGymA$l7T9}T_O zNpG-l3rD&7TGclf+PU!-xz5dL({4qqigB7q=|;{#p0$6!tyJp(Qzic5#fwa^dF8U(|U?Ohe1?9#HH*GHJn@R{zjmda~8 zrymzM*~5bL+&7xcuejLGvf+}CwO@3evkVxmXWcU`-cd4=BwzmU$4Z;$zkQ8e1lrqB zSOygi7VOM*X%$9=%du3Ga>(yB23e4>=9lKdP?wiZRhE{Krk<0^>P@XBcq4|q^{DPf zB>=kC8!B!QkXM+Z{7_fB>_y~GI!fb~uM+M*w-yybbZg$IHJ!-qCerSuriY}a7woWN zg_xGXZkjZEaB|XiD0K76KiwAhxzyy#D+xI{=cCEyCH}rB zz32d3B4UE$(Nz_^Go$ER&CwLY@?)kaHfT*eH>9N(4u-%<7NclqfO1|m&*Sf}XcbwI zJ{@UkEKxSeu#$j^kV0#5$_OV+L=%G1?AO-St&@P77e-t)WmK zXy5^u4?ia?e1h6CdEUc^dpx^!RgA_FkJ!^4m^R zW>L7+_eO)(v{nMrb$9+iS)FDMcqc%Rp49`cBfCz1H+THho%~vkV7aImoT@yA-Jbw{ z*WWP*u!044DM3XZKY;hL$9s|czllzx8fnaactW93=!R97EvDbzY0i9f?^p=AZ#JR> zPKrQ8fD+z3er(X1C8{dAku+Nn+sil7FVws>F&(Q4xvPA3@2<5OvmpS0x{0V{{>5#i zy?~D}-l3!K)b}A4R%^YpyrrXI@wtr#8-nj1hNrUM#$B6dCn)ogdBicXoP#Xi4+i+W zm^fG_!Q z7GdcG!;zya_{mnCnfu#hd{8K~#c}cE6@-gnm$TO<9j5VMl2JCrQ3~LK**TY)yq9Fw zUZ)8pz@LkU*iw#szd36GrrDhqX?vb%vR(7TVRfbR_wnDdKQrhv1OW>bw@v7v+z@#% z>Ef23=Ch_>(&|-hS#zgjlF$4qlu0Xi$WKx}V5A;}i+u&~;y(mM>TUS&XHFU_8Rn4m zP_Ey0$?m!x<%|yi6eY$N8~7_l=+rEIr8KvmC#taZr0I10&yP9Fk8K7J3xA;}P31PslLfl-J0Z#d%Yp4oUm+Fw_2`-ki6AF(h=3gO)E420cy|Te=yCfC}KMK`L-@fhHlP8l0j;|446K04__s5|cBP`3* zFqRQ;MgPj9{5`nZeTKP6$~ix`$Ug|xeD=n}1QD2jLC4I6Y6o=d^8-8|9%qTZrPy0@ zQJla@M}QMXTm~ds24m_rEeKs7h3ZAK2nT4HV~%;^6@hCB=#-uh)r%*uy@H>zf2jb6 zGh!)Q>~e@rm!We;LWVUD3c`!$(cyCfN}l+zrKwq?^sp4MbvXk zL&Mz0o(t8<3txNPBN&M|K*A98U{;85eU2^!>K)sDCaG&&qANRrv6^R<7l-PlmM$Qq zeOZpHhU$nluEED*A<(Ja4MB?pv)di^;XmyPC+}Pp@$f{Aw>-l+H9I6u+jw})Yz_PDx zY*op|B^Rb{*Ze-Li%+k95UQgEg_Ex?S^)DadG6T6j_VX-o53mH`BmDa`a|%rBmrXLhdWw{caEQcJeK@Bxy{Tr1$_a4=MpXP z?F#BIe(cLz&p+F1Po$KGEPs~9JzLk`WLf`Lw-4v|gF5zogsCQDMMQRVpZi|M+0<10 z869IW)h{<*S#)eH;QKL!$g7q;a|^mVBhtpjZ6>b!NpG%LfC_BV(ZY_UCcn88*tw9wog%1oL=bDYtJsE;lVr7V57EL}G25j;T*I z#XxfJHg`P@R@pisA=bm_VwotQ=m4c8Y;+6gvq;`8%$8Z4wc7w-n5yg;Nvp%;HE~%p zG8Wkp8$$?o9u%C4TtRmNfZ~~_pZ}&h*$wzZ;ucB56li+R81ZrIKtGaXe2JQ7x!|=Y0QcWn?5i#Ws5E)d{ z2wtX6b*a!_?92#5JTIb44@ik%p{&VcgI8uU6gk_Ig|Me#Jl@Rnzg-HtB>});cY(LlpQu;286L04cS4>5dz&Qe@S5mndRm2-UW* z8@{!5tN$SY>>_uXR&YwzCZf+Sx`d|ROkNY;>w!t7=R)D-))f! zZgnk`HBcYO9-m@pX{C@y0dz&AC6{~3XirClN8^Y`3O_tKU zOF1Vj;T1A0S!QV zVE<5Or7Zx{EI_@~@74E)h4;Ae*lw8IWB*#UuS$UZ)zzlNcalHSxlQ`i#Ll{$Sdpj=4Rvd&h zfWrg7eF&dvSAAUxK~D&VYV)i+%o>U=_0N+epm5QUW^tur_l7G{fj)B~M6BcehG;X0is%(GJS=$$^PKbYXn!P=`GEwekYGdCPO&O=MG2{RdzI_Br^1;tt%`dP!Cnvk!_RJ zNfL-cQ{_z!Z!6}tJ@TOAQ%%Chb2?-#Y#$Wk3c4b!-uvY;n?bl16ciK%32|JVnj@(s zt$4rIH?TU%McS??L*=#CHVdV>xNHe5HAxL`vNP~*yepLtj5=Z_;wz_o6H6#;F1MT7 zASFbZ{^7H4jC8H=m)%wrF;R>aldsBgS< z2rgMy!_Y#-kjLl=D=)u(RGUspj`a!urX?<9M5Fq(lkcxxukSKaOor{!XD{n$E#r0J zk9~Ko-G2X0mW|FVK8ch@uezZk-;iOgm1c{;aYQc=$8%uwsHW%BLdIcViQC2do@w)C z+(a=$PrtH>CuV1(sV>PGsWSvh3_D5o4)1tvLjiDHn)WF5z#ZF;BHv8c_JY`rul|jR zPkve@7gT4UF5592KUU^lGJF&1N~Wr*Q`IpXN}0cx47*=dxW7L(8Go6JzrVr$o1cK; zrCICmT`}Dn&k@lBR{b87NkY6y4zRbik82-~BQn?W_$NBKchiI!#rL*JSCkn2JLD-f z^Uu2(dGcMxJGg;5n{mAJ=K&a5rl)v5X|hJ;h0}voa`|7@0Fw_=mcY+J6c#h&jt=$G z@p5^aH)GNM#h=FmAz}tlIGlf5++q2VK|Th0iM-P30gOa~yG$r94gj?rVCf2YcE1l~ zUXof|7BN}9e|x}RbJ#v!$@-sq7j2I9HMq7Z12N3QyvK3v%|MF*vt7|jjvJyl6g4(f zd9>V$jYqWgwNmGPhK8pW(?p9<7-(SZJy~@_gp;*XPSf+9CM<=T0y_#vBOB+Kt{*a$udsW>$o#CU(vWSAL}Z$>ayYNLJv_Up>}Xe z199X8d}i0~Smp$%0u))p)c%2RyKgpSEs-@nMny1C37K;6)Lxv+HP<$s2`h69;_RDpin;4Tiqfs=AFgr`ikiC^X!!Qs75`;tZ zDK~seC8%72f|{}&>V7A}*^ro=ylpLRekC1#=AMfiaE-LLN@=|@A#jd-n2TO{6y;BvVjZFmXl zBofg7kj?5&cO0r>fYL$2T?Pvf7jABF%(No~u!BL5X9h~V--+(P=ILpdAr|fEvz80)QQw-YXVHF2U{{9oO^vlulmiO6=P5f@C88d zeVea{!vLPxze@RN=9%j2-MzgJXYh-#6gXmpgpdLhvI>=U&${0w3G{H43M>4;1|&dT zO>}nVO=j>!g@icFQr=yvlY>KWUdd>hJ2haeoEbP)*sjS2`K%~n-q7FIzB0N?G))kI z%oJ#cTN!@E9o?Is#PA0$$_NLs=}L+DK@bxxs&rT7HDy8C0y<@*>PpS`7m=j1e1mB}o0S1^8Og+M2?p3- z-;%UxR_1S-X5ut*_2eOp_9>r=GLOsjseIWuC7fmie}^>LbEw`g7X7}>l~%$aOXbiI zX^k|cg`-UXBe6(|68@Fq zXCJ!~C?E>yZ{VtQ_}Kb`dMIp~-72ri&LoBxT7zENpF2!K6&Eikt7ebWE3y{oscq`+ z9Cjak#L%^{Xmt(e7Zyz(>(6B}&S&6HfF?;T(`%qbb>iJMTM*BHewf|rMnu zM_Yc|rP!EK+!j9b71j0kSSugm=*vb8~arWM2j`8Y+ETNhXYM7!rlJ7WCXXQkqB6n=w-!Xp}z7Wuwm;d&)KJAZ7YeSl|?8u4KU*ZS;ZOPk~V`rddNBO*7=aGo&Hv8(kOD^p+ugfCr-{97#(uK;w<1 z)mx;ID%X9YGnxz$cq@)1L8T*c03z0r2vBw8<$hZfl7fOzTF)J|<|)CBMgh~^JPIAvx^I>Z&wGGooCoHjs?!g@yRdY zaP0^2lRK+i#ISE88WW`IT{q|rMRkP;M3VlkXnG-YLLdy8bk6$gHxgx{suqCaZ(El@S*DY?3(l;}S$z?4_F+#9~|>-A2JKQ>X0 zI~ai9YKF7e)64Q5MV*s`~m!J zDNDW=Zk{y0DD*4=pU>Oe=InKR6$Mn-lez4*F5Xo=VGBr_<+Amv4xlz`bnOm1e91h? zXVI5{tidM7Jgs*Bg##Foxq3%Zkd8~v643QL!#`t)`e&dBq7M)`?Zob%w-JmqyvQuj z1KG&Jqhu-b+uY`vyZ8G^waWzV+yTeqk_>wJ(*{RKA@b`h8@$UaJ^{_lqAVhP)}uI& zs?TsT-QE4jM#0xb{B_ofOk`Nv>EtvghS4DuuNNF~_y|<~M=bi1-pK6VdlgE5%&!L> zse&0W=!*i(3@wv+emDv<6)y0ODu6E9PDavo^x^18H3-)B2H8IWYFpceNFwJ)-PIL|8pCq4j3Omb)Q!-*xb;a z;S>o(`-0j5UBL&E%lh?FU+E6>$@l^bM}$43S>={gt_(f;{h|dhzmn$&LPSi07D&OH zi|GYsRsdfxI5Wu$GSMa0(8uKQJTo(|7_cZsTM*o}p*81Z*D^sNQQgJvPJ@NB)a~_+ zc2kw7q+bIAim(Iz8zTvM`-YAu}JTsSGd=>8T;oMh;oKljICZ@mP@k!S27 zzS;>`nTi>n{TAj>O)?5jf7Jd#T-t3GTqy-BZ&4|Ao$!cHwVo85XBhu-n}X0KD}b`r zg)$f;(fM%H0x2UPrR+|BZBzc!TN6UQgO_tUkTFZ&{zpd5mda7pKRoj5>v37q_tuDi z9=3lGX+|Ad&p&wgTLS5cwyA@Q#N2`&X*`&jn>V8%Sg<3Ip3G8Cj}cchAEunsqipMS z(~SHV4e$~R=r37G5IY4};IHJWcX{f5DD)}+DatV}+djYENyW3`&c2Vs6gWyV&C?pX zH$T3OxpP-U8kHsFwk$Du^K3rQkj7xyVjmxvv#N%I#R$wTdkIsxI?dV>KjI>n(%sB$p1FIUbFSJh&6b~XQd%f%TEv!{e%vo$CMtP)dhy`{WKvZY zjH0WH?cw{o7f3mfOcCkZz^Xhad`T#^3RyXseGpjP1+V=_j5(CA`&)rPgb$rp=9wQH zjiG+q)?0U}bL0KL3`|SA7h|YKp^CzSd46CGXj1*-BLZisfkpx+xCUf&n$v;A1EvD{ zu)iLI7kIsg41PFV(f2j!>wTXsTEuG6cljG7=-;!OH)ZaOt+L}gzgMhWaXHt*+yZQ4 zN^`1*gkodj*I8FAPK-G_jWmKRagi1Q%>rm$Mn>6dkZQy+MDUBm3BJR;T{g#u2Z}~{ z3u@=3^6g(OS^)Dac`m;}M>9B+jr~ao5YP=lM=wdz zEncOqx1}SuJ532GPZ!?b2XdwZSxv*p=7s3SE8^$A2NFRGOtZEuTDkiai%eDlU++e7 z@i-Rq5pXH_Gr2!coIyg88Opxsqke@`T>(seJ^1N?rG&%i<4waIXUB}BP>Ps)A0ntjOBPtho zz|*hju_|s>2;vh}OxOg|-+jHceO?1}_)=v4l>5hV`4_AHl*T^y7u%D|lo~COwKfzX zK1g#d#2I0;E0UtEL=nP(Y>Tdi1G%dG51!qb!byR-%ZGyRSO;X8Tin^FpCZE|`PLQ5 zJvJnW-;F1{Px$v9C50g4Gy>_sH!21?p#GsIL5=r&!4{dp8!bhaf%u_~d_{=YHzP_1 z{;zoQJ0sITXGmd?=i4h%5lE>ItZVy`RX8C^+Q?0~D%LQGr-5z;BLNry7X3^nfR7s- zy%(0Pjd{f{q6OkJ9)QLIE)1^LItW?pN+zn^5a1*?rUm2x-N~9`t^o*>I~bk}dhqdn zy(uh&n2eQ-6{~`hVp|(nMJL=5AB>nNdESsb{Z~E7=1wkhfuiyq!3KvN_-Lm9#k8qB z9;qf)tXM$<3!)>q{|$Q;kpBb2B+}dhb`Ana(>@uP*Wu^XcCJzubAyCz*tvB&A3jYT zL1sE2y#R#6F`5Hzr%UO*{Bb;EyjcW~$p*M%rBVnA)f&H~1^%4CK@Uu#IE(3#3$-ni%%x;E{O?)F{a1T}X+b^r^jnyv&<3 zzAFk~+)K-r?YAEFE3V!DlLB96G|=fM{!(q%NWE3Vj`Bt7FLUrjAxH(}#k3gPh}c(j zB97ezSou-lx6dF)R76BXP|%6=aU6VykkD*edd3*Ed++_Br@>$Ozk>k6s($yrVgw*G zWoc=|jYq)6?!?0=9YsfIc5cMnVKeEJWY*d`qwe`oqLgzs6o=5rG>g0nK38o^wxOUY zMbJ2sQ2_M~%?042VI6Kn{JPCx+as{f(-~SkUo0pfS2j>tz)j&Wh8`>|G_Z_A89S5^ zcC!dd63?0*=ea_wyvtF|#O3uzS*dw`c|4;3r0AO zfJ$vp6Rlws%|PG5%4fGYA^(o3H?=%egbdd-G2X4GwTEuo4#cfId22K2S-4VBn{t)k4+Y=v1L_6z0Y zUrKr81E3lhY0zb6Jvi@UaARd(IJx|W9)^sC*5U;?y#g6{Co8=Yd zRC~nNwFrb{cb?R8JWU<GVzuhm!^XGOHVpV)e?d8_oym9| z#7HqmwAs@Jo9gWeEK1#>q9_p;10BEkGrg2Hj0QSdtT{a#v|JYG*F;kC860)SGoD;g z?Z9Bx+arh_&L6-aAp{)NgvK@@U{PKp(f7*;>ZbrFL%dI8VaJ9H5YLd?7(fnz#mGlm zS{j*qx1!*L_3r@JzW!7)Z-iviaQ`@h<)x4lk&M(Ark3tHn4c+8YWkZJ@a`E-czM}A zni{G^9X3cKT!e=*)6A7Zgm6_`_c_%;W$29Rz|M7s2*1JgEjthzqLi$wWmxT3VmBi} z2)}WZ8I_h8SbXF&;AOx@8Wa?x;?|KJp@?kQrGe9{!|eTwi;G!Q9)~~#xgm1v=5wGH z8mI6kw8)5ZLd*$yO8geutH|1mk-;QR8-un*YT|o;U|2#i<^njra+h`idp~RcT{iT` ze_G>D=piG#8(}CqQEIHqmlB|(t?@{fHcSlbV3f*+slFLw1dXw^?~BrDR4rfMvIHuL zH~s#3P(3bjOpST$884vRObeXy~;U4p1NX^#|2wsIpHRK$?+ zrYJmd!iXMWeX40j1UU2XTW5t_zZwNF#5y-TMuti_Mh&pG2H-qBG@*)e2J0!Bh{CR2 zyI3_x-$T-+s5$jkkc`L)AS1jHc8?va^2_)WV#qXQt-QS#hS7lqoX@5og@X_2ILNW}3hLkh>QxKR zBdQ&CGazw~(V01=&?$o1*4KQueoOC>5GWQSR69ZgtS7bFd5;EqGz_i%-#_BHM&Snx z$A*^y!G0z%UUQd}Ck9ABsMX8Huydcdxk+_M+{rwc8?1?T2D)9EI-o%=oqwYD)H(i?>z#fID z>8{sQs+4z!J2}W&tM{;5NN#Q|qewpcDd?Wa2?q=fDcKQqb#=o($voE9Mg#?`mKZql zh>|tYF=q9ES=Z4ai79X(mJu*UmF}YZ_8Ymy?H!n><<~;ScL#?PU~4hhP7xc0Sss+he`7bb|4HOrLZ;v$*|coewY6 zi;?4Rn(>KzMI7L^zqmY;e@`(ccZ`+$$Dg4wN}F57D5tx2A7u!I$JAN5j0X9nH{PUt zB08#pV+N#9c`buCnJ%K@c+weXH^a%{l%b;G3wHM+PXv~V^!e@>qAJ}fKnDGXaCPTb z9A{+j1f_s91BBsvAKBj z*koc1LQJpY3TND8eDuVWujF3zU9R+8AUU;7O-)hm_JW)bq6SD&q2!7GRRJ2zAkLQ# zsbj=7gFV~1GW6P7XCl}0~Y zE=U-E)>P!{fryrP7kMrX8Sg^M6GwhW;H1NE`}z zg`v}G)Nu?`+QPV&k2YFMfqog{fXW8caR|wMVZf2S+PAh;s~q|*&Y@FxiXVR}|F5*) zp3hJQjeN?Wc!n|nTmkwpzMU3$i2648{%ELO268eH5K?3H3#bCNj>aIBGIA+n(}&8i zp|KJkmqQ2dzT4`xYb%haS`SL~--${R*jhq~Z`}EY z!~t}PM7iaC(6mR)tw@2}PvOc8LSkZ;>wFyX{k0t(np^09JOUbio}p=;Z+nFmO$gc? zIVjvA_$5%cIY1)=VusjqpZZj*4bXQW8g+HU1pT1dw_*1;L!oO}cEY=T1G1KbG^hft zG1!fgV?GeKX`uh4s&|Lsy+%YW&Qe(Jh81NlOO~>Dg;Jun4{L*Qm^6?D{Rxl`JXrNUwRSYc= zL40(xfwhf}7MwWBwvfmL0yY25*R5-AQ22}QbD?0UUv=kug%15p(qA49O-CL0ZrTjK zo7R+Xu3QjaF+2E@p4w{@vN_06oWbw6;Wxv8@_Ri#<$QuHmP-t7!kOTlJa4@gBhdJ?JUdCXN6brC$b*l{G67YBLpgcjJjT% zA;TIMkzoraXKA07%v`4fz5|oLBFfN;Sfby-H9qFJ%rMpf zHbKW>AFT^A{5HB~NG$mINh4Uoi|83i50H#6|zfBTgsJ=7i-(Ap*1K0uQ_ zT3GqBV&Lj`LJPg6Lfb!T^Sqc4TWSzy)e4*LN4GKK_)>)hbNY`sLExkpyJ(@qluRtH zt*^k&BC#}m$%#b#vPr6rwHp;{Y<*|^ONHy8%D7#aB+Rtl-PQ+Wp8vS)FH6MMC7K3* z-10zdQ|4UNr8egk0$k!_LEHy`%9OYvh?M!zAtNBJW7@4+U za;leXNAr-+RL$|${KIY?I_wm&rsN>ks8!0Ft-O@in9zpEqcbe;!q5L-carYmixsT+ zVujwnx&MVeS_gh78mswEG#~Gbg<=i3sri012cTJ~6W)UFJX?HfWBVEs;<&oz8Di{4 zYNuJwk&GEp)q?q7f>)h8mFI%iyx$+eQLPdldlKio?$2k`3XOcV!jcuz0x8+?xmGkw zoUZfv)<+F#dQzio&Ku4&r(P=~Z{}(C z*^It;mvHXi9#B9OU|k-r(=L_SYnp$3ZIIus4^iQZ2-?H$g2=yPs7PLIs_*d(){aU96 zK;zNRb&Jhzbd!umOndH>{s`G=g%OT`bO&45Jp%(+59=B&-W0N(VP0DJ{KFG?aFr*r z;>U`%p&}j=mZK_vzaY-DOcNvp(2A{K{B^SC2ISth0Y|L+vo$J*dVfpTtqSfkS~*`=_Yvo2Dmg3VTmRPYk~}$GalP)UUhq zVL6h=N_o>}nKn98Po$=vxZ>CzB#tH2B>BL~y9}H$(4iYF z&5V4`?zziM1PN|a^Iy~An6n1jzTTFc;kL|HS|iYbNeuVZMli74PBbE_ zQ2L}Md+&D7Q2q-djd@IYJjBw!vT|3wds#910dqdV*)%iI?~Gzv^I?ZBXobFN3qU~3 zLu;I(5#kMi5~wNEx|nux>mHphio1$~3ra92Ha#fT;5X2ieH_Cf45xnScuE+19s@LC zh2@v*ABK!<;4ebaLQ(1diAmJ%0E}X$>EgpKa@Z zubF%>>D$-65dnZN%&}9lN#|BK=nW!AwRh!vO|g}_#Jns^v4ZnDIg*(UXGb*KBh9m; zNv+AHCLz`Jwe%Cvx!~Y-oBE2H?$oG?BId-?hPP@ik}`U{;R?*9eY1iy@@Awfn@)J^ z8K3-18fDu1NY{D=MM|9~P#9W<;c<1qo>+3n-}~;>Ptmj?0V#UaH$2Fmi-@NB-Vy6c zkzDYR-dM4dHD>6!raI-@p||_3s(>)zR=Kd*cNCLj_Ym#N;?mn+9tWGT6^T31@lzBo zxmcu^lFZOrsRNyX8K0=5@2!;*p^c!xOoBp!yRBV_C+iYqRL3fdN~&-5RZ9&QRfNYisK}IeBuq%LD9?cr@?_=mCYQQoVsJ zl&A0pyZeKnFTYT!b!xqCzalh#do9@Z=J8%6xug8ZEjmKA!}C1GPK9mcTxpr1 zR_)d!Itnhbtd*$48pE?A5jvpzjCqXhAo>his}4@B7+07BPH|eMBfVSg zX7*hb;T$l9*W(5<3+zVXmh^m+I^uF&XEdfg2ZS96NbiO$_TRFYcv|ta8h?h+4b3xlN7nxKv1C%iv)ls)K>CGl%LsW7ym9 z6bqd)57XZck+Ej@qu;5aXPv85dDdR0RZ+wo+?+ zAFwAjFUZFMq6W6OH0UDLdQhnj39TxwXidFEjbUhr%mGRwywFXEvHK%h*d(8`Lz!MI zU5(up`?gxZq$$3G;eKd$@;tZuz|14WzJJ)0bxU!0c;vaYu$_TWI3a$c@kAYUmknybVq+gGc?vdN^#Ht+Hti91Rs_&HEVyXy19hmWwn7p&92?K z45IhhFhbxfYx(erX!^}L2laHh&rg&?ZJ=NuJSb}-vvF|r%8fI`as5$k+f87f_O>%9 zoU~SLW;oFQ#WQ(V9$%M!i0ym*Pi@=S6jCyDGPrLN3M~oBoU|2l^JYxeMN!ONr8ng< zb!KT1ogWdb^6WUT^B4i{%T$}@HhMAr-Rj;nadz9{@vlgR>uzRgQbR{IHcT)@kG7NJ zDpX?CK#y^vMCz(L--zwOJTWjep`mVmvkJP!$BXDg&
b0Hyk+)EY4YOe!cl@z== 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 E4>@sL{{R30 literal 0 HcmV?d00001 From 81079c401c50984563c47d7ad5337ca336ec4616 Mon Sep 17 00:00:00 2001 From: Isaac De Vlugt Date: Tue, 24 Oct 2023 16:04:24 -0400 Subject: [PATCH 03/18] ctrlsequence and other additions --- doc/releases/changelog-0.33.0.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index 0f7ec462c7a..bd2a2fdf669 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -151,6 +151,33 @@ +* Controlled gate sequences raised to decreasing powers, a sub-block in quantum phase estimation, can now be created with the new + `CtrlSequence` operator. + [(#4707)](https://github.com/PennyLaneAI/pennylane/pull/4707/) + + Applying sequences of controlled unitary operations raised to decreasing powers is a key part in the quantum phase estimation + algorithm. The new `CtrlSequence` operator allows for the ability to create just this part of the algorithm, facilitating users + to tinker with quantum phase estimation. + + To use `CtrlSequence`, specify the controlled unitary operator and the control wires, `control`: + + ```python + dev = qml.device("default.qubit", wires = 4) + + @qml.qnode(dev) + def circuit(): + for i in range(3): + qml.Hadamard(wires = i) + qml.ControlledSequence(qml.RX(0.25, wires = 3), control = [0, 1, 2]) + qml.adjoint(qml.QFT)(wires = range(3)) + return qml.probs(wires = range(3)) + ``` + + ```pycon + >>> print(circuit()) + [0.92059345 0.02637178 0.00729619 0.00423258 0.00360545 0.00423258 0.00729619 0.02637178] + ``` +

New device capabilities, integration with Catalyst, and more! ⚗️

* `default.qubit` now uses the new `qml.devices.Device` API and functionality in From 6158a3b11b9cd63aeeb1a981bc3c094874d4d92d Mon Sep 17 00:00:00 2001 From: Isaac De Vlugt Date: Tue, 24 Oct 2023 16:09:55 -0400 Subject: [PATCH 04/18] minor --- doc/releases/changelog-0.33.0.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index bd2a2fdf669..b05bee87327 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -294,6 +294,8 @@ a `QuantumScript`: ```python + import jax + tape0 = qml.tape.QuantumTape([qml.RX(1.0, 0), qml.RY(0.5, 0)], [qml.expval(qml.PauliZ(0))]) dev = qml.device('lightning.qubit', wires=5) From 93af49ecbbeb8c68d25a1a77b8d5e2d136a40874 Mon Sep 17 00:00:00 2001 From: Tom Bromley <49409390+trbromley@users.noreply.github.com> Date: Wed, 25 Oct 2023 08:41:18 -0400 Subject: [PATCH 05/18] Update doc/releases/changelog-0.33.0.md --- doc/releases/changelog-0.33.0.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index b05bee87327..be92d0643f1 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -279,8 +279,6 @@ 1: ──H───RY─┤ 2: ──RZ─────┤ ``` - - Stay tuned for more integration of Catalyst into PennyLane!

Improvements 🛠

From 31d147bf363db7384a87447f87dacf5acc04edd0 Mon Sep 17 00:00:00 2001 From: Isaac De Vlugt Date: Wed, 25 Oct 2023 09:35:09 -0400 Subject: [PATCH 06/18] shuffled qchem entry --- doc/releases/changelog-0.33.0.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index be92d0643f1..221dfa9df44 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -312,6 +312,13 @@ [(#4546)](https://github.com/PennyLaneAI/pennylane/pull/4546) [(#4556)](https://github.com/PennyLaneAI/pennylane/pull/4556) +* `qml.qchem.import_state` has been extended to import more quantum chemistry wavefunctions, + from MPS, DMRG and SHCI classical calculations performed with the Block2 and Dice libraries. + [#4523](https://github.com/PennyLaneAI/pennylane/pull/4523) + [#4524](https://github.com/PennyLaneAI/pennylane/pull/4524) + [#4626](https://github.com/PennyLaneAI/pennylane/pull/4626) + [#4634](https://github.com/PennyLaneAI/pennylane/pull/4634) + * Tensor-network template `qml.MPS` now supports changing `offset` between subsequent blocks for more flexibility. [(#4531)](https://github.com/PennyLaneAI/pennylane/pull/4531) @@ -402,13 +409,6 @@ * `pennylane.defer_measurements` will now exit early if the input does not contain mid circuit measurements. [(#4659)](https://github.com/PennyLaneAI/pennylane/pull/4659) -* `qml.qchem.import_state` has been extended to import more quantum chemistry wavefunctions, - from MPS, DMRG and SHCI classical calculations performed with the Block2 and Dice libraries. - [#4523](https://github.com/PennyLaneAI/pennylane/pull/4523) - [#4524](https://github.com/PennyLaneAI/pennylane/pull/4524) - [#4626](https://github.com/PennyLaneAI/pennylane/pull/4626) - [#4634](https://github.com/PennyLaneAI/pennylane/pull/4634) - Check out our [how-to guide](https://pennylane.ai/qml/demos/tutorial_initial_state_preparation) to learn more about how PennyLane integrates with your favourite quantum chemistry libraries. From 159f3a3c97f42aa5811696d357df50183ff9674b Mon Sep 17 00:00:00 2001 From: Isaac De Vlugt Date: Wed, 25 Oct 2023 11:00:05 -0400 Subject: [PATCH 07/18] pass through up to bug fixes --- doc/releases/changelog-0.33.0.md | 145 ++++++++++++++++--------------- 1 file changed, 74 insertions(+), 71 deletions(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index 221dfa9df44..3e2031ac5da 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -11,6 +11,8 @@ [(#4604)](https://github.com/PennyLaneAI/pennylane/pull/4604) ```python + import pennylane as qml + dev = qml.device("default.qubit", wires=3) @qml.qnode(dev) @@ -132,7 +134,6 @@ prepare a state whose amplitudes follow a cosinusoidal distribution over the computational basis. ```python - import pennylane as qml import matplotlib.pyplot as plt dev = qml.device('default.qubit', wires=4) @@ -300,14 +301,13 @@ execute_kwargs = {"device": dev, "gradient_fn": qml.gradients.param_shift, "interface":"jax"} jitted_execute = jax.jit(qml.execute, static_argnames=execute_kwargs.keys()) - jitted_execute((tape0, ), **execute_kwargs) ```

Improving QChem and existing algorithms

-* The qchem ``fermionic_dipole`` and ``particle_number`` functions are updated to use a - ``FermiSentence``. The deprecated features for using tuples to represent fermionic operations are +* The qchem `fermionic_dipole` and `particle_number` functions have been updated to use a + `FermiSentence`. The deprecated features for using tuples to represent fermionic operations are removed. [(#4546)](https://github.com/PennyLaneAI/pennylane/pull/4546) [(#4556)](https://github.com/PennyLaneAI/pennylane/pull/4556) @@ -319,10 +319,10 @@ [#4626](https://github.com/PennyLaneAI/pennylane/pull/4626) [#4634](https://github.com/PennyLaneAI/pennylane/pull/4634) -* Tensor-network template `qml.MPS` now supports changing `offset` between subsequent blocks for more flexibility. +* The tensor-network template `qml.MPS` now supports changing the `offset` between subsequent blocks for more flexibility. [(#4531)](https://github.com/PennyLaneAI/pennylane/pull/4531) -* Improve builtin types support with `qml.pauli_decompose`. +* Builtin types support with `qml.pauli_decompose` have been improved. [(#4577)](https://github.com/PennyLaneAI/pennylane/pull/4577) * `AmplitudeEmbedding` now inherits from `StatePrep`, allowing for it to not be decomposed @@ -332,13 +332,13 @@

Next-generation device API

* `default.qubit` now tracks the number of equivalent qpu executions and total shots - when the device is sampling. Note that `"simulations"` denotes the number of simulation passes, where as + when the device is sampling. Note that `"simulations"` denotes the number of simulation passes, whereas `"executions"` denotes how many different computational bases need to be sampled in. Additionally, the - new `default.qubit` also tracks the results of `device.execute`. + new `default.qubit` tracks the results of `device.execute`. [(#4628)](https://github.com/PennyLaneAI/pennylane/pull/4628) [(#4649)](https://github.com/PennyLaneAI/pennylane/pull/4649) -* `DefaultQubit2` can now accept a `jax.random.PRNGKey` as a `seed`, to set the key for the JAX pseudo random +* `DefaultQubit2` can now accept a `jax.random.PRNGKey` as a `seed` to set the key for the JAX pseudo random number generator when using the JAX interface. This corresponds to the `prng_key` on `DefaultQubitJax` in the old API. [(#4596)](https://github.com/PennyLaneAI/pennylane/pull/4596) @@ -361,18 +361,19 @@ * `qml.sample()` in the new device API now returns a `np.int64` array instead of `np.bool8`. [(#4539)](https://github.com/PennyLaneAI/pennylane/pull/4539) -* The new device API now has a `repr()` +* The new device API now has a `repr()` method. [(#4562)](https://github.com/PennyLaneAI/pennylane/pull/4562) * `DefaultQubit2` now works as expected with measurement processes that don't specify wires. [(#4580)](https://github.com/PennyLaneAI/pennylane/pull/4580) -* The function `integrals.py` is modified to replace indexing with slicing in the computationally - expensive functions `electron_repulsion` and `_hermite_coulomb`, for a better compatibility with - JAX. +* Computationally expensive functions in `integrals.py`, `electron_repulsion` and `_hermite_coulomb`, have + been modified to replace indexing with slicing for better compatibility with JAX. [(#4685)](https://github.com/PennyLaneAI/pennylane/pull/4685) -* Various changes to measurements to improve feature parity between the legacy `default.qubit` and +* + +* Various improvements to measurements have been made for feature parity between `default.qubit.legacy` and the new `DefaultQubit2`. This includes not trying to squeeze batched `CountsMP` results and implementing `MutualInfoMP.map_wires`. [(#4574)](https://github.com/PennyLaneAI/pennylane/pull/4574) @@ -387,23 +388,30 @@ * `pennylane.devices.preprocess` now offers the transforms `decompose`, `validate_observables`, `validate_measurements`, `validate_device_wires`, `validate_multiprocessing_workers`, `warn_about_trainable_observables`, - and `no_sampling` to assist in the construction of devices under the new `devices.Device` API. + and `no_sampling` to assist in constructing devices under the new device API. [(#4659)](https://github.com/PennyLaneAI/pennylane/pull/4659)

Other improvements

-* Add the method ``add_transform`` and ``insert_front_transform`` transform in the ``TransformProgram``. +* The `StateMP` measurement now accepts a wire order (e.g., a device wire order). The `process_state` + method will re-order the given state to go from the inputted wire-order to the process's wire-order. + If the process's wire-order contains extra wires, it will assume those are in the zero-state. + [(#4570)](https://github.com/PennyLaneAI/pennylane/pull/4570) + [(#4602)](https://github.com/PennyLaneAI/pennylane/pull/4602) + +* Methods called `add_transform` and `insert_front_transform` have been added to `TransformProgram`. [(#4559)](https://github.com/PennyLaneAI/pennylane/pull/4559) -* Dunder ``__add__`` method is added to the ``TransformProgram`` class, therefore two programs can be added using ``+`` . +* Instances of the `TransformProgram` class can now be added together. [(#4549)](https://github.com/PennyLaneAI/pennylane/pull/4549) -* Transforms can be applied on devices following the new device API. +* Transforms can now be applied to devices following the new device API. [(#4667)](https://github.com/PennyLaneAI/pennylane/pull/4667) -* All gradient transforms are updated to the new transform program system. +* All gradient transforms have been updated to the new transform program system. [(#4595)](https://github.com/PennyLaneAI/pennylane/pull/4595) -* Multi-controlled operations with a single qubit special unitary target can now automatically decompose. + +* Multi-controlled operations with a single-qubit special unitary target can now automatically decompose. [(#4697)](https://github.com/PennyLaneAI/pennylane/pull/4697) * `pennylane.defer_measurements` will now exit early if the input does not contain mid circuit measurements. @@ -413,30 +421,24 @@ to learn more about how PennyLane integrates with your favourite quantum chemistry libraries. * The density matrix aspects of `StateMP` have been split into their own measurement - process, `DensityMatrixMP`. + process called `DensityMatrixMP`. [(#4558)](https://github.com/PennyLaneAI/pennylane/pull/4558) -* The `StateMP` measurement now accepts a wire order (e.g., a device wire order). The `process_state` - method will re-order the given state to go from the inputted wire-order to the process's wire-order. - If the process's wire-order contains extra wires, it will assume those are in the zero-state. - [(#4570)](https://github.com/PennyLaneAI/pennylane/pull/4570) - [(#4602)](https://github.com/PennyLaneAI/pennylane/pull/4602) - -* `StateMeasurement.process_state` now assumes the input is flat. `ProbabilityMP.process_state` has +* `StateMeasurement.process_state` now assumes that the input is flat. `ProbabilityMP.process_state` has been updated to reflect this assumption and avoid redundant reshaping. [(#4602)](https://github.com/PennyLaneAI/pennylane/pull/4602) -* `qml.exp` returns a more informative error message when decomposition is unavailable for non-unitary operator. +* `qml.exp` returns a more informative error message when decomposition is unavailable for non-unitary operators. [(#4571)](https://github.com/PennyLaneAI/pennylane/pull/4571) * Added `qml.math.get_deep_interface` to get the interface of a scalar hidden deep in lists or tuples. [(#4603)](https://github.com/PennyLaneAI/pennylane/pull/4603) -* Updated `qml.math.ndim` and `qml.math.shape` to work with built-in lists/tuples that contain - interface-specific scalar data, eg `[(tf.Variable(1.1), tf.Variable(2.2))]`. +* Updated `qml.math.ndim` and `qml.math.shape` to work with built-in lists or tuples that contain + interface-specific scalar dat (e.g., `[(tf.Variable(1.1), tf.Variable(2.2))]`). [(#4603)](https://github.com/PennyLaneAI/pennylane/pull/4603) -* When decomposing a unitary matrix with `one_qubit_decomposition`, and opting to include the `GlobalPhase` +* When decomposing a unitary matrix with `one_qubit_decomposition` and opting to include the `GlobalPhase` in the decomposition, the phase is no longer cast to `dtype=complex`. [(#4653)](https://github.com/PennyLaneAI/pennylane/pull/4653) @@ -459,15 +461,15 @@ same dataset has already been performed. [(#4681)](https://github.com/PennyLaneAI/pennylane/pull/4681) -* Improved performance of `qml.data.load()` when partially loading a dataset +* The performance of `qml.data.load()` has been improved when partially loading a dataset [(#4674)](https://github.com/PennyLaneAI/pennylane/pull/4674) * Plots generated with the `pennylane.drawer.plot` style of `matplotlib.pyplot` now have black axis labels and are generated at a default DPI of 300. [(#4690)](https://github.com/PennyLaneAI/pennylane/pull/4690) -* Updated `qml.device`, `devices.preprocessing` and the `tape_expand.set_decomposition` context - manager to bring `DefaultQubit2` to feature parity with `default.qubit.legacy` with regards to +* `qml.device`, `devices.preprocessing` and the `tape_expand.set_decomposition` context + manager have been updated to bring `DefaultQubit2` to feature parity with `default.qubit.legacy` with regards to using custom decompositions. The `DefaultQubit2` device can now be included in a `set_decomposition` context or initialized with a `custom_decomps` dictionary, as well as a custom `max_depth` for decomposition. @@ -475,11 +477,11 @@

Breaking changes 💔

-* ``qml.defer_measurements`` now raises an error if a transformed circuit measures ``qml.probs``, - ``qml.sample``, or ``qml.counts`` without any wires or obsrvable, or if it measures ``qml.state``. +* `qml.defer_measurements` now raises an error if a transformed circuit measures `qml.probs`, + `qml.sample`, or `qml.counts` without any wires or observable, or if it measures `qml.state`. [(#4701)](https://github.com/PennyLaneAI/pennylane/pull/4701) -* The device test suite now converts device kwargs to integers or floats if they can be converted to integers or floats. +* The device test suite now converts device keyword arguments to integers or floats if possible. [(#4640)](https://github.com/PennyLaneAI/pennylane/pull/4640) * `MeasurementProcess.eigvals()` now raises an `EigvalsUndefinedError` if the measurement observable @@ -487,27 +489,31 @@ [(#4544)](https://github.com/PennyLaneAI/pennylane/pull/4544) * The `__eq__` and `__hash__` methods of `Operator` and `MeasurementProcess` no longer rely on the - object's address is memory. Using `==` with operators and measurement processes will now behave the + object's address in memory. Using `==` with operators and measurement processes will now behave the same as `qml.equal`, and objects of the same type with the same data and hyperparameters will have the same hash. [(#4536)](https://github.com/PennyLaneAI/pennylane/pull/4536) In the following scenario, the second and third code blocks show the previous and current behaviour - of operator and measurement process equality, determined by the `__eq__` dunder method: + of operator and measurement process equality, determined by `==`: ```python op1 = qml.PauliX(0) op2 = qml.PauliX(0) op3 = op1 ``` + Old behaviour: + ```pycon >>> op1 == op2 False >>> op1 == op3 True ``` + New behaviour: + ```pycon >>> op1 == op2 True @@ -524,49 +530,46 @@ op1 = qml.PauliX(0) op2 = qml.PauliX(0) ``` + Old behaviour: + ```pycon >>> print({op1, op2}) {PauliX(wires=[0]), PauliX(wires=[0])} ``` + New behaviour: + ```pycon >>> print({op1, op2}) {PauliX(wires=[0])} ``` -* The old return type and associated functions ``qml.enable_return`` and ``qml.disable_return`` are removed. +* The old return type and associated functions `qml.enable_return` and `qml.disable_return` have been removed. [(#4503)](https://github.com/PennyLaneAI/pennylane/pull/4503) -* The ``mode`` keyword argument in ``QNode`` is removed. Please use ``grad_on_execution`` instead. +* The `mode` keyword argument in `QNode` has been removed. Please use `grad_on_execution` instead. [(#4503)](https://github.com/PennyLaneAI/pennylane/pull/4503) -* The CV observables ``qml.X`` and ``qml.P`` are removed. Please use ``qml.QuadX`` and ``qml.QuadP`` instead. +* The CV observables `qml.X` and `qml.P` have been removed. Please use `qml.QuadX` and `qml.QuadP` instead. [(#4533)](https://github.com/PennyLaneAI/pennylane/pull/4533) -* The ``sampler_seed`` argument of ``qml.gradients.spsa_grad`` has been removed. - Instead, the ``sampler_rng`` argument should be set, either to an integer value, which will be used +* The `sampler_seed` argument of `qml.gradients.spsa_grad` has been removed. + Instead, the `sampler_rng` argument should be set, either to an integer value, which will be used to create a PRNG internally, or to a NumPy pseudo-random number generator (PRNG) created via - ``np.random.default_rng(seed)``. + `np.random.default_rng(seed)`. [(#4550)](https://github.com/PennyLaneAI/pennylane/pull/4550) -* The ``QuantumScript.set_parameters`` method and the ``QuantumScript.data`` setter have - been removed. Please use ``QuantumScript.bind_new_parameters`` instead. +* The `QuantumScript.set_parameters` method and the `QuantumScript.data` setter have + been removed. Please use `QuantumScript.bind_new_parameters` instead. [(#4548)](https://github.com/PennyLaneAI/pennylane/pull/4548) -* The method ``tape.unwrap()`` and corresponding ``UnwrapTape`` and ``Unwrap`` classes are removed. - Instead of ``tape.unwrap()``, use ``qml.transforms.convert_to_numpy_parameters``. +* The method `tape.unwrap()` and corresponding `UnwrapTape` and `Unwrap` classes have been removed. + Instead of `tape.unwrap()`, use `qml.transforms.convert_to_numpy_parameters`. [(#4535)](https://github.com/PennyLaneAI/pennylane/pull/4535) -* `MeasurementProcess.eigvals()` now raises an `EigvalsUndefinedError` if the measurement observable - does not have eigenvalues. - [(#4544)](https://github.com/PennyLaneAI/pennylane/pull/4544) - -* The device test suite now converts device kwargs to integers or floats if they can be converted to integers or floats. - [(#4640)](https://github.com/PennyLaneAI/pennylane/pull/4640) - -* The ``RandomLayers.compute_decomposition`` keyword argument ``ratio_imprivitive`` has been changed to - ``ratio_imprim`` to match the call signature of the operation. +* The `RandomLayers.compute_decomposition` keyword argument `ratio_imprivitive` has been changed to + `ratio_imprim` to match the call signature of the operation. [(#4552)](https://github.com/PennyLaneAI/pennylane/pull/4552) * The private `TmpPauliRot` operator used for `SpecialUnitary` no longer decomposes to nothing @@ -600,39 +603,39 @@ ... ``` -* The ``prep`` keyword argument in ``QuantumScript`` is deprecated and will be removed from `QuantumScript`. - ``StatePrepBase`` operations should be placed at the beginning of the `ops` list instead. +* The `prep` keyword argument in `QuantumScript` has been deprecated and will be removed from `QuantumScript`. + `StatePrepBase` operations should be placed at the beginning of the `ops` list instead. [(#4554)](https://github.com/PennyLaneAI/pennylane/pull/4554) -* `qml.gradients.pulse_generator` becomes `qml.gradients.pulse_odegen` to adhere to paper naming conventions. During v0.33, `pulse_generator` +* `qml.gradients.pulse_generator` has been renamed to `qml.gradients.pulse_odegen` to adhere to paper naming conventions. During v0.33, `pulse_generator` is still available but raises a warning. [(#4633)](https://github.com/PennyLaneAI/pennylane/pull/4633)

Documentation 📝

-* Add a warning section in DefaultQubit's docstring regarding the start method used in multiprocessing. +* A warning section in the docstring for `DefaultQubit` regarding the start method used in multiprocessing has been added. This may help users circumvent issues arising in Jupyter notebooks on macOS for example. [(#4622)](https://github.com/PennyLaneAI/pennylane/pull/4622) -* Minor documentation improvements to the new device API. The documentation now correctly states that interface-specific +* Documentation improvements to the new device API have been made. The documentation now correctly states that interface-specific parameters are only passed to the device for backpropagation derivatives. [(#4542)](https://github.com/PennyLaneAI/pennylane/pull/4542) -* Add functions for qubit-simulation to the `qml.devices` sub-page of the "Internal" section. +* Functions for qubit-simulation to the `qml.devices` sub-page of the "Internal" section have been added. Note that these functions are unstable while device upgrades are underway. [(#4555)](https://github.com/PennyLaneAI/pennylane/pull/4555) -* Minor documentation improvement to the usage example in the `qml.QuantumMonteCarlo` page. - Integral was missing the differential dx with respect to which the integration is being performed. +* A documentation improvement to the usage example in the `qml.QuantumMonteCarlo` page has been made. + An integral was missing the differential :math:`dx`. [(#4593)](https://github.com/PennyLaneAI/pennylane/pull/4593) -* Minor documentation improvement for the use of the `pennylane` style of `qml.drawer` and the - `pennylane.drawer.plot` style of `matplotlib.pyplot`. The use of the default font was clarified. +* A documentation improvement for the use of the `pennylane` style of `qml.drawer` and the + `pennylane.drawer.plot` style of `matplotlib.pyplot` has been made by clarifying the use of the default font. [(#4690)](https://github.com/PennyLaneAI/pennylane/pull/4690)

Bug fixes 🐛

-* Fixes `LocalHilbertSchmidt.compute_decomposition` so the template can be used in a qnode. +* Fixed `LocalHilbertSchmidt.compute_decomposition` so that the template can be used in a qnode. * Providing `work_wires=None` to `qml.GroverOperator` no longer interprets `None` as a wire. [(#4668)](https://github.com/PennyLaneAI/pennylane/pull/4668) @@ -682,7 +685,7 @@ Diego Guala, Soran Jahangiri, Edward Jiang, Korbinian Kottmann, -Ivana Kurecic, +Ivana Kurečić Christina Lee, Lillian M. A. Frederiksen, Vincent Michaud-Rioux, From 26688256c3f0c97c0cbe27860d91b3eaabe90e83 Mon Sep 17 00:00:00 2001 From: Isaac De Vlugt Date: Wed, 25 Oct 2023 11:03:34 -0400 Subject: [PATCH 08/18] bug fixes --- doc/releases/changelog-0.33.0.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index 3e2031ac5da..bbb755164e0 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -635,27 +635,27 @@

Bug fixes 🐛

-* Fixed `LocalHilbertSchmidt.compute_decomposition` so that the template can be used in a qnode. +* Fixed `LocalHilbertSchmidt.compute_decomposition` so that the template can be used in a QNode. * Providing `work_wires=None` to `qml.GroverOperator` no longer interprets `None` as a wire. [(#4668)](https://github.com/PennyLaneAI/pennylane/pull/4668) -* Fixed issue where `__copy__` method of the `qml.Select()` operator attempted to access un-initialized data. +* Fixed an issue where the `__copy__` method of the `qml.Select()` operator attempted to access un-initialized data. [(#4551)](https://github.com/PennyLaneAI/pennylane/pull/4551) -* Fix `skip_first` option in `expand_tape_state_prep`. +* Fixed the `skip_first` option in `expand_tape_state_prep`. [(#4564)](https://github.com/PennyLaneAI/pennylane/pull/4564) * `convert_to_numpy_parameters` now uses `qml.ops.functions.bind_new_parameters`. This reinitializes the operation and - makes sure everything references the new numpy parameters. + makes sure everything references the new NumPy parameters. -* `tf.function` no longer breaks `ProbabilityMP.process_state` which is needed by new devices. +* `tf.function` no longer breaks `ProbabilityMP.process_state`, which is needed by new devices. [(#4470)](https://github.com/PennyLaneAI/pennylane/pull/4470) -* Fix mocking in the unit tests for `qml.qchem.mol_data`. +* Fixed unit tests for `qml.qchem.mol_data`. [(#4591)](https://github.com/PennyLaneAI/pennylane/pull/4591) -* Fix `ProbabilityMP.process_state` so it allows for proper Autograph compilation. Without this, +* Fixed `ProbabilityMP.process_state` so that it allows for proper Autograph compilation. Without this, decorating a QNode that returns an `expval` with `tf.function` would fail when computing the expectation. [(#4590)](https://github.com/PennyLaneAI/pennylane/pull/4590) @@ -663,11 +663,11 @@ * The `torch.nn.Module` properties are now accessible on a `pennylane.qnn.TorchLayer`. [(#4611)](https://github.com/PennyLaneAI/pennylane/pull/4611) -* `qml.math.take` with torch now returns `tensor[..., indices]` when the user requests +* `qml.math.take` with Pytorch now returns `tensor[..., indices]` when the user requests the last axis (`axis=-1`). Without the fix, it would wrongly return `tensor[indices]`. [(#4605)](https://github.com/PennyLaneAI/pennylane/pull/4605) -* Ensure the logging `TRACE` level works with gradient-free execution. +* Ensured the logging `TRACE` level works with gradient-free execution. [(#4669)](https://github.com/PennyLaneAI/pennylane/pull/4669)

Contributors ✍️

From f859ccd5d54c46d3a7091f9b9c5dbe0b1ac9bec2 Mon Sep 17 00:00:00 2001 From: Isaac De Vlugt Date: Wed, 25 Oct 2023 11:05:09 -0400 Subject: [PATCH 09/18] bug fixes --- doc/releases/changelog-0.33.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index bbb755164e0..b419c0b036a 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -641,7 +641,7 @@ [(#4668)](https://github.com/PennyLaneAI/pennylane/pull/4668) * Fixed an issue where the `__copy__` method of the `qml.Select()` operator attempted to access un-initialized data. -[(#4551)](https://github.com/PennyLaneAI/pennylane/pull/4551) + [(#4551)](https://github.com/PennyLaneAI/pennylane/pull/4551) * Fixed the `skip_first` option in `expand_tape_state_prep`. [(#4564)](https://github.com/PennyLaneAI/pennylane/pull/4564) From 597c539cca0b48c79e940e4ac0a91e218868b128 Mon Sep 17 00:00:00 2001 From: trbromley Date: Wed, 25 Oct 2023 15:42:55 -0400 Subject: [PATCH 10/18] Add --- doc/releases/changelog-0.33.0.md | 33 ++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index b419c0b036a..2894647c2b7 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -6,31 +6,36 @@

Postselection and statistics in mid-circuit measurements 📌

-* Requesting postselection after making mid-circuit measurements is now possible by specifying the - `postselect` keyword argument in `qml.measure` as either `0` or `1`, corresponding to the basis states. +* It is now possible to request postselection on a mid-circuit measurement. [(#4604)](https://github.com/PennyLaneAI/pennylane/pull/4604) + This can be achieved by specifying the `postselect` keyword argument in `qml.measure` as either + `0` or `1`, corresponding to the basis states. + ```python import pennylane as qml - dev = qml.device("default.qubit", wires=3) + dev = qml.device("default.qubit") - @qml.qnode(dev) - def circuit(phi): - qml.RX(phi, wires=0) - m = qml.measure(0, postselect=1) - qml.cond(m, qml.PauliX)(wires=1) - return qml.probs(wires=1) + @qml.qnode(dev, interface=None) + def circuit(): + qml.Hadamard(wires=0) + qml.CNOT(wires=[0, 1]) + qml.measure(0, postselect=1) + return qml.expval(qml.PauliZ(1)), qml.sample(wires=1) ``` + This circuit prepares the :math:`| \Phi^{+} \rangle` Bell state and postselects on measuring + :math:`|1\rangle` in the first wire. The output of the second wire is then also :math:`|1\rangle` + at all times: + ```pycon - >>> circuit(np.pi) - tensor([0., 1.], requires_grad=True) + >>> circuit(shots=10) + (-1.0, array([1, 1, 1, 1, 1, 1])) ``` - Here, we measure a probability of one on wire 1 as we postselect on the :math:`|1\rangle` state on - wire 0, thus resulting in the circuit being projected onto the state corresponding to the - measurement outcome :math:`|1\rangle` on wire 0. + Note that the number of shots is less than the requested amount because we have thrown away the + samples where :math:`|0\rangle` was measured in wire ``0``. * Measurement statistics can now be collected for mid-circuit measurements. [(#4544)](https://github.com/PennyLaneAI/pennylane/pull/4544) From dc6efc187d4fdd989b267d640fda76824b31df65 Mon Sep 17 00:00:00 2001 From: trbromley Date: Wed, 25 Oct 2023 15:49:11 -0400 Subject: [PATCH 11/18] Make image work --- .../{cosine_window.png => cosine_window_notes.png} | Bin doc/releases/changelog-0.33.0.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename doc/_static/{cosine_window.png => cosine_window_notes.png} (100%) diff --git a/doc/_static/cosine_window.png b/doc/_static/cosine_window_notes.png similarity index 100% rename from doc/_static/cosine_window.png rename to doc/_static/cosine_window_notes.png diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index 2894647c2b7..ed9596e03fe 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -155,7 +155,7 @@ plt.show() ``` - + * Controlled gate sequences raised to decreasing powers, a sub-block in quantum phase estimation, can now be created with the new `CtrlSequence` operator. From da6d6ff01b7604f99a36cdf79fe0bd6f21c712f1 Mon Sep 17 00:00:00 2001 From: trbromley Date: Wed, 25 Oct 2023 16:03:17 -0400 Subject: [PATCH 12/18] Update --- doc/releases/changelog-0.33.0.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index ed9596e03fe..7b6ee588585 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -224,12 +224,14 @@ backpropagation differentiation method is used. For example, consider: ```python + import jax + dev = qml.device("default.qubit", wires=1) @qml.qnode(dev, diff_method="backprop") def f(x): qml.RX(x, wires=0) - return qml.expval(qml.PauliX(0)) + return qml.expval(qml.PauliZ(0)) f(jax.numpy.array(0.2)) ``` From d2029079bd8c70f83bd9fc927d86fcc0ffaf25ce Mon Sep 17 00:00:00 2001 From: trbromley Date: Wed, 25 Oct 2023 16:47:26 -0400 Subject: [PATCH 13/18] Add --- doc/releases/changelog-0.33.0.md | 75 +++++++++++++------------------- 1 file changed, 31 insertions(+), 44 deletions(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index 7b6ee588585..fe654a7a785 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -26,7 +26,7 @@ ``` This circuit prepares the :math:`| \Phi^{+} \rangle` Bell state and postselects on measuring - :math:`|1\rangle` in the first wire. The output of the second wire is then also :math:`|1\rangle` + :math:`|1\rangle` in wire `0`. The output of wire `1` is then also :math:`|1\rangle` at all times: ```pycon @@ -35,7 +35,7 @@ ``` Note that the number of shots is less than the requested amount because we have thrown away the - samples where :math:`|0\rangle` was measured in wire ``0``. + samples where :math:`|0\rangle` was measured in wire `0`. * Measurement statistics can now be collected for mid-circuit measurements. [(#4544)](https://github.com/PennyLaneAI/pennylane/pull/4544) @@ -62,9 +62,6 @@ [deferred measurement](https://docs.pennylane.ai/en/stable/code/api/pennylane.defer_measurements.html) principle to enact the mid-circuit measurements. - In future releases, we will be exploring the ability to combine and manipulate mid-circuit - measurements such as `qml.expval(m0 @ m1)` or `qml.expval(m0 @ qml.PauliZ(0))`. -

Exponentiate Hamiltonians with flexible Trotter products 🐖

* Higher-order Trotter-Suzuki methods are now easily accessible through a new operation @@ -96,10 +93,6 @@ [-0.13259524+0.59790098j 0. +0.j -0.13259524-0.77932754j 0. +0.j ] ``` - The already-available `ApproxTimeEvolution` operation represents the special case of `order=1`. - It is recommended to switch over to use of `TrotterProduct` because `ApproxTimeEvolution` will be - deprecated and removed in upcoming releases. - * Approximating matrix exponentiation with random product formulas, qDrift, is now available with the new `QDrift` operation. [(#4671)](https://github.com/PennyLaneAI/pennylane/pull/4671) @@ -161,10 +154,6 @@ `CtrlSequence` operator. [(#4707)](https://github.com/PennyLaneAI/pennylane/pull/4707/) - Applying sequences of controlled unitary operations raised to decreasing powers is a key part in the quantum phase estimation - algorithm. The new `CtrlSequence` operator allows for the ability to create just this part of the algorithm, facilitating users - to tinker with quantum phase estimation. - To use `CtrlSequence`, specify the controlled unitary operator and the control wires, `control`: ```python @@ -245,7 +234,7 @@ False ``` - Now, `default.qubit` can itself dispatch to all of the interfaces in a backprop-compatible way + Now, `default.qubit` can itself dispatch to all the interfaces in a backprop-compatible way and hence does not need to be swapped: ```pycon @@ -313,11 +302,9 @@

Improving QChem and existing algorithms

-* The qchem `fermionic_dipole` and `particle_number` functions have been updated to use a - `FermiSentence`. The deprecated features for using tuples to represent fermionic operations are - removed. - [(#4546)](https://github.com/PennyLaneAI/pennylane/pull/4546) - [(#4556)](https://github.com/PennyLaneAI/pennylane/pull/4556) +* Computationally expensive functions in `integrals.py`, `electron_repulsion` and `_hermite_coulomb`, have + been modified to replace indexing with slicing for better compatibility with JAX. + [(#4685)](https://github.com/PennyLaneAI/pennylane/pull/4685) * `qml.qchem.import_state` has been extended to import more quantum chemistry wavefunctions, from MPS, DMRG and SHCI classical calculations performed with the Block2 and Dice libraries. @@ -326,6 +313,15 @@ [#4626](https://github.com/PennyLaneAI/pennylane/pull/4626) [#4634](https://github.com/PennyLaneAI/pennylane/pull/4634) + Check out our [how-to guide](https://pennylane.ai/qml/demos/tutorial_initial_state_preparation) + to learn more about how PennyLane integrates with your favourite quantum chemistry libraries. + +* The qchem `fermionic_dipole` and `particle_number` functions have been updated to use a + `FermiSentence`. The deprecated features for using tuples to represent fermionic operations are + removed. + [(#4546)](https://github.com/PennyLaneAI/pennylane/pull/4546) + [(#4556)](https://github.com/PennyLaneAI/pennylane/pull/4556) + * The tensor-network template `qml.MPS` now supports changing the `offset` between subsequent blocks for more flexibility. [(#4531)](https://github.com/PennyLaneAI/pennylane/pull/4531) @@ -336,6 +332,10 @@ when at the beginning of a circuit, thus behaving like `StatePrep`. [(#4583)](https://github.com/PennyLaneAI/pennylane/pull/4583) +* `qml.cut_circuit` is now compatible with circuits that compute the expectation values of Hamiltonians + with two or more terms. + [(#4642)](https://github.com/PennyLaneAI/pennylane/pull/4642) +

Next-generation device API

* `default.qubit` now tracks the number of equivalent qpu executions and total shots @@ -345,7 +345,7 @@ [(#4628)](https://github.com/PennyLaneAI/pennylane/pull/4628) [(#4649)](https://github.com/PennyLaneAI/pennylane/pull/4649) -* `DefaultQubit2` can now accept a `jax.random.PRNGKey` as a `seed` to set the key for the JAX pseudo random +* `DefaultQubit` can now accept a `jax.random.PRNGKey` as a `seed` to set the key for the JAX pseudo random number generator when using the JAX interface. This corresponds to the `prng_key` on `DefaultQubitJax` in the old API. [(#4596)](https://github.com/PennyLaneAI/pennylane/pull/4596) @@ -356,7 +356,7 @@ [(#4527)](https://github.com/PennyLaneAI/pennylane/pull/4527) [(#4637)](https://github.com/PennyLaneAI/pennylane/pull/4637) -* `DefaultQubit2` dispatches to a faster implementation for applying `ParametrizedEvolution` to a state +* `DefaultQubit` dispatches to a faster implementation for applying `ParametrizedEvolution` to a state when it is more efficient to evolve the state than the operation matrix. [(#4598)](https://github.com/PennyLaneAI/pennylane/pull/4598) [(#4620)](https://github.com/PennyLaneAI/pennylane/pull/4620) @@ -371,21 +371,15 @@ * The new device API now has a `repr()` method. [(#4562)](https://github.com/PennyLaneAI/pennylane/pull/4562) -* `DefaultQubit2` now works as expected with measurement processes that don't specify wires. +* `DefaultQubit` now works as expected with measurement processes that don't specify wires. [(#4580)](https://github.com/PennyLaneAI/pennylane/pull/4580) -* Computationally expensive functions in `integrals.py`, `electron_repulsion` and `_hermite_coulomb`, have - been modified to replace indexing with slicing for better compatibility with JAX. - [(#4685)](https://github.com/PennyLaneAI/pennylane/pull/4685) - -* - * Various improvements to measurements have been made for feature parity between `default.qubit.legacy` and - the new `DefaultQubit2`. This includes not trying to squeeze batched `CountsMP` results and implementing + the new `DefaultQubit`. This includes not trying to squeeze batched `CountsMP` results and implementing `MutualInfoMP.map_wires`. [(#4574)](https://github.com/PennyLaneAI/pennylane/pull/4574) -* `devices.qubit.simulate` now accepts an interface keyword argument. If a QNode with `DefaultQubit2` +* `devices.qubit.simulate` now accepts an interface keyword argument. If a QNode with `DefaultQubit` specifies an interface, the result will be computed with that interface. [(#4582)](https://github.com/PennyLaneAI/pennylane/pull/4582) @@ -398,6 +392,13 @@ and `no_sampling` to assist in constructing devices under the new device API. [(#4659)](https://github.com/PennyLaneAI/pennylane/pull/4659) +* `qml.device`, `devices.preprocessing` and the `tape_expand.set_decomposition` context + manager have been updated to bring `default.qubit` to feature parity with `default.qubit.legacy` with regards to + using custom decompositions. The `DefaultQubit` device can now be included in a `set_decomposition` + context or initialized with a `custom_decomps` dictionary, as well as a custom `max_depth` for + decomposition. + [(#4675)](https://github.com/PennyLaneAI/pennylane/pull/4675) +

Other improvements

* The `StateMP` measurement now accepts a wire order (e.g., a device wire order). The `process_state` @@ -424,9 +425,6 @@ * `pennylane.defer_measurements` will now exit early if the input does not contain mid circuit measurements. [(#4659)](https://github.com/PennyLaneAI/pennylane/pull/4659) - Check out our [how-to guide](https://pennylane.ai/qml/demos/tutorial_initial_state_preparation) - to learn more about how PennyLane integrates with your favourite quantum chemistry libraries. - * The density matrix aspects of `StateMP` have been split into their own measurement process called `DensityMatrixMP`. [(#4558)](https://github.com/PennyLaneAI/pennylane/pull/4558) @@ -449,10 +447,6 @@ in the decomposition, the phase is no longer cast to `dtype=complex`. [(#4653)](https://github.com/PennyLaneAI/pennylane/pull/4653) -* `qml.cut_circuit` is now compatible with circuits that compute the expectation values of Hamiltonians - with two or more terms. - [(#4642)](https://github.com/PennyLaneAI/pennylane/pull/4642) - * `_qfunc_output` has been removed from `QuantumScript`, as it is no longer necessary. There is still a `_qfunc_output` property on `QNode` instances. [(#4651)](https://github.com/PennyLaneAI/pennylane/pull/4651) @@ -475,13 +469,6 @@ axis labels and are generated at a default DPI of 300. [(#4690)](https://github.com/PennyLaneAI/pennylane/pull/4690) -* `qml.device`, `devices.preprocessing` and the `tape_expand.set_decomposition` context - manager have been updated to bring `DefaultQubit2` to feature parity with `default.qubit.legacy` with regards to - using custom decompositions. The `DefaultQubit2` device can now be included in a `set_decomposition` - context or initialized with a `custom_decomps` dictionary, as well as a custom `max_depth` for - decomposition. - [(#4675)](https://github.com/PennyLaneAI/pennylane/pull/4675) -

Breaking changes 💔

* `qml.defer_measurements` now raises an error if a transformed circuit measures `qml.probs`, From c1490c791051da1ab60772d4962fb10871f9a0fc Mon Sep 17 00:00:00 2001 From: Tom Bromley <49409390+trbromley@users.noreply.github.com> Date: Wed, 25 Oct 2023 16:51:13 -0400 Subject: [PATCH 14/18] Update doc/releases/changelog-0.33.0.md Co-authored-by: Isaac De Vlugt <34751083+isaacdevlugt@users.noreply.github.com> --- doc/releases/changelog-0.33.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index 996e1294a45..330ad1ba2c3 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -347,7 +347,7 @@ * `DefaultQubit` can now accept a `jax.random.PRNGKey` as a `seed` to set the key for the JAX pseudo random number generator when using the JAX interface. This corresponds to the `prng_key` on - `DefaultQubitJax` in the old API. + `default.qubit.jax` in the old API. [(#4596)](https://github.com/PennyLaneAI/pennylane/pull/4596) * The `JacobianProductCalculator` abstract base class and implementations `TransformJacobianProducts` From 530758cb9ca7655f1b3c50194810f8c4eb80c892 Mon Sep 17 00:00:00 2001 From: trbromley Date: Wed, 25 Oct 2023 16:53:21 -0400 Subject: [PATCH 15/18] Add --- doc/releases/changelog-0.33.0.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index 330ad1ba2c3..eeaaa919674 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -646,6 +646,7 @@ * `convert_to_numpy_parameters` now uses `qml.ops.functions.bind_new_parameters`. This reinitializes the operation and makes sure everything references the new NumPy parameters. + [(#4540)](https://github.com/PennyLaneAI/pennylane/pull/4540) * `tf.function` no longer breaks `ProbabilityMP.process_state`, which is needed by new devices. [(#4470)](https://github.com/PennyLaneAI/pennylane/pull/4470) From 29748f98d5f02678d30a7bd6c1d06b996c539248 Mon Sep 17 00:00:00 2001 From: Isaac De Vlugt Date: Wed, 25 Oct 2023 17:06:24 -0400 Subject: [PATCH 16/18] minor --- doc/releases/changelog-0.33.0.md | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index b419c0b036a..af4ad7736f6 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -144,7 +144,6 @@ return qml.state() output = example_circuit() - # Graph showing state amplitudes plt.style.use("pennylane.drawer.plot") plt.bar(range(len(output)), output) plt.show() From 35c2ce7b452adce853006d14465aea903be4411d Mon Sep 17 00:00:00 2001 From: Tom Bromley <49409390+trbromley@users.noreply.github.com> Date: Thu, 26 Oct 2023 17:45:57 -0400 Subject: [PATCH 17/18] Update doc/releases/changelog-0.33.0.md --- doc/releases/changelog-0.33.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index 69085efc754..e6a09d2d8d4 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -393,7 +393,7 @@ * Updated `qml.device`, `devices.preprocessing` and the `tape_expand.set_decomposition` context manager to bring `DefaultQubit` to feature parity with `default.qubit.legacy` with regards to - using custom decompositions. The `DefaultQubit2` device can now be included in a `set_decomposition` + using custom decompositions. The `DefaultQubit` device can now be included in a `set_decomposition` context or initialized with a `custom_decomps` dictionary, as well as a custom `max_depth` for decomposition. [(#4675)](https://github.com/PennyLaneAI/pennylane/pull/4675) From 98beff4bbf57b9116f8e9dd432ac849e9ef353f3 Mon Sep 17 00:00:00 2001 From: trbromley Date: Fri, 27 Oct 2023 08:43:22 -0400 Subject: [PATCH 18/18] Add --- doc/_static/cosine_window_notes.png | Bin 68634 -> 0 bytes doc/releases/changelog-0.33.0.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 doc/_static/cosine_window_notes.png diff --git a/doc/_static/cosine_window_notes.png b/doc/_static/cosine_window_notes.png deleted file mode 100644 index 2b88019be86f6e91da24cace4714a4e490bc8c7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68634 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
b0Hyk+)EY4YOe!cl@z== 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 E4>@sL{{R30 diff --git a/doc/releases/changelog-0.33.0.md b/doc/releases/changelog-0.33.0.md index e6a09d2d8d4..43194290bd3 100644 --- a/doc/releases/changelog-0.33.0.md +++ b/doc/releases/changelog-0.33.0.md @@ -147,7 +147,7 @@ plt.show() ``` - + * Controlled gate sequences raised to decreasing powers, a sub-block in quantum phase estimation, can now be created with the new `CtrlSequence` operator.