def sample_gate(a: Qid, b: Qid, gate: FSimGate) -> PhasedFSimCharacterization: assert isinstance(gate, FSimGate), f'Expected FSimGate, got {gate}' assert np.isclose(gate.theta, np.pi / 4) and np.isclose( gate.phi, 0.0), f'Expected ISWAP ** -0.5 like gate, got {gate}' if (a, b) in parameters: pair_parameters = parameters[(a, b)] if not isinstance(pair_parameters, PhasedFSimCharacterization): pair_parameters = PhasedFSimCharacterization( **pair_parameters) elif (b, a) in parameters: pair_parameters = parameters[(b, a)] if not isinstance(pair_parameters, PhasedFSimCharacterization): pair_parameters = PhasedFSimCharacterization( **pair_parameters) pair_parameters = pair_parameters.parameters_for_qubits_swapped( ) elif ideal_when_missing_gate: pair_parameters = SQRT_ISWAP_PARAMETERS else: raise ValueError(f'Missing parameters for pair {(a, b)}') if pair_parameters.any_none(): if not ideal_when_missing_parameter: raise ValueError( f'Missing parameter value for pair {(a, b)}, ' f'parameters={pair_parameters}') pair_parameters = pair_parameters.merge_with( SQRT_ISWAP_PARAMETERS) return pair_parameters
def create_with_random_gaussian_sqrt_iswap( cls, mean: PhasedFSimCharacterization = SQRT_ISWAP_PARAMETERS, *, simulator: Optional[Simulator] = None, sigma: PhasedFSimCharacterization = PhasedFSimCharacterization( theta=0.02, zeta=0.05, chi=0.05, gamma=0.05, phi=0.02), random_or_seed: RANDOM_STATE_OR_SEED_LIKE = None, ) -> 'PhasedFSimEngineSimulator': """Creates a PhasedFSimEngineSimulator that introduces a random deviation from the mean. The random deviations are described by a Gaussian distribution of a given mean and sigma, for each angle respectively. Each gate for each pair of qubits retains the sampled values for the entire simulation, even when used multiple times within a circuit. Attributes: mean: The mean value for each unitary angle. All parameters must be provided. simulator: Simulator object to use. When None, a new instance of cirq.Simulator() will be created. sigma: The standard deviation for each unitary angle. For sigma parameters that are None, the mean value will be used without any sampling. Returns: New PhasedFSimEngineSimulator instance. """ if mean.any_none(): raise ValueError( f'All mean values must be provided, got mean of {mean}') rand = parse_random_state(random_or_seed) def sample_value(gaussian_mean: Optional[float], gaussian_sigma: Optional[float]) -> float: assert gaussian_mean is not None if gaussian_sigma is None: return gaussian_mean return rand.normal(gaussian_mean, gaussian_sigma) def sample_gate(_1: Qid, _2: Qid, gate: FSimGate) -> PhasedFSimCharacterization: assert isinstance(gate, FSimGate), f'Expected FSimGate, got {gate}' assert np.isclose(gate.theta, np.pi / 4) and np.isclose( gate.phi, 0.0), f'Expected ISWAP ** -0.5 like gate, got {gate}' return PhasedFSimCharacterization( theta=sample_value(mean.theta, sigma.theta), zeta=sample_value(mean.zeta, sigma.zeta), chi=sample_value(mean.chi, sigma.chi), gamma=sample_value(mean.gamma, sigma.gamma), phi=sample_value(mean.phi, sigma.phi), ) if simulator is None: simulator = Simulator() return cls(simulator, drift_generator=sample_gate, gates_translator=try_convert_sqrt_iswap_to_fsim)