Quantum submissions using sqcsub

We can use the sqcsub worker to run tasks on a QPU.

Example graph

from typing import NamedTuple
from uuid import UUID
from tierkreis import run_graph
from tierkreis.builder import GraphBuilder
from tierkreis.executor import ShellExecutor
from tierkreis.models import TKR
from tierkreis.storage import FileStorage, read_outputs
from workers.tkr_sqcsub.stubs import submit

from workers.consts import WORKERS_DIR


class SqcsubInput(NamedTuple):
    nqubits: TKR[int]
    nshots: TKR[int]
    iformat: TKR[str]
    oformat: TKR[str]
    input: TKR[bytes]
    qpu: TKR[str]


g = GraphBuilder(SqcsubInput, TKR[bytes])
res = g.task(
    submit(
        g.inputs.nqubits,
        g.inputs.nshots,
        g.inputs.input,
        g.inputs.iformat,
        g.inputs.oformat,
        g.inputs.qpu,
    )
)
g.outputs(res)


storage = FileStorage(UUID(int=106), do_cleanup=True)
executor = ShellExecutor(WORKERS_DIR, storage.workflow_dir)
TEST_QASM = """
OPENQASM 2.0;
include "hqslib1.inc";

qreg q[2];
creg c[2];
U1q(0.20000000000000012*pi,0.0*pi) q[0];
U1q(0.5*pi,0.5*pi) q[1];
RZZ(0.5*pi) q[0],q[1];
measure q[0] -> c[0];
U1q(0.5*pi,0.0*pi) q[1];
measure q[1] -> c[1];
"""

run_graph(
    storage,
    executor,
    g.get_data(),
    {
        "nqubits": 10,
        "nshots": 30,
        "iformat": "qasm",
        "input": TEST_QASM,
        "oformat": "raw",
        "qpu": "reimei-simulator",
    },
)
read_outputs(g.get_data(), storage)