Asynchronous submissions

The default compile function in the client makes a synchronous call to the API. This blocks the python console until the results of the run have been sent back, which means that you cannot use it in the meantime. It is also possible to make an asynchronous submission using ParityOS. In that case, after submitting a problem, you do not need to wait for the results. In this file we will explain how this asynchronous process works.

Submission

Similar to the example in the quickstart section, you will need a optimization problem and device model to make an asynchronous submission. Then a submission can be made using an initialized client (see the quickstart section):

submission_id = compiler_client.submit(optimization_problem, device_model)

At this point the only important information to store is the submission_id. The submission_id can be used at any point to request the results of that submission.

Obtaining results

After some time, you can then request the solutions as follows:

compiler_runs = compiler_client.get_compiler_runs(submission_id)

For now the API will only return one compiler run per submission, so the list of compiler_runs will only have a single CompilerRun inside.

Note

The CompilerRun object holds all information about how the run went, including any exceptions that were raised in case of a failure.

The CompilerRun object can then be used to get the ParityOSOutput object, which is exactly the same data that CompilerClient.compile would return, like this:

parityos_outputs = compiler_client.get_solutions(compiler_run)

Where parityos_outputs is a list of ParityOSOutput objects. However, for now the API will only return a single solution per request, so this list will have a single element.

Examples

Here is an example of the code that can be used to make an asyncronous submission using an analog device:

from parityos import CompilerClient, ProblemRepresentation, Qubit, RectangularAnalogDevice


compiler_client = CompilerClient()
optimization_problem = ProblemRepresentation(
    interactions=[{Qubit(0), Qubit(1)}, {Qubit(1), Qubit(2)}, {Qubit(2), Qubit(0)}],
    coefficients=[1, 0.5, -0.7],
)
x, y = 2, 2  # the dimensions of the device
device_model = RectangularAnalogDevice(x, y)
submission_id = compiler_client.submit(optimization_problem, device_model)

At this point there should be a break, after which the results can be obtained using:

compiler_runs = compiler_client.get_compiler_runs(submission_id)
parityos_outputs = compiler_client.get_solutions(compiler_runs[0])