def get_pauli_expectation_value(
        self,
        state_circuit: Circuit,
        pauli: QubitPauliString,
        valid_check: bool = True,
    ) -> complex:
        """Calculates the expectation value of the given circuit using the built-in
        ProjectQ functionality

        :param state_circuit: Circuit that generates the desired state
            :math:`\\left|\\psi\\right>`.
        :type state_circuit: Circuit
        :param pauli: Pauli operator
        :type pauli: QubitPauliString
        :param valid_check: Explicitly check that the circuit satisfies all required
            predicates to run on the backend. Defaults to True
        :type valid_check: bool, optional
        :return: :math:`\\left<\\psi | P | \\psi \\right>`
        :rtype: complex
        """
        pauli_tuple = tuple(
            (_default_q_index(q), p.name) for q, p in pauli.to_dict().items())
        return self._expectation_value(state_circuit,
                                       projectq.ops.QubitOperator(pauli_tuple),
                                       valid_check)
Beispiel #2
0
 def _gen_PauliTerm(self,
                    term: QubitPauliString,
                    coeff: complex = 1.0) -> PauliTerm:
     pauli_term = ID() * coeff
     for q, p in term.to_dict().items():
         pauli_term *= PauliTerm(p.name, _default_q_index(q))
     return pauli_term  # type: ignore
Beispiel #3
0
def _sparse_to_qiskit_pauli(pauli: QubitPauliString,
                            n_qubits: int) -> qk_Pauli:
    x = [False] * n_qubits
    z = [False] * n_qubits
    for q, p in pauli.to_dict().items():
        i = _default_q_index(q)
        z[i] = p in (Pauli.Z, Pauli.Y)
        x[i] = p in (Pauli.X, Pauli.Y)
    return qk_Pauli((z, x))
Beispiel #4
0
def add_operator_term(circuit: Circuit, term: QubitPauliString, angle: float):
    qubits = []
    for q, p in term.to_dict().items():
        if p != Pauli.I:
            qubits.append(q)
            if p == Pauli.X:
                circuit.H(q)
            elif p == Pauli.Y:
                circuit.V(q)
    for i in range(len(qubits) - 1):
        circuit.CX(i, i + 1)
    circuit.Rz(angle, len(qubits) - 1)
    for i in reversed(range(len(qubits) - 1)):
        circuit.CX(i, i + 1)
    for q, p in term.to_dict().items():
        if p == Pauli.X:
            circuit.H(q)
        elif p == Pauli.Y:
            circuit.Vdg(q)
Beispiel #5
0
def _sparse_to_qiskit_pauli(pauli: QubitPauliString,
                            n_qubits: int) -> qk_Pauli:
    empty = np.zeros(n_qubits)
    q_pauli = qk_Pauli(empty, empty)
    for q, p in pauli.to_dict().items():
        i = _default_q_index(q)
        if p in (Pauli.X, Pauli.Y):
            q_pauli._x[i] = True
        if p in (Pauli.Z, Pauli.Y):
            q_pauli._z[i] = True
    return q_pauli
Beispiel #6
0
def _obs_from_qps(pauli: QubitPauliString) -> Tuple[Observable, QubitSet]:
    obs, qbs = [], []
    for q, p in pauli.to_dict().items():
        obs.append(_observables[p])
        qbs.append(q.index[0])
    return Observable.TensorProduct(obs), qbs