Skip to content

Commit 4396385

Browse files
Merge pull request #42 from ColibrITD-SAS/feat-delayed-imports
Feature: shorter import times by delaying some auxiliary imports
2 parents aa3890e + ec93249 commit 4396385

18 files changed

+370
-208
lines changed

mpqp/core/circuit.py

+22-15
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22

33
from copy import deepcopy
44
from numbers import Complex
5-
from typing import Iterable, Optional, Sequence, Type, Union
5+
from typing import TYPE_CHECKING, Iterable, Optional, Sequence, Type, Union
6+
7+
if TYPE_CHECKING:
8+
from qat.core.wrappers.circuit import Circuit as myQLM_Circuit
9+
from cirq.circuits.circuit import Circuit as cirq_Circuit
10+
from braket.circuits import Circuit as braket_Circuit
11+
from qiskit.circuit import QuantumCircuit
612

713
import numpy as np
814
import numpy.typing as npt
9-
from braket.circuits import Circuit as braket_Circuit
10-
from cirq.circuits.circuit import Circuit as cirq_Circuit
1115
from matplotlib.figure import Figure
12-
from qat.core.wrappers.circuit import Circuit as myQLM_Circuit
13-
from qiskit.circuit import Operation, QuantumCircuit
14-
from qiskit.circuit.quantumcircuit import CircuitInstruction
15-
from qiskit.quantum_info import Operator
1616
from sympy import Basic, Expr
1717
from typeguard import TypeCheckError, typechecked
1818

@@ -626,6 +626,10 @@ def to_other_language(self, language: Language = Language.QISKIT) -> Union[
626626
"""
627627

628628
if language == Language.QISKIT:
629+
from qiskit.circuit import Operation, QuantumCircuit
630+
from qiskit.circuit.quantumcircuit import CircuitInstruction
631+
from qiskit.quantum_info import Operator
632+
629633
# to avoid defining twice the same parameter, we keep trace of the
630634
# added parameters, and we use those instead of new ones when they
631635
# are used more than once
@@ -642,15 +646,16 @@ def to_other_language(self, language: Language = Language.QISKIT) -> Union[
642646
qiskit_inst = instruction.to_other_language(
643647
Language.QISKIT, qiskit_parameters
644648
)
645-
assert (
646-
isinstance(qiskit_inst, CircuitInstruction)
647-
or isinstance(qiskit_inst, Operation)
648-
or isinstance(qiskit_inst, Operator)
649-
)
649+
if TYPE_CHECKING:
650+
assert (
651+
isinstance(qiskit_inst, CircuitInstruction)
652+
or isinstance(qiskit_inst, Operation)
653+
or isinstance(qiskit_inst, Operator)
654+
)
650655
cargs = []
651656

652657
if isinstance(instruction, CustomGate):
653-
new_circ.unitary(
658+
new_circ.unitary( # pyright: ignore[reportAttributeAccessIssue]
654659
instruction.to_other_language(),
655660
instruction.targets,
656661
instruction.label,
@@ -674,8 +679,9 @@ def to_other_language(self, language: Language = Language.QISKIT) -> Union[
674679
qargs = range(instruction.size)
675680
else:
676681
raise ValueError(f"Instruction not handled: {instruction}")
677-
assert not isinstance(qiskit_inst, Operator)
678682

683+
if TYPE_CHECKING:
684+
assert not isinstance(qiskit_inst, Operator)
679685
new_circ.append(
680686
qiskit_inst,
681687
qargs,
@@ -734,7 +740,8 @@ def to_qasm2(self) -> str:
734740
qiskit_circ = self.subs({}, remove_symbolic=True).to_other_language(
735741
Language.QISKIT
736742
)
737-
assert isinstance(qiskit_circ, QuantumCircuit)
743+
if TYPE_CHECKING:
744+
assert isinstance(qiskit_circ, QuantumCircuit)
738745
qasm = qiskit_circ.qasm()
739746
assert qasm is not None
740747
return qasm

mpqp/core/instruction/barrier.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
removed because it could have a negative impact on the execution speed of the
33
circuit (since it artificially increases the depth)."""
44

5-
from typing import Optional
6-
from qiskit.circuit.library import Barrier as QiskitBarrier
5+
from typing import TYPE_CHECKING, Optional
76

8-
from qiskit.circuit import Parameter
7+
if TYPE_CHECKING:
8+
from qiskit.circuit import Parameter
99

1010
from mpqp.core.languages import Language
11+
1112
from .instruction import Instruction
1213

1314

@@ -22,7 +23,9 @@ def __init__(self):
2223
def to_other_language(
2324
self,
2425
language: Language = Language.QISKIT,
25-
qiskit_parameters: Optional[set[Parameter]] = None,
26+
qiskit_parameters: Optional[set["Parameter"]] = None,
2627
):
2728
if language == Language.QISKIT:
29+
from qiskit.circuit.library import Barrier as QiskitBarrier
30+
2831
return QiskitBarrier(self.size)

mpqp/core/instruction/gates/custom_gate.py

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
from typing import Optional
1+
from typing import TYPE_CHECKING, Optional
22

33
from typeguard import typechecked
44

5+
if TYPE_CHECKING:
6+
from qiskit.circuit import Parameter
7+
58
from mpqp.core.instruction.gates.gate import Gate
69
from mpqp.core.instruction.gates.gate_definition import (
7-
UnitaryMatrix,
810
KrausRepresentation,
911
PauliDecomposition,
12+
UnitaryMatrix,
1013
)
1114
from mpqp.core.languages import Language
12-
from qiskit.circuit import Parameter
13-
from qiskit.quantum_info.operators import Operator as QiskitOperator
1415

1516

1617
@typechecked
@@ -36,8 +37,10 @@ def to_matrix(self):
3637
def to_other_language(
3738
self,
3839
language: Language = Language.QISKIT,
39-
qiskit_parameters: Optional[set[Parameter]] = None,
40+
qiskit_parameters: Optional[set["Parameter"]] = None,
4041
):
42+
from qiskit.quantum_info.operators import Operator as QiskitOperator
43+
4144
if qiskit_parameters is None:
4245
qiskit_parameters = set()
4346
return QiskitOperator(self.matrix)
@@ -55,6 +58,7 @@ def decompose(self):
5558
@typechecked
5659
class KrausGate(CustomGate):
5760
"""6M-TODO"""
61+
5862
def __init__(
5963
self,
6064
definition: KrausRepresentation,
@@ -69,6 +73,7 @@ def __init__(
6973
@typechecked
7074
class PauliDecompositionGate(CustomGate):
7175
"""6M-TODO"""
76+
7277
def __init__(
7378
self,
7479
definition: PauliDecomposition,

0 commit comments

Comments
 (0)