[RFC] Python frontend for photonic simulator
Required prerequisites
- [X] Search the issue tracker to check if your feature has already been mentioned or rejected in other issues.
Describe the feature
-
Add support to use the photonics simulator with
photonics-cputarget from Python frontend of CUDA-Q -
Proposed API
-
Gates (same as those supported on C++ frontend):
-
plus(q: qudit) -> None, -
phase_shift(q: qudit, phi: float) -> None, -
beam_splitter(q: qudit, r: qudit, theta: float) -> None, -
mz(q: qudit) -> intandmz(q: list[qudit]) -> list[int]
-
-
Handler is inferred from the target
-
Custom handler must provide API for defining a
quditof level = N, for example,qudit(3) -
APIs
- Synchronous sampling:
cudaq.sample(*args, **kwargs) - State retrieval:
cudaq.get_state(*args, **kwargs)
- Synchronous sampling:
-
-
Example
import cudaq
cudaq.set_target("photonics-cpu")
@cudaq.kernel
def photonicsKernel():
qutrits = [qudit(3) for i in range(2)]
plus(qutrits[0])
plus(qutrits[1])
plus(qutrits[1])
mz(qutrits)
counts = cudaq.sample(photonicsKernel)
print(counts)
state = cudaq.get_state(photonicsKernel)
print(state)
For vis, @Omar-ORCA
For vis, @Omar-ORCA
LGTM
Updated the decorator as per inputs from @amccaskey
Let's have a quick sync on implementation to make sure we are not missing anything that will lead to some technical pain across the different scenarios in the future. We'll set something up for a larger group and once we have confirmation that works across the board, we can approve and move forward with it. Acknowledged that the API looks good - not we need to talk implementation. :)
The use of the plus gate in photonics circuits is not intuitive, changing it for the set of create and annihilate gates makes more sense.
The following changes will be needed:
Required prerequisites
- [x] Search the issue tracker to check if your feature has already been mentioned or rejected in other issues.
Describe the feature
- Add support to use the photonics simulator with
photonics-cputarget from Python frontend of CUDA-Q
- Add support to use the photonics simulator with
photonicstarget from Python frontend of CUDA-Q
Proposed API
Gates (same as those supported on C++ frontend):
plus(q: qudit) -> None,phase_shift(q: qudit, phi: float) -> None,beam_splitter(q: qudit, r: qudit, theta: float) -> None,mz(q: qudit) -> intandmz(q: list[qudit]) -> list[int]
-
create(q: qudit) -> None, -
annihilate(q: qudit) -> None, -
plus(q: qudit) -> None, (to be deprecated) -
phase_shift(q: qudit, phi: float) -> None, -
beam_splitter(q: qudit, r: qudit, theta: float) -> None, -
mz(q: qudit) -> intandmz(q: list[qudit]) -> list[int]
- Handler is inferred from the target> * Custom handler must provide API for defining a
quditof level = N, for example,qudit(3)
APIs
- Synchronous sampling:
cudaq.sample(*args, **kwargs)- State retrieval:
cudaq.get_state(*args, **kwargs)- Example
import cudaq cudaq.set_target("photonics-cpu") @cudaq.kernel def photonicsKernel(): qutrits = [qudit(3) for i in range(2)] plus(qutrits[0]) plus(qutrits[1]) plus(qutrits[1]) mz(qutrits) counts = cudaq.sample(photonicsKernel) print(counts) state = cudaq.get_state(photonicsKernel) print(state)
@cudaq.kernel
def photonicsKernel():
qutrits = [qudit(3) for i in range(2)]
create(qutrits[0])
create(qutrits[1])
create(qutrits[1])
mz(qutrits)
@boschmitt for visibility