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()
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)