cirq.sim.DensityMatrixSimulator

A simulator for density matrices and noisy quantum circuits.

Inherits From: SimulatesSamples, Sampler, SimulatesIntermediateState, SimulatesFinalState

Used in the notebooks

Used in the guide Used in the tutorials

This simulator can be applied on circuits that are made up of operations that have:

* a `_channel_` method
* a `_mixture_` method for a probabilistic combination of unitary gates.
* a `_unitary_` method
* a `_has_unitary_` and `_apply_unitary_` method.
* measurements
* a `_decompose_` that eventually yields one of the above

That is, the circuit must have elements that follow on of the protocols: * cirq.SupportsChannel * cirq.SupportsMixture * cirq.SupportsConsistentApplyUnitary * cirq.SupportsUnitary * cirq.SupportsDecompose or is a measurement.

This simulator supports three types of simulation.

Run simulations which mimic running on actual quantum hardware. These simulations do not give access to the density matrix (like actual hardware). There are two variations of run methods, one which takes in a single (optional) way to resolve parameterized circuits, and a second which takes in a list or sweep of parameter resolver:

run(circuit, param_resolver, repetitions)

run_sweep(circuit, params, repetitions)

These methods return Results which contain both the measurement results, but also the parameters used for the parameterized circuit operations. The initial state of a run is always the all 0s state in the computational basis.

By contrast the simulate methods of the simulator give access to the density matrix of the simulation at the end of the simulation of the circuit. Note that if the circuit contains measurements then the density matrix is that result for those particular measurement results. For example if there is one measurement, then the simulation may result in the measurement result for this measurement, and the density matrix will be that conditional on that result. It will not be the density matrix formed by summing over the different measurements and their probabilities. The simulate methods take in two parameters that the run methods do not: a qubit order and an initial state. The qubit order is necessary because an ordering must be chosen for the kronecker product (see DensityMatrixTrialResult for details of this ordering). The initial state can be either the full density matrix, the full wave function (for pure states), or an integer which represents the initial state of being in a computational basis state for the binary representation of that integer. Similar to run methods, there are two simulate methods that run for single simulations or for sweeps across different parameters:

simulate(circuit, param_resolver, qubit_order, initial_state)

simulate_sweep(circuit, params, qubit_order, initial_state)

The simulate methods in contrast to the run methods do not perform repetitions. The result of these simulations is a DensityMatrixTrialResult which contains, in addition to measurement results and information about the parameters that were used in the simulation, access to the density matrix via the density_matrix method.

If one wishes to perform simulations that have access to the density matrix as one steps through running the circuit there is a generator which can be iterated over and each step is an object that gives access to the density matrix. This stepping through a Circuit is done on a Moment by Moment manner.

simulate_moment_steps(circuit, param_resolver, qubit_order,
                      initial_state)

One can iterate over the moments via

for step_result in simulate_moments(circuit):
   # do something with the density matrix via
   # step_result.density_matrix()

dtype The numpy.dtype used by the simulation. One of numpy.complex64 or numpy.complex128
noise A noise model to apply while simulating.
seed The random seed to use for this simulator.
ignore_measurement_results if True, then the simulation will treat measurement as dephasing instead of collapsing process.

Example:

>>> (q0,) = cirq.LineQubit.range(1)
>>> circuit = cirq.Circuit(cirq.H(q0), cirq.measure(q0))

Default case (ignore_measurement_results = False):

>>> simulator = cirq.DensityMatrixSimulator()
>>> result = simulator.run(circuit)

The measurement result will be strictly one of 0 or 1.

In the other case:

>>> simulator = cirq.DensityMatrixSimulator(
...     ignore_measurement_results = True)
>>> result = simulator.run(circuit)

The measurement result will be the maximally mixed state with equal probability for 0 and 1.

Methods

run

View source

Samples from the given Circuit.

By default, the run_async method invokes this method on another thread. So this method is supposed to be thread safe.

Args
program The circuit to sample from.
param_resolver Parameters to run with the program.
repetitions The number of times to sample.

Returns
Result for a run.

run_async

View source

Asynchronously samples from the given Circuit.

By default, this method invokes run synchronously and simply exposes its result is an awaitable. Child classes that are capable of true asynchronous sampling should override it to use other strategies.

Args
program The circuit to sample from.
repetitions The number of times to sample.

Returns
An awaitable Result.

run_batch

View source

Runs the supplied circuits.

Each circuit provided in programs will pair with the optional associated parameter sweep provided in the params_list, and be run with the associated repetitions provided in repetitions (if repetitions is an integer, then all runs will have that number of repetitions). If params_list is specified, then the number of circuits is required to match the number of sweeps. Similarly, when repetitions is a list, the number of circuits is required to match the length of this list.

By default, this method simply invokes run_sweep sequentially for each (circuit, parameter sweep, repetitions) tuple. Child classes that are capable of sampling batches more efficiently should override it to use other strategies. Note that child classes may have certain requirements that must be met in order for a speedup to be possible, such as a constant number of repetitions being used for all circuits. Refer to the documentation of the child class for any such requirements.

Args
programs The circuits to execute as a batch.
params_list Parameter sweeps to use with the circuits. The number of sweeps should match the number of circuits and will be paired in order with the circuits.
repetitions Number of circuit repetitions to run. Can be specified as a single value to use for all runs, or as a list of values, one for each circuit.

Returns
A list of lists of TrialResults. The outer list corresponds to the circuits, while each inner list contains the TrialResults for the corresponding circuit, in the order imposed by the associated parameter sweep.

run_sweep

View source

Runs the supplied Circuit, mimicking quantum hardware.

In contrast to run, this allows for sweeping over different parameter values.

Args
program The circuit to simulate.
params Parameters to run with the program.
repetitions The number of repetitions to simulate.

Returns
Result list for this run; one for each possible parameter resolver.

run_sweep_async

View source

Asynchronously sweeps and samples from the given Circuit.

By default, this method invokes run_sweep synchronously and simply exposes its result is an awaitable. Child classes that are capable of true asynchronous sampling should override it to use other strategies.

Args
program The circuit to sample from.
params One or more mappings from parameter keys to parameter values to use. For each parameter assignment, repetitions samples will be taken.
repetitions The number of times to sample.

Returns
An awaitable Result.

sample

View source

Samples the given Circuit, producing a pandas data frame.

Args
program The circuit to sample from.
repetitions The number of times to sample the program, for each parameter mapping.
params Maps symbols to one or more values. This argument can be a dictionary, a list of dictionaries, a cirq.Sweep, a list of cirq.Sweep, etc. The program will be sampled repetition times for each mapping. Defaults to a single empty mapping.

Returns
A pandas.DataFrame with a row for each sample, and a column for each measurement key as well as a column for each symbolic parameter. Measurement results are stored as a big endian integer representation with one bit for each measured qubit in the key. See cirq.big_endian_int_to_bits and similar functions for how to convert this integer into bits. There is an also index column containing the repetition number, for each parameter assignment.

Examples:

a, b, c = cirq.LineQubit.range(3)
sampler = cirq.Simulator()
circuit = cirq.Circuit(cirq.X(a),
                       cirq.measure(a, key='out'))
print(sampler.sample(circuit, repetitions=4))
   out
0    1
1    1
2    1
3    1
circuit = cirq.Circuit(cirq.X(a),
                       cirq.CNOT(a, b),
                       cirq.measure(a, b, c, key='out'))
print(sampler.sample(circuit, repetitions=4))
   out
0    6
1    6
2    6
3    6
circuit = cirq.Circuit(cirq.X(a)**sympy.Symbol('t'),
                       cirq.measure(a, key='out'))
print(sampler.sample(
    circuit,
    repetitions=3,
    params=[{'t': 0}, {'t': 1}]))
   t  out
0  0    0
1  0    0
2  0    0
0  1    1
1  1    1
2  1    1

simulate

View source

Simulates the supplied Circuit.

This method returns a result which allows access to the entire simulator's final state.

Args
program The circuit to simulate.
param_resolver Parameters to run with the program.
qubit_order Determines the canonical ordering of the qubits. This is often used in specifying the initial state, i.e. the ordering of the computational basis states.
initial_state The initial state for the simulation. The form of this state depends on the simulation implementation. See documentation of the implementing class for details.

Returns
SimulationTrialResults for the simulation. Includes the final state.

simulate_moment_steps

View source

Returns an iterator of StepResults for each moment simulated.

If the circuit being simulated is empty, a single step result should be returned with the state being set to the initial state.

Args
circuit The Circuit to simulate.
param_resolver A ParamResolver for determining values of Symbols.
qubit_order Determines the canonical ordering of the qubits. This is often used in specifying the initial state, i.e. the ordering of the computational basis states.
initial_state The initial state for the simulation. The form of this state depends on the simulation implementation. See documentation of the implementing class for details.

Returns
Iterator that steps through the simulation, simulating each moment and returning a StepResult for each moment.

simulate_sweep

View source

Simulates the supplied Circuit.

This method returns a result which allows access to the entire state vector. In contrast to simulate, this allows for sweeping over different parameter values.

Args
program The circuit to simulate.
params Parameters to run with the program.
qubit_order Determines the canonical ordering of the qubits. This is often used in specifying the initial state, i.e. the ordering of the computational basis states.
initial_state The initial state for the simulation. The form of this state depends on the simulation implementation. See documentation of the implementing class for details.

Returns
List of SimulationTrialResults for this run, one for each possible parameter resolver.