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

Stable BSgate #248

Merged
merged 21 commits into from Jun 20, 2023
Merged

Stable BSgate #248

merged 21 commits into from Jun 20, 2023

Conversation

ziofil
Copy link
Collaborator

@ziofil ziofil commented Jun 9, 2023

Context:
BSgate is unstable for high Fock cutoff.

Description of the Change:
Implements an alternative method to calculate the BS and exposes it like so:

bs = BSgate(1.0,2.0)
bs.U(cutoffs=[10,10], method='schwinger') # or 'vanilla' (default)

Benefits:
Slower but stable method to compute the BS Fock amplitudes to any cutoff

@codecov
Copy link

codecov bot commented Jun 9, 2023

Codecov Report

Merging #248 (10c5108) into develop (ebbdd3c) will increase coverage by 0.13%.
The diff coverage is 85.93%.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop     #248      +/-   ##
===========================================
+ Coverage    77.41%   77.54%   +0.13%     
===========================================
  Files           53       53              
  Lines         4325     4369      +44     
===========================================
+ Hits          3348     3388      +40     
- Misses         977      981       +4     
Impacted Files Coverage Δ
mrmustard/math/lattice/strategies/squeezer.py 100.00% <ø> (ø)
mrmustard/lab/abstract/transformation.py 86.07% <69.23%> (-0.60%) ⬇️
mrmustard/lab/gates.py 97.41% <84.00%> (-1.66%) ⬇️
mrmustard/physics/fock.py 91.81% <88.88%> (+0.08%) ⬆️
mrmustard/__init__.py 97.05% <100.00%> (+0.04%) ⬆️
mrmustard/math/lattice/strategies/beamsplitter.py 100.00% <100.00%> (ø)

... and 1 file with indirect coverage changes


Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update ebbdd3c...10c5108. Read the comment docs.

Copy link
Contributor

@ryk-wolf ryk-wolf left a comment

Choose a reason for hiding this comment

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

Amazing new stuff!
Just a few details on the docs

mrmustard/lab/abstract/transformation.py Outdated Show resolved Hide resolved
mrmustard/lab/abstract/transformation.py Outdated Show resolved Hide resolved
mrmustard/physics/fock.py Outdated Show resolved Hide resolved
mrmustard/physics/fock.py Show resolved Hide resolved
tests/test_lab/test_gates_fock.py Outdated Show resolved Hide resolved
mrmustard/lab/gates.py Show resolved Hide resolved
mrmustard/lab/gates.py Show resolved Hide resolved
mrmustard/lab/gates.py Show resolved Hide resolved
@sylviemonet
Copy link
Contributor

Note: we need another PR to fix the shape or cutoffs things as well.

mrmustard/lab/abstract/transformation.py Outdated Show resolved Hide resolved
mrmustard/lab/abstract/transformation.py Outdated Show resolved Hide resolved
mrmustard/lab/abstract/transformation.py Outdated Show resolved Hide resolved
mrmustard/lab/gates.py Outdated Show resolved Hide resolved
mrmustard/lab/gates.py Show resolved Hide resolved
mrmustard/physics/fock.py Outdated Show resolved Hide resolved
tests/test_lab/test_gates_fock.py Outdated Show resolved Hide resolved
tests/test_lab/test_gates_fock.py Outdated Show resolved Hide resolved
tests/test_lab/test_gates_fock.py Show resolved Hide resolved
tests/test_lab/test_gates_fock.py Show resolved Hide resolved
ziofil and others added 13 commits June 14, 2023 10:28
Co-authored-by: Ryk <47638463+ryk-wolf@users.noreply.github.com>
Co-authored-by: Ryk <47638463+ryk-wolf@users.noreply.github.com>
Co-authored-by: Ryk <47638463+ryk-wolf@users.noreply.github.com>
Co-authored-by: Ryk <47638463+ryk-wolf@users.noreply.github.com>
Co-authored-by: Ryk <47638463+ryk-wolf@users.noreply.github.com>
Co-authored-by: Ryk <47638463+ryk-wolf@users.noreply.github.com>
@ziofil ziofil merged commit c84ee68 into develop Jun 20, 2023
6 checks passed
@ziofil ziofil deleted the stable_BSgate branch June 20, 2023 16:51
@ziofil ziofil mentioned this pull request Jul 26, 2023
ziofil added a commit that referenced this pull request Jul 26, 2023
# Release 0.5.0

### New features

* Optimization callback functionalities has been improved. A dedicated
`Callback` class is added which
is able to access the optimizer, the cost function, the parameters as
well as gradients, during the
optimization. In addition, multiple callbacks can be specified. This
opens up the endless possiblities
of customizing the the optimization progress with schedulers, trackers,
heuristics, tricks, etc.
  [(#219)](#219)

* Tensorboard-based optimization tracking is added as a builtin
`Callback` class: `TensorboardCallback`.
It can automatically track costs as well as all trainable parameters
during optimization in realtime.
  Tensorboard can be most conveniently viewed from VScode.
  [(#219)](#219)

  ```python
  import numpy as np
  from mrmustard.training import Optimizer, TensorboardCallback

  def cost_fn():
      ...
  
  def as_dB(cost):
      delta = np.sqrt(np.log(1 / (abs(cost) ** 2)) / (2 * np.pi))
      cost_dB = -10 * np.log10(delta**2)
      return cost_dB

  tb_cb = TensorboardCallback(cost_converter=as_dB, track_grads=True)

  opt = Optimizer(euclidean_lr = 0.001);
opt.minimize(cost_fn, max_steps=200, by_optimizing=[...],
callbacks=tb_cb)

# Logs will be stored in `tb_cb.logdir` which defaults to
`./tb_logdir/...` but can be customized.
# VScode can be used to open the Tensorboard frontend for live
monitoring.
# Or, in command line: `tensorboard --logdir={tb_cb.logdir}` and open
link in browser.
  ```

* Gaussian states support a `bargmann` method for returning the bargmann
representation.
  [(#235)](#235)

* The `ket` method of `State` now supports new keyword arguments
`max_prob` and `max_photons`.
Use them to speed-up the filling of a ket array up to a certain
probability or *total* photon number.
  [(#235)](#235)

  ```python
  from mrmustard.lab import Gaussian

# Fills the ket array up to 99% probability or up to the |0,3>, |1,2>,
|2,1>, |3,0> subspace, whichever is reached first.
# The array has the autocutoff shape, unless the cutoffs are specified
explicitly.
  ket = Gaussian(2).ket(max_prob=0.99, max_photons=3)
  ```

* Gaussian transformations support a `bargmann` method for returning the
bargmann representation.
  [(#239)](#239)

* BSGate.U now supports method='vanilla' (default) and 'schwinger'
(slower, but stable to any cutoff)
  [(#248)](#248)

### Breaking Changes

* The previous `callback` argument to `Optimizer.minimize` is now
`callbacks` since we can now pass
  multiple callbacks to it.
  [(#219)](#219)

* The `opt_history` attribute of `Optimizer` does not have the
placeholder at the beginning anymore.
  [(#235)](#235)

### Improvements

* The math module now has a submodule `lattice` for constructing
recurrence relation strategies in the Fock lattice.
There are a few predefined strategies in
`mrmustard.math.lattice.strategies`.
  [(#235)](#235)

* Gradients in the Fock lattice are now computed using the
vector-jacobian product.
This saves a lot of memory and speeds up the optimization process by
roughly 4x.
  [(#235)](#235)

* Tests of the compact_fock module now use hypothesis.
  [(#235)](#235)

* Faster implementation of the fock representation of `BSgate`, `Sgate`
and `SqueezedVacuum`, ranging from 5x to 50x.
  [(#239)](#239)

* More robust implementation of cutoffs for States.
[(#239)](#239)

* Dependencies and versioning are now managed using Poetry.
[(#257)](#257)

### Bug fixes

* Fixed a bug that would make two progress bars appear during an
optimization
  [(#235)](#235)

* The displacement of the dual of an operation had the wrong sign
  [(#239)](#239)

* When projecting a Gaussian state onto a Fock state, the upper limit of
the autocutoff now respect the Fock projection.
  [(#246)](#246)

* Fixed a bug for the algorithms that allow faster PNR sampling from
Gaussian circuits using density matrices. When the
cutoff of the first detector is equal to 1, the resulting density matrix
is now correct.

### Documentation

### Contributors
[Filippo Miatto](https://github.com/ziofil), [Zeyue
Niu](https://github.com/zeyueN),
[Robbe De Prins](https://github.com/rdprins), [Gabriele
Gullì](https://github.com/ggulli),
[Richard A. Wolf](https://github.com/ryk-wolf)
@ziofil ziofil mentioned this pull request Jul 26, 2023
sduquemesa added a commit that referenced this pull request Jul 27, 2023
# Release 0.5.0

### New features

* Optimization callback functionalities has been improved. A dedicated
`Callback` class is added which
is able to access the optimizer, the cost function, the parameters as
well as gradients, during the
optimization. In addition, multiple callbacks can be specified. This
opens up the endless possiblities
of customizing the the optimization progress with schedulers, trackers,
heuristics, tricks, etc.
  [(#219)](#219)

* Tensorboard-based optimization tracking is added as a builtin
`Callback` class: `TensorboardCallback`.
It can automatically track costs as well as all trainable parameters
during optimization in realtime.
  Tensorboard can be most conveniently viewed from VScode.
  [(#219)](#219)

  ```python
  import numpy as np
  from mrmustard.training import Optimizer, TensorboardCallback

  def cost_fn():
      ...
  
  def as_dB(cost):
      delta = np.sqrt(np.log(1 / (abs(cost) ** 2)) / (2 * np.pi))
      cost_dB = -10 * np.log10(delta**2)
      return cost_dB

  tb_cb = TensorboardCallback(cost_converter=as_dB, track_grads=True)

  opt = Optimizer(euclidean_lr = 0.001);
opt.minimize(cost_fn, max_steps=200, by_optimizing=[...],
callbacks=tb_cb)

# Logs will be stored in `tb_cb.logdir` which defaults to
`./tb_logdir/...` but can be customized.
# VScode can be used to open the Tensorboard frontend for live
monitoring.
# Or, in command line: `tensorboard --logdir={tb_cb.logdir}` and open
link in browser.
  ```

* Gaussian states support a `bargmann` method for returning the bargmann
representation.
  [(#235)](#235)

* The `ket` method of `State` now supports new keyword arguments
`max_prob` and `max_photons`.
Use them to speed-up the filling of a ket array up to a certain
probability or *total* photon number.
  [(#235)](#235)

  ```python
  from mrmustard.lab import Gaussian

# Fills the ket array up to 99% probability or up to the |0,3>, |1,2>,
|2,1>, |3,0> subspace, whichever is reached first.
# The array has the autocutoff shape, unless the cutoffs are specified
explicitly.
  ket = Gaussian(2).ket(max_prob=0.99, max_photons=3)
  ```

* Gaussian transformations support a `bargmann` method for returning the
bargmann representation.
  [(#239)](#239)

* BSGate.U now supports method='vanilla' (default) and 'schwinger'
(slower, but stable to any cutoff)
  [(#248)](#248)

### Breaking Changes

* The previous `callback` argument to `Optimizer.minimize` is now
`callbacks` since we can now pass
  multiple callbacks to it.
  [(#219)](#219)

* The `opt_history` attribute of `Optimizer` does not have the
placeholder at the beginning anymore.
  [(#235)](#235)

### Improvements

* The math module now has a submodule `lattice` for constructing
recurrence relation strategies in the Fock lattice.
There are a few predefined strategies in
`mrmustard.math.lattice.strategies`.
  [(#235)](#235)

* Gradients in the Fock lattice are now computed using the
vector-jacobian product.
This saves a lot of memory and speeds up the optimization process by
roughly 4x.
  [(#235)](#235)

* Tests of the compact_fock module now use hypothesis.
  [(#235)](#235)

* Faster implementation of the fock representation of `BSgate`, `Sgate`
and `SqueezedVacuum`, ranging from 5x to 50x.
  [(#239)](#239)

* More robust implementation of cutoffs for States.
[(#239)](#239)

* Dependencies and versioning are now managed using Poetry.
[(#257)](#257)

### Bug fixes

* Fixed a bug that would make two progress bars appear during an
optimization
  [(#235)](#235)

* The displacement of the dual of an operation had the wrong sign
  [(#239)](#239)

* When projecting a Gaussian state onto a Fock state, the upper limit of
the autocutoff now respect the Fock projection.
  [(#246)](#246)

* Fixed a bug for the algorithms that allow faster PNR sampling from
Gaussian circuits using density matrices. When the
cutoff of the first detector is equal to 1, the resulting density matrix
is now correct.

### Documentation

### Contributors
[Filippo Miatto](https://github.com/ziofil), [Zeyue
Niu](https://github.com/zeyueN),
[Robbe De Prins](https://github.com/rdprins), [Gabriele
Gullì](https://github.com/ggulli),
[Richard A. Wolf](https://github.com/ryk-wolf)

---------

Co-authored-by: Sebastián Duque Mesa <675763+sduquemesa@users.noreply.github.com>
Co-authored-by: JacobHast <jacobhastrup@gmail.com>
Co-authored-by: elib20 <53090166+elib20@users.noreply.github.com>
Co-authored-by: Luke Helt <31250931+heltluke@users.noreply.github.com>
Co-authored-by: zeyueN <48225584+zeyueN@users.noreply.github.com>
Co-authored-by: Robbe De Prins <52749580+rdprins@users.noreply.github.com>
Co-authored-by: Robbe De Prins (UGent-imec) <Robbe.DePrins@UGent.be>
Co-authored-by: Yuan <16817699+sylviemonet@users.noreply.github.com>
Co-authored-by: Ryk <47638463+ryk-wolf@users.noreply.github.com>
Co-authored-by: Gabriele Gullì <120967042+ggulli@users.noreply.github.com>
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.

None yet

3 participants