def async_job(qp: QuantumProgram,
              experiment: Experiment,
              block_missing_credits=True,
              use_sim=True):

    running_jobs: List[RunningExperimentData] = []
    done_jobs: List[RunningExperimentData] = []

    for algorithm_input in experiment.get_inputs():
        qasm, qobj, expected = experiment.create_experiment(
            qp, algorithm_input)

        executing_backend = models.backend_online_simulator if use_sim else experiment.backend

        my_credits = qp.get_api().get_my_credits()
        backend_status = qp.get_api().backend_status(executing_backend)

        log.debug("Current credits: %s" % my_credits["remaining"])
        log.debug("Current executing backend status: %s" % backend_status)

        while my_credits["remaining"] < 3 and block_missing_credits:
            time.sleep(10)
            my_credits = qp.get_api().get_my_credits()

            log.debug("Current credits: %s" % my_credits["remaining"])
            log.debug("Current executing backend status: %s" % backend_status)

        job_result = qp.get_api().run_job([{
            "qasm": qasm
        }],
                                          executing_backend,
                                          experiment.get_shots(),
                                          max_credits=3,
                                          seed=None)
        job_id = job_result["id"]

        job = RunningExperimentData(job_id, executing_backend,
                                    experiment.get_shots(), algorithm_input,
                                    expected, experiment)
        running_jobs.append(job)

        log.debug("Added job %s (%s)..." % (job_id, str(algorithm_input)))

    while len(running_jobs) > 0:
        for job_entry in running_jobs:
            job_result = qp.get_api().get_job(job_entry.job_id)

            log.debug("Checking job %s..." % (job_entry.job_id))
            if "status" in job_result and job_result["status"] == "COMPLETED":
                log.debug("Done job %s..." % (job_entry.job_id))
                running_jobs.remove(job_entry)
                job_entry.complete_job(job_result)
                done_jobs.append(job_entry)
        time.sleep(2)

    for job_entry in done_jobs:
        log.info(job_entry.to_log())

    commands.update_config_file()
예제 #2
0
def async_job(qp: QuantumProgram,
              experiment: Experiment,
              block_missing_credits=True):
    bits = ["0b00", "0b01", "0b10", "0b11"]

    running_jobs = []
    done_jobs = []

    for a, b in itertools.product(bits, bits):
        qasm, qobj, expected = experiment.create_experiment(qp, (a, b))
        shots = 1024

        credits = qp.get_api().get_my_credits()
        backend_status = qp.get_api().backend_status(experiment.backend)
        log.debug("Current credits: %s" % credits["remaining"])
        log.debug("Current backend status: %s" % backend_status)
        while credits["remaining"] < 3 and block_missing_credits:
            time.sleep(10)
            credits = qp.get_api().get_my_credits()
            log.debug("Current credits: %s" % credits["remaining"])
            log.debug("Current backend status: %s" % backend_status)

        job_result = qp.get_api().run_job([{
            "qasm": qasm
        }],
                                          experiment.backend,
                                          shots,
                                          max_credits=3,
                                          seed=None)
        jobId = job_result["id"]

        op_length = len(qasm.split("\n"))
        job = [
            experiment.backend, jobId, a, b, op_length, shots, expected,
            experiment.version
        ]
        log.debug("Added job %s (%s+%s)..." % (jobId, a, b))
        running_jobs.append(job)

    while len(running_jobs) > 0:
        for jobEntry in running_jobs:
            job_result = qp.get_api().get_job(jobEntry[1])
            log.debug("Checking job %s..." % (jobEntry[1]))
            if "status" in job_result and job_result["status"] == "COMPLETED":
                log.debug("Done job %s..." % (jobEntry[1]))
                running_jobs.remove(jobEntry)
                jobEntry.append(job_result)
                done_jobs.append(jobEntry)
        time.sleep(2)

    for jobEntry in done_jobs:
        result = jobEntry[8]
        computational_result = ""
        success = False
        counts = dict()
        calibrations = {}
        computational_result_prob = 0.0

        if "qasms" in result and len(
                result["qasms"]) == 1 and "data" in result["qasms"][0]:
            data = result["qasms"][0]["data"]
            if "counts" in data:
                counts: dict = data["counts"]
                computational_result = max(counts.keys(),
                                           key=(lambda key: counts[key]))
                success = jobEntry[6] == computational_result
                shots = jobEntry[5]
                computational_result_count = max(counts.values())
                computational_result_prob = float(
                    computational_result_count) / float(shots)
            if "calibration" in result:
                calibrations = result["calibration"]

        log_msg = "%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s" % (
            datetime.isoformat(datetime.now()), jobEntry[0], jobEntry[1],
            jobEntry[2], jobEntry[3], jobEntry[4], jobEntry[5], jobEntry[6],
            computational_result, computational_result_prob, success, counts,
            calibrations, jobEntry[7])
        log.info(log_msg)