Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _pauliTerm(term):
# type: (QuilParser.PauliTermContext) -> PauliTerm
from pyquil.paulis import PauliTerm
letters = term.IDENTIFIER().getText()
args = [_formalQubit(q) for q in term.qubitVariable()]
coeff = _expression(term.expression())
return PauliTerm.from_list(list(zip(letters, args)), coeff)
(2 * s + 1, 0),
(2 * r + 1, 0)))
spin_adapted_term *= 0.5
tpdm_element_as_pauli = remove_imaginary_terms(
qubitop_to_pyquilpauli(transform(spin_adapted_term)))
for term in tpdm_element_as_pauli:
pauli_terms_to_measure.append(term)
for term in pauli_terms_to_measure:
# convert term into numerically order pauli tensor term
pauli_tensor_list = sorted(list(term.operations_as_set()),
key=lambda x: x[0])
rev_order_pauli_tensor_list = list(
map(lambda x: (x[1], x[0]), pauli_tensor_list))
pauli_term = PauliTerm.from_list(rev_order_pauli_tensor_list,
coefficient=term.coefficient)
if pauli_term.id() not in pauli_to_rdm.keys():
pauli_to_rdm[pauli_term.id()] = pauli_term
else:
if (abs(pauli_to_rdm[pauli_term.id()].coefficient) <
abs(pauli_term.coefficient)):
pauli_to_rdm[pauli_term.id()] = pauli_term
return list(pauli_to_rdm.values())
with for loops. It would be preferable to have this functionality in
pyquil.paulis.PauliSum directly
"""
out = PauliTerm("I", 0, 0)
# Make sure we map to integers and not to Qubits(), these are not
# supported by pyquil.paulis.PauliSum().
if set([Qubit]) == set(map(type, qubit_mapping.values())):
qubit_mapping = dict(zip(qubit_mapping.keys(),
[q.index for q in qubit_mapping.values()]))
# And change all of them
for term in hamiltonian:
coeff = term.coefficient
ops = []
for factor in term:
ops.append((factor[1], qubit_mapping[factor[0]]))
out += PauliTerm.from_list(ops, coeff)
return out
(2 * r + 1, 0),
(2 * s + 1, 0))) + \
FermionOperator(((2 * q + 1, 1), (2 * p + 1, 1),
(2 * s + 1, 0),
(2 * r + 1, 0)))
spin_adapted_term *= 0.5
tpdm_element_as_pauli = remove_imaginary_terms(
qubitop_to_pyquilpauli(transform(spin_adapted_term)))
for term in tpdm_element_as_pauli:
pauli_tensor_list = sorted(list(
term.operations_as_set()), key=lambda x: x[0])
rev_order_pauli_tensor_list = list(
map(lambda x: (x[1], x[0]), pauli_tensor_list))
pauli_term = PauliTerm.from_list(rev_order_pauli_tensor_list,
coefficient=term.coefficient)
try:
d2_aa[bas_aa[(p, q)], bas_aa[(s, r)]] += pauli_to_coeff[
pauli_term.id()] * \
pauli_term.coefficient
except KeyError:
raise Warning("key was not in the coeff matrix.")
return d2_aa
def pauli_term_from_string(pauli_string):
"""
Convert a string to a Pauli term
Strings look like `X0Z1Y3I4'
:param pauli_string: String to be translated to a PauliTerm
:return: PauliTerm
"""
pauli_elements = pauli_string[::2]
qubit_elements = list(map(int, pauli_string[1::2]))
return PauliTerm.from_list(list(zip(pauli_elements, qubit_elements)))
for p, q, r, s in product(range(spatial_dim), repeat=4):
spin_adapted_term = FermionOperator(
((2 * p, 1), (2 * q + 1, 1), (2 * r + 1, 0), (2 * s, 0)))
tpdm_element_as_pauli = remove_imaginary_terms(
qubitop_to_pyquilpauli(transform(spin_adapted_term)))
for term in tpdm_element_as_pauli:
pauli_terms_to_measure.append(term)
for term in pauli_terms_to_measure:
# convert term into numerically order pauli tensor term
pauli_tensor_list = sorted(list(term.operations_as_set()),
key=lambda x: x[0])
rev_order_pauli_tensor_list = list(
map(lambda x: (x[1], x[0]), pauli_tensor_list))
pauli_term = PauliTerm.from_list(rev_order_pauli_tensor_list,
coefficient=term.coefficient)
if pauli_term.id() not in pauli_to_rdm.keys():
pauli_to_rdm[pauli_term.id()] = pauli_term
else:
if (abs(pauli_to_rdm[pauli_term.id()].coefficient) <
abs(pauli_term.coefficient)):
pauli_to_rdm[pauli_term.id()] = pauli_term
return list(pauli_to_rdm.values())
with for loops. It would be preferable to have this functionality in
pyquil.paulis.PauliSum directly
"""
out = PauliTerm("I", 0, 0)
# Make sure we map to integers and not to Qubits(), these are not
# supported by pyquil.paulis.PauliSum().
if set([Qubit]) == set(map(type, qubit_mapping.values())):
qubit_mapping = dict(zip(qubit_mapping.keys(),
[q.index for q in qubit_mapping.values()]))
# And change all of them
for term in hamiltonian:
coeff = term.coefficient
ops = []
for factor in term:
ops.append((factor[1], qubit_mapping[factor[0]]))
out += PauliTerm.from_list(ops, coeff)
return out
(2 * s, 0), (2 * r, 0))) - \
FermionOperator(((2 * q, 1), (2 * p, 1),
(2 * r, 0), (2 * s, 0))) + \
FermionOperator(((2 * q, 1), (2 * p, 1),
(2 * s, 0), (2 * r, 0)))
spin_adapted_term *= 0.5
tpdm_element_as_pauli = remove_imaginary_terms(
qubitop_to_pyquilpauli(transform(spin_adapted_term)))
for term in tpdm_element_as_pauli:
pauli_tensor_list = sorted(list(
term.operations_as_set()), key=lambda x: x[0])
rev_order_pauli_tensor_list = list(
map(lambda x: (x[1], x[0]), pauli_tensor_list))
pauli_term = PauliTerm.from_list(rev_order_pauli_tensor_list,
coefficient=term.coefficient)
try:
d2_aa[bas_aa[(p, q)], bas_aa[(s, r)]] += pauli_to_coeff[
pauli_term.id()] * \
pauli_term.coefficient
except KeyError:
raise Warning("key was not in the coeff matrix.")
return d2_aa
def get_diagonalizing_basis(list_of_pauli_terms):
"""
Find the Pauli Term with the most non-identity terms
:param list_of_pauli_terms: List of Pauli terms to check
:return: The highest weight Pauli Term
:rtype: PauliTerm
"""
qubit_ops = set(reduce(lambda x, y: x + y,
[list(term._ops.items()) for term in list_of_pauli_terms]))
qubit_ops = sorted(list(qubit_ops), key=lambda x: x[0])
return PauliTerm.from_list(list(map(lambda x: tuple(reversed(x)), qubit_ops)))