Source code for spheres.spin_circuits.strawberryfields

"""
StrawberryFields circuits for preparing spin-j states.
"""

from ..stars.pure import *
from ..oscillators import *
from ..symplectic import *

import strawberryfields as sf
from strawberryfields.ops import *

import scipy as sc

[docs]def spin_osc_strawberryfields(spin): """ Returns a StrawberryFields circuit that prepares a given spin-j state as a state of two photonic oscillator modes. Parameters ---------- spin : qt.Qobj Spin-j state. Returns ------- prog : sf.Program StrawberryFields circuit. """ j = (spin.shape[0]-1)/2 n_modes = 2*int(2*j) sph = [np.array([theta_phi[0]/2, theta_phi[1]]) for theta_phi in spin_sph(spin)] prog = sf.Program(n_modes) with prog.context as q: for i in range(0, n_modes-1, 2): Fock(1) | q[i] theta, phi = sph[int(i/2)] BSgate(theta, phi) | (q[i], q[i+1]) for i in range(2, n_modes-1, 2): BSgate() | (q[0], q[i]) BSgate() | (q[1], q[i+1]) for i in range(2, n_modes): MeasureFock(select=0) | q[i] return prog
[docs]def spinj_xyz_strawberryfields(state, on_modes=[0,1], XYZ=None): """ Returns XYZ expectation values of a spin encoded in two oscillator modes. Parameters ---------- state : strawberryfields.state on_modes : list Two modes encoding the spin, e.g., [0,1]. XYZ : dict XYZ operators as real symplectic matrices. Constructed if not provided. Returns ------- xyz : np.array XYZ expectation values. """ XYZ = XYZ if XYZ else symplectic_xyz() XYZ = dict([(o, upgrade_two_mode_operator(O, on_modes[0], on_modes[1], state.num_modes)) for o, O in XYZ.items()]) return np.array([state.poly_quad_expectation(XYZ["x"])[0],\ state.poly_quad_expectation(XYZ["y"])[0],\ state.poly_quad_expectation(XYZ["z"])[0]]).real