def prog():
    """Program used for testing"""
    program = sf.Program(2)

    with program.context as q:
        Sgate(0.54, 0) | q[0]
        Sgate(0.54, 0) | q[1]
        BSgate(6.283, 0.6283) | (q[0], q[1])
        MeasureFock() | q

    return program
Esempio n. 2
0
    def test_pre_measure_state_and_samples_non_analytic(self, tol):
        """Test that the pre_measure method operates as expected in non-analytic mode by
        generating the correct output state and samples of the right shape"""
        dev = qml.device("strawberryfields.gbs", wires=4, cutoff_dim=3, shots=2)
        prog = Program(4)
        op1 = GraphEmbed(0.1767767 * np.ones((4, 4)), mean_photon_per_mode=0.25)
        op2 = MeasureFock()
        prog.append(op1, prog.register)
        prog.append(op2, prog.register)
        dev.prog = prog
        dev.pre_measure()

        assert np.allclose(dev.state.displacement(), np.zeros(4))
        assert np.allclose(dev.state.cov(), target_cov, atol=tol)
        assert dev.samples.shape == (2, 4)
Esempio n. 3
0
 def test_pre_measure_non_analytic_cache(self, mocker):
     """Test that the pre_measure method does not overwrite existing samples if present in
     non-analytic mode when use_cache is ``True``"""
     samples = -1 * np.ones((10, 4))
     dev = qml.device(
         "strawberryfields.gbs",
         wires=4,
         cutoff_dim=3,
         shots=10,
         samples=samples,
         use_cache=True,
     )
     prog = Program(4)
     op1 = GraphEmbed(0.1767767 * np.ones((4, 4)), mean_photon_per_mode=0.25)
     op2 = MeasureFock()
     prog.append(op1, prog.register)
     prog.append(op2, prog.register)
     dev.prog = prog
     dev.pre_measure()
     spy = mocker.spy(sf.Engine, "run")
     assert np.allclose(dev.samples, samples)
     spy.assert_not_called()
Esempio n. 4
0
    def apply(self, operation, wires, par):
        self._params, A, n_mean = par
        A *= rescale(A, n_mean)
        self.Z_inv = self._calculate_z_inv(A)

        if len(self._params) != self.num_wires:
            raise ValueError(
                "The number of variable parameters must be equal to the total number of wires."
            )

        self._WAW = self.calculate_WAW(self._params, A)

        if self.shots is not None and self._use_cache:
            op = GraphEmbed(A, mean_photon_per_mode=n_mean / len(A))
        else:
            n_mean_WAW = self.calculate_n_mean(self._WAW)
            op = GraphEmbed(self._WAW, mean_photon_per_mode=n_mean_WAW / len(A))

        op | [self.q[wires.index(i)] for i in wires]

        if self.shots is not None:
            MeasureFock() | [self.q[wires.index(i)] for i in wires]
    device = eng.device

    # create a list of list of gate arguments for a GBS instance
    gate_args_list = borealis_gbs(device, modes=288, squeezing="high")

    # create a Strawberry Fields program
    delays = [1, 6, 36]
    vac_modes = sum(delays)
    n, N = get_mode_indices(delays)
    prog = sf.TDMProgram(N)
    with prog.context(*gate_args_list) as (p, q):
        Sgate(p[0]) | q[n[0]]
        for i in range(len(delays)):
            Rgate(p[2 * i + 1]) | q[n[i]]
            BSgate(p[2 * i + 2], np.pi / 2) | (q[n[i + 1]], q[n[i]])
        MeasureFock() | q[0]

    # define number of shots and submit job to hardware
    shots = 250_000
    results = eng.run(prog, shots=shots, crop=True)

    # the GBS samples
    samples = results.samples

    # plot the estimated simulation times of the experimental samples
    plot_simulation_time(samples)

    # obtain first and second moment of the photon-number distribution: mean photon
    # number and photon-number covariance
    mean_n = np.mean(samples, axis=(0, 1))
    cov_n = np.cov(samples[:, 0, :].T)