Skip to content

Commit

Permalink
Allow reusing and reseting wires after a mid-circuit measurement (#4402)
Browse files Browse the repository at this point in the history
* Added qubit reuse and reset

* Fixed `defer_measurements`

* Removed `MeasurementValue`

* Update type hint

* Removed `MeasurementValue`

* Add VJP/JVP capabilities to `DefaultQubit2` (#4374)

* Add vjp/jvp capabilities

* pylint

* some tests for simulate

* Fix syntax error

* Split simulate

* Add some tests

* pylint

* more device tests

* pylint and fix tests

* change tracker keys

* Update pennylane/devices/qubit/adjoint_jacobian.py

Co-authored-by: Christina Lee <[email protected]>

* other places

* Add docs for simulate funcs

* revert suggestion

* Remove validation

* Add validation for use_device_gradient

* remove None case

* use device gradient in validation

* changelog

---------

Co-authored-by: Christina Lee <[email protected]>

* Initialize `DefaultQubit2` local rng from global rng if no seed provided (#4394)

* initialize dev rng from global state

* change default value to global str

* Apply suggestions from code review

Co-authored-by: Frederik Wilde <[email protected]>

* Update tests/devices/experimental/test_default_qubit_2.py

* fix indentation

---------

Co-authored-by: Frederik Wilde <[email protected]>

* Changes to remove use of `Operator.__eq__` (#4398)

* Testing changes to operator __eq__

* Updated until `nodes_between`

* Updated metric tensor, circuit graph

* Updating `qml.equal`

* Linters

* Updated tape tests

* Added coverage

* Updates changelog

* Removed changes to __eq__ and __hash__

* Update pennylane/operation.py

Co-authored-by: Matthew Silverman <[email protected]>

* Update pennylane/ops/functions/equal.py

Co-authored-by: Christina Lee <[email protected]>

---------

Co-authored-by: Matthew Silverman <[email protected]>
Co-authored-by: Christina Lee <[email protected]>

* Make autoray changes backwards compatible (#4397)

* Fixes for new autoray version

* unused import

* Use if instead of try-except

* Fix case of two torch tensors

* pin autoray

* dispatch

* test with new version

* Raise warning in Operator `__eq__` and `__hash__` about change in behaviour (#4144)

* Updated Operator

* Added tests

* Updated warning

* black

* Updated warning text

* black

* Update doc/development/deprecations.rst

* Updated docs, tests

* Updated deprecations.rst

* Fixing tests

* Updated tests and warnings

* Pylint

* Testing warnings

* Testing changes

* Updated tests

* testing what breaks

* Checking tests

* Testing changes

* Testing changes to operator __eq__

* Updated until `nodes_between`

* Updated metric tensor, circuit graph

* Updating `qml.equal`

* Linters

* Updated tape tests

* Added coverage

* Updates changelog

* Removed changes to __eq__ and __hash__

* Update pennylane/operation.py

Co-authored-by: Matthew Silverman <[email protected]>

* Testing changes to operator __eq__

* Updated until `nodes_between`

* Updated metric tensor, circuit graph

* Updating `qml.equal`

* Linters

* Fixes for new autoray version (#4396)

* Fixes for new autoray version

* unused import

* Use if instead of try-except

* Fix case of two torch tensors

* Updated tape tests

* Add ability to apply `TransformProgram` to batch of tapes (#4364)

* Draft structure

* draf exec

* Simple execute

* Update

* More tests

* Update

* Update exec

* Pylint and black

* Update tests

* Update more tests

* More tests

* changelog

* Coverage

* Cover fix

* pylint

* Pylint

* Pylint tests

* proposed changes to transform program integration

* oops

* add to legacy, remove cotransform support

* just transform program call component

* just transform program call component

* no longer support cotransforms, fix _batch_postprocessing

* some more testing

* test null postprocessing function

* docstring, rename batch_slices to slices, black

* Apply suggestions from code review

Co-authored-by: Matthew Silverman <[email protected]>

---------

Co-authored-by: rmoyard <[email protected]>
Co-authored-by: Matthew Silverman <[email protected]>

* torch qnode integration with DefaultQubit2 (#4392)

* copy-paste torch file; replace device in most places

* make tests work; little changes in pennylane

* pylint fix

* changelog

* update test name and docstring for hamiltonian_expand

* minimal test for single-shot bugfix

* Added coverage

* Updates changelog

* Removed changes to __eq__ and __hash__

* Update pennylane/operation.py

Co-authored-by: Matthew Silverman <[email protected]>

* Updated deprecations to 0.32

* Added warnings

* Trigger CI

* Removed docstrings

* Added correctness test

* Trigger CI

---------

Co-authored-by: Tom Bromley <[email protected]>
Co-authored-by: Matthew Silverman <[email protected]>
Co-authored-by: Edward Jiang <[email protected]>
Co-authored-by: Christina Lee <[email protected]>
Co-authored-by: rmoyard <[email protected]>

* Tensorflow qnode integration with DefaultQubit2 (#4393)

* copy-paste tf files

* make tests work; little changes in pennylane

* changes coming from torch PR first

* update remaining test files

* support tf.function by adding empty kwargs

* update copyright year in test files

* changelog

* put all qnode integrations together

* remove turning warning into error (#4409)

* Fix jax.ad deprecation. (#4403)

* Fix jax.ad deprecation.

* Update changelog.

* Print name of requested device in DeviceError.

* Force push.

* Fix pytest.raises in test_device.py

* fix `has_decomposition` for ControlledQubitUnitary (#4407)

* fix has_decomposition for ControlledQubitUnitary

* changelog

* add comment; add test when super returns False

* [sc-36527]: Add new robots.txt to doc build to hide latest build from search engine (#4423)

* Adding a `wire_order` kwarg to `Tensor.sparse_matrix()` (#4424)

* `wire_order` kwarg for `Tensor.sparse_matrix()`

* update changelog

* swap kwarg order

Co-authored-by: Matthew Silverman <[email protected]>

* adapt docstring to the kwarg order swap

* add comment about using  over

---------

Co-authored-by: Matthew Silverman <[email protected]>

* Updated defer_measurements post-merge

* Fixed defer_measurements

* Updated test

* Updated class signature

* Updating keys

* Updated id process

* Updated changelog

* Updated changelog

* Adds shots to experimental device interface and integrate with QNode (#4388)

* default shots on new device interface

* make fewer changes and clean stuff up later

* fix tests, lint, and sphinx

* Update doc/releases/changelog-dev.md

* Update tests/interfaces/test_set_shots.py

Co-authored-by: Matthew Silverman <[email protected]>

* Update tests/devices/experimental/test_default_qubit_2.py

* make set_shots error with new device, shots type hinting

* Update doc/releases/changelog-dev.md

Co-authored-by: Tom Bromley <[email protected]>

* Update pennylane/interfaces/set_shots.py

Co-authored-by: Matthew Silverman <[email protected]>

* Apply suggestions from code review

* Update tests/devices/experimental/test_default_qubit_2.py

* merge problem

* black

* Update doc/releases/changelog-dev.md

* Update pennylane/qnode.py

Co-authored-by: Edward Jiang <[email protected]>

---------

Co-authored-by: Matthew Silverman <[email protected]>
Co-authored-by: Tom Bromley <[email protected]>
Co-authored-by: Edward Jiang <[email protected]>

* QNSPSA bugfix (#4421)

* qnspsa bugfix

* Update doc/releases/changelog-dev.md

* Update tests/optimize/test_qnspsa.py

Co-authored-by: Matthew Silverman <[email protected]>

---------

Co-authored-by: Matthew Silverman <[email protected]>

* Update changelog

* Updated defer_measurements for device wires

* Removed error from drawable layers

* Update changelog

* Updated drawable layers test

* Updated signatures

* Updated signatures

* Merge `v0.31.1-rc0` branch into master (#4428)

* Support `HardwareHamiltonian` pulses in `stoch_pulse_grad` (#4215)

* single out gradient transform checks

* rename stochastic pulse gradient file

* unify gradient_analysis and grad_method_validation

* continue restructure of analysis+validation

* CV

* black

* modularize more

* more modularizing

* black

* tiny [skip ci]

* [skip ci] lint

* remove dummy test

* test fix

* add test file to linting test file

* test fixes, docstrings

* code review

* docstring gradient_analysis_and_grad_method_validation

* move first fun

* code review:move functions

* test regex

* regexs

* move and promote reorder_grads

* tmp

* more tmp

* test cases, contractions

* lint

* docstring

* even more tmp

* cleanup

* black

* tmp

* lint

* move stoch_pulse_gradient.. files back to pulse_gradient...

* move stoch_pulse_gradient.. files back to pulse_gradient...

* lint

* rename

* extend functions and tests

* lint and black

* changelog

* improve

* update example to include non-Pauli word generator

* add jit test with pauli sentence

* tmp

* debugging, docstring, extend test

* review

* optimize for Pauli words

* Apply suggestions from code review

Co-authored-by: Romain Moyard <[email protected]>

* test cases code review

* fix parametrization

* drafting

* working prototype

* finish merge; cleanup

* changelog

* comments

* [skip ci]

* raising an error; cleanup [skip ci]

* Apply suggestions from code review

Co-authored-by: Korbinian Kottmann <[email protected]>

* change contraction idea

* typo in docs

* tests

* remove prints

* fix test

* test descriptions

* fix merge

* format

* code review; test coverage

* coverage reordering

* fix

* trigger CI

* trigger

* clear caches

* trigger

* trigger

---------

Co-authored-by: Romain Moyard <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>

* Fix batching of derivative tapes in autograd (#4245)

* Fix `expval` of `Sum` with broadcasting (#4275)

* fix bug and add test

* changelog addition

* Various doc fixes (#4268)

* Various things while validating changes for 0.31 (#4279)

* change link in setup.py

* fix qchem docs

* fix qcut docs

* rename string function (#4278)

* Update docs (#4269)

* Incrementing the version number to `v0.32.0-dev` (#4266)

* pre-release for v0.31.0

* Update doc/releases/changelog-0.31.0.md

* Incrementing the version number to v0.32.0-dev

* Update installation.rst (#4247)

Update Python version to 3.8

Co-authored-by: Romain Moyard <[email protected]>

* docs typos

* don't include updating versioning from master

* don't include python requirements from master

* update example output for shot_vector

* Update pennylane/operation.py

Co-authored-by: Matthew Silverman <[email protected]>

* fix entirely unrelated rendering issue

---------

Co-authored-by: Matthew Silverman <[email protected]>
Co-authored-by: Catalina Albornoz <[email protected]>
Co-authored-by: Romain Moyard <[email protected]>

* Minor fixes for v0.31 (#4280)

* Added fixes

* Update pennylane/ops/qubit/matrix_ops.py

Co-authored-by: Matthew Silverman <[email protected]>

* Update pennylane/ops/qubit/matrix_ops.py

---------

Co-authored-by: Matthew Silverman <[email protected]>

* add graphviz to RTD apt packages (#4284)

* Pulse gradient methods docs polish (#4282)

* stoch pulse docs update

* generator method docs update

* small fixes / typos

* Update pennylane/gradients/pulse_generator_gradient.py

Co-authored-by: David Wierichs <[email protected]>

* Update pennylane/gradients/pulse_generator_gradient.py

Co-authored-by: David Wierichs <[email protected]>

* Update pennylane/gradients/pulse_generator_gradient.py

Co-authored-by: David Wierichs <[email protected]>

* code review

* Update pennylane/gradients/pulse_gradient.py

Co-authored-by: David Wierichs <[email protected]>

* code review

* Update pennylane/gradients/pulse_generator_gradient.py

Co-authored-by: Frederik Wilde <[email protected]>

* large |

* add equal to

---------

Co-authored-by: David Wierichs <[email protected]>
Co-authored-by: Frederik Wilde <[email protected]>

* 0.31 release notes (#4218)

* Add categories

* First pass at categorization

* More categorization

* More categorization

* Typo

* Add first half of resource estimation text

* Improvements

* Add custom ops resource estimation

* Update wording

* Improve entry

* Move

* Move

* Move

* Update

* Add details about Torch and Keras

* Add entry

* Add contributor

* Add to Keras and Torch layer section

* Add saving and loading details

* Add entry

* Add contributor

* Add contributor

* Add qutrit basis state example

* first round of edits

* Remove

* Add entry for one_qubit_decompostition

* more changes

* Reorder sections

* fermi blurb

* minor

* Update

* Add

* Update doc/releases/changelog-dev.md

Co-authored-by: Isaac De Vlugt <[email protected]>

* Update doc/releases/changelog-dev.md

Co-authored-by: Isaac De Vlugt <[email protected]>

* update fermionic code examples

* additions

* minor

* restructure sections

* minor

* minor

* reorder fermi section

* fixed fermi section

* various small changes

* Tweaks to fermionic

* Tweaks to resource and UH sections

* Improvements

* Move

* Update doc/releases/changelog-0.31.0.md

* minior

* minor

* minor

* minor

* minor

* Update

* minor

* use from_string for fermi ops

* Add link

* Update doc/releases/changelog-0.31.0.md

* added links and other minor things

* Update doc/releases/changelog-0.31.0.md

* Update doc/releases/changelog-0.31.0.md

* minor

* minor

* deleted extraneous notebook

* Apply suggestions from code review

Co-authored-by: Tom Bromley <[email protected]>

---------

Co-authored-by: Isaac De Vlugt <[email protected]>
Co-authored-by: Isaac De Vlugt <[email protected]>
Co-authored-by: soranjh <[email protected]>

* Allow updating dense kwarg in call of ParametrizedEvolution (#4285)

* add dense kwarg to call

* update changelog

* update changelog better

* changelog formatting

---------

Co-authored-by: Korbinian Kottmann <[email protected]>

* Remove line in code example to make docs render properly. (#4290)

* Pin autograd to <= 1.5 (#4289)

* pin autograd to 1.5 or less

* allow autograd 1.4 as well

* pin for doc build as well

* Add dm_from_state_vector function to qml.math docs page. (#4291)

* Fix `ShotAdaptiveOptimizer` to prevent removing shot vector axes (#4240)

* Updated `ShotAdaptiveOpt` per suggestion in issue

* Reformatting

* Testing changes

* Fixed bug

* Updated min to max

* Allow classical shadow measurements in new device (#4162)

* Support classical shadow measurements

* Add shot vector tests

* Address comments

* Add comment for diag_list

* Apply suggestions from code review

Co-authored-by: Christina Lee <[email protected]>

* Fix

* Add unit tests for process_state_with_shots

* Update preprocessing

* Apply suggestions from code review

Co-authored-by: Frederik Wilde <[email protected]>

* Address PR comments

* set rng for test

---------

Co-authored-by: Christina Lee <[email protected]>
Co-authored-by: Frederik Wilde <[email protected]>

* Add the `fermi` module docs (#4250)

* support trainable Sum observables (#4251)

* support trainable Sum observables (analytic only)

* just use pre-rotated state; use super with finite shots

* fix tests; add test for trainable Sum coeffs

* changelog

* use overlapping wires to prove they work

* add hacky gradient support

* Revert "add hacky gradient support"

This reverts commit 09009c8.

* set interface=None to keep test behaviour

* Integrate experimental device with the `QNode` (#4196)

* integrate qnode with new device

* some diff method improvements

* repr methods

* add tests, always pass config to device

* add tests, always pass config to device

* final test

* pylint

* autograd integration tests

* pylint

* Update pennylane/interfaces/execution.py

Co-authored-by: Matthew Silverman <[email protected]>

* pass shots through methods

* changelog

* revert set shots change

* Apply suggestions from code review

Co-authored-by: Matthew Silverman <[email protected]>

* revert executionc hange, pylint:

* pylint again

---------

Co-authored-by: Matthew Silverman <[email protected]>
Co-authored-by: Romain Moyard <[email protected]>

* pre-release for v0.31.0 (#4265)

* pre-release for v0.31.0

* Update doc/releases/changelog-0.31.0.md

* Support `HardwareHamiltonian` pulses in `stoch_pulse_grad` (#4215)

* single out gradient transform checks

* rename stochastic pulse gradient file

* unify gradient_analysis and grad_method_validation

* continue restructure of analysis+validation

* CV

* black

* modularize more

* more modularizing

* black

* tiny [skip ci]

* [skip ci] lint

* remove dummy test

* test fix

* add test file to linting test file

* test fixes, docstrings

* code review

* docstring gradient_analysis_and_grad_method_validation

* move first fun

* code review:move functions

* test regex

* regexs

* move and promote reorder_grads

* tmp

* more tmp

* test cases, contractions

* lint

* docstring

* even more tmp

* cleanup

* black

* tmp

* lint

* move stoch_pulse_gradient.. files back to pulse_gradient...

* move stoch_pulse_gradient.. files back to pulse_gradient...

* lint

* rename

* extend functions and tests

* lint and black

* changelog

* improve

* update example to include non-Pauli word generator

* add jit test with pauli sentence

* tmp

* debugging, docstring, extend test

* review

* optimize for Pauli words

* Apply suggestions from code review

Co-authored-by: Romain Moyard <[email protected]>

* test cases code review

* fix parametrization

* drafting

* working prototype

* finish merge; cleanup

* changelog

* comments

* [skip ci]

* raising an error; cleanup [skip ci]

* Apply suggestions from code review

Co-authored-by: Korbinian Kottmann <[email protected]>

* change contraction idea

* typo in docs

* tests

* remove prints

* fix test

* test descriptions

* fix merge

* format

* code review; test coverage

* coverage reordering

* fix

* trigger CI

* trigger

* clear caches

* trigger

* trigger

---------

Co-authored-by: Romain Moyard <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>

* Fix batching of derivative tapes in autograd (#4245)

* Fix `expval` of `Sum` with broadcasting (#4275)

* fix bug and add test

* changelog addition

* Various doc fixes (#4268)

* Various things while validating changes for 0.31 (#4279)

* change link in setup.py

* fix qchem docs

* fix qcut docs

* rename string function (#4278)

* Update docs (#4269)

* Incrementing the version number to `v0.32.0-dev` (#4266)

* pre-release for v0.31.0

* Update doc/releases/changelog-0.31.0.md

* Incrementing the version number to v0.32.0-dev

* Update installation.rst (#4247)

Update Python version to 3.8

Co-authored-by: Romain Moyard <[email protected]>

* docs typos

* don't include updating versioning from master

* don't include python requirements from master

* update example output for shot_vector

* Update pennylane/operation.py

Co-authored-by: Matthew Silverman <[email protected]>

* fix entirely unrelated rendering issue

---------

Co-authored-by: Matthew Silverman <[email protected]>
Co-authored-by: Catalina Albornoz <[email protected]>
Co-authored-by: Romain Moyard <[email protected]>

* Minor fixes for v0.31 (#4280)

* Added fixes

* Update pennylane/ops/qubit/matrix_ops.py

Co-authored-by: Matthew Silverman <[email protected]>

* Update pennylane/ops/qubit/matrix_ops.py

---------

Co-authored-by: Matthew Silverman <[email protected]>

* add graphviz to RTD apt packages (#4284)

* Updated test

---------

Co-authored-by: Edward Jiang <[email protected]>
Co-authored-by: Christina Lee <[email protected]>
Co-authored-by: Frederik Wilde <[email protected]>
Co-authored-by: soranjh <[email protected]>
Co-authored-by: Matthew Silverman <[email protected]>
Co-authored-by: Romain Moyard <[email protected]>
Co-authored-by: David Wierichs <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>
Co-authored-by: lillian542 <[email protected]>
Co-authored-by: Catalina Albornoz <[email protected]>

* Make links to qml.eigvals and the eigvals method appear distinctly. (#4292)

* Make links to qml.eigvals and the eigvals method appear distinctly in the docstring of compute_method.

* Make links more informative.

---------

Co-authored-by: Matthew Silverman <[email protected]>

* Device API review (#4283)

* fix  example

* minor docstring change in `_zyz_decomposition`

* update decomposition examples

* update counts & samples docstrings

* Shots class link

* Fix code block

* Change note

Co-authored-by: Edward Jiang <[email protected]>

---------

Co-authored-by: Edward Jiang <[email protected]>

* remove duplicate controlled operation entries (#4298)

* Refer to class QNode in ml layers (#4299)

* Specs dict fix (#4286)

* Add copy function to SpecsDict.

* black

* Adjust docs to not throw warnings from deprecated specs keys.

* Formatting fix.

* update doc string

* update doc string

---------

Co-authored-by: Jay Soni <[email protected]>
Co-authored-by: Matthew Silverman <[email protected]>

* Fermionic ops in changelog (#4302)

* bump lightning to 0.31 in setup.py, pin scipy to [1.8,1.10] (#4304)

* bump lightning to 0.31 in setup.py

* trigger ci

* pin scipy

* Revert "pin scipy"

This reverts commit 492ad40.

* take Soran's forward fix for scipy fac2

* revert the scipy un-pinning and forward fix - just pin scipy

* remove lower bound in files that didn't have them

* remove autograd lower bound

* Implement new Dataset class using HDF5 (#4369)

* rename changelog

* test

* rename changelog back

* changes from 9f5939e

* changes from b6dc487

* changes until 01d9141

* changes until 935832e

* changes until 76c4ae8

* trigger ci

* newline

* revert

* changes until 3b59d71

* trigger ci

* Make qchem compatible with scipy factorial2 (#4387)

* pull diff from #4321

* unpin scipy

* Release notes and version bump (#4385)

* changelog and version bump

* Add qchem changes

* Apply suggestions from code review

Co-authored-by: Tom Bromley <[email protected]>

---------

Co-authored-by: Tom Bromley <[email protected]>

* pin autoray (#4399)

* raise error with actual identifier name (#4405)

* Escape special characters in Dataset URL (#4412)

* url escape

* remove debug

* update changelog

* pylint

* Update doc/releases/changelog-0.31.1.md

Co-authored-by: Matthew Silverman <[email protected]>

---------

Co-authored-by: Matthew Silverman <[email protected]>

* BUGFIX: ensure that operators are not queued upon deserialization (#4414)

* ensure that operators are not queued upon deserialization

* Update tests/data/attributes/operator/test_operator.py

* Updated the datasets docs (#4400)

* Updated the datasets docs

* Update doc/Makefile

* a few more

* Apply suggestions from code review

Co-authored-by: Utkarsh <[email protected]>

* Apply suggestions from code review

Co-authored-by: Diego <[email protected]>

* Update pennylane/data/data_manager/__init__.py

Co-authored-by: Josh Izaac <[email protected]>

* fix typo

* fix typo

---------

Co-authored-by: Utkarsh <[email protected]>
Co-authored-by: Diego <[email protected]>
Co-authored-by: Diego <[email protected]>

* Fix error message when successively loading the same dataset (#4422)

* Fix Attribute Error when accessing identifiers on partial dataset (#4413)

* no exception if identifiers are not downloaded

* always download identifiers

* Update tests/data/test_dataset.py

Co-authored-by: Matthew Silverman <[email protected]>

* add error message

---------

Co-authored-by: Matthew Silverman <[email protected]>

* Update tests/tape/test_qscript.py

* Update setup.py

* Update requirements.txt

Co-authored-by: Edward Jiang <[email protected]>

---------

Co-authored-by: David Wierichs <[email protected]>
Co-authored-by: Romain Moyard <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>
Co-authored-by: Christina Lee <[email protected]>
Co-authored-by: Matthew Silverman <[email protected]>
Co-authored-by: soranjh <[email protected]>
Co-authored-by: lillian542 <[email protected]>
Co-authored-by: Catalina Albornoz <[email protected]>
Co-authored-by: Mudit Pandey <[email protected]>
Co-authored-by: Frederik Wilde <[email protected]>
Co-authored-by: Tom Bromley <[email protected]>
Co-authored-by: Isaac De Vlugt <[email protected]>
Co-authored-by: Isaac De Vlugt <[email protected]>
Co-authored-by: soranjh <[email protected]>
Co-authored-by: BorjaRequena <[email protected]>
Co-authored-by: Jay Soni <[email protected]>
Co-authored-by: Jack Brown <[email protected]>
Co-authored-by: Josh Izaac <[email protected]>
Co-authored-by: Utkarsh <[email protected]>
Co-authored-by: Diego <[email protected]>
Co-authored-by: Diego <[email protected]>
Co-authored-by: albi3ro <[email protected]>

* Integrate `TransformProgram` with `QNode` (#4404)

* Draft structure

* draf exec

* Simple execute

* Update

* More tests

* Update

* Update exec

* Pylint and black

* Update tests

* Update more tests

* More tests

* changelog

* Coverage

* Cover fix

* pylint

* Pylint

* Pylint tests

* proposed changes to transform program integration

* oops

* add to legacy, remove cotransform support

* just transform program call component

* just transform program call component

* no longer support cotransforms, fix _batch_postprocessing

* some more testing

* test null postprocessing function

* docstring, rename batch_slices to slices, black

* Apply suggestions from code review

Co-authored-by: Matthew Silverman <[email protected]>

* integrate transform program with qnode

* adding integration tests

* test modifications

* [skip ci] fiddling

* more testing

* changelog entry

* add to execute, start on testing

* add qml.execute tests

* Update doc/releases/changelog-dev.md

Co-authored-by: Matthew Silverman <[email protected]>

* fix test

---------

Co-authored-by: rmoyard <[email protected]>
Co-authored-by: Matthew Silverman <[email protected]>

* move multiprocessing pre-processing to preprocess (#4425)

* move multiprocessing pre-processing to preprocess

* add test for None case

* you knew it was a bad idea... 🙃

* changelog

* Remove `parametric_ops.py` (#4434)

* Removed `parametric_ops.py`

* Fixed test

---------

Co-authored-by: Christina Lee <[email protected]>

* Updated signature

* Removed `dev_wires` arg

* Fixed defer_measurements

* Fixed tests

* Fixed tests

* Update mid_measure tests

* Updated how queuing for `MidMeasureMP` works

* Updated tests

* Added tests

* Add converter function for PySCF's CISD to PennyLane statevector (#4427)

* Updated init

* Reverted queuing change

* Trigger CI

* Added documentation

* Trigger CI

* Trigger CI

* Update docs

* Updated measurement value

* Updated changelog

* Update doc/releases/changelog-dev.md

* Updated tests

* Fix transmon Hamiltonians (#4418)

* Fix transmon Hamiltonians

* black

* docs update

* docs

* update changelog

* small updates

* Update pennylane/pulse/transmon.py

Co-authored-by: David Wierichs <[email protected]>

* Update pennylane/pulse/transmon.py

Co-authored-by: David Wierichs <[email protected]>

* black

* code review

* formatting

* Update pennylane/pulse/transmon.py

Co-authored-by: David Wierichs <[email protected]>

* Update tests/pulse/test_transmon.py

Co-authored-by: David Wierichs <[email protected]>

---------

Co-authored-by: David Wierichs <[email protected]>

* Updated measurement value

* Updated changelog

* Update doc/releases/changelog-dev.md

* Updated tests

* Added qubit reuse and reset

* Removed `MeasurementValue`

* Integrate `TransformProgram` with `QNode` (#4404)

* Draft structure

* draf exec

* Simple execute

* Update

* More tests

* Update

* Update exec

* Pylint and black

* Update tests

* Update more tests

* More tests

* changelog

* Coverage

* Cover fix

* pylint

* Pylint

* Pylint tests

* proposed changes to transform program integration

* oops

* add to legacy, remove cotransform support

* just transform program call component

* just transform program call component

* no longer support cotransforms, fix _batch_postprocessing

* some more testing

* test null postprocessing function

* docstring, rename batch_slices to slices, black

* Apply suggestions from code review

Co-authored-by: Matthew Silverman <[email protected]>

* integrate transform program with qnode

* adding integration tests

* test modifications

* [skip ci] fiddling

* more testing

* changelog entry

* add to execute, start on testing

* add qml.execute tests

* Update doc/releases/changelog-dev.md

Co-authored-by: Matthew Silverman <[email protected]>

* fix test

---------

Co-authored-by: rmoyard <[email protected]>
Co-authored-by: Matthew Silverman <[email protected]>

* Removed `dev_wires` arg

* Fixed tests

* Update mid_measure tests

* Trigger CI

* Trigger CI

* Trigger CI

* Updated tests

* Updated tests

* Remove references to measurement_ids

* Removed weird code

* Add converter function for PySCF's RCISD and CCSD/UCCSD to PennyLane statevector (#4433)

* Remove references to measurement_ids

* Updated init

* linting

* Removed merge artifacts

* Fixing tests

* Fixed tests

* Linting

* Testing to see if doc build fails

* Check doc build

* Progressing docs

* Updated doc

* doc test

* Testing doc

* Updated docstring

* Changed docstring (hopefully the last time)

* Apply suggestions from code review

Co-authored-by: Christina Lee <[email protected]>

* Updating docs

* linting

* Removed old comment

* Added optimization

* Fixed preprocess test

* linting

* Cleaning up

* Adding tests

* Finish adding tests

* Apply suggestions from code review

Co-authored-by: Matthew Silverman <[email protected]>

* Updated docstring per review

---------

Co-authored-by: Edward Jiang <[email protected]>
Co-authored-by: Christina Lee <[email protected]>
Co-authored-by: Frederik Wilde <[email protected]>
Co-authored-by: Matthew Silverman <[email protected]>
Co-authored-by: Tom Bromley <[email protected]>
Co-authored-by: rmoyard <[email protected]>
Co-authored-by: Vincent Michaud-Rioux <[email protected]>
Co-authored-by: Rashid N H M <[email protected]>
Co-authored-by: BorjaRequena <[email protected]>
Co-authored-by: David Wierichs <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>
Co-authored-by: Korbinian Kottmann <[email protected]>
Co-authored-by: soranjh <[email protected]>
Co-authored-by: lillian542 <[email protected]>
Co-authored-by: Catalina Albornoz <[email protected]>
Co-authored-by: Isaac De Vlugt <[email protected]>
Co-authored-by: Isaac De Vlugt <[email protected]>
Co-authored-by: soranjh <[email protected]>
Co-authored-by: Jay Soni <[email protected]>
Co-authored-by: Jack Brown <[email protected]>
Co-authored-by: Josh Izaac <[email protected]>
Co-authored-by: Utkarsh <[email protected]>
Co-authored-by: Diego <[email protected]>
Co-authored-by: Diego <[email protected]>
Co-authored-by: albi3ro <[email protected]>
Co-authored-by: Stepan Fomichev <[email protected]>
  • Loading branch information
27 people authored and mlxd committed Aug 23, 2023
1 parent 86235ce commit be987a8
Show file tree
Hide file tree
Showing 10 changed files with 439 additions and 156 deletions.
21 changes: 15 additions & 6 deletions doc/releases/changelog-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@

<h3>New features since last release</h3>

* `DefaultQubit2` accepts a `max_workers` argument which controls multiprocessing.
* `qml.measure` now includes a boolean keyword argument `reset` to reset a wire to the
$|0\rangle$ computational basis state after measurement.
[(#4402)](https://github.com/PennyLaneAI/pennylane/pull/4402/)

* `DefaultQubit2` accepts a `max_workers` argument which controls multiprocessing.
A `ProcessPoolExecutor` executes tapes asynchronously
using a pool of at most `max_workers` processes. If `max_workers` is `None`
or not given, only the current process executes tapes. If you experience any
Expand Down Expand Up @@ -105,7 +109,7 @@ array([False, False])
[#4331](https://github.com/PennyLaneAI/pennylane/pull/4331)

* The `qchem` functions `primitive_norm` and `contracted_norm` are modified to be compatible with
higher versions of scipy. The private function `_fac2` for computing double factorials is added.
higher versions of scipy. The private function `_fac2` for computing double factorials is added.
[#4321](https://github.com/PennyLaneAI/pennylane/pull/4321)

* The default label for a `StatePrep` operator is now `|Ψ⟩`.
Expand Down Expand Up @@ -158,6 +162,9 @@ array([False, False])

* The experimental `DefaultQubit2` device now supports computing VJPs and JVPs using the adjoint method.
[(#4374)](https://github.com/PennyLaneAI/pennylane/pull/4374)

* Provide users access to the logging configuration file path and improve the logging configuration structure.
[(#4377)](https://github.com/PennyLaneAI/pennylane/pull/4377)

* Refactoring of `pennylane/interfaces`. The `execute_fn` passed to the machine learning framework boundaries
is now responsible for converting parameters to numpy. The gradients module can now handle tensorflow parameters,
Expand Down Expand Up @@ -236,20 +243,20 @@ array([False, False])

<h3>Deprecations 👋</h3>

* ``qml.qchem.jordan_wigner`` is deprecated, use ``qml.jordan_wigner`` instead.
List input to define the fermionic operator is also deprecated; the fermionic
* ``qml.qchem.jordan_wigner`` is deprecated, use ``qml.jordan_wigner`` instead.
List input to define the fermionic operator is also deprecated; the fermionic
operators in the ``qml.fermi`` module should be used instead.
[(#4332)](https://github.com/PennyLaneAI/pennylane/pull/4332)

* The `qml.RandomLayers.compute_decomposition` keyword argument `ratio_imprimitive` will be changed to `ratio_imprim` to
match the call signature of the operation.
[(#4314)](https://github.com/PennyLaneAI/pennylane/pull/4314)

* The CV observables ``qml.X`` and ``qml.P`` have been deprecated. Use ``qml.QuadX``
* The CV observables ``qml.X`` and ``qml.P`` have been deprecated. Use ``qml.QuadX``
and ``qml.QuadP`` instead.
[(#4330)](https://github.com/PennyLaneAI/pennylane/pull/4330)

* The method ``tape.unwrap()`` and corresponding ``UnwrapTape`` and ``Unwrap`` classes
* The method ``tape.unwrap()`` and corresponding ``UnwrapTape`` and ``Unwrap`` classes
are deprecated. Use ``convert_to_numpy_parameters`` instead.
[(#4344)](https://github.com/PennyLaneAI/pennylane/pull/4344)

Expand Down Expand Up @@ -368,6 +375,7 @@ This release contains contributions from (in alphabetical order):

Utkarsh Azad,
Isaac De Vlugt,
Amintor Dusko,
Stepan Fomichev,
Lillian M. A. Frederiksen,
Soran Jahangiri,
Expand All @@ -376,6 +384,7 @@ Korbinian Kottmann
Christina Lee,
Vincent Michaud-Rioux,
Romain Moyard,
Lee James O'Riordan,
Mudit Pandey,
Borja Requena,
Matthew Silverman,
Expand Down
5 changes: 0 additions & 5 deletions pennylane/drawer/drawable_layers.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,6 @@ def drawable_layers(ops, wire_map=None):
# loop over operations
for op in ops:
is_mid_measure = is_conditional = False
if set(measured_wires.values()).intersection({wire_map[w] for w in op.wires}):
raise ValueError(
f"Cannot apply operations on {op.wires} as some wires have been measured already."
)

if isinstance(op, MidMeasureMP):
if len(op.wires) > 1:
raise ValueError("Cannot draw mid-circuit measurements with more than one wire.")
Expand Down
50 changes: 39 additions & 11 deletions pennylane/measurements/mid_measure.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
from .measurements import MeasurementProcess, MidMeasure


def measure(wires): # TODO: Change name to mid_measure
"""Perform a mid-circuit measurement in the computational basis on the
def measure(wires: Wires, reset: Optional[bool] = False):
r"""Perform a mid-circuit measurement in the computational basis on the
supplied qubit.
Measurement outcomes can be obtained and used to conditionally apply
Expand All @@ -38,7 +38,7 @@ def measure(wires): # TODO: Change name to mid_measure
.. code-block:: python3
dev = qml.device("default.qubit", wires=2)
dev = qml.device("default.qubit", wires=3)
@qml.qnode(dev)
def func(x, y):
Expand All @@ -55,23 +55,45 @@ def func(x, y):
>>> func(*pars)
tensor([0.90165331, 0.09834669], requires_grad=True)
Wires can be reused after measurement. Moreover, measured wires can be reset
to the :math:`|0 \rangle` by setting ``reset=True``.
.. code-block:: python3
dev = qml.device("default.qubit", wires=3)
@qml.qnode(dev)
def func():
qml.PauliX(1)
m_0 = qml.measure(1, reset=True)
return qml.probs(wires=[1])
Executing this QNode:
>>> func()
tensor([1., 0.], requires_grad=True)
Mid circuit measurements can be manipulated using the following dunder methods
``+``, ``-``, ``*``, ``/``, ``~`` (not), ``&`` (and), ``|`` (or), ``==``, ``<=``,
``>=``, ``<``, ``>`` with other mid-circuit measurements or scalars.
Note:
python ``not``, ``and``, ``or``, do not work since these do not have dunder
methods. Instead use ``~``, ``&``, ``|``.
.. Note ::
Python ``not``, ``and``, ``or``, do not work since these do not have dunder methods.
Instead use ``~``, ``&``, ``|``.
Args:
wires (Wires): The wire of the qubit the measurement process applies to.
reset (Optional[bool]): Whether to reset the wire to the :math:`|0 \rangle`
state after measurement.
Returns:
MidMeasureMP: measurement process instance
Raises:
QuantumFunctionError: if multiple wires were specified
"""

wire = Wires(wires)
if len(wire) > 1:
raise qml.QuantumFunctionError(
Expand All @@ -80,7 +102,7 @@ def func(x, y):

# Create a UUID and a map between MP and MV to support serialization
measurement_id = str(uuid.uuid4())[:8]
mp = MidMeasureMP(wires=wire, id=measurement_id)
mp = MidMeasureMP(wires=wire, reset=reset, id=measurement_id)
return MeasurementValue([mp], processing_fn=lambda v: v)


Expand All @@ -90,17 +112,23 @@ def func(x, y):
class MidMeasureMP(MeasurementProcess):
"""Mid-circuit measurement.
This class additionally stores information about unknown measurement outcomes in the qubit model.
Measurements on a single qubit in the computational basis are assumed.
Please refer to :func:`measure` for detailed documentation.
Args:
wires (.Wires): The wires the measurement process applies to.
This can only be specified if an observable was not provided.
id (str): custom label given to a measurement instance, can be useful for some applications
where the instance has to be identified
reset (bool): Whether to reset the wire after measurement.
id (str): Custom label given to a measurement instance.
"""

def __init__(self, wires: Optional[Wires] = None, id: Optional[str] = None):
super().__init__(wires=wires, id=id)
def __init__(
self, wires: Optional[Wires] = None, reset: Optional[bool] = False, id: Optional[str] = None
):
super().__init__(wires=Wires(wires), id=id)
self.reset = reset

@property
def return_type(self):
Expand Down
4 changes: 3 additions & 1 deletion pennylane/transforms/condition.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def cond(condition, true_fn, false_fn=None):
:func:`defer_measurements` transform.
Args:
condition (.MeasurementValue[bool]): a conditional expression involving a mid-circuit
condition (.MeasurementValue): a conditional expression involving a mid-circuit
measurement value (see :func:`.pennylane.measure`)
true_fn (callable): The quantum function of PennyLane operation to
apply if ``condition`` is ``True``
Expand Down Expand Up @@ -114,6 +114,8 @@ def qnode(x, y):
Expressions with boolean logic flow using operators like ``and``,
``or`` and ``not`` are not supported as the ``condition`` argument.
While such statements may not result in errors, they may result in
incorrect behaviour.
.. details::
:title: Usage Details
Expand Down
83 changes: 71 additions & 12 deletions pennylane/transforms/defer_measurements.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,15 @@
from pennylane.measurements import MidMeasureMP
from pennylane.ops.op_math import ctrl
from pennylane.queuing import apply
from pennylane.tape import QuantumTape
from pennylane.transforms import qfunc_transform
from pennylane.wires import Wires

# pylint: disable=too-many-branches


@qfunc_transform
def defer_measurements(tape):
def defer_measurements(tape: QuantumTape):
"""Quantum function transform that substitutes operations conditioned on
measurement outcomes to controlled operations.
Expand All @@ -40,6 +43,14 @@ def defer_measurements(tape):
that can be controlled as such depends on the set of operations
supported by the chosen device.
.. note::
Devices that inherit from :class:`~pennylane.QubitDevice` **must** be initialized
with an additional wire for each mid-circuit measurement after which the measured
wire is reused or reset for ``defer_measurements`` to transform the quantum tape
correctly. Hence, devices and quantum tapes must also be initialized without custom
wire labels for correct behaviour.
.. note::
This transform does not change the list of terminal measurements returned by
Expand All @@ -54,7 +65,7 @@ def defer_measurements(tape):
post-measurement states are considered.
Args:
qfunc (function): a quantum function
tape (.QuantumTape): a quantum tape
**Example**
Expand Down Expand Up @@ -84,34 +95,82 @@ def qfunc(par):
>>> qml.grad(qnode)(par)
tensor(-0.49622252, requires_grad=True)
Reusing and reseting measured wires will work as expected with the
``defer_measurements`` transform:
.. code-block:: python3
dev = qml.device("default.qubit", wires=3)
@qml.qnode(dev)
def func(x, y):
qml.RY(x, wires=0)
qml.CNOT(wires=[0, 1])
m_0 = qml.measure(1, reset=True)
qml.cond(m_0, qml.RY)(y, wires=0)
qml.RX(np.pi/4, wires=1)
return qml.probs(wires=[0, 1])
Executing this QNode:
>>> pars = np.array([0.643, 0.246], requires_grad=True)
>>> func(*pars)
tensor([0.76960924, 0.13204407, 0.08394415, 0.01440254], requires_grad=True)
"""
measured_wires = {}

cv_types = (qml.operation.CVOperation, qml.operation.CVObservable)
ops_cv = any(isinstance(op, cv_types) for op in tape.operations)
obs_cv = any(isinstance(getattr(op, "obs", None), cv_types) for op in tape.measurements)
if ops_cv or obs_cv:
raise ValueError("Continuous variable operations and observables are not supported.")

for op in tape:
op_wires_measured = set(wire for wire in op.wires if wire in measured_wires.values())
if len(op_wires_measured) > 0:
raise ValueError(
f"Cannot apply operations on {op.wires} as the following wires have been measured already: {op_wires_measured}."
# Find wires that are reused after measurement
measured_wires = set()
reused_measurement_wires = set()

for op in tape.operations:
if isinstance(op, MidMeasureMP):
if op.wires[0] in measured_wires or op.reset is True:
reused_measurement_wires.add(op.wires[0])
measured_wires.add(op.wires[0])

else:
reused_measurement_wires = reused_measurement_wires.union(
measured_wires.intersection(op.wires.toset())
)

# Apply controlled operations to store measurement outcomes and replace
# classically controlled operations
control_wires = {}
cur_wire = max(tape.wires) + 1

for op in tape:
if isinstance(op, MidMeasureMP):
measured_wires[op.id] = op.wires[0]
# Only store measurement outcome in new wire if wire gets reused
if op.wires[0] in reused_measurement_wires:
control_wires[op.id] = cur_wire

qml.CNOT([op.wires[0], cur_wire])
if op.reset:
qml.CNOT([cur_wire, op.wires[0]])

cur_wire += 1
else:
control_wires[op.id] = op.wires[0]

elif op.__class__.__name__ == "Conditional":
_add_control_gate(op, measured_wires)
_add_control_gate(op, control_wires)
else:
apply(op)

return tape._qfunc_output # pylint: disable=protected-access


def _add_control_gate(op, measured_wires):
def _add_control_gate(op, control_wires):
"""Helper function to add control gates"""
control = [measured_wires[m.id] for m in op.meas_val.measurements]
control = [control_wires[m.id] for m in op.meas_val.measurements]
for branch, value in op.meas_val._items(): # pylint: disable=protected-access
if value:
ctrl(
Expand Down
6 changes: 4 additions & 2 deletions tests/devices/qubit/test_preprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ def test_expand_fn_expand_unsupported_op(self, shots):
# pylint: disable=no-member
def test_expand_fn_defer_measurement(self):
"""Test that expand_fn defers mid-circuit measurements."""
mp = MidMeasureMP(wires=[0], id="test_id")
mp = MidMeasureMP(wires=[0], reset=True, id="test_id")
mv = MeasurementValue([mp], processing_fn=lambda v: v)
ops = [
qml.Hadamard(0),
Expand All @@ -230,7 +230,9 @@ def test_expand_fn_defer_measurement(self):
expanded_tape = expand_fn(tape)
expected = [
qml.Hadamard(0),
qml.ops.Controlled(qml.RX(0.123, wires=1), 0),
qml.CNOT([0, 2]),
qml.CNOT([2, 0]),
qml.ops.Controlled(qml.RX(0.123, wires=1), 2),
]

for op, exp in zip(expanded_tape, expected + measurements):
Expand Down
16 changes: 0 additions & 16 deletions tests/drawer/test_drawable_layers.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,23 +173,7 @@ def test_empty_layers_are_pruned(self):
layers = drawable_layers(ops, wire_map={i: i for i in range(3)})
assert layers == [[ops[1]], [ops[2], ops[0]], [ops[3]]]

def test_cannot_reuse_wire_after_conditional(self):
"""Tests that a wire cannot be re-used after using a mid-circuit measurement."""
with AnnotatedQueue() as q:
m0 = qml.measure(0)
qml.cond(m0, qml.PauliX)(1)
qml.Hadamard(0)

with pytest.raises(ValueError, match="some wires have been measured already"):
drawable_layers(q.queue)

def test_cannot_draw_multi_wire_MidMeasureMP(self):
"""Tests that MidMeasureMP is only supported with one wire."""
with pytest.raises(ValueError, match="mid-circuit measurements with more than one wire."):
drawable_layers([MidMeasureMP([0, 1])])

def test_cannot_use_measured_wire(self):
"""Tests error is raised when trying to use a measured wire."""
ops = [MidMeasureMP([0]), qml.PauliX(0)]
with pytest.raises(ValueError, match="some wires have been measured already"):
drawable_layers(ops)
Loading

0 comments on commit be987a8

Please sign in to comment.