qat.plugins.PatternManager
This plugin can compile or optimize quantum circuits by replacing a subcircuit by an equivalent subcircuit. This plugin needs to be configured to perform the right changes in the circuit. A dedicated section in the user guide explains how to configure this plugin.
- class qat.plugins.PatternManager(*args, **kwargs)
Defines an instance of Pattern Manager. A
PatternManagerwill update any circuit to maximize a metric.A
local_metricwill be used to calculate the local score of any pattern. The first step of this manager is to replace a pattern by an equivalent pattern having a strict better local score.Then, if some patterns have the same best local score, a
global_metricwill be used to select the pattern which maximize the global score of the circuit- Parameters:
local_metric (fun<Circuit -> float>, optional) – local metric
global_metric (fun<Circuit -> float>, optional) – global metric
groups (list<
PatternGroup>, optional) – list of groups to link to this pattern managercollections (list<collections>, optional) – list of collections to link to this pattern manager. A collection is a list of
PatternGroupgate_set (
GateSet, optional) – Gate set used to castGraphCircuitobjects used internally intoCircuitobjects
- add_abstract_gate(abstract_gate, constructor=None)
Internally, the
PatternManagerdoes not manipulateCircuitobjects. During the optimization, thePatternManagermust be able to cast data structures used internally intoCircuit(to compute metrics or to return aCircuitat the end of the optimization).This method is used to define gates that are not part of the default gate set (to use these gates in some patterns):
from qat.lang.AQASM import AbstractGate from qat.pbo import PatternManager # Define an abstract gate my_gate = AbstractGate("MY_GATE", [], 1) # Define a manager manager = PatternManager() manager.add_abstract_gate(my_gate) print("The gate 'MY_GATE' can now be used in patterns of 'manager'")
The gate 'MY_GATE' can now be used in patterns of 'manager'
Note
The constructor of
PatternManageraccepts aGateSetin argument. Passing a gate set in argument or adding abstract gates one by one are equivalent- Parameters:
abstract_gate (
AbstractGate) – abstract gate
- compile(batch, specs)
Compile a
Batch. This method will call the methodreplace_pattern()to optimize each job composing the batch (to override the default arguments of this method, please refer toset_compile_attributes())- Parameters:
batch (
Batch) – batch to optimizespecs (
HardwareSpecs) – specs of the QPU that this plugin will optimize for
- Returns:
optimized batch
- Return type:
- new_group()
Return a
PatternGrouplinked to thisPatternManager. A group is a set of equivalent patterns. Created groups are used to perform local changes in circuits to optimize them. Please refer the methodreplace_pattern()for further information.from qat.pbo import PatternManager manager = PatternManager() # Define a a group of equivalent patterns group = manager.new_group() group.add_pattern([("SWAP", {0, 1})]) group.add_pattern([("CNOT", [0, 1]), ("CNOT", [1, 0]), ("CNOT", [0, 1])])
- Returns:
- replace_pattern(circ, method='gradient', window_size=1, max_iterations=250, temperature=1000, trace=None)
Replace some patterns in a circuit by an equivalent one with to improve the circuit
- Parameters:
circ (
qat.core.Circuitorqat.pbo.GraphCircuit)method (str, optional) –
heuristic used to optimize globally. Two heuristics are implemented:
”gradient” (default) -> Gradient Descent
”annealing” -> Simulated annealing
window_size (int, optional) – size of the window for the global optimization - used if
method == "gradient"(Default value: 1)max_iterations (int, optional) – maximum number of iteration for the global optimization - used if
method == "annealing"(Default value: 250)temperature (int, optional) – temperature of the simulated annealing - used if
method == "annealing"(Default value: 1000)trace (list, optional) – if a list is given, values of the metric will be inserted at each step
- Returns:
Resulting circuit. The result is either a
qat.core.CircuitorNoneIf a circuit was given in argument: the result is an optimized equivalent circuit
If a graph was given in argument: the optimal circuit is contained in the GraphCircuit object given in argument
- Return type:
CircuitorNone
- set_compile_attributes(**kwargs)
The
compile()method will call the methodreplace_pattern()to optimize each job composing the batch. This method will override the default arguments used by the methodreplace_pattern().from qat.plugins import PatternManager manager = PatternManager() manager.set_compile_attributes(method="annealing") print("The 'compile' method will use the 'annealing' method to optimize " "the batches")
The 'compile' method will use the 'annealing' method to optimize the batches
Note
Parameters used for the optimization could be overrided for a specific batch, by updating the meta-data of this batch
from json import dumps as json_dumps from qat.core import Batch # Define a batch batch = Batch(jobs=[...]) # Define the options to optimize this batch options = dict(method="gradient", window_size=2) batch.meta_data = {"PatternManager": json_dumps(options)}
- Keyword Arguments:
method (str, optional) – optimization method (cf.
replace_pattern()for more information)window_size (int, optional) – size of windows used during optimization (cf.
replace_pattern()for more information)max_iterations (int, optional) – maximal number of iteration (cf.
replace_pattern()for more information)temparature (int, optional) – temperature used for the simulated annealing (cf.
replace_pattern()for more information)