DAGCircuit#
- class qiskit.dagcircuit.DAGCircuit[ソース]#
ベースクラス:
object
Quantum circuit as a directed acyclic graph.
There are 3 types of nodes in the graph: inputs, outputs, and operations. The nodes are connected by directed edges that correspond to qubits and bits.
Create an empty circuit.
Attributes
- calibrations#
Return calibration dictionary.
- The custom pulse definition of a given gate is of the form
{『gate_name』: {(qubits, params): schedule}}
- global_phase#
Return the global phase of the circuit.
- node_counter#
Returns the number of nodes in the dag.
- wires#
Return a list of the wires in order.
Methods
- add_calibration(gate, qubits, schedule, params=None)[ソース]#
Register a low-level, custom pulse definition for the given gate.
- apply_operation_back(op, qargs=(), cargs=())[ソース]#
Apply an operation to the output of the circuit.
- パラメータ:
op (qiskit.circuit.Operation) – the operation associated with the DAG node
- 戻り値:
the node for the op that was added to the dag
- 戻り値の型:
- 例外:
DAGCircuitError – if a leaf node is connected to multiple outputs
- apply_operation_front(op, qargs=(), cargs=())[ソース]#
Apply an operation to the input of the circuit.
- パラメータ:
op (qiskit.circuit.Operation) – the operation associated with the DAG node
- 戻り値:
the node for the op that was added to the dag
- 戻り値の型:
- 例外:
DAGCircuitError – if initial nodes connected to multiple out edges
- bfs_successors(node)[ソース]#
Returns an iterator of tuples of (DAGNode, [DAGNodes]) where the DAGNode is the current node and [DAGNode] is its successors in BFS order.
- classical_predecessors(node)[ソース]#
Returns iterator of the predecessors of a node that are connected by a classical edge as DAGOpNodes and DAGInNodes.
- classical_successors(node)[ソース]#
Returns iterator of the successors of a node that are connected by a classical edge as DAGOpNodes and DAGInNodes.
- collect_runs(namelist)[ソース]#
Return a set of non-conditional runs of 「op」 nodes with the given names.
For example, 「… h q[0]; cx q[0],q[1]; cx q[0],q[1]; h q[1]; ..」 would produce the tuple of cx nodes as an element of the set returned from a call to collect_runs([「cx」]). If instead the cx nodes were 「cx q[0],q[1]; cx q[1],q[0];」, the method would still return the pair in a tuple. The namelist can contain names that are not in the circuit’s basis.
Nodes must have only one successor to continue the run.
- compose(other, qubits=None, clbits=None, front=False, inplace=True)[ソース]#
Compose the
other
circuit onto the output of this circuit.A subset of input wires of
other
are mapped to a subset of output wires of this circuit.other
can be narrower or of equal width toself
.- パラメータ:
other (DAGCircuit) – circuit to compose with self
front (bool) – If True, front composition will be performed (not implemented yet)
inplace (bool) – If True, modify the object. Otherwise return composed circuit.
- 戻り値:
the composed dag (returns None if inplace==True).
- 戻り値の型:
- 例外:
DAGCircuitError – if
other
is wider or there are duplicate edge mappings.
- copy_empty_like()[ソース]#
Return a copy of self with the same structure but empty.
- That structure includes:
name and other metadata
global phase
duration
all the qubits and clbits, including the registers.
- 戻り値:
An empty copy of self.
- 戻り値の型:
- count_ops(*, recurse=True)[ソース]#
Count the occurrences of operation names.
- パラメータ:
recurse (bool) – if
True
(default), then recurse into control-flow operations. In all cases, this counts only the number of times the operation appears in any possible block; both branches of if-elses are counted, and for- and while-loop blocks are only counted once.- 戻り値:
a mapping of operation names to the number of times it appears.
- 戻り値の型:
- count_ops_longest_path()[ソース]#
Count the occurrences of operation names on the longest path.
Returns a dictionary of counts keyed on the operation name.
- depth(*, recurse=False)[ソース]#
Return the circuit depth. If there is control flow present, this count may only be an estimate, as the complete control-flow path cannot be statically known.
- パラメータ:
recurse (bool) – if
True
, then recurse into control-flow operations. For loops with known-length iterators are counted as if the loop had been manually unrolled (i.e. with each iteration of the loop body written out explicitly). If-else blocks take the longer case of the two branches. While loops are counted as if the loop body runs once only. Defaults toFalse
and raisesDAGCircuitError
if any control flow is present, to avoid silently returning a nonsensical number.- 戻り値:
the circuit depth
- 戻り値の型:
- 例外:
DAGCircuitError – if not a directed acyclic graph
DAGCircuitError – if unknown control flow is present in a recursive call, or any control flow is present in a non-recursive call.
- draw(scale=0.7, filename=None, style='color')[ソース]#
Draws the dag circuit.
This function needs pydot, which in turn needs Graphviz to be installed.
- edges(nodes=None)[ソース]#
Iterator for edge values and source and dest node
This works by returning the output edges from the specified nodes. If no nodes are specified all edges from the graph are returned.
- パラメータ:
nodes (DAGOpNode, DAGInNode, or DAGOutNode|list(DAGOpNode, DAGInNode, or DAGOutNode) – Either a list of nodes or a single input node. If none is specified, all edges are returned from the graph.
- 列挙:
edge –
- the edge in the same format as out_edges the tuple
(source node, destination node, edge data)
- find_bit(bit)[ソース]#
Finds locations in the circuit, by mapping the Qubit and Clbit to positional index BitLocations is defined as: BitLocations = namedtuple(「BitLocations」, (「index」, 「registers」))
- パラメータ:
bit (Bit) – The bit to locate.
- 戻り値:
- A 2-tuple. The first element (
index
) contains the index at which the
Bit
can be found (in eitherqubits
,clbits
, depending on its type). The second element (registers
) is a list of(register, index)
pairs with an entry for eachRegister
in the circuit which contains theBit
(and the index in theRegister
at which it can be found).
- A 2-tuple. The first element (
- 戻り値の型:
namedtuple(int, List[Tuple(Register, int)])
- Raises:
DAGCircuitError: If the supplied
Bit
was of an unknown type. DAGCircuitError: If the suppliedBit
could not be found on the circuit.
- has_calibration_for(node)[ソース]#
Return True if the dag has a calibration defined for the node operation. In this case, the operation does not need to be translated to the device basis.
- idle_wires(ignore=None)[ソース]#
Return idle wires.
- パラメータ:
ignore (list(str)) – List of node names to ignore. Default: []
- 列挙:
Bit – Bit in idle wire.
- 例外:
DAGCircuitError – If the DAG is invalid
- layers()[ソース]#
Yield a shallow view on a layer of this DAGCircuit for all d layers of this circuit.
A layer is a circuit whose gates act on disjoint qubits, i.e., a layer has depth 1. The total number of layers equals the circuit depth d. The layers are indexed from 0 to d-1 with the earliest layer at index 0. The layers are constructed using a greedy algorithm. Each returned layer is a dict containing {「graph」: circuit graph, 「partition」: list of qubit lists}.
The returned layer contains new (but semantically equivalent) DAGOpNodes, DAGInNodes, and DAGOutNodes. These are not the same as nodes of the original dag, but are equivalent via DAGNode.semantic_eq(node1, node2).
TODO: Gates that use the same cbits will end up in different layers as this is currently implemented. This may not be the desired behavior.
- longest_path()[ソース]#
Returns the longest path in the dag as a list of DAGOpNodes, DAGInNodes, and DAGOutNodes.
- multi_qubit_ops()[ソース]#
Get list of 3+ qubit operations. Ignore directives like snapshot and barrier.
- node(node_id)[ソース]#
Get the node in the dag.
- パラメータ:
node_id (int) – Node identifier.
- 戻り値:
the node.
- 戻り値の型:
node
- nodes_on_wire(wire, only_ops=False)[ソース]#
Iterator for nodes that affect a given wire.
- パラメータ:
- 列挙:
Iterator – the successive nodes on the given wire
- 例外:
DAGCircuitError – if the given wire doesn’t exist in the DAG
- num_qubits()[ソース]#
Return the total number of qubits used by the circuit. num_qubits() replaces former use of width(). DAGCircuit.width() now returns qubits + clbits for consistency with Circuit.width() [qiskit-terra #2564].
- op_nodes(op=None, include_directives=True)[ソース]#
Get the list of 「op」 nodes in the dag.
- パラメータ:
op (Type) –
qiskit.circuit.Operation
subclass op nodes to return. If None, return all op nodes.include_directives (bool) – include barrier, snapshot etc.
- 戻り値:
the list of node ids containing the given op.
- 戻り値の型:
- predecessors(node)[ソース]#
Returns iterator of the predecessors of a node as DAGOpNodes and DAGInNodes.
- quantum_causal_cone(qubit)[ソース]#
Returns causal cone of a qubit.
A qubit’s causal cone is the set of qubits that can influence the output of that qubit through interactions, whether through multi-qubit gates or operations. Knowing the causal cone of a qubit can be useful when debugging faulty circuits, as it can help identify which wire(s) may be causing the problem.
This method does not consider any classical data dependency in the
DAGCircuit
, classical bit wires are ignored for the purposes of building the causal cone.
- quantum_predecessors(node)[ソース]#
Returns iterator of the predecessors of a node that are connected by a quantum edge as DAGOpNodes and DAGInNodes.
- quantum_successors(node)[ソース]#
Returns iterator of the successors of a node that are connected by a quantum edge as Opnodes and DAGOutNodes.
- remove_clbits(*clbits)[ソース]#
Remove classical bits from the circuit. All bits MUST be idle. Any registers with references to at least one of the specified bits will also be removed.
- パラメータ:
clbits (List[Clbit]) – The bits to remove.
- 例外:
DAGCircuitError – a clbit is not a
Clbit
, is not in the circuit, or is not idle.
- remove_cregs(*cregs)[ソース]#
Remove classical registers from the circuit, leaving underlying bits in place.
- 例外:
DAGCircuitError – a creg is not a ClassicalRegister, or is not in
the circuit. –
- remove_qregs(*qregs)[ソース]#
Remove classical registers from the circuit, leaving underlying bits in place.
- 例外:
DAGCircuitError – a qreg is not a QuantumRegister, or is not in
the circuit. –
- remove_qubits(*qubits)[ソース]#
Remove quantum bits from the circuit. All bits MUST be idle. Any registers with references to at least one of the specified bits will also be removed.
- パラメータ:
qubits (List[Qubit]) – The bits to remove.
- 例外:
DAGCircuitError – a qubit is not a
Qubit
, is not in the circuit, or is not idle.
- replace_block_with_op(node_block, op, wire_pos_map, cycle_check=True)[ソース]#
Replace a block of nodes with a single node.
This is used to consolidate a block of DAGOpNodes into a single operation. A typical example is a block of gates being consolidated into a single
UnitaryGate
representing the unitary matrix of the block.- パラメータ:
node_block (List[DAGNode]) – A list of dag nodes that represents the node block to be replaced
op (qiskit.circuit.Operation) – The operation to replace the block with
wire_pos_map (Dict[Bit, int]) – The dictionary mapping the bits to their positions in the output
qargs
orcargs
. This is necessary to reconstruct the arg order over multiple gates in the combined single op node. If aBit
is not in the dictionary, it will not be added to the args; this can be useful when dealing with control-flow operations that have inherent bits in theircondition
ortarget
fields.cycle_check (bool) – When set to True this method will check that replacing the provided
node_block
with a single node would introduce a cycle (which would invalidate theDAGCircuit
) and will raise aDAGCircuitError
if a cycle would be introduced. This checking comes with a run time penalty. If you can guarantee that your inputnode_block
is a contiguous block and won’t introduce a cycle when it’s contracted to a single node, this can be set toFalse
to improve the runtime performance of this method.
- 例外:
DAGCircuitError – if
cycle_check
is set toTrue
and replacing the specified block introduces a cycle or ifnode_block
is empty.- 戻り値:
The op node that replaces the block.
- 戻り値の型:
- separable_circuits(remove_idle_qubits=False)[ソース]#
Decompose the circuit into sets of qubits with no gates connecting them.
- パラメータ:
remove_idle_qubits (bool) – Flag denoting whether to remove idle qubits from the separated circuits. If
False
, each output circuit will contain the same number of qubits asself
.- 戻り値:
- The circuits resulting from separating
self
into sets of disconnected qubits
- The circuits resulting from separating
- 戻り値の型:
List[DAGCircuit]
Each
DAGCircuit
instance returned by this method will contain the same number of clbits asself
. The global phase information inself
will not be maintained in the subcircuits returned by this method.
- serial_layers()[ソース]#
Yield a layer for all gates of this circuit.
A serial layer is a circuit with one gate. The layers have the same structure as in layers().
- size(*, recurse=False)[ソース]#
Return the number of operations. If there is control flow present, this count may only be an estimate, as the complete control-flow path cannot be statically known.
- パラメータ:
recurse (bool) – if
True
, then recurse into control-flow operations. For loops with known-length iterators are counted unrolled. If-else blocks sum both of the two branches. While loops are counted as if the loop body runs once only. Defaults toFalse
and raisesDAGCircuitError
if any control flow is present, to avoid silently returning a mostly meaningless number.- 戻り値:
the circuit size
- 戻り値の型:
- 例外:
DAGCircuitError – if an unknown
ControlFlowOp
is present in a call withrecurse=True
, or any control flow is present in a non-recursive call.
- substitute_node(node, op, inplace=False, propagate_condition=True)[ソース]#
Replace an DAGOpNode with a single operation. qargs, cargs and conditions for the new operation will be inferred from the node to be replaced. The new operation will be checked to match the shape of the replaced operation.
- パラメータ:
node (DAGOpNode) – Node to be replaced
op (qiskit.circuit.Operation) – The
qiskit.circuit.Operation
instance to be added to the DAGinplace (bool) – Optional, default False. If True, existing DAG node will be modified to include op. Otherwise, a new DAG node will be used.
propagate_condition (bool) – Optional, default True. If True, a condition on the
node
to be replaced will be applied to the newop
. This is the legacy behaviour. If either node is a control-flow operation, this will be ignored. If theop
already has a condition,DAGCircuitError
is raised.
- 戻り値:
the new node containing the added operation.
- 戻り値の型:
- 例外:
DAGCircuitError – If replacement operation was incompatible with
location of target node. –
- substitute_node_with_dag(node, input_dag, wires=None, propagate_condition=True)[ソース]#
Replace one node with dag.
- パラメータ:
node (DAGOpNode) – node to substitute
input_dag (DAGCircuit) – circuit that will substitute the node
wires (list[Bit] | Dict[Bit, Bit]) – gives an order for (qu)bits in the input circuit. If a list, then the bits refer to those in the
input_dag
, and the order gets matched to the node wires by qargs first, then cargs, then conditions. If a dictionary, then a mapping of bits in theinput_dag
to those that thenode
acts on.propagate_condition (bool) – If
True
(default), then anycondition
attribute on the operation withinnode
is propagated to each node in theinput_dag
. IfFalse
, then theinput_dag
is assumed to faithfully implement suitable conditional logic already. This is ignored forControlFlowOp
s (i.e. treated as if it isFalse
); replacements of those must already fulfil the same conditional logic or this function would be close to useless for them.
- 戻り値:
maps node IDs from input_dag to their new node incarnations in self.
- 戻り値の型:
- 例外:
DAGCircuitError – if met with unexpected predecessor/successors
- swap_nodes(node1, node2)[ソース]#
Swap connected nodes e.g. due to commutation.
- パラメータ:
node1 (OpNode) – predecessor node
node2 (OpNode) – successor node
- 例外:
DAGCircuitError – if either node is not an OpNode or nodes are not connected
- topological_nodes(key=None)[ソース]#
Yield nodes in topological order.
- パラメータ:
key (Callable) – A callable which will take a DAGNode object and return a string sort key. If not specified the
sort_key
attribute will be used as the sort key for each node.- 戻り値:
node in topological order
- 戻り値の型:
generator(DAGOpNode, DAGInNode, or DAGOutNode)
- topological_op_nodes(key=None)[ソース]#
Yield op nodes in topological order.
Allowed to pass in specific key to break ties in top order
- パラメータ:
key (Callable) – A callable which will take a DAGNode object and return a string sort key. If not specified the
sort_key
attribute will be used as the sort key for each node.- 戻り値:
op node in topological order
- 戻り値の型:
generator(DAGOpNode)
- width()[ソース]#
Return the total number of qubits + clbits used by the circuit. This function formerly returned the number of qubits by the calculation return len(self._wires) - self.num_clbits() but was changed by issue #2564 to return number of qubits + clbits with the new function DAGCircuit.num_qubits replacing the former semantic of DAGCircuit.width().