cirq.circuits.Circuit

A mutable list of groups of operations to apply to some qubits.

Inherits From: AbstractCircuit

Methods returning information about the circuit (inherited from AbstractCircuit):

  • next_moment_operating_on
  • prev_moment_operating_on
  • next_moments_operating_on
  • operation_at
  • all_qubits
  • all_operations
  • findall_operations
  • findall_operations_between
  • findall_operations_until_blocked
  • findall_operations_with_gate_type
  • reachable_frontier_from
  • has_measurements
  • are_all_matches_terminal
  • are_all_measurements_terminal
  • unitary
  • final_state_vector
  • to_text_diagram
  • to_text_diagram_drawer
  • qid_shape
  • all_measurement_keys
  • to_quil
  • to_qasm
  • save_qasm
  • get_independent_qubit_sets

Methods for mutation:

  • insert
  • append
  • insert_into_range
  • clear_operations_touching
  • batch_insert
  • batch_remove
  • batch_insert_into
  • insert_at_frontier

Circuits can also be iterated over,

    for moment in circuit:
        ...

and sliced,

  • circuit[1:3] is a new Circuit made up of two moments, the first being circuit[1] and the second being circuit[2];
  • circuit[:, qubit] is a new Circuit with the same moments, but with only those operations which act on the given Qubit;
  • circuit[:, qubits], where 'qubits' is list of Qubits, is a new Circuit with the same moments, but only with those operations which touch any of the given qubits;
  • circuit[1:3, qubit] is equivalent to circuit[1:3][:, qubit];
  • circuit[1:3, qubits] is equivalent to circuit[1:3][:, qubits];

and concatenated,

  • circuit1 + circuit2 is a new Circuit made up of the moments in circuit1 followed by the moments in circuit2;

and multiplied by an integer,

  • circuit * k is a new Circuit made up of the moments in circuit repeated k times.

and mutated,

  • circuit[1:7] = [Moment(...)]

and factorized,

  • circuit.factorize() returns a sequence of Circuits which represent independent 'factors' of the original Circuit.

contents The initial list of moments and operations defining the circuit. You can also pass in operations, lists of operations, or generally anything meeting the cirq.OP_TREE contract. Non-moment entries will be inserted according to the specified insertion strategy.
strategy When initializing the circuit with operations and moments from contents, this determines how the operations are packed together. This option does not affect later insertions into the circuit.
device Hardware that the circuit should be able to run on.

device

moments

Methods

all_measurement_keys

View source

all_operations

View source

Iterates over the operations applied by this circuit.

Operations from earlier moments will be iterated over first. Operations within a moment are iterated in the order they were given to the moment's constructor.

all_qubits

View source

Returns the qubits acted upon by Operations in this circuit.

append

View source

Appends operations onto the end of the circuit.

Moments within the operation tree are appended intact.

Args
moment_or_operation_tree The moment or operation tree to append.
strategy How to pick/create the moment to put operations into.

are_all_matches_terminal

View source

Check whether all of the ops that satisfy a predicate are terminal.

This method will transparently descend into any CircuitOperations this circuit contains; as a result, it will misbehave if the predicate refers to CircuitOperations. See the tests for an example of this.

Args
predicate A predicate on ops.Operations which is being checked.

Returns
Whether or not all Operation s in a circuit that satisfy the given predicate are terminal. Also checks within any CircuitGates the circuit may contain.

are_all_measurements_terminal

View source

Whether all measurement gates are at the end of the circuit.

are_any_matches_terminal

View source

Check whether any of the ops that satisfy a predicate are terminal.

This method will transparently descend into any CircuitOperations this circuit contains; as a result, it will misbehave if the predicate refers to CircuitOperations. See the tests for an example of this.

Args
predicate A predicate on ops.Operations which is being checked.

Returns
Whether or not any Operation s in a circuit that satisfy the given predicate are terminal. Also checks within any CircuitGates the circuit may contain.

are_any_measurements_terminal

View source

Whether any measurement gates are at the end of the circuit.

batch_insert

View source

Applies a batched insert operation to the circuit.

Transparently handles the fact that earlier insertions may shift the index that later insertions should occur at. For example, if you insert an operation at index 2 and at index 4, but the insert at index 2 causes a new moment to be created, then the insert at "4" will actually occur at index 5 to account for the shift from the new moment.

All insertions are done with the strategy 'EARLIEST'.

When multiple inserts occur at the same index, the gates from the later inserts end up before the gates from the earlier inserts (exactly as if you'd called list.insert several times with the same index: the later inserts shift the earliest inserts forward).

Args
insertions A sequence of (insert_index, operations) pairs indicating operations to add into the circuit at specific places.

batch_insert_into

View source

Inserts operations into empty spaces in existing moments.

If any of the insertions fails (due to colliding with an existing operation), this method fails without making any changes to the circuit.

Args
insert_intos A sequence of (moment_index, new_op_tree) pairs indicating a moment to add new operations into.

ValueError:

One of the insertions collided with an existing operation.

IndexError:

Inserted into a moment index that doesn't exist.

batch_remove

View source

Removes several operations from a circuit.

Args
removals A sequence of (moment_index, operation) tuples indicating operations to delete from the moments that are present. All listed operations must actually be present or the edit will fail (without making any changes to the circuit).

ValueError:

One of the operations to delete wasn't present to start with.

IndexError:

Deleted from a moment that doesn't exist.

batch_replace

View source

Replaces several operations in a circuit with new operations.

Args
replacements A sequence of (moment_index, old_op, new_op) tuples indicating operations to be replaced in this circuit. All "old" operations must actually be present or the edit will fail (without making any changes to the circuit).

ValueError:

One of the operations to replace wasn't present to start with.

IndexError:

Replaced in a moment that doesn't exist.

clear_operations_touching

View source

Clears operations that are touching given qubits at given moments.

Args
qubits The qubits to check for operations on.
moment_indices The indices of moments to check for operations within.

copy

View source

factorize

View source

Factorize circuit into a sequence of independent circuits (factors).

Factorization is possible when the circuit's qubits can be divided into two or more independent qubit sets. Preserves the moments from the original circuit. If this is not possible, returns the set consisting of the single circuit (this one).

q0, q1, q2 = cirq.LineQubit.range(3)
circuit = cirq.Circuit()
circuit.append(cirq.Moment(cirq.H(q2)))
circuit.append(cirq.Moment(cirq.CZ(q0,q1)))
circuit.append(cirq.H(q0))
print(circuit)
0: ───────@───H───

1: ───────@───────
<BLANKLINE>
2: ───H───────────
for i, f in enumerate(circuit.factorize()):
    print("Factor {}".format(i))
    print(f)

Factor 0
0: ───────@───H───

1: ───────@───────
Factor 1
2: ───H───────────

Returns
The sequence of circuits, each including only the qubits from one independent qubit set.

final_state_vector

View source

Left-multiplies a state vector by the circuit's unitary effect.

A circuit's "unitary effect" is the unitary matrix produced by multiplying together all of its gates' unitary matrices. A circuit with non-unitary gates (such as measurement or parameterized gates) does not have a well-defined unitary effect, and the method will fail if such operations are present.

For convenience, terminal measurements are automatically ignored instead of causing a failure. Set the ignore_terminal_measurements argument to False to disable this behavior.

This method is equivalent to left-multiplying the input state by cirq.unitary(circuit) but it's computed in a more efficient way.

Args
initial_state The input state for the circuit. This can be a list of qudit values, a big endian int encoding the qudit values, a vector of amplitudes, or a tensor of amplitudes.

When this is an int, it refers to a computational basis state (e.g. 5 means initialize to |5⟩ = |...000101⟩).

If this is a vector of amplitudes (a flat numpy array of the correct length for the system) or a tensor of amplitudes (a numpy array whose shape equals this circuit's qid_shape), it directly specifies the initial state's amplitudes. The vector type must be convertible to the given dtype argument.

qubit_order Determines how qubits are ordered when passing matrices into np.kron.
qubits_that_should_be_present Qubits that may or may not appear in operations within the circuit, but that should be included regardless when generating the matrix.
ignore_terminal_measurements When set, measurements at the end of the circuit are ignored instead of causing the method to fail.
dtype The numpy dtype for the returned unitary. Defaults to np.complex128. Specifying np.complex64 will run faster at the cost of precision. dtype must be a complex np.dtype, unless all operations in the circuit have unitary matrices with exclusively real coefficients (e.g. an H + TOFFOLI circuit).

Returns
A (possibly gigantic) numpy array storing the superposition that came out of the circuit for the given input state.

Raises
ValueError The circuit contains measurement gates that are not ignored.
TypeError The circuit contains gates that don't have a known unitary matrix, e.g. gates parameterized by a Symbol.

findall_operations

View source

Find the locations of all operations that satisfy a given condition.

This returns an iterator of (index, operation) tuples where each operation satisfies op_cond(operation) is truthy. The indices are in order of the moments and then order of the ops within that moment.

Args
predicate A method that takes an Operation and returns a Truthy value indicating the operation meets the find condition.

Returns
An iterator (index, operation)'s that satisfy the op_condition.

findall_operations_between

View source

Finds operations between the two given frontiers.

If a qubit is in start_frontier but not end_frontier, its end index defaults to the end of the circuit. If a qubit is in end_frontier but not start_frontier, its start index defaults to the start of the circuit. Operations on qubits not mentioned in either frontier are not included in the results.

Args
start_frontier Just before where to start searching for operations, for each qubit of interest. Start frontier indices are inclusive.
end_frontier Just before where to stop searching for operations, for each qubit of interest. End frontier indices are exclusive.
omit_crossing_operations Determines whether or not operations that cross from a location between the two frontiers to a location outside the two frontiers are included or excluded. (Operations completely inside are always included, and operations completely outside are always excluded.)

Returns
A list of tuples. Each tuple describes an operation found between the two frontiers. The first item of each tuple is the index of the moment containing the operation, and the second item is the operation itself. The list is sorted so that the moment index increases monotonically.

findall_operations_until_blocked

View source

Finds all operations until a blocking operation is hit.

An operation is considered blocking if

a) It is in the 'light cone' of start_frontier.

AND

(

1) is_blocker returns a truthy value.

OR

2) It acts on a blocked qubit.

)

Every qubit acted on by a blocking operation is thereafter itself blocked.

The notion of reachability here differs from that in reachable_frontier_from in two respects:

1) An operation is not considered blocking only because it is in a moment before the start_frontier of one of the qubits on which it acts. 2) Operations that act on qubits not in start_frontier are not automatically blocking.

For every (moment_index, operation) returned:

1) moment_index >= min((start_frontier[q] for q in operation.qubits if q in start_frontier), default=0) 2) set(operation.qubits).intersection(start_frontier)

Below are some examples, where on the left the opening parentheses show start_frontier and on the right are the operations included (with their moment indices) in the output. F and T indicate that is_blocker return False or True, respectively, when applied to the gates; M indicates that it doesn't matter.

─(─F───F─────── ┄(─F───F─)┄┄┄┄┄ │ │ │ │ ─(─F───F───T─── => ┄(─F───F─)┄┄┄┄┄ │ ┊ ───────────T─── ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄

───M─────(─F─── ┄┄┄┄┄┄┄┄┄(─F─)┄┄ │ │ ┊ │ ───M───M─(─F─── ┄┄┄┄┄┄┄┄┄(─F─)┄┄ │ => ┊ ───────M───M─── ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ ┊ ───────────M─── ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄

───M─(─────M─── ┄┄┄┄┄()┄┄┄┄┄┄┄┄ │ │ ┊ ┊ ───M─(─T───M─── ┄┄┄┄┄()┄┄┄┄┄┄┄┄ │ => ┊ ───────T───M─── ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ ┊ ───────────M─── ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄

─(─F───F─── ┄(─F───F─)┄ │ │ => │ │ ───F─(─F─── ┄(─F───F─)┄

─(─F─────────── ┄(─F─)┄┄┄┄┄┄┄┄┄ │ │ ───F───F─────── ┄(─F─)┄┄┄┄┄┄┄┄┄ │ => ┊ ───────F───F─── ┄┄┄┄┄┄┄┄┄(─F─)┄ │ │ ─(─────────F─── ┄┄┄┄┄┄┄┄┄(─F─)┄

Args
start_frontier A starting set of reachable locations.
is_blocker A predicate that determines if operations block reachability. Any location covered by an operation that causes is_blocker to return True is considered to be an unreachable location.

Returns
A list of tuples. Each tuple describes an operation found between the start frontier and a blocking operation. The first item of each tuple is the index of the moment containing the operation, and the second item is the operation itself.

findall_operations_with_gate_type

View source

Find the locations of all gate operations of a given type.

Args
gate_type The type of gate to find, e.g. XPowGate or MeasurementGate.

Returns
An iterator (index, operation, gate)'s for operations with the given gate type.

freeze

View source

Creates a FrozenCircuit from this circuit.

If 'self' is a FrozenCircuit, the original object is returned.

get_independent_qubit_sets

View source

Divide circuit's qubits into independent qubit sets.

Independent qubit sets are the qubit sets such that there are no entangling gates between qubits belonging to different sets. If this is not possible, a sequence with a single factor (the whole set of circuit's qubits) is returned.

q0, q1, q2 = cirq.LineQubit.range(3)
circuit = cirq.Circuit()
circuit.append(cirq.Moment(cirq.H(q2)))
circuit.append(cirq.Moment(cirq.CZ(q0,q1)))
circuit.append(cirq.H(q0))
print(circuit)
0: ───────@───H───

1: ───────@───────
<BLANKLINE>
2: ───H───────────
[sorted(qs) for qs in circuit.get_independent_qubit_sets()]
[[cirq.LineQubit(0), cirq.LineQubit(1)], [cirq.LineQubit(2)]]

Returns
The list of independent qubit sets.

has_measurements

View source

insert

View source

Inserts operations into the circuit.

Operations are inserted into the moment specified by the index and 'InsertStrategy'. Moments within the operation tree are inserted intact.

Args
index The index to insert all of the operations at.
moment_or_operation_tree The moment or operation tree to insert.
strategy How to pick/create the moment to put operations into.

Returns
The insertion index that will place operations just after the operations that were inserted by this method.

Raises
ValueError Bad insertion strategy.

insert_at_frontier

View source

Inserts operations inline at frontier.

Args
operations The operations to insert.
start The moment at which to start inserting the operations.
frontier frontier[q] is the earliest moment in which an operation acting on qubit q can be placed.

insert_into_range

View source

Writes operations inline into an area of the circuit.

Args
start The start of the range (inclusive) to write the given operations into.
end The end of the range (exclusive) to write the given operations into. If there are still operations remaining, new moments are created to fit them.
operations An operation or tree of operations to insert.

Returns
An insertion index that will place operations after the operations that were inserted by this method.

Raises
IndexError Bad inline_start and/or inline_end.

next_moment_operating_on

View source

Finds the index of the next moment that touches the given qubits.

Args
qubits We're looking for operations affecting any of these qubits.
start_moment_index The starting point of the search.
max_distance The number of moments (starting from the start index and moving forward) to check. Defaults to no limit.

Returns
None if there is no matching moment, otherwise the index of the earliest matching moment.

Raises
ValueError negative max_distance.

next_moments_operating_on

View source

Finds the index of the next moment that touches each qubit.

Args
qubits The qubits to find the next moments acting on.
start_moment_index The starting point of the search.

Returns
The index of the next moment that touches each qubit. If there is no such moment, the next moment is specified as the number of moments in the circuit. Equivalently, can be characterized as one plus the index of the last moment after start_moment_index (inclusive) that does not act on a given qubit.

operation_at

View source

Finds the operation on a qubit within a moment, if any.

Args
qubit The qubit to check for an operation on.
moment_index The index of the moment to check for an operation within. Allowed to be beyond the end of the circuit.

Returns
None if there is no operation on the qubit at the given moment, or else the operation.

prev_moment_operating_on

View source

Finds the index of the next moment that touches the given qubits.

Args
qubits We're looking for operations affecting any of these qubits.
end_moment_index The moment index just after the starting point of the reverse search. Defaults to the length of the list of moments.
max_distance The number of moments (starting just before from the end index and moving backward) to check. Defaults to no limit.

Returns
None if there is no matching moment, otherwise the index of the latest matching moment.

Raises
ValueError negative max_distance.

qid_shape

View source

reachable_frontier_from

View source

Determines how far can be reached into a circuit under certain rules.

The location L = (qubit, moment_index) is reachable if and only if:

a) There is not a blocking operation covering L.

AND

[
    b1) qubit is in start frontier and moment_index =
        max(start_frontier[qubit], 0).

    OR

    b2) There is no operation at L and prev(L) = (qubit,
        moment_index-1) is reachable.

    OR

    b3) There is an (non-blocking) operation P covering L such that
        (q', moment_index - 1) is reachable for every q' on which P
        acts.
]

An operation in moment moment_index is blocking if

a) `is_blocker` returns a truthy value.

OR

b) The operation acts on a qubit not in start_frontier.

OR

c) The operation acts on a qubit q such that start_frontier[q] >
    moment_index.

In other words, the reachable region extends forward through time along each qubit in start_frontier until it hits a blocking operation. Any location involving a qubit not in start_frontier is unreachable.

For each qubit q in start_frontier, the reachable locations will correspond to a contiguous range starting at start_frontier[q] and ending just before some index end_q. The result of this method is a dictionary, and that dictionary maps each qubit q to its end_q.

Examples:

If start_frontier is { cirq.LineQubit(0): 6, cirq.LineQubit(1): 2, cirq.LineQubit(2): 2, } then the reachable wire locations in the following circuit are highlighted with '█' characters:

0   1   2   3   4   5   6   7   8   9   10  11  12  13
  • 0: ───H───@─────────────────█████████████████████─@───H─── │ │
  • 1: ───────@─██H███@██████████████████████─@───H───@─────── │ │
  • 2: ─────────██████@███H██─@───────@───H───@─────────────── │ │
  • 3: ───────────────────────@───H───@───────────────────────

And the computed end_frontier is { cirq.LineQubit(0): 11, cirq.LineQubit(1): 9, cirq.LineQubit(2): 6, }

Note that the frontier indices (shown above the circuit) are best thought of (and shown) as happening between moment indices.

If we specify a blocker as follows:

is_blocker=lambda: op == cirq.CZ(cirq.LineQubit(1),
                                 cirq.LineQubit(2))

and use this start_frontier:

{
    cirq.LineQubit(0): 0,
    cirq.LineQubit(1): 0,
    cirq.LineQubit(2): 0,
    cirq.LineQubit(3): 0,
}

Then this is the reachable area:

0   1   2   3   4   5   6   7   8   9   10  11  12  13
  • 0: ─██H███@██████████████████████████████████████─@───H─── │ │
  • 1: ─██████@███H██─@───────────────────────@───H───@─────── │ │
  • 2: ─█████████████─@───H───@───────@───H───@─────────────── │ │
  • 3: ─█████████████████████─@───H───@───────────────────────

and the computed end_frontier is:

{
    cirq.LineQubit(0): 11,
    cirq.LineQubit(1): 3,
    cirq.LineQubit(2): 3,
    cirq.LineQubit(3): 5,
}

Args
start_frontier A starting set of reachable locations.
is_blocker A predicate that determines if operations block reachability. Any location covered by an operation that causes is_blocker to return True is considered to be an unreachable location.

Returns
An end_frontier dictionary, containing an end index for each qubit q mapped to a start index by the given start_frontier dictionary.

To determine if a location (q, i) was reachable, you can use this expression:

q in start_frontier and start_frontier[q] <= i < end_frontier[q]

where i is the moment index, q is the qubit, and end_frontier is the result of this method.

save_qasm

View source

Save a QASM file equivalent to the circuit.

Args
file_path The location of the file where the qasm will be written.
header A multi-line string that is placed in a comment at the top of the QASM. Defaults to a cirq version specifier.
precision Number of digits to use when representing numbers.
qubit_order Determines how qubits are ordered in the QASM register.

tetris_concat

View source

Concatenates circuits while overlapping them if possible.

Starts with the first circuit (index 0), then iterates over the other circuits while folding them in. To fold two circuits together, they are placed one after the other and then moved inward until just before their operations would collide. If any of the circuits do not share qubits and so would not collide, the starts or ends of the circuits will be aligned, acording to the given align parameter.

Beware that this method is not associative. For example:

    a, b = cirq.LineQubit.range(2)
    A = cirq.Circuit(cirq.H(a))
    B = cirq.Circuit(cirq.H(b))
    f = cirq.Circuit.tetris_concat
    f(f(A, B), A) == f(A, f(B, A))
        False
    len(f(f(f(A, B), A), B)) == len(f(f(A, f(B, A)), B))
        False
        

Args
circuits The circuits to concatenate.
align When to stop when sliding the circuits together. 'left': Stop when the starts of the circuits align. 'right': Stop when the ends of the circuits align. 'first': Stop the first time either the starts or the ends align. Circuits are never overlapped more than needed to align their starts (in case the left circuit is smaller) or to align their ends (in case the right circuit is smaller)

Returns
The concatenated and overlapped circuit.

to_qasm

View source

Returns QASM equivalent to the circuit.

Args
header A multi-line string that is placed in a comment at the top of the QASM. Defaults to a cirq version specifier.
precision Number of digits to use when representing numbers.
qubit_order Determines how qubits are ordered in the QASM register.

to_quil

View source

to_text_diagram

View source

Returns text containing a diagram describing the circuit.

Args
use_unicode_characters Determines if unicode characters are allowed (as opposed to ascii-only diagrams).
transpose Arranges qubit wires vertically instead of horizontally.
include_tags Whether tags on TaggedOperations should be printed
precision Number of digits to display in text diagram
qubit_order Determines how qubits are ordered in the diagram.

Returns
The text diagram.

to_text_diagram_drawer

View source

Returns a TextDiagramDrawer with the circuit drawn into it.

Args
use_unicode_characters Determines if unicode characters are allowed (as opposed to ascii-only diagrams).
qubit_namer Names qubits in diagram. Defaults to str.
transpose Arranges qubit wires vertically instead of horizontally.
draw_moment_groups Whether to draw moment symbol or not
precision Number of digits to use when representing numbers.
qubit_order Determines how qubits are ordered in the diagram.
get_circuit_diagram_info Gets circuit diagram info. Defaults to protocol with fallback.

Returns
The TextDiagramDrawer instance.

transform_qubits

View source

Returns the same circuit, but with different qubits.

Note that this method does essentially the same thing as cirq.Circuit.with_device. It is included regardless because there are also transform_qubits methods on cirq.Operation and cirq.Moment.

Args
qubit_map A function or a dict mapping each current qubit into a desired new qubit.
new_device The device to use for the new circuit, if different. If this is not set, the new device defaults to the current device.

Returns
The receiving circuit but with qubits transformed by the given function, and with an updated device (if specified).

unfreeze

View source

Creates a Circuit from this circuit.

Args
copy If True and 'self' is a Circuit, returns a copy that circuit.

unitary

View source

Converts the circuit into a unitary matrix, if possible.

Returns the same result as cirq.unitary, but provides more options.

Args
qubit_order Determines how qubits are ordered when passing matrices into np.kron.
qubits_that_should_be_present Qubits that may or may not appear in operations within the circuit, but that should be included regardless when generating the matrix.
ignore_terminal_measurements When set, measurements at the end of the circuit are ignored instead of causing the method to fail.
dtype The numpy dtype for the returned unitary. Defaults to np.complex128. Specifying np.complex64 will run faster at the cost of precision. dtype must be a complex np.dtype, unless all operations in the circuit have unitary matrices with exclusively real coefficients (e.g. an H + TOFFOLI circuit).

Returns
A (possibly gigantic) 2d numpy array corresponding to a matrix equivalent to the circuit's effect on a quantum state.

Raises
ValueError The circuit contains measurement gates that are not ignored.
TypeError The circuit contains gates that don't have a known unitary matrix, e.g. gates parameterized by a Symbol.

with_device

View source

Maps the current circuit onto a new device, and validates.

Args
new_device The new device that the circuit should be on.
qubit_mapping How to translate qubits from the old device into qubits on the new device.

Returns
The translated circuit.

with_noise

View source

Make a noisy version of the circuit.

Args
noise The noise model to use. This describes the kind of noise to add to the circuit.

Returns
A new circuit with the same moment structure but with new moments inserted where needed when more than one noisy operation is generated for an input operation. Emptied moments are removed.

zip

View source

Combines operations from circuits in a moment-by-moment fashion.

Moment k of the resulting circuit will have all operations from moment k of each of the given circuits.

When the given circuits have different lengths, the shorter circuits are implicitly padded with empty moments. This differs from the behavior of python's built-in zip function, which would instead truncate the longer circuits.

The zipped circuits can't have overlapping operations occurring at the same moment index.

Args
circuits The circuits to merge together.

Returns
The merged circuit.

Raises
ValueError The zipped circuits have overlapping operations occurring at the same moment index.

Examples:

import cirq
a, b, c, d = cirq.LineQubit.range(4)
circuit1 = cirq.Circuit(cirq.H(a), cirq.CNOT(a, b))
circuit2 = cirq.Circuit(cirq.X(c), cirq.Y(c), cirq.Z(c))
circuit3 = cirq.Circuit(cirq.Moment(), cirq.Moment(cirq.S(d)))
print(circuit1.zip(circuit2))

* <b>`0`</b>: ───H───@───────

* <b>`1`</b>: ───────X───────
<BLANKLINE>
* <b>`2`</b>: ───X───Y───Z───
print(circuit1.zip(circuit2, circuit3))
* <b>`0`</b>: ───H───@───────

* <b>`1`</b>: ───────X───────
<BLANKLINE>
* <b>`2`</b>: ───X───Y───Z───
<BLANKLINE>
* <b>`3`</b>: ───────S───────
print(cirq.Circuit.zip(circuit3, circuit2, circuit1))
* <b>`0`</b>: ───H───@───────

* <b>`1`</b>: ───────X───────
<BLANKLINE>
* <b>`2`</b>: ───X───Y───Z───
<BLANKLINE>
* <b>`3`</b>: ───────S───────

__add__

View source

__bool__

View source

__eq__

View source

Return self==value.

__getitem__

View source

__iter__

View source

__len__

View source

__mul__

View source

__ne__

View source

Return self!=value.

__pow__

View source

A circuit raised to a power, only valid for exponent -1, the inverse.

This will fail if anything other than -1 is passed to the Circuit by returning NotImplemented. Otherwise this will return the inverse circuit, which is the circuit with its moment order reversed and for every moment all the moment's operations are replaced by its inverse. If any of the operations do not support inverse, NotImplemented will be returned.

__radd__

View source

__rmul__

View source