def serialize_paulisum(paulisum): """Constructs a pauli_sum proto from `cirq.PauliSum` or `cirq.PauliString`. Args: paulisum: A `cirq.PauliSum` object. Returns: A pauli_sum proto object. """ if isinstance(paulisum, cirq.PauliString): paulisum = cirq.PauliSum.from_pauli_strings(paulisum) if not isinstance(paulisum, cirq.PauliSum): raise TypeError("serialize requires a cirq.PauliSum object." " Given: " + str(type(paulisum))) if any(not isinstance(qubit, cirq.GridQubit) for qubit in paulisum.qubits): raise ValueError("Attempted to serialize a paulisum that doesn't use " "only cirq.GridQubits.") paulisum_proto = pauli_sum_pb2.PauliSum() for term in paulisum: pauliterm_proto = pauli_sum_pb2.PauliTerm() pauliterm_proto.coefficient_real = term.coefficient.real pauliterm_proto.coefficient_imag = term.coefficient.imag for t in sorted(term.items()): # sort to keep qubits ordered. pauliterm_proto.paulis.add( qubit_id=v2.qubit_to_proto_id(t[0]), pauli_type=str(t[1]), ) paulisum_proto.terms.extend([pauliterm_proto]) return paulisum_proto
def _build_pauli_proto(coefs, ops, qubit_ids): """Construct pauli_sum proto explicitly.""" terms = [] for i in range(len(coefs)): term = pauli_sum_pb2.PauliTerm() term.coefficient_real = coefs[i].real term.coefficient_imag = coefs[i].imag for j in range(len(qubit_ids[i])): term.paulis.add(qubit_id=qubit_ids[i][j], pauli_type=ops[i][j]) terms.append(term) a = pauli_sum_pb2.PauliSum() a.terms.extend(terms) return a