Skip to content

Commit

Permalink
handle obs with overlapping wires seperately
Browse files Browse the repository at this point in the history
  • Loading branch information
lillian542 committed Sep 20, 2024
1 parent 17eb0ce commit db62305
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions pennylane/tape/qscript.py
Original file line number Diff line number Diff line change
Expand Up @@ -339,10 +339,8 @@ def diagonalizing_gates(self) -> list[Operation]:
"""
rotation_gates = []

observables = set(_get_base_obs(self.observables))

with qml.queuing.QueuingManager.stop_recording():
for observable in observables:
for observable in _get_base_obs(self.observables):
# some observables do not have diagonalizing gates,
# in which case we just don't append any
with contextlib.suppress(qml.operation.DiagGatesUndefinedError):
Expand Down Expand Up @@ -1328,19 +1326,25 @@ def wrapper(*args, **kwargs):


def _get_base_obs(observables):

overlapping_ops_observables = []

while any(isinstance(o, (qml.ops.CompositeOp, qml.ops.SymbolicOp)) for o in observables):

new_obs = []

for observable in observables:

if isinstance(observable, qml.ops.CompositeOp):
new_obs.extend(observable.operands)
if any(len(o) > 1 for o in observable.overlapping_ops):
overlapping_ops_observables.append(observable)
else:
new_obs.extend(observable.operands)
elif isinstance(observable, qml.ops.SymbolicOp):
new_obs.append(observable.base)
else:
new_obs.append(observable)

observables = new_obs

return observables
return set(observables + overlapping_ops_observables)

0 comments on commit db62305

Please sign in to comment.