def _pauli_expansion_(self) -> value.LinearDict[str]: """Computes Pauli expansion of self from Pauli expansions of terms.""" def extend_term(pauli_names: str, qubits: Tuple['cirq.Qid', ...], all_qubits: Tuple['cirq.Qid', ...]) -> str: """Extends Pauli product on qubits to product on all_qubits.""" assert len(pauli_names) == len(qubits) qubit_to_pauli_name = dict(zip(qubits, pauli_names)) return ''.join(qubit_to_pauli_name.get(q, 'I') for q in all_qubits) def extend( expansion: value.LinearDict[str], qubits: Tuple['cirq.Qid', ...], all_qubits: Tuple['cirq.Qid', ...]) -> value.LinearDict[str]: """Extends Pauli expansion on qubits to expansion on all_qubits.""" return value.LinearDict({ extend_term(p, qubits, all_qubits): c for p, c in expansion.items() }) result = value.LinearDict({}) # type: value.LinearDict[str] for op, coefficient in self.items(): expansion = protocols.pauli_expansion(op) extended_expansion = extend(expansion, op.qubits, self.qubits) result += extended_expansion * coefficient return result
def assert_pauli_expansion_is_consistent_with_unitary(val: Any) -> None: """Checks Pauli expansion against unitary matrix.""" # Check to see if the protocol is supported without doing a fallback # to unitary, otherwise the test is vacuous. method = getattr(val, '_pauli_expansion_', None) if method is None: return pauli_expansion = protocols.pauli_expansion(val, default=None) if pauli_expansion is None: return unitary = protocols.unitary(val, None) if unitary is None: return num_qubits = protocols.num_qubits(val, default=unitary.shape[0].bit_length() - 1) basis = operator_spaces.kron_bases(operator_spaces.PAULI_BASIS, repeat=num_qubits) recovered_unitary = operator_spaces.matrix_from_basis_coefficients( pauli_expansion, basis) assert np.allclose(unitary, recovered_unitary, rtol=0, atol=1e-12)
def assert_pauli_expansion_is_consistent_with_unitary(val: Any) -> None: """Checks Pauli expansion against unitary matrix.""" pauli_expansion = protocols.pauli_expansion(val, default=None) if pauli_expansion is None: return unitary = protocols.unitary(val, None) if unitary is None: return num_qubits = unitary.shape[0].bit_length() - 1 basis = operator_spaces.kron_bases(operator_spaces.PAULI_BASIS, repeat=num_qubits) recovered_unitary = operator_spaces.matrix_from_basis_coefficients( pauli_expansion, basis) assert np.allclose(unitary, recovered_unitary, rtol=0, atol=1e-12)
def _pauli_expansion_(self) -> value.LinearDict[str]: if self._is_parameterized_(): return NotImplemented expansion = protocols.pauli_expansion(self._iswap) assert set(expansion.keys()).issubset({'II', 'XX', 'YY', 'ZZ'}) assert np.isclose(expansion['XX'], expansion['YY']) v = (expansion['XX'] + expansion['YY']) / 2 phase_angle = np.pi * self.phase_exponent c, s = np.cos(2 * phase_angle), np.sin(2 * phase_angle) return value.LinearDict({ 'II': expansion['II'], 'XX': c * v, 'YY': c * v, 'XY': s * v, 'YX': -s * v, 'ZZ': expansion['ZZ'], })
def _pauli_expansion_(self) -> value.LinearDict[str]: return protocols.pauli_expansion(self.sub_operation)
def _pauli_expansion_(self) -> value.LinearDict[str]: result = value.LinearDict({}) # type: value.LinearDict[str] for gate, coefficient in self.items(): result += protocols.pauli_expansion(gate) * coefficient return result
def _pauli_expansion_(self) -> value.LinearDict[str]: return protocols.pauli_expansion(self.gate)