Skip to main content

A package for the design and study of linear optical quantum systems.

Project description

QOptCraft

documentation License: Apache 2.0 Ruff black

A Python package for the design and study of linear optical quantum systems.

Documentation

Documentation and examples can be found here.

Installation

Create and activate a new conda environment

conda create --name test python==3.11
conda activate test

Clone the repository

git clone -b optimized https://github.tel.uva.es/juagar/qoptcraft.git

Install with pip:

pip install git+https://github.tel.uva.es/juagar/qoptcraft.git@optimized

Quick usage

Clemens and Reck decompositions

We can decompose any unitary into beamsplitters and phase shifters:

from qoptcraft.optical_elements import clemens_decomposition, reck_decomposition
from qoptcraft.operators import haar_random_unitary

modes = 4
unitary = haar_random_unitary(modes)
left, diag, right = clemens_decomposition(unitary)
diag, right = reck_decomposition(unitary)

Basis

We can get easily get the basis of the unitary algebra

from qoptcraft.basis import get_algebra_basis

modes = 2
photons = 3
basis_algebra, basis_image_algebra = get_algebra_basis(modes, photons)

or the Fock state basis of the Hilbert space

from qoptcraft.basis import get_photon_basis, hilbert_dim

photon_basis = get_photon_basis(modes, photons)
dimension = hilbert_dim(modes, photons)  # should equal len(photon_basis)

States

We can create pure quantum states by summing Fock states:

from math import sqrt

from qoptcraft.state import Fock

in_fock = Fock(1, 1, 0, 0)
bell_state = 1 / sqrt(2) * Fock(1, 0, 1, 0) + 1 / sqrt(2) * Fock(0, 1, 0, 1)

Invariants

To check if transitions between quantum states are forbidden by a linear optical transformation, we simply run

from qoptcraft.invariant import forbidden_transition, photon_invariant

forbidden_transition(in_fock, bell_state, method="reduced")
>>> True

The invariant can be calculated from density matrices (calculations use the basis of the algebra) To check if transitions between quantum states are forbidden by a linear optical transformation, we simply run

from qoptcraft.state import MixedState
from qoptcraft.invariant import forbidden_transition, photon_invariant

mixed_state = MixedState.from_mixture(pure_states=[in_fock, bell_state], probs=[0.5, 0.5])
forbidden_transition(mixed_state, bell_state, method="basis")
>>> True

Quantizing linear interferomenters

We can easily compute the unitary matrix associated with a linear interferometer S and a certain number of photons. There are four different methods to compute the unitary: 'heisenberg', 'hamiltonian', 'permanent glynn' and 'permanent ryser'.

from qoptcraft.operators import haar_random_unitary
from qoptcraft.evolution import photon_unitary

modes = 2
photons = 3
interferometer = haar_random_unitary(modes)
unitary_heisenberg = photon_unitary(interferometer, photons, method="heisenberg")
unitary_hamiltonian = photon_unitary(interferometer, photons, method="hamiltonian")
unitary_glynn = photon_unitary(interferometer, photons, method="permanent glynn")
unitary_ryser = photon_unitary(interferometer, photons, method="permanent ryser")

We can apply this function to a 50:50 beamsplitter to recover the Hong-Ou-Mandel matrix

from numpy import pi as PI
from qoptcraft.optical_elements import beam_splitter

bs_matrix = beam_splitter(angle=PI/4, shift=0, dim=2, mode_1=0, mode_2=1, convention="clemens")
hong_ou_mandel = photon_unitary(bs_matrix, photons=3, method="heisenberg")

Retrieve the linear optical scattering matrix from the quantized unitary

If a given unitary matrix comes from a linear optical scattering matrix, we can retrieve it

from qoptcraft import haar_random_unitary, photon_unitary, scattering_from_unitary

modes = 3
photons = 2
S = haar_random_unitary(modes)
U = photon_unitary(S, photons)
S_rebuilt = scattering_from_unitary(U, modes, photons)

If this scattering matrix doesn't exist, it will raise an InconsistentEquations error.

Approximating a unitary with linear optics (Topogonov)

from qoptcraft.operators import qft
from qoptcraft.topogonov import topogonov

modes = 3
photons = 2
unitary = qft(6)
approx_unitary, error = topogonov(unitary, modes, photons)

Citing

QOptCraft is the work of Daniel Gómez Aguado (gomezaguado99@gmail.com) and Pablo V. Parellada (pablo.veganzones@uva.es).

If you are doing research using qoptcraft, please cite our paper:

Daniel Gómez Aguado et al. qoptcraft: A Python package for the design and study of linear optical quantum systems. 2023. https://doi.org/10.1016/j.cpc.2022.108511

References

[1] W. R. Clements, P. C. Humphreys, B. J. Metcalf, W. S. Kolthammer, and I. A. Walsmley, ”Optimal Design for Universal Multiport Interferometers”, Optica 3, 1460 (2016).

[2] J. Skaar, J. C. García Escartín, and H. Landro, ”Quantum mechanical description of linear optic”, American Journal of Physics 72, 1385 (2004).

[3] S. Scheel, ”Permanents in linear optics network”, Acta Physica Slovaca 58, 675 (2008).

[4] ”Permanents and Ryser’s algorithm”, numbersandshapes.net.

[5] J. C. García Escartín, V. Gimeno, and J. J. Moyano-Fernández, ”Multiple photon effective Hamiltonians in linear quantum optical networks”, Optics Communications 430 (2019) 434–439.

[6] J. C. García Escartín, V. Gimeno, and J. J. Moyano Fernández, ”A method to determine which quantum operations can be realized with linear optics with a constructive implementation recipe”, Physical Review A 100, 022301 (2019).

[7] J. C. García Escartín and J. J. Moyano Fernández, ”Optimal approximation to unitary quantum operators with linear optics”, arXiv:2011.15048v1 [quant-ph].

[8] N. Tischler, C. Rockstuhl, and K. Slowik, ”Quantum Optical Realization of Arbitrary Linear Transformations Allowing for Loss and Gain”, Physical Review X 8, 021017 (2018).

[9] T. A. Loring, ”Computing a logarithm of a unitary matrix with general spectrum”, Numerical Linear Algebra wth Applications, 21 (6) 744–760 (2014).

Contributing

We appreciate and welcome contributions. For major changes, please open an issue first to discuss what you would like to change. Also, make sure to update tests as appropriate.

If you are new to contributing to open source, this guide helps explain why, what, and how to get involved.

License

This software is under the Apache License 2.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qoptcraft-2.0.0.tar.gz (89.0 kB view details)

Uploaded Source

Built Distribution

qoptcraft-2.0.0-py3-none-any.whl (153.6 kB view details)

Uploaded Python 3

File details

Details for the file qoptcraft-2.0.0.tar.gz.

File metadata

  • Download URL: qoptcraft-2.0.0.tar.gz
  • Upload date:
  • Size: 89.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.3

File hashes

Hashes for qoptcraft-2.0.0.tar.gz
Algorithm Hash digest
SHA256 74ea345394898cb43bf70905ae350d45b1e51e94a0d1e3548fb2d5e532c8b548
MD5 bc2468f8b8a701a805d8c2bae89bb06b
BLAKE2b-256 9e1a205e5b7aa1e7f8a3efe1af130c61441a9cf952915f8e11f4cbd2457392cf

See more details on using hashes here.

File details

Details for the file qoptcraft-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: qoptcraft-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 153.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.3

File hashes

Hashes for qoptcraft-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5bb7d7c054f3fbfb5c4ba98e70c00cd127d45fd822c81a0a4920fcdda17dc0c5
MD5 5e4970d0afebe08cdc2f359ec88e7376
BLAKE2b-256 a44ffdaf68402883c4684be7b562f5583a9f5e5ae6e8546ff378c21ffb18599e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page