Skip to content

Commit 32743ff

Browse files
Merge pull request #29 from ColibrITD-SAS/fix-braket-noncontiguous-qubits
Add identity gates on non-operated qubits
2 parents d718968 + ad72149 commit 32743ff

File tree

2 files changed

+51
-23
lines changed

2 files changed

+51
-23
lines changed

mpqp/core/circuit.py

+32-23
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,33 @@
11
from __future__ import annotations
22

3-
from typing import Iterable, Optional, Sequence, Type, Union
43
from copy import deepcopy
54
from numbers import Complex
5+
from typing import Iterable, Optional, Sequence, Type, Union
66

77
import numpy as np
88
import numpy.typing as npt
9+
from braket.circuits import Circuit as braket_Circuit
910
from matplotlib.figure import Figure
10-
from qiskit.circuit import QuantumCircuit, Operation
11-
from qiskit.circuit.quantumcircuit import CircuitInstruction
12-
1311
from qat.core.wrappers.circuit import Circuit as myQLM_Circuit
14-
from braket.circuits import Circuit as braket_Circuit
12+
from qiskit.circuit import Operation, QuantumCircuit
13+
from qiskit.circuit.quantumcircuit import CircuitInstruction
1514
from qiskit.quantum_info import Operator
1615
from sympy import Basic, Expr
17-
from typeguard import typechecked, TypeCheckError
16+
from typeguard import TypeCheckError, typechecked
1817

1918
from mpqp.core.instruction import Instruction
2019
from mpqp.core.instruction.barrier import Barrier
21-
from mpqp.core.instruction.gates import (
22-
ControlledGate,
23-
Gate,
24-
)
20+
from mpqp.core.instruction.gates import ControlledGate, Gate, Id
2521
from mpqp.core.instruction.gates.custom_gate import CustomGate
2622
from mpqp.core.instruction.gates.gate_definition import UnitaryMatrix
2723
from mpqp.core.instruction.gates.parametrized_gate import ParametrizedGate
28-
from mpqp.core.instruction.measurement import (
29-
ComputationalBasis,
30-
BasisMeasure,
31-
Measure,
32-
)
24+
from mpqp.core.instruction.measurement import BasisMeasure, ComputationalBasis, Measure
3325
from mpqp.core.instruction.measurement.expectation_value import ExpectationMeasure
26+
from mpqp.core.languages import Language
3427
from mpqp.qasm import qasm2_to_myqlm_Circuit
3528
from mpqp.qasm.open_qasm_2_and_3 import open_qasm_2_to_3
3629
from mpqp.qasm.qasm_to_braket import qasm3_to_braket_Circuit
3730
from mpqp.tools.errors import NumberQubitsError
38-
from mpqp.core.languages import Language
3931
from mpqp.tools.maths import matrix_eq
4032

4133

@@ -646,12 +638,19 @@ def to_other_language(
646638
qiskit_inst = instruction.to_other_language(
647639
Language.QISKIT, qiskit_parameters
648640
)
649-
assert isinstance(qiskit_inst, CircuitInstruction) or isinstance(
650-
qiskit_inst, Operation) or isinstance(qiskit_inst, Operator)
641+
assert (
642+
isinstance(qiskit_inst, CircuitInstruction)
643+
or isinstance(qiskit_inst, Operation)
644+
or isinstance(qiskit_inst, Operator)
645+
)
651646
cargs = []
652647

653648
if isinstance(instruction, CustomGate):
654-
new_circ.unitary(instruction.to_other_language(), instruction.targets, instruction.label)
649+
new_circ.unitary(
650+
instruction.to_other_language(),
651+
instruction.targets,
652+
instruction.label,
653+
)
655654
# FIXME: minus sign appearing when it should not, seems there a phase added somewhere, check u gate
656655
# in OpenQASM translation.
657656
continue
@@ -662,7 +661,7 @@ def to_other_language(
662661
elif isinstance(instruction, BasisMeasure) and isinstance(
663662
instruction.basis, ComputationalBasis
664663
):
665-
#TODO muhammad/henri, for custom basis, check if something should be changed here, otherwise remove
664+
# TODO muhammad/henri, for custom basis, check if something should be changed here, otherwise remove
666665
# the condition to have only computational basis
667666
assert instruction.c_targets is not None
668667
qargs = [instruction.targets]
@@ -685,9 +684,19 @@ def to_other_language(
685684
return myqlm_circuit
686685

687686
elif language == Language.BRAKET:
688-
circuit_qasm3 = self.to_qasm3()
689-
brkt_circuit = qasm3_to_braket_Circuit(circuit_qasm3)
690-
return brkt_circuit
687+
circuit = deepcopy(self)
688+
used_qubits = set().union(
689+
*(inst.connections() for inst in circuit.instructions)
690+
)
691+
circuit.add(
692+
[
693+
Id(qubit)
694+
for qubit in range(circuit.nb_qubits)
695+
if qubit not in used_qubits
696+
]
697+
)
698+
699+
return qasm3_to_braket_Circuit(circuit.to_qasm3())
691700

692701
else:
693702
raise NotImplementedError(f"Error: {language} is not supported")
Original file line numberDiff line numberDiff line change
@@ -1 +1,20 @@
11
# 3M-TODO
2+
import pytest
3+
4+
from mpqp import QCircuit
5+
from mpqp.gates import *
6+
from mpqp.execution import run, AWSDevice
7+
8+
9+
@pytest.mark.parametrize(
10+
"circuit",
11+
[
12+
QCircuit([H(2)]),
13+
QCircuit([H(0), H(2)]),
14+
QCircuit([H(0), CNOT(1, 3), H(2)]),
15+
QCircuit([H(2)], nb_qubits=5),
16+
]
17+
)
18+
def test_braket_non_contiguous_qubits(circuit: QCircuit):
19+
run(circuit, AWSDevice.BRAKET_LOCAL_SIMULATOR)
20+

0 commit comments

Comments
 (0)