Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Internal modes #354

Open
wants to merge 149 commits into
base: master
Choose a base branch
from
Open

Internal modes #354

wants to merge 149 commits into from

Conversation

DavidSPhillips
Copy link
Collaborator

@DavidSPhillips DavidSPhillips commented Oct 26, 2022

Context:
Calculating probability distributions and density matrices for partially distinguishable squeezed states with multiple internal modes through an interferometer with PNR detection.

Currently in thewalrus we only have the ability to simulate interference between Gaussian states which are either indistinguishable or fully distinguishable, and with only one internal mode per spatial mode. There exists no framework to simulate partially distinguishable states or states with more than one internal mode per spatial mode (e.g. when we have multiple Schmidt modes). There are code repos that already simulate internal modes and partial distinguishability, two_squeezer_interference for two degenerate squeezers, and GKP_Multimode_Modelling for the simulation of GKP states from GBS devices, however both those approaches use a combinatorial approach and therefore are inherently slow.

Using the same orthonormalisation procedures as those two named repos, the additions to this repo employs a new algorithm called the 'Internal Modes Haffnian' which cuts out unnecessary calculations from the combinatorial approach, and thus speeds up the calculations.

Description of the Change:
Nearly all of the changes are confined to the new directory internal_modes within the main thewalrus directory, and is reasonably self-contained and well documented. The unit tests for these functions live in the test_internal_modes.py script in the tests directory, and should be comprehensive though pending a codecov check. The main functions which will be the most user-facing are: distinguishable_pnr_prob, density_matrix_single_mode, and pnr_prob. The remainder of the functions are support functions.

The only change in the main thewalrus section is the Takagi decomposition. There is a function called autonne which lives in the symplectic.py script, which performs a Takagi-Autonne decomposition of a symmetric matrix. There is also a function in strawberryfields called takagi which performs the same decomposition using a different (and arguably more robust) algorithm. This function has been added to thewalrus with some additions to make it even more robust. Additionally, both functions now live in the decompositions.py script, and given they have different names they coexist without any problems. This decomposition is needed for some functions in the internal_modes directory, and it's the takagi version of the function that’s used there. Tests for both decomposition functions now live in test_decompositions.py.

Benefits:

  • thewalrus now has the ability to simulate both multiple internal modes per spatial mode and partial distinguishability.

  • Significantly faster computation for the listed specific system compared to the combinatorial approach in other repos.

  • Ability to define the mode shape of the desired output mode (e.g. for homodyne detection).

  • All dependencies on strawberryfields removed for the entire thewalrus.

Possible Drawbacks:

  • No drawbacks to pre-existing code.

  • New code only applies for squeezed states without displacement.

  • For density matrix calculations we're restricted to post-selecting in one mode only (which is mandatory), and only a single internal mode is given (user can specify the basis function for this mode if they want).

  • For photon-number distributions, only the probability for a particular pattern is given, the user must loop over all desired combinations for full distribution.

Related GitHub Issues:
None

DavidSPhillips and others added 24 commits December 16, 2022 11:07
* Refactor sphinx config and bump docs python version (#364)

* fix [.readthedocs.yml] - increase python version

Fixes urllib3 v2.0 not supporting versions <1.1.1 of openSSL. See readthedocs/readthedocs.org#10290.

* fix [.readthedocs.yml] - set container image and python version

* unpin doc requirements

* Update decompositions.py and readds the Takagi decomposition (#363)

* Update decompositions.py

* New takagi

* New takagi

* Passes black

* Simplifies blochmessiah

* Simplifies blochmessiah

* Found a case that breaks Takagi

* Fixes all the tests

* Fixes issues found by the linter

* Adds extra test

* Adds extra test

* dummy

* dummy

* fix [.readthedocs.yml] - increase python version

Fixes urllib3 v2.0 not supporting versions <1.1.1 of openSSL. See readthedocs/readthedocs.org#10290.

* fix [.readthedocs.yml] - set container image and python version

* unpin doc requirements

* Revert "fix [.readthedocs.yml] - increase python version"

This reverts commit db0e8d7.

---------

Co-authored-by: Nicolas Quesada <[email protected]>
Co-authored-by: Sebastián Duque Mesa <[email protected]>

* Dummy commit

* Passes black

* linting

* Updates module summary

---------

Co-authored-by: Sebastián Duque Mesa <[email protected]>
Co-authored-by: Nicolas Quesada <[email protected]>
* First working version still lacks wrapper, tests

* Test pass

* Adds more tests

* Adds more tests

* Adds more tests

* Add clarification of docstring

* Adds doscstring

* Apply suggestions from code review

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

* passes black

* Apply suggestions from code review

* Add relative import

* Increase tolerance

* Increase tolerance

---------

Co-authored-by: Nicolas Quesada <[email protected]>
Co-authored-by: rachelchadwick <[email protected]>
* First commit

* Fixes bug

* removes unused import

* Working version

* Passes black

* removes unused function

* removes unused function

* Rachels code review (#385)

* Minor fixes

* passes black

* Fix test

* removes unused function

* test error is raised

* test error is raised

* Passes black

* Passes black

---------

Co-authored-by: Nicolas Quesada <[email protected]>
Co-authored-by: rachelchadwick <[email protected]>

* Now the non-recursive function do not produce warning (#386)

* Now the non-recursive function do not produce warning

* Now the non-recursive function do not produce warning

* Passes black

* Simplifies the diagonal method

* More tests, always

* More tests, always

* minor pylint improvements

* Adds extra test

* black

* minor simplification

* some tests pass

* some tests pass

* Moves the tests that take forever to the end of the test file

* Passes black

* Adds else

---------

Co-authored-by: Nicolas Quesada <[email protected]>

* Adds the warning (#388)

* Adds the warning

* passes black

* Apply suggestions from code review

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

* Update thewalrus/internal_modes/fock_density_matrices.py

---------

Co-authored-by: Nicolas Quesada <[email protected]>
Co-authored-by: rachelchadwick <[email protected]>

* Windows fix for numba types (#389)

* Fix numba types

* Passes black

* Apply suggestions from code review

* Apply suggestions from code review

* passes black

* Make lists tuples

* Check non-recursive

* Tests with high tolerances

* Run black

* Update test_density_matrix

* Minor changes

---------

Co-authored-by: Nicolas Quesada <[email protected]>
Co-authored-by: Nicolas Quesada <[email protected]>

* Apply suggestions from code review

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

* removes unnecesary import

* Squashed commit of the following:

commit 7c63905
Merge: 127a1a7 f935053
Author: Eli Bourassa <[email protected]>
Date:   Mon Apr 29 14:16:22 2024 -0400

    Merge branch 'master' into internal_modes

commit f935053
Author: Alberto Fumagalli <[email protected]>
Date:   Mon Apr 29 14:14:51 2024 -0400

    Add codecov token to test workflow (#390)

commit fe9e112
Author: Nicolas Quesada <[email protected]>
Date:   Wed Apr 10 15:31:34 2024 -0400

    Updates references (#384)

    * updates references

    * Updates biblio

    ---------

    Co-authored-by: Nicolas Quesada <[email protected]>

commit 25b5f08
Author: Nicolas Quesada <[email protected]>
Date:   Wed Feb 28 20:35:28 2024 -0500

    Implements the pre-Iwasawa and Iwasawa decompositions. (#382)

    * First working version

    * First working version

    * First working version

    * better tests

    * better tests

    * Finally correct

    * Finally correct

    * putting the traingles in the right places

    * Removes unnecesary T

    * More tests

    * More tests and spell correction

    * More tests and spell correction

    * Removes unnecesary complex number usage

    * Apply suggestions from code review

    Co-authored-by: Sebastián Duque Mesa <[email protected]>

    * Apply suggestions from code review

    Co-authored-by: Sebastián Duque Mesa <[email protected]>

    ---------

    Co-authored-by: Nicolas Quesada <[email protected]>
    Co-authored-by: Sebastián Duque Mesa <[email protected]>

commit 127a1a7
Merge: e6de063 8759363
Author: Nicolas Quesada <[email protected]>
Date:   Tue Feb 13 16:43:20 2024 -0500

    Merge branch 'master' into internal_modes

commit 8759363
Author: Nicolas Quesada <[email protected]>
Date:   Thu Feb 1 16:57:23 2024 -0500

    Better blochmessiah (#381)

    * Nicer BM

    * Updates changelog

    * Unnecesary import

    * More simplifications

    * More simplifications

    * one more

    * Updates docstring

    ---------

    Co-authored-by: Nicolas Quesada <[email protected]>

commit 6247fc8
Author: Nicolas Quesada <[email protected]>
Date:   Wed Jan 24 10:43:57 2024 -0500

    Updates docstring and simplifies Williamson (#380)

    Co-authored-by: Nicolas Quesada <[email protected]>

commit 0b1af63
Author: Sebastián Duque Mesa <[email protected]>
Date:   Thu Jan 11 17:09:32 2024 -0500

    Increment version number to `0.22.0-dev` (#379)

commit 544c457
Author: Sebastián Duque Mesa <[email protected]>
Date:   Wed Jan 10 16:52:38 2024 -0500

    bump version to `0.21.0` (#378)

commit 2268bf0
Author: Nicolas Quesada <[email protected]>
Date:   Thu Jan 4 11:12:27 2024 -0500

    Adds extra degenerate tests with nonvac nullspace (#377)

    * Adds extra degenerate tests with nonvac nullspace

    * updates changelog

    * updates changelog

    * updates changelog

    * Removes unnecesary comment

    * Still breaking something

    * Simplifications still work

    * Simplifications still work

    * Fixes bug

    ---------

    Co-authored-by: Nicolas Quesada <[email protected]>

commit 8ec2172
Author: Nicolas Quesada <[email protected]>
Date:   Wed Nov 29 15:53:11 2023 -0500

    Implements the Montrealer (#374)

    * Saving changes

    * Passes black

    * Passes black

    * Black

    * updates acknowledgements and changelog

    * updates acknowledgements and changelog

    * Adds montrealer

    * Adds Montrealer tests (#375)

    * Yanic the pirate

    * mtl test

    * mtl first tests

    * mtl test

    * test mtl

    * test montrealer

    * test montrealer

    * test Montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * tests montrealer

    * montrealer test

    * montrealer test

    * montrealer test

    * montrealer test

    * montrealer test

    * test montrealer

    * test montrealer

    * montrealer test

    * montrealer test

    * montrealer test

    * montrealer tests

    * montrealer tests

    * montrealer tests

    * montrealer tests

    * functions header update

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer ready for review

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer - failed tests

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * test montrealer

    * the rspms are now ordered

    * Passes black

    * garbage test file to be deleted later

    * minor changes

    * Done

    ---------

    Co-authored-by: Nicolas Quesada <[email protected]>

    * making bots happy

    * Apply suggestions from code review

    Co-authored-by: Sebastián Duque Mesa <[email protected]>

    * Apply suggestions from code review

    Co-authored-by: Sebastián Duque Mesa <[email protected]>

    * Apply suggestions from code review

    * Apply suggestions from code review

    Co-authored-by: Sebastián Duque Mesa <[email protected]>

    * Apply suggestions from code review

    Co-authored-by: Sebastián Duque Mesa <[email protected]>

    * Adds extra tests

    ---------

    Co-authored-by: Nicolas Quesada <[email protected]>
    Co-authored-by: Yanic Cardin <[email protected]>
    Co-authored-by: Sebastián Duque Mesa <[email protected]>

commit 0e163bf
Author: Nicolas Quesada <[email protected]>
Date:   Tue Aug 22 10:19:08 2023 -0400

    Update symplectic.py (#372)

    * Update decompositions.py

    * New takagi

    * New takagi

    * Passes black

    * Simplifies blochmessiah

    * Simplifies blochmessiah

    * Found a case that breaks Takagi

    * Fixes all the tests

    * Fixes issues found by the linter

    * Adds extra test

    * Adds extra test

    * dummy

    * dummy

    * Update symplectic.py

    Removes `autonne`

    * relocates test

    * trying to make pylint happy

    ---------

    Co-authored-by: Nicolas Quesada <[email protected]>

commit e999e49
Author: Nicolas Quesada <[email protected]>
Date:   Thu Aug 17 12:55:45 2023 -0400

    Better way to determine if a matrix is a phase times a real matrix (#373)

    * Add a better way to determine if a matrix is a phase times a real matrix and tests

    * CHANGELOG updates

    ---------

    Co-authored-by: Nicolas Quesada <[email protected]>

* Revert "Squashed commit of the following:"

This reverts commit 0f99b20.

---------

Co-authored-by: Nicolas Quesada <[email protected]>
Co-authored-by: rachelchadwick <[email protected]>
@timmysilv
Copy link
Collaborator

the cause of the segfault has been found! You cannot use asserts within numba.prange loop contexts as described in the second note of their docs on parallelization. Once I removed that line, I was told: Use of reduction variable 'haf_arr' other than in a supported reduction function is not permitted - updated the loop to not use it, and everything worked!

@nquesada
Copy link
Collaborator

Wow. That is crazy! Thanks so much!

for i in range(cutoff):
for j in range(i + 1):
if (i - j) % 2 == 0:
patt_long = (j,) + N_nums + ((i - j) // 2,)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.



@numba.jit(nopython=True)
def _haf_blocked_numba(A, blocks, repeats_p): # pragma: no cover
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants