loom.executor.eka_to_guppylang_converter
Copyright 2024 Entropica Labs Pte Ltd
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- class loom.executor.eka_to_guppylang_converter.EkaToGuppylangConverter(**data)[source]
Bases:
Converter[tuple[str, dict[str, int], dict[str, int]], Any]Convert Eka circuit format to Guppylang program.
In the program, the quantum registers are represented as an array of qubits named q, and the classical registers are represented as an array of booleans named c.
The program is generated as a string of Guppylang code, assuming the following import prefixes by default:
guppylang.std.quantum as guppyQ.
guppylang.std.qsystem as guppyQSys.
guppylang.std.builtins as builtins.
Note: the user also needs to import array from guppylang.std.builtins to use arrays in the generated program (it is not exposed by the builtins by default).
This can be customized via the constructor parameters.
- Parameters:
quantum_prefix (str) – The import prefix for quantum operations in Guppylang.
qsystem_prefix (str) – The import prefix for Qsys operations in Guppylang.
builtins_prefix (str) – The import prefix for built-in functions in Guppylang.
Create a new model by parsing and validating input data from keyword arguments.
Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model.
self is explicitly positional-only to allow self as a field name.
- ALLOW_ERROR_MODELS: bool
- SUPPORTED_OPERATIONS: frozenset[OpSignature]
- builtins_prefix: str
- convert_circuit(input_circuit)[source]
Convert a Circuit to Guppy program string.
- Parameters:
input_circuit (Circuit) – The Eka Circuit to convert.
- Returns:
The Guppy program string representing the converted circuit.
- Return type:
str
- emit_init_instructions(circuit)[source]
Generate Guppy code to initialize quantum and classical registers.
- Parameters:
circuit (Circuit) – The circuit for which to initialize registers.
- Returns:
A tuple containing:
The Guppy code string to initialize the registers.
A mapping from quantum channel IDs to a string of the variable name in the program (e.g. “q[0]”).
A mapping from classical channel IDs to a string of the variable name in the program (e.g. “c[0]”).
- Return type:
tuple[str, dict[str, str], dict[str, str]]
- emit_leaf_circuit_instruction(circuit, quantum_channel_map, classical_channel_map)[source]
Generate a string of the Guppy code of an given Eka instruction.
- Parameters:
circuit (Circuit) – The Eka atomic circuit to convert to Guppy code.
quantum_channel_map (dict[str, str]) – A mapping from quantum channel IDs to their variable names in the Guppylang code.
classical_channel_map (dict[str, str]) – A mapping from classical channel IDs to their variable names in the Guppylang code.
- Returns:
The Guppy code representation of the Eka instruction.
- Return type:
str
- Raises:
ValueError – If the circuit is not atomic (leaf in the Eka circuit tree).
KeyError – If the instruction is not supported by the converter.
- model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}
A dictionary of computed field names and their corresponding ComputedFieldInfo objects.
- model_config: ClassVar[ConfigDict] = {'frozen': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- model_fields: ClassVar[Dict[str, FieldInfo]] = {'ALLOW_ERROR_MODELS': FieldInfo(annotation=bool, required=False, default=False, frozen=True, init=False), 'SUPPORTED_OPERATIONS': FieldInfo(annotation=frozenset[OpSignature], required=False, default=frozenset({OpSignature(name='or', op_type=<OpType.BOOL_LOGIC: 'bool_logic'>, quantum_input=0, classical_input=2, is_clifford=False, description=''), OpSignature(name='phase', op_type=<OpType.SINGLE_QUBIT: 'single_qubit'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='classical_if', op_type=<OpType.CONTROL_FLOW: 'control_flow'>, quantum_input=0, classical_input=0, is_clifford=True, description=''), OpSignature(name='z', op_type=<OpType.SINGLE_QUBIT: 'single_qubit'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='classical_else', op_type=<OpType.CONTROL_FLOW: 'control_flow'>, quantum_input=0, classical_input=0, is_clifford=True, description=''), OpSignature(name='reset_1', op_type=<OpType.RESET: 'reset'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='t', op_type=<OpType.SINGLE_QUBIT: 'single_qubit'>, quantum_input=1, classical_input=0, is_clifford=False, description=''), OpSignature(name='not', op_type=<OpType.BOOL_LOGIC: 'bool_logic'>, quantum_input=0, classical_input=1, is_clifford=False, description=''), OpSignature(name='reset_0', op_type=<OpType.RESET: 'reset'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='x', op_type=<OpType.SINGLE_QUBIT: 'single_qubit'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='indent_less', op_type=<OpType.UTILS: 'utils'>, quantum_input=0, classical_input=0, is_clifford=True, description=''), OpSignature(name='cnot', op_type=<OpType.TWO_QUBIT: 'two_qubit'>, quantum_input=2, classical_input=0, is_clifford=True, description=''), OpSignature(name='measure_x', op_type=<OpType.MEASUREMENT: 'measurement'>, quantum_input=1, classical_input=1, is_clifford=True, description=''), OpSignature(name='measurement', op_type=<OpType.MEASUREMENT: 'measurement'>, quantum_input=1, classical_input=1, is_clifford=True, description=''), OpSignature(name='reset_+', op_type=<OpType.RESET: 'reset'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='y', op_type=<OpType.SINGLE_QUBIT: 'single_qubit'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='i', op_type=<OpType.SINGLE_QUBIT: 'single_qubit'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='cx', op_type=<OpType.TWO_QUBIT: 'two_qubit'>, quantum_input=2, classical_input=0, is_clifford=True, description=''), OpSignature(name='measure_z', op_type=<OpType.MEASUREMENT: 'measurement'>, quantum_input=1, classical_input=1, is_clifford=True, description=''), OpSignature(name='cz', op_type=<OpType.TWO_QUBIT: 'two_qubit'>, quantum_input=2, classical_input=0, is_clifford=True, description=''), OpSignature(name='measure_y', op_type=<OpType.MEASUREMENT: 'measurement'>, quantum_input=1, classical_input=1, is_clifford=True, description=''), OpSignature(name='h', op_type=<OpType.SINGLE_QUBIT: 'single_qubit'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='phaseinv', op_type=<OpType.SINGLE_QUBIT: 'single_qubit'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='cy', op_type=<OpType.TWO_QUBIT: 'two_qubit'>, quantum_input=2, classical_input=0, is_clifford=True, description=''), OpSignature(name='indent_more', op_type=<OpType.UTILS: 'utils'>, quantum_input=0, classical_input=0, is_clifford=True, description=''), OpSignature(name='xor', op_type=<OpType.BOOL_LOGIC: 'bool_logic'>, quantum_input=0, classical_input=2, is_clifford=False, description=''), OpSignature(name='nor', op_type=<OpType.BOOL_LOGIC: 'bool_logic'>, quantum_input=0, classical_input=2, is_clifford=False, description=''), OpSignature(name='match', op_type=<OpType.BOOL_LOGIC: 'bool_logic'>, quantum_input=0, classical_input=1, is_clifford=False, description=''), OpSignature(name='and', op_type=<OpType.BOOL_LOGIC: 'bool_logic'>, quantum_input=0, classical_input=2, is_clifford=False, description=''), OpSignature(name='comment', op_type=<OpType.UTILS: 'utils'>, quantum_input=0, classical_input=0, is_clifford=True, description=''), OpSignature(name='swap', op_type=<OpType.TWO_QUBIT: 'two_qubit'>, quantum_input=2, classical_input=0, is_clifford=True, description=''), OpSignature(name='reset_-', op_type=<OpType.RESET: 'reset'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='reset_-i', op_type=<OpType.RESET: 'reset'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='nand', op_type=<OpType.BOOL_LOGIC: 'bool_logic'>, quantum_input=0, classical_input=2, is_clifford=False, description=''), OpSignature(name='end_if', op_type=<OpType.CONTROL_FLOW: 'control_flow'>, quantum_input=0, classical_input=0, is_clifford=True, description=''), OpSignature(name='reset', op_type=<OpType.RESET: 'reset'>, quantum_input=1, classical_input=0, is_clifford=True, description=''), OpSignature(name='reset_+i', op_type=<OpType.RESET: 'reset'>, quantum_input=1, classical_input=0, is_clifford=True, description='')})), 'builtins_prefix': FieldInfo(annotation=str, required=False, default='builtins.', frozen=True), 'qsystem_prefix': FieldInfo(annotation=str, required=False, default='guppyQSys.', frozen=True), 'quantum_prefix': FieldInfo(annotation=str, required=False, default='guppyQ.', frozen=True), 'separator_for_else_in_condition': FieldInfo(annotation=str, required=False, default=', is_else=', description='The separator string used in the description for else conditions.', frozen=True, init=False)}
Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.
This replaces Model.__fields__ from Pydantic V1.
- property operations_map: dict[str, Callable[[list[str], list[str], str | None], str]]
Map operation names to their corresponding Guppy functions. The functions returned by this map take as input the quantum and classical targets, and return the Guppy function(s) to apply, handling assignments of parameters.
- Returns:
A mapping from operation names to Guppylang instruction with the proper parameters applied.
- Return type:
dict[str, str]
- static parse_target_run_outcome(outcome)[source]
Convert a QsysResult into a dict mapping label -> list of int per shot.
- Return type:
dict[str,list[int]]
- qsystem_prefix: str
- quantum_prefix: str