def _permute_circuit(
        circuit: QuantumCircuit,
        measurement_qubits: Optional[Sequence[int]] = None,
        preparation_qubits: Optional[Sequence[int]] = None,
    ):
        """Permute circuit qubits.

        This permutes the circuit so that the specified preparation and measurement
        qubits correspond to input and output qubits [0, ..., N-1] respectively
        for the returned circuit.
        """
        if measurement_qubits is None and preparation_qubits is None:
            return circuit

        total_qubits = circuit.num_qubits
        total_clbits = circuit.num_clbits
        if total_clbits:
            perm_circ = QuantumCircuit(total_qubits, total_clbits)
        else:
            perm_circ = QuantumCircuit(total_qubits)

        # Apply permutation to put prep qubits as [0, ..., M-1]
        if preparation_qubits:
            prep_qargs = list(preparation_qubits)
            if len(preparation_qubits) != total_qubits:
                prep_qargs += [
                    i for i in range(total_qubits)
                    if i not in preparation_qubits
                ]
            perm_circ.append(
                Permutation(total_qubits, prep_qargs).inverse(),
                range(total_qubits))

        # Apply original circuit
        if total_clbits:
            perm_circ = perm_circ.compose(circuit, range(total_qubits),
                                          range(total_clbits))
        else:
            perm_circ = perm_circ.compose(circuit, range(total_qubits))

        # Apply permutation to put meas qubits as [0, ..., M-1]
        if measurement_qubits:
            meas_qargs = list(measurement_qubits)
            if len(measurement_qubits) != total_qubits:
                meas_qargs += [
                    i for i in range(total_qubits)
                    if i not in measurement_qubits
                ]
            perm_circ.append(Permutation(total_qubits, meas_qargs),
                             range(total_qubits))

        return perm_circ
    def _permute_circuit(self) -> QuantumCircuit:
        """Permute circuit qubits.

        This permutes the circuit so that the specified preparation and measurement
        qubits correspond to input and output qubits [0, ..., N-1] and [0, ..., M-1]
        respectively for the returned circuit.
        """
        default_range = tuple(range(self.num_qubits))
        permute_meas = self._meas_qubits and self._meas_qubits != default_range
        permute_prep = self._prep_qubits and self._prep_qubits != default_range
        if not permute_meas and not permute_prep:
            return self._circuit

        total_qubits = self._circuit.num_qubits
        total_clbits = self._circuit.num_clbits
        if total_clbits:
            perm_circ = QuantumCircuit(total_qubits, total_clbits)
        else:
            perm_circ = QuantumCircuit(total_qubits)

        # Apply permutation to put prep qubits as [0, ..., M-1]
        if self._prep_qubits:
            prep_qargs = list(self._prep_qubits)
            if len(self._prep_qubits) != total_qubits:
                prep_qargs += [
                    i for i in range(total_qubits)
                    if i not in self._prep_qubits
                ]
            perm_circ.append(
                Permutation(total_qubits, prep_qargs).inverse(),
                range(total_qubits))

        # Apply original circuit
        if total_clbits:
            perm_circ = perm_circ.compose(self._circuit, range(total_qubits),
                                          range(total_clbits))
        else:
            perm_circ = perm_circ.compose(self._circuit, range(total_qubits))

        # Apply permutation to put meas qubits as [0, ..., M-1]
        if self._meas_qubits:
            meas_qargs = list(self._meas_qubits)
            if len(self._meas_qubits) != total_qubits:
                meas_qargs += [
                    i for i in range(total_qubits)
                    if i not in self._meas_qubits
                ]
            perm_circ.append(Permutation(total_qubits, meas_qargs),
                             range(total_qubits))

        return perm_circ
예제 #3
0
 def test_permutation(self):
     """Test permutation circuit."""
     circuit = Permutation(n_qubits=4, pattern=[1, 0, 3, 2])
     expected = QuantumCircuit(4)
     expected.swap(0, 1)
     expected.swap(2, 3)
     self.assertEqual(circuit, expected)
예제 #4
0
def build_QFT_0_to_k(nWires, k, measure=False):
    r""" Builds the QFT on nWires wires up to the `k^{th}` state generates.
    
    Note that the whole QFT can be generated in Qiskit using the `QFT` method
    
    :param int nWires: number of wires
    :param int k: number of gates in the output
    :returns: QuantumCirctuit -- `k^{th}` first gates of the QFT circuit
    """
    partial_QFT = QuantumCircuit(nWires)
    gate_count = 0
    if gate_count == k:
        return partial_QFT
    for wire in range(nWires):
        partial_QFT.h(wire)
        gate_count += 1
        if gate_count == k:
            return partial_QFT
        for inlayer_nb in range(2, nWires - (wire - 1)):
            partial_QFT.cu1(np.pi / (2**inlayer_nb), wire,
                            inlayer_nb + (wire - 1))
            gate_count += 1
            if gate_count == k:
                return partial_QFT
        partial_QFT.barrier()
    SWAP = Permutation(nWires, [nWires - 1 - wire for wire in range(nWires)])
    meas = QuantumCircuit(nWires, nWires)
    meas.barrier(range(nWires))
    meas.measure(range(nWires), range(nWires))
    result = partial_QFT + SWAP + meas if measure else partial_QFT + SWAP
    return result
    def run(self, dag: DAGCircuit) -> DAGCircuit:
        """Run the LinearFunctionsToPermutations pass on `dag`.
        Args:
            dag: input dag.
        Returns:
            Output dag with LinearFunctions synthesized.
        """

        for node in dag.named_nodes("linear_function"):
            try:
                pattern = node.op.permutation_pattern()
            except CircuitError:
                continue

            permutation = Permutation(len(pattern), pattern)
            dag.substitute_node(node, permutation.to_instruction())
        return dag
 def test_permutation(self):
     """Test permutation circuit."""
     circuit = Permutation(num_qubits=4, pattern=[1, 0, 3, 2])
     expected = QuantumCircuit(4)
     expected.swap(0, 1)
     expected.swap(2, 3)
     expected = Operator(expected)
     simulated = Operator(circuit)
     self.assertTrue(expected.equiv(simulated))
예제 #7
0
    def test_permutation(self):
        """Test permutation circuit.

        TODO add a test using assertBooleanFunctionIsCorrect
        """
        circuit = Permutation(num_qubits=4, pattern=[1, 0, 3, 2])
        expected = QuantumCircuit(4)
        expected.swap(0, 1)
        expected.swap(2, 3)
        self.assertEqual(circuit, expected)