Problem generators
Qaptiva provides batch generators used to both generate a quantum job (used to solve a combinatorial problem) and parse the result to return a user-friendly structure.
These batch generators can generate different types of job, to be compatible with different types of QPUs. The different types of jobs are:
These jobs are generated using the method qaoa_job() of CircuitGenerator by passing job_type="qaoa" to the constructor of the generator and are designed to be executed on a digital QPU. Two jobs will be submitted to the QPU:
a variational job to determine the best parameters
a sampling job to find an actual solution to the combinatorial problem
For instance, the following example uses MaxCutGenerator to generate jobs solving
the NP-Hard problem Max Cut on a graph given to this generator:
import networkx as nx
from qat.generators import MaxCutGenerator
graph = nx.full_rary_tree(3, 6)
# The job_type here can also be "aqo" or "sqa"
batches = MaxCutGenerator(job_type="qaoa").generate(None, graph)
This generator can be piped to a computation stack of plugins and a QPU, creating an Application. The Max Cut problem can then be solved by calling the execute() method.
import networkx as nx
from qat.generators import MaxCutGenerator
from qat.plugins import ScipyMinimizePlugin
from qat.qpus import get_default_qpu
graph = nx.full_rary_tree(3, 6)
max_cut_application = (
        MaxCutGenerator(job_type="qaoa")
        | ScipyMinimizePlugin(method="COBYLA", tol=1e-5, options={"maxiter": 200})
        | get_default_qpu()
)
combinatorial_result = max_cut_application.execute(graph)
print(combinatorial_result.subsets)
print(combinatorial_result.cost)
[[0, 4, 5], [1, 2, 3]]
-5.0
The parsed combinatorial result can also be displayed with NetworkX:
combinatorial_result.display()
These jobs are generated using the method
to_job()ofIsingby passingjob_type="sqa"to the constructor of the generator and are designed to be executed withSQAQPU.For instance, the following example uses
MaxCutGeneratorto generate jobs solving the NP-Hard problem Max Cut on a graph given to this generator:import networkx as nx from qat.generators import MaxCutGenerator graph = nx.full_rary_tree(3, 6) # The job_type here can also be "qaoa" or "aqo" batches = MaxCutGenerator(job_type="sqa").generate(None, graph)This generator can be piped to a computation stack of plugins and a QPU, creating an
Application. The Max Cut problem can then be solved by calling theexecute()method.
import networkx as nx from qat.generators import MaxCutGenerator from qat.qpus import SQAQPU graph = nx.full_rary_tree(3, 6) max_cut_application = ( MaxCutGenerator(job_type="sqa") | SQAQPU() ) combinatorial_result = max_cut_application.execute(graph) print(combinatorial_result.subsets) print(combinatorial_result.cost)[[1, 2, 3], [0, 4, 5]] -5.0
The parsed combinatorial result can also be displayed with NetworkX:
combinatorial_result.display()
These jobs are generated by passing job_type="aqo" to the constructor of the generator
and are designed to be executed on an analog QPU (or job_type="ryd" for Rydberg atom QPU).
For instance, the following example uses MaxCutGenerator to generate jobs solving the NP-Hard problem Max Cut on a graph given to this generator:
import networkx as nx
from qat.generators import MaxCutGenerator
graph = nx.full_rary_tree(3, 6)
# The job_type here can also be "qaoa" or "sqa"
batches = MaxCutGenerator(job_type="aqo").generate(None, graph)
This generator can be piped to a computation stack of plugins and a QPU, creating an Application. The Max Cut problem
can then be solved by calling the execute() method.
import networkx as nx
from qat.generators import MaxCutGenerator
from qat.qpus import AnalogQPU
graph = nx.full_rary_tree(3, 6)
max_cut_application = (
        MaxCutGenerator(job_type="aqo")
        | AnalogQPU()
)
combinatorial_result = max_cut_application.execute(graph)
print(combinatorial_result.subsets)
print(combinatorial_result.cost)
[[0, 4, 5], [1, 2, 3]]
-5.0
The parsed combinatorial result can also be displayed with NetworkX:
combinatorial_result.display()