Exemple #1
0
 def _mul_with_qubits(self, qubits: Tuple['cirq.Qid', ...], other):
     if isinstance(other, raw_types.Operation):
         return other
     if isinstance(other, (complex, float, int)):
         from cirq.ops.pauli_string import PauliString
         return PauliString(coefficient=other)
     return NotImplemented
Exemple #2
0
 def __add__(self, other):
     if not isinstance(other, (numbers.Complex, PauliString, PauliSum)):
         if hasattr(other, 'gate') and isinstance(other.gate, identity.IdentityGate):
             other = PauliString(other)
         else:
             return NotImplemented
     result = self.copy()
     result += other
     return result
Exemple #3
0
    def __isub__(self, other):
        if isinstance(other, numbers.Complex):
            other = PauliSum.from_pauli_strings([PauliString(coefficient=other)])
        if isinstance(other, PauliString):
            other = PauliSum.from_pauli_strings([other])

        if not isinstance(other, PauliSum):
            return NotImplemented

        self._linear_dict -= other._linear_dict
        return self
Exemple #4
0
    def __iadd__(self, other):
        if isinstance(other, (float, int, complex)):
            other = PauliSum.from_pauli_strings(
                [PauliString(coefficient=other)])
        elif isinstance(other, PauliString):
            other = PauliSum.from_pauli_strings([other])

        if not isinstance(other, PauliSum):
            return NotImplemented

        self._linear_dict += other._linear_dict
        return self
    def from_boolean_expression(
            cls, boolean_expr: Expr,
            qubit_map: Dict[str, 'cirq.Qid']) -> 'PauliSum':
        """Builds the Hamiltonian representation of a Boolean expression.

        This is based on "On the representation of Boolean and real functions as Hamiltonians for
        quantum computing" by Stuart Hadfield, https://arxiv.org/abs/1804.09130

        Args:
            boolean_expr: A Sympy expression containing symbols and Boolean operations
            qubit_map: map of string (boolean variable name) to qubit.

        Return:
            The PauliString that represents the Boolean expression.

        Raises:
            ValueError: If `boolean_expr` is of an unsupported type.
        """
        if isinstance(boolean_expr, Symbol):
            # In table 1, the entry for 'x' is '1/2.I - 1/2.Z'
            return cls.from_pauli_strings([
                PauliString({}, 0.5),
                PauliString({qubit_map[boolean_expr.name]: pauli_gates.Z},
                            -0.5),
            ])

        if isinstance(boolean_expr, (And, Not, Or, Xor)):
            sub_pauli_sums = [
                cls.from_boolean_expression(sub_boolean_expr, qubit_map)
                for sub_boolean_expr in boolean_expr.args
            ]
            # We apply the equalities of theorem 1.
            if isinstance(boolean_expr, And):
                pauli_sum = cls.from_pauli_strings(PauliString({}, 1.0))
                for sub_pauli_sum in sub_pauli_sums:
                    pauli_sum = pauli_sum * sub_pauli_sum
            elif isinstance(boolean_expr, Not):
                assert len(sub_pauli_sums) == 1
                pauli_sum = cls.from_pauli_strings(PauliString(
                    {}, 1.0)) - sub_pauli_sums[0]
            elif isinstance(boolean_expr, Or):
                pauli_sum = cls.from_pauli_strings(PauliString({}, 0.0))
                for sub_pauli_sum in sub_pauli_sums:
                    pauli_sum = pauli_sum + sub_pauli_sum - pauli_sum * sub_pauli_sum
            elif isinstance(boolean_expr, Xor):
                pauli_sum = cls.from_pauli_strings(PauliString({}, 0.0))
                for sub_pauli_sum in sub_pauli_sums:
                    pauli_sum = pauli_sum + sub_pauli_sum - 2.0 * pauli_sum * sub_pauli_sum
            return pauli_sum

        raise ValueError(f'Unsupported type: {type(boolean_expr)}')
Exemple #6
0
def _pauli_string_from_unit(unit: UnitPauliStringT,
                            coefficient: Union[int, float, complex] = 1):
    return PauliString(qubit_pauli_map=dict(unit), coefficient=coefficient)