Source code for uniqc.circuit_builder.normalize
"""Shared circuit input normalization.
Provides the :data:`AnyQuantumCircuit` type alias and
:func:`normalize_circuit_input` used by compile, simulators, and task-manager
modules so that every public entry point accepts the same set of input types.
"""
from __future__ import annotations
__all__ = [
"AnyQuantumCircuit",
"NormalizedCircuit",
"normalize_circuit_input",
"normalize_to_circuit",
"resolve_output_format",
]
from dataclasses import dataclass
from typing import TYPE_CHECKING, Any, Union
if TYPE_CHECKING:
from .qcircuit import Circuit
#: Accepted input types for circuit-oriented APIs.
#: A :class:`~uniqc.circuit_builder.Circuit` object, an OriginIR string,
#: or an OpenQASM 2.0 string.
AnyQuantumCircuit = Union["Circuit", str]
[docs]
@dataclass
class NormalizedCircuit:
"""Result of :func:`normalize_circuit_input`.
Attributes
----------
circuit : Circuit
The unified :class:`uniqc.Circuit` object.
type : str
Detected input format: ``"circuit"``, ``"originir"``, ``"qasm"``,
or ``"qiskit"``.
original_input : Any
The raw input value, retained so callers can round-trip.
"""
circuit: Any
type: str
original_input: Any = None
def _parse_originir(text: str):
from uniqc.compile.originir import OriginIR_BaseParser
parser = OriginIR_BaseParser()
parser.parse(text)
return parser.to_circuit()
def _parse_qasm(text: str):
from uniqc.compile.qasm import OpenQASM2_BaseParser
parser = OpenQASM2_BaseParser()
parser.parse(text)
return parser.to_circuit()
[docs]
def normalize_circuit_input(circuit) -> NormalizedCircuit:
"""Auto-detect input type and convert to :class:`uniqc.Circuit`.
Accepted input types:
- :class:`uniqc.Circuit` — returned as-is.
- :class:`str` — parsed as OriginIR or OpenQASM 2.0.
- ``qiskit.QuantumCircuit`` — exported via ``qiskit.qasm2.dumps()`` then parsed.
- ``pyqpanda3.QProg`` — converted via OriginIR round-trip.
Parameters
----------
circuit : Any
Circuit in any supported format.
Returns
-------
NormalizedCircuit
Dataclass with ``.circuit``, ``.type``, and ``.original_input`` fields.
"""
from .qcircuit import Circuit
if isinstance(circuit, Circuit):
return NormalizedCircuit(circuit=circuit, type="circuit", original_input=circuit)
if isinstance(circuit, str):
stripped = circuit.lstrip()
if stripped.upper().startswith(("OPENQASM", "QREG", "CREG", "MEASURE")):
try:
return NormalizedCircuit(circuit=_parse_qasm(circuit), type="qasm", original_input=circuit)
except Exception:
pass
try:
return NormalizedCircuit(circuit=_parse_originir(circuit), type="originir", original_input=circuit)
except Exception:
pass
# Last-ditch QASM attempt
return NormalizedCircuit(circuit=_parse_qasm(circuit), type="qasm", original_input=circuit)
# qiskit.QuantumCircuit
try:
import qiskit.qasm2
qasm_str = qiskit.qasm2.dumps(circuit)
return NormalizedCircuit(circuit=_parse_qasm(qasm_str), type="qiskit", original_input=circuit)
except Exception:
pass
# pyqpanda3.QProg
try:
import pyqpanda3
if isinstance(circuit, pyqpanda3.QProg):
originir_str = pyqpanda3.convert_qprog_to_originir(circuit)
return NormalizedCircuit(
circuit=_parse_originir(originir_str),
type="originir",
original_input=circuit,
)
except Exception:
pass
raise TypeError(
f"Cannot normalize input of type {type(circuit).__name__}. "
f"Expected Circuit, originir string, qasm string, "
f"qiskit.QuantumCircuit, or pyqpanda3.QProg."
)
[docs]
def normalize_to_circuit(input: AnyQuantumCircuit) -> Circuit:
"""Convert *AnyQuantumCircuit* to a :class:`Circuit` object."""
return normalize_circuit_input(input).circuit
[docs]
def resolve_output_format(output_format: str, type: str) -> str:
"""Resolve the output format string to a canonical name.
Parameters
----------
output_format : str
User-specified format: ``"originir"``, ``"qasm"``, ``"circuit"``, or
``"auto"``. ``"auto"`` returns the same format as the input *type*.
type : str
Detected input format from :func:`normalize_circuit_input`.
Returns
-------
str
Canonical format: ``"originir"`` or ``"qasm"``.
"""
if output_format == "auto":
return "originir" if type in ("circuit", "originir") else "qasm"
return output_format