PennyLaneAI / pennylane

PennyLane is a cross-platform Python library for quantum computing, quantum machine learning, and quantum chemistry. Train a quantum computer the same way as a neural network.
https://pennylane.ai
Apache License 2.0
2.27k stars 585 forks source link

We can measure any Observable with Paulis on same wire in circuit #2897

Open Jaybsoni opened 2 years ago

Jaybsoni commented 2 years ago

Expected behavior

Measuring Hadamard and a Pauli Observable together on the same wire at the end of a circuit is well behaved.

Actual behavior

An error raised which mentions that a non Pauli word observable was passed to a grouping method which only works with Pauli words.

Additional information

No response

Source code

dev = qml.device("default.qubit", wires=1)

@qml.qnode(dev)
def circ():
    return qml.expval(qml.PauliZ(0)), qml.expval(qml.Hadamard(0))

Tracebacks

>>> circ()
Traceback (most recent call last):
  File "/Users/jay/Desktop/PL/scratch.py", line 21, in <module>
    main()
  File "/Users/jay/Desktop/PL/scratch.py", line 15, in main
    print(circuit())  # ({'00': 53, '10': 47}, 0.06) , which is wrong
  File "/Users/jay/Desktop/PL/pennylane/pennylane/qnode.py", line 619, in __call__
    res = qml.execute(
  File "/Users/jay/Desktop/PL/pennylane/pennylane/interfaces/execution.py", line 338, in execute
    tapes, batch_fn = qml.transforms.map_batch_transform(device.batch_transform, tapes)
  File "/Users/jay/Desktop/PL/pennylane/pennylane/transforms/batch_transform.py", line 469, in map_batch_transform
    new_tapes, fn = transform(t)
  File "/Users/jay/Desktop/PL/pennylane/pennylane/_device.py", line 740, in batch_transform
    circuits, hamiltonian_fn = qml.transforms.split_non_commuting(circuit)
  File "/Users/jay/Desktop/PL/pennylane/pennylane/transforms/batch_transform.py", line 331, in __call__
    return self._tape_wrapper(*targs, **tkwargs)(qnode)
  File "/Users/jay/Desktop/PL/pennylane/pennylane/transforms/batch_transform.py", line 419, in <lambda>
    return lambda tape: self.construct(tape, *targs, **tkwargs)
  File "/Users/jay/Desktop/PL/pennylane/pennylane/transforms/batch_transform.py", line 403, in construct
    tapes, processing_fn = self.transform_fn(tape, *args, **kwargs)
  File "/Users/jay/Desktop/PL/pennylane/pennylane/transforms/split_non_commuting.py", line 158, in split_non_commuting
    groups, group_coeffs = qml.grouping.group_observables(obs_list, range(len(obs_list)))
  File "/Users/jay/Desktop/PL/pennylane/pennylane/grouping/group_observables.py", line 233, in group_observables
    partitioned_paulis = pauli_grouping.colour_pauli_graph()
  File "/Users/jay/Desktop/PL/pennylane/pennylane/grouping/group_observables.py", line 168, in colour_pauli_graph
    self.adj_matrix = self.complement_adj_matrix_for_operator()
  File "/Users/jay/Desktop/PL/pennylane/pennylane/grouping/group_observables.py", line 129, in complement_adj_matrix_for_operator
    self.binary_observables = self.binary_repr()
  File "/Users/jay/Desktop/PL/pennylane/pennylane/grouping/group_observables.py", line 116, in binary_repr
    return observables_to_binary_matrix(self.observables, n_qubits, self._wire_map)
  File "/Users/jay/Desktop/PL/pennylane/pennylane/grouping/utils.py", line 736, in observables_to_binary_matrix
    binary_mat[i, :] = pauli_to_binary(observables[i], n_qubits=n_qubits, wire_map=wire_map)
  File "/Users/jay/Desktop/PL/pennylane/pennylane/grouping/utils.py", line 220, in pauli_to_binary
    raise TypeError(f"Expected a Pauli word Observable instance, instead got {pauli_word}.")
TypeError: Expected a Pauli word Observable instance, instead got expval(Hadamard(wires=[0])).

System information

Name: PennyLane
Version: 0.25.0.dev0
Summary: PennyLane is a Python quantum machine learning library by Xanadu Inc.
Home-page: https://github.com/XanaduAI/pennylane
Author: 
Author-email: 
License: Apache License 2.0
Location: /Users/jay/Desktop/PL/pennylane
Requires: appdirs, autograd, autoray, cachetools, networkx, numpy, pennylane-lightning, retworkx, scipy, semantic-version, toml
Required-by: amazon-braket-pennylane-plugin, PennyLane-Cirq, PennyLane-Forest, PennyLane-Lightning, PennyLane-Orquestra, PennyLane-Qchem, PennyLane-qiskit, PennyLane-qsharp

Platform info:           macOS-10.16-x86_64-i386-64bit
Python version:          3.9.7
Numpy version:           1.21.0
Scipy version:           1.7.1
Installed devices:
- lightning.qubit (PennyLane-Lightning-0.24.0)
- braket.aws.qubit (amazon-braket-pennylane-plugin-1.5.1)
- braket.local.qubit (amazon-braket-pennylane-plugin-1.5.1)
- forest.numpy_wavefunction (PennyLane-Forest-0.18.0.dev0)
- forest.qvm (PennyLane-Forest-0.18.0.dev0)
- forest.wavefunction (PennyLane-Forest-0.18.0.dev0)
- cirq.mixedsimulator (PennyLane-Cirq-0.18.0.dev0)
- cirq.pasqal (PennyLane-Cirq-0.18.0.dev0)
- cirq.qsim (PennyLane-Cirq-0.18.0.dev0)
- cirq.qsimh (PennyLane-Cirq-0.18.0.dev0)
- cirq.simulator (PennyLane-Cirq-0.18.0.dev0)
- microsoft.QuantumSimulator (PennyLane-qsharp-0.9.0.dev0)
- qiskit.aer (PennyLane-qiskit-0.19.0.dev0)
- qiskit.basicaer (PennyLane-qiskit-0.19.0.dev0)
- qiskit.ibmq (PennyLane-qiskit-0.19.0.dev0)
- orquestra.forest (PennyLane-Orquestra-0.16.0.dev0)
- orquestra.ibmq (PennyLane-Orquestra-0.16.0.dev0)
- orquestra.qiskit (PennyLane-Orquestra-0.16.0.dev0)
- orquestra.qulacs (PennyLane-Orquestra-0.16.0.dev0)
- default.gaussian (PennyLane-0.25.0.dev0)
- default.mixed (PennyLane-0.25.0.dev0)
- default.qubit (PennyLane-0.25.0.dev0)
- default.qubit.autograd (PennyLane-0.25.0.dev0)
- default.qubit.jax (PennyLane-0.25.0.dev0)
- default.qubit.tf (PennyLane-0.25.0.dev0)
- default.qubit.torch (PennyLane-0.25.0.dev0)

Existing GitHub issues

antalszava commented 2 years ago

This sounds a bit more like an unsupported feature, no? I assume that measurements on the same wire are only supported for Paulis atm.

Jaybsoni commented 2 years ago

Ahh interesting, I would assume that if it works for Pauli's then it should work for any observable? I mean the grouping logic is currently written such that it only groups Pauli words.

Jaybsoni commented 2 years ago

If we never used to support this then I can change it to a feature request 👍🏼