示例#1
0
def dag_to_circuit(dag):
    """Build a ``QuantumCircuit`` object from a ``DAGCircuit``.

    Args:
        dag (DAGCircuit): the input dag.

    Return:
        QuantumCircuit: the circuit representing the input dag.
    """
    circuit = QuantumCircuit()
    random_name = QuantumCircuit.cls_prefix() + \
        str(''.join(random.choice(string.ascii_lowercase) for i in range(8)))
    circuit.name = dag.name or random_name
    for qreg in dag.qregs.values():
        circuit.add_register(qreg)
    for creg in dag.cregs.values():
        circuit.add_register(creg)
    graph = dag.multi_graph
    for node in nx.topological_sort(graph):
        n = graph.nodes[node]
        if n['type'] == 'op':
            op = deepcopy(n['op'])
            op.qargs = n['qargs']
            op.cargs = n['cargs']
            op.circuit = circuit
            if 'condition' in n and n['condition']:
                op = op.c_if(*n['condition'])
            circuit._attach(op)

    return circuit
示例#2
0
def dag_to_circuit(dag):
    """Build a ``QuantumCircuit`` object from a ``DAGCircuit``.

    Args:
        dag (DAGCircuit): the input dag.

    Return:
        QuantumCircuit: the circuit representing the input dag.
    """
    qregs = collections.OrderedDict()
    for qreg in dag.qregs.values():
        qreg_tmp = QuantumRegister(qreg.size, name=qreg.name)
        qregs[qreg.name] = qreg_tmp
    cregs = collections.OrderedDict()
    for creg in dag.cregs.values():
        creg_tmp = ClassicalRegister(creg.size, name=creg.name)
        cregs[creg.name] = creg_tmp

    name = dag.name or None
    circuit = QuantumCircuit(*qregs.values(), *cregs.values(), name=name)

    for node in dag.node_nums_in_topological_order():
        n = dag.node(node)
        if n['type'] == 'op':
            qubits = []
            for qubit in n['qargs']:
                qubits.append(qregs[qubit[0].name][qubit[1]])

            clbits = []
            for clbit in n['cargs']:
                clbits.append(cregs[clbit[0].name][clbit[1]])

            # Get arguments for classical control (if any)
            if n['condition'] is None:
                control = None
            else:
                control = (n['condition'][0], n['condition'][1])

            def duplicate_instruction(inst):
                """Create a fresh instruction from an input instruction."""
                if inst.name == 'barrier':
                    params = [inst.qargs]
                elif inst.name == 'snapshot':
                    params = inst.params + [inst.qargs]
                else:
                    params = inst.params + inst.qargs + inst.cargs
                new_inst = inst.__class__(*params)
                return new_inst

            inst = duplicate_instruction(n['op'])
            inst.control = control
            circuit._attach(inst)

    return circuit