MainEngine
Extends:
The MainEngine class provides all functionality of the main compiler engine.
It initializes all further compiler engines (calls, e.g., .next_engine=...) and keeps track of measurement results and active qubits (and their IDs).
Attributes: next_engine (BasicEngine): Next compiler engine (or the back-end). main_engine (MainEngine): Self. active_qubits (WeakSet): WeakSet containing all active qubits dirty_qubits (Set): Containing all dirty qubit ids backend (BasicEngine): Access the back-end. mapper (BasicMapperEngine): Access to the mapper if there is one.
Constructor Summary
Public Constructor | ||
public |
constructor(backend: BasicEngine, engineList: Array<BasicEngine>, verbose: boolean) |
Member Summary
Public Members | ||
public |
activeQubits: * |
|
public |
backend: * |
|
public |
dirtyQubits: * |
|
public |
main: * |
|
public |
mapper: * |
|
public |
next: * |
|
public |
verbose: * |
Private Members | ||
private |
_measurements: {} |
|
private |
|
Method Summary
Public Methods | ||
public |
Destroy the main engine. |
|
public |
Flush the entire circuit down the pipeline, clearing potential buffers (of, e.g., optimizers). |
|
public |
getMeasurementResult(qubit: BasicQubit): * Return the classical value of a measured qubit, given that an engine registered this result previously (see setMeasurementResult). |
|
public |
Returns a unique qubit id to be used for the next qubit allocation. |
|
public |
Forward the list of commands to the first engine. |
|
public |
send(commandList: *) Forward the list of commands to the next engine in the pipeline. |
|
public |
setMeasurementResult(qubit: BasicQubit, value: boolean) Register a measurement result |
Inherited Summary
From class BasicEngine | ||
public |
|
|
public |
allocateQubit(dirty: boolean): Qureg Return a new qubit as a list containing 1 qubit object (quantum register of size 1). |
|
public |
allocateQureg(n: number): Qureg Allocate n qubits and return them as a quantum register, which is a list of qubit objects. |
|
public |
deallocateQubit(qubit: BasicQubit) Deallocate a qubit (and sends the deallocation command down the pipeline). |
|
public |
isAvailable(cmd: Command): boolean Default implementation of isAvailable: Ask the next engine whether a command is available, i.e., whether it can be executed by the next engine(s). |
|
public |
isMetaTagSupported(metaTag: function): boolean Check if there is a compiler engine handling the meta tag |
|
public |
receive() |
|
public |
Forward the list of commands to the next engine in the pipeline. |
Public Constructors
public constructor(backend: BasicEngine, engineList: Array<BasicEngine>, verbose: boolean) source
Override:
BasicEngine#constructorParams:
Name | Type | Attribute | Description |
backend | BasicEngine | Backend to send the compiled circuit to. |
|
engineList | Array<BasicEngine> | List of engines / backends to use as compiler engines. Note: The engine list must not contain multiple mappers (instances of BasicMapperEngine). Default: getEngineList() |
|
verbose | boolean | Either print full or compact error messages. Default: false (i.e. compact error messages). |
Example:
const eng = new MainEngine() // uses default engine_list and the Simulator
Instead of the default `engine_list` one can use, e.g., one of the IBM
setups which defines a custom `engine_list` useful for one of the IBM
chips
const eng = new MainEngine(new Simulator, getEngineList())
// eng uses the default Simulator backend
Alternatively, one can specify all compiler engines explicitly, e.g.,
const rule_set = new DecompositionRuleSet()
const engines = [new AutoReplacer(rule_set), new TagRemover(), new LocalOptimizer(3)]
const eng = new MainEngine(new Simulator(), engines)
Public Members
public activeQubits: * source
public backend: * source
public dirtyQubits: * source
public main: * source
public mapper: * source
public next: * source
public verbose: * source
Private Members
private _measurements: {} source
Public Methods
public deallocate() source
Destroy the main engine. Flushes the entire circuit down the pipeline, clearing all temporary buffers (in, e.g., optimizers).
public flush(deallocateQubits: boolean) source
Flush the entire circuit down the pipeline, clearing potential buffers (of, e.g., optimizers).
Params:
Name | Type | Attribute | Description |
deallocateQubits | boolean | If true, deallocates all qubits that are still alive (invalidating references to them by setting their id to -1). |
public getMeasurementResult(qubit: BasicQubit): * source
Return the classical value of a measured qubit, given that an engine registered this result previously (see setMeasurementResult).
Params:
Name | Type | Attribute | Description |
qubit | BasicQubit | Qubit of which to get the measurement result. |
Return:
* |
Example:
const eng = new MainEngine()
const qubit = eng.allocateQubit() // quantum register of size 1
H.or(qubit)
Measure.or(qubit)
eng.getMeasurementResult(qubit[0]) == qubit.toNumber()
public getNewQubitID(): number source
Returns a unique qubit id to be used for the next qubit allocation.
public receive(commandList: Command[]) source
Forward the list of commands to the first engine.
Override:
BasicEngine#receiveParams:
Name | Type | Attribute | Description |
commandList | Command[] | List of commands to receive (and then send on) |
public send(commandList: *) source
Forward the list of commands to the next engine in the pipeline. It also shortens exception stack traces if this.verbose is false.
Override:
BasicEngine#sendParams:
Name | Type | Attribute | Description |
commandList | * |
public setMeasurementResult(qubit: BasicQubit, value: boolean) source
Register a measurement result
The engine being responsible for measurement results needs to register these results with the master engine such that they are available when the user calls an int() or bool() conversion operator on a measured qubit.
Params:
Name | Type | Attribute | Description |
qubit | BasicQubit | Qubit for which to register the measurement result. |
|
value | boolean | Boolean value of the measurement outcome (true / false = 1 / 0 respectively). |