Source code for pennylane_sf.gaussian
# Copyright 2018-2020 Xanadu Quantum Technologies Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#     http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Strawberry Fields Gaussian device
=================================
**Module name:** :mod:`pennylane_sf.gaussian`
.. currentmodule:: pennylane_sf.gaussian
The Strawberry Fields Gaussian plugin implements all the :class:`~pennylane.device.Device` methods,
and provides a Gaussian simulation of a continuous-variable quantum circuit.
Classes
-------
.. autosummary::
   StrawberryFieldsGaussian
Code details
~~~~~~~~~~~~
"""
import numpy as np
import strawberryfields as sf
# import state preparations
from strawberryfields.ops import Coherent, DisplacedSqueezed, Squeezed, Thermal, Gaussian
# import gates
from strawberryfields.ops import (
    BSgate,
    CXgate,
    CZgate,
    Dgate,
    Pgate,
    Rgate,
    S2gate,
    Sgate,
    Interferometer,
)
from .expectations import identity, mean_photon, number_expectation, homodyne, fock_state, poly_xp
from .simulator import StrawberryFieldsSimulator
[docs]class StrawberryFieldsGaussian(StrawberryFieldsSimulator):
    r"""StrawberryFields Gaussian device for PennyLane.
    Args:
        wires (int, Iterable[Number, str]]): Number of subsystems accessible on the device,
            or iterable that contains unique labels for the subsystems as numbers (i.e., ``[-1, 0, 2]``)
            or strings (``['ancilla', 'q1', 'q2']``).
        shots (int): Number of circuit evaluations/random samples used
            to estimate expectation values of observables. If ``None``,
            the device calculates probability, expectation values, and variances analytically.
        cutoff_dim (int): Fock-space truncation dimension
        hbar (float): the convention chosen in the canonical commutation
            relation :math:`[x, p] = i \hbar`
    """
    name = "Strawberry Fields Gaussian PennyLane plugin"
    short_name = "strawberryfields.gaussian"
    _operation_map = {
        "CoherentState": Coherent,
        "DisplacedSqueezedState": DisplacedSqueezed,
        "SqueezedState": Squeezed,
        "ThermalState": Thermal,
        "GaussianState": Gaussian,
        "Beamsplitter": BSgate,
        "ControlledAddition": CXgate,
        "ControlledPhase": CZgate,
        "Displacement": Dgate,
        "QuadraticPhase": Pgate,
        "Rotation": Rgate,
        "TwoModeSqueezing": S2gate,
        "Squeezing": Sgate,
        "InterferometerUnitary": Interferometer,
    }
    _observable_map = {
        "NumberOperator": mean_photon,
        "TensorN": number_expectation,
        "X": homodyne(0),
        "P": homodyne(np.pi / 2),
        "QuadOperator": homodyne(),
        "PolyXP": poly_xp,
        "FockStateProjector": fock_state,
        "Identity": identity,
    }
    _circuits = {}
    def __init__(self, wires, *, shots=None, cutoff_dim=10, hbar=2):
        super().__init__(wires, shots=shots, hbar=hbar)
        self.cutoff = cutoff_dim
[docs]    def pre_measure(self):
        self.eng = sf.Engine("gaussian")
        results = self.eng.run(self.prog)
        self.state = results.state
        self.samples = results.samples
_modules/pennylane_sf/gaussian
                Download Python script
                Download Notebook
                View on GitHub