The Mixed Simulator Device

You can instantiate the mixed-state simulator device in PennyLane as follows:

import pennylane as qml

dev = qml.device('cirq.mixedsimulator', wires=2)

This device can then be used just like other devices for the definition and evaluation of QNodes within PennyLane. Unlike the cirq.simulator backend, this device also supports several of Cirq’s custom non-unitary channels, e.g., BitFlip or Depolarize.

from pennylane_cirq import ops

@qml.qnode(dev)
def circuit(x, p, q):
    qml.RX(x, wires=[0])
    ops.BitFlip(p, wires=[0])
    ops.Depolarize(q, wires=[1])
    qml.CNOT(wires=[0, 1])
    return qml.expval(qml.PauliZ(wires=1))

circuit(0.2, 0.1, 0.3)

This device stores the internal state of the quantum simulation as a density matrix. This has additional memory overhead compared to pure-state simulation, but allows for additional channels to be performed. The density matrix can be accessed after a circuit execution using dev.state.

Device options

Cirq has different ways of defining qubits, e.g., LineQubit or GridQubit. The Cirq device therefore accepts an additional argument qubits=None that you can use to define your own qubits and give them to the device as a list.

import cirq

qubits = [
  cirq.GridQubit(0, 0),
  cirq.GridQubit(0, 1),
  cirq.GridQubit(1, 0),
  cirq.GridQubit(1, 1),
]

dev = qml.device("cirq.mixedsimulator", wires=4, qubits=qubits)

The wire of each qubit corresponds to its index in the qubit list. In the above example, the wire 2 corresponds to cirq.GridQubit(1, 0).

If no qubits are given, the plugin will create an array of LineQubit instances.

Supported operations

The cirq.mixedsimulator device supports all PennyLane operations and observables.

It also supports the following non-unitary channels from Cirq (found in pennylane_cirq.ops): BitFlip, PhaseFlip, PhaseDamp, AmplitudeDamp, and Depolarize.