Exemplo n.º 1
0
    def job_factory(matrix, num_shots, shots_multiplier, add_measurements):
        if matrix is None:
            raise NotImplementedError("The matrix is Not specified")
        num_qubits = matrix["qubits"]
        num_ancillas = matrix["ancillas"]

        if num_ancillas != 1:
            raise NotImplementedError(
                "The general HHL circuit generation is not yet implemented!")

        # Build block-encoding of A
        block_encoding = Circuit()
        HHLJob.list_to_circuit(matrix["circuit"], block_encoding)
        # block_encoding.draw()

        # Angles describing the polynomial inverting A
        angles = matrix["angles"]

        # Quanutm Singular Value Transformation
        qsvt_circuit = HHLJob.create_qsvt_circuit(
            num_qubits,
            num_ancillas,
            add_measurements,
            block_encoding.adjoint(),
            block_encoding,
            angles,
        )

        # For debug purposes
        # reorder = QuantumCircuit(num_qubits+1)
        # reorder.swap(0,3)
        # reorder.swap(1,2)

        # Debugging the circuit
        # print(block_encoding)
        # print_unitary=reorder.compose(block_encoding,qubits=list(range(1,num_qubits + 1))).extend(reorder)
        # #job execution and getting the unitary matrix of the circuit
        # job = execute(print_unitary, BasicAer.get_backend('unitary_simulator'))
        # print(DataFrame(job.result().get_unitary(print_unitary, decimals=2)))

        # raise NotImplementedError("Stop now")

        # Debugging the circuit
        # print(qsvt_circuit)
        # print_unitary=reorder.combine(qsvt_circuit).extend(reorder)
        # # job execution and getting the unitary matrix of the circuit
        # job = execute(print_unitary, BasicAer.get_backend('unitary_simulator'))
        # print(DataFrame(job.result().get_unitary(print_unitary, decimals=2)))

        used_qubits = num_qubits - num_ancillas

        for m_idx in range(shots_multiplier):
            for basis_vec in range(0, 2**used_qubits):
                instance_circuit = Circuit()
                # Here we assume that there is a single ancilla
                instance_circuit.x(1)
                for i in range(used_qubits):
                    if basis_vec % 2**(i + 1) >= 2**i:
                        instance_circuit.x(num_qubits - i)
                instance_circuit.add_circuit(qsvt_circuit)

                yield HHLJob(
                    instance_circuit,
                    num_qubits,
                    num_ancillas,
                    basis_vec,
                    num_shots,
                    m_idx,
                    add_measurements,
                )