ExecutionResult
An ExecutionResult is the struct you receive from a call to either execute_on_qvm or execute_on_qpu. This struct is implemented as a tagged union, describing the possible outcomes of program execution.
SAFETY
You must pass this struct to free_execution_result when you're done with it to avoid leaking the memory.
Any RegisterData which was retrieved from this result will be freed when this is called.
Definition
typedef struct ExecutionResult {
ExecutionResult_Tag tag;
union {
struct {
struct ExecutionData success;
};
struct {
char *error;
};
};
} ExecutionResult;
Variants
There are multiple variants of ExecutionResult. The tag attribute determines which is in use via an enum:
typedef enum ExecutionResult_Tag {
ExecutionResult_Success,
ExecutionResult_Error,
} ExecutionResult_Tag;
The Error variant indicates that execution failed. The Success variant is populated in the case of a successful run, and contains an ExecutionData.
Error
If something goes wrong, tag will be ExecutionResult_Error, indicating it is the Error variant. This variant is a human-readable string of the error that occurred.
Error Example
Here, result.error is that string:
unsigned int shots = 3;
Executable *exe = executable_from_quil(BELL_STATE_PROGRAM);
wrap_in_shots(exe, shots);
ExecutionResult *result = execute_on_qvm(exe);
if (result->tag == ExecutionResult_Error) {
return fail(
TEST_NAME,
result->error,
exe,
result
);
}
Success
If there is not an error, tag will instead be ExecutionResult_Success. The success attribute is an ExecutionData.
Handle Example
const RegisterData *ro = get_data(result->success.handle, "ro");
if (ro == NULL) {
return fail(
TEST_NAME,
"ro register was not in result",
exe,
result
);
}