Skip to content

Commit 83b333f

Browse files
committed
Merge branch 'fake-backends' of https://github.com/ElePT/qiskit-terra into fake-backends-v1
2 parents 0d7a52d + 025a11d commit 83b333f

File tree

352 files changed

+654
-678
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

352 files changed

+654
-678
lines changed

qiskit/qpy/__init__.py

+10
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,16 @@
162162
by ``num_circuits`` in the file header). There is no padding between the
163163
circuits in the data.
164164
165+
.. _qpy_version_11:
166+
167+
Version 11
168+
==========
169+
170+
Version 11 is identical to Version 10 except that for names in the CUSTOM_INSTRUCTION blocks
171+
have a suffix of the form ``"_{uuid_hex}"`` where ``uuid_hex`` is a uuid
172+
hexadecimal string such as returned by :attr:`.UUID.hex`. For example:
173+
``"b3ecab5b4d6a4eb6bc2b2dbf18d83e1e"``.
174+
165175
.. _qpy_version_10:
166176
167177
Version 10

qiskit/qpy/binary_io/circuits.py

+24-10
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@ def _parse_custom_operation(
373373
) = custom_operations[gate_name]
374374
else:
375375
type_str, num_qubits, num_clbits, definition = custom_operations[gate_name]
376+
# Strip the trailing "_{uuid}" from the gate name if the version >=11
377+
if version >= 11:
378+
gate_name = "_".join(gate_name.split("_")[:-1])
376379
type_key = type_keys.CircuitInstruction(type_str)
377380

378381
if type_key == type_keys.CircuitInstruction.INSTRUCTION:
@@ -572,7 +575,7 @@ def _dumps_instruction_parameter(param, index_map, use_symengine):
572575

573576

574577
# pylint: disable=too-many-boolean-expressions
575-
def _write_instruction(file_obj, instruction, custom_operations, index_map, use_symengine):
578+
def _write_instruction(file_obj, instruction, custom_operations, index_map, use_symengine, version):
576579
if isinstance(instruction.operation, Instruction):
577580
gate_class_name = instruction.operation.base_class.__name__
578581
else:
@@ -591,15 +594,17 @@ def _write_instruction(file_obj, instruction, custom_operations, index_map, use_
591594
or isinstance(instruction.operation, library.BlueprintCircuit)
592595
):
593596
gate_class_name = instruction.operation.name
597+
if version >= 11:
598+
# Assign a uuid to each instance of a custom operation
599+
gate_class_name = f"{gate_class_name}_{uuid.uuid4().hex}"
594600
# ucr*_dg gates can have different numbers of parameters,
595601
# the uuid is appended to avoid storing a single definition
596602
# in circuits with multiple ucr*_dg gates.
597-
if instruction.operation.name in ["ucrx_dg", "ucry_dg", "ucrz_dg"]:
598-
gate_class_name += "_" + str(uuid.uuid4())
603+
elif instruction.operation.name in {"ucrx_dg", "ucry_dg", "ucrz_dg"}:
604+
gate_class_name = f"{gate_class_name}_{uuid.uuid4()}"
599605

600-
if gate_class_name not in custom_operations:
601-
custom_operations[gate_class_name] = instruction.operation
602-
custom_operations_list.append(gate_class_name)
606+
custom_operations[gate_class_name] = instruction.operation
607+
custom_operations_list.append(gate_class_name)
603608

604609
elif gate_class_name == "ControlledGate":
605610
# controlled gates can have the same name but different parameter
@@ -724,7 +729,7 @@ def _write_elem(buffer, op):
724729
file_obj.write(synth_data)
725730

726731

727-
def _write_custom_operation(file_obj, name, operation, custom_operations, use_symengine):
732+
def _write_custom_operation(file_obj, name, operation, custom_operations, use_symengine, version):
728733
type_key = type_keys.CircuitInstruction.assign(operation)
729734
has_definition = False
730735
size = 0
@@ -768,6 +773,7 @@ def _write_custom_operation(file_obj, name, operation, custom_operations, use_sy
768773
custom_operations,
769774
{},
770775
use_symengine,
776+
version,
771777
)
772778
base_gate_raw = base_gate_buffer.getvalue()
773779
name_raw = name.encode(common.ENCODE)
@@ -1002,7 +1008,9 @@ def _read_layout_v2(file_obj, circuit):
10021008
circuit._layout._output_qubit_list = circuit.qubits
10031009

10041010

1005-
def write_circuit(file_obj, circuit, metadata_serializer=None, use_symengine=False):
1011+
def write_circuit(
1012+
file_obj, circuit, metadata_serializer=None, use_symengine=False, version=common.QPY_VERSION
1013+
):
10061014
"""Write a single QuantumCircuit object in the file like object.
10071015
10081016
Args:
@@ -1016,6 +1024,7 @@ def write_circuit(file_obj, circuit, metadata_serializer=None, use_symengine=Fal
10161024
native mechanism. This is a faster serialization alternative, but not supported in all
10171025
platforms. Please check that your target platform is supported by the symengine library
10181026
before setting this option, as it will be required by qpy to deserialize the payload.
1027+
version (int): The QPY format version to use for serializing this circuit
10191028
"""
10201029
metadata_raw = json.dumps(
10211030
circuit.metadata, separators=(",", ":"), cls=metadata_serializer
@@ -1056,7 +1065,7 @@ def write_circuit(file_obj, circuit, metadata_serializer=None, use_symengine=Fal
10561065
index_map["c"] = {bit: index for index, bit in enumerate(circuit.clbits)}
10571066
for instruction in circuit.data:
10581067
_write_instruction(
1059-
instruction_buffer, instruction, custom_operations, index_map, use_symengine
1068+
instruction_buffer, instruction, custom_operations, index_map, use_symengine, version
10601069
)
10611070

10621071
with io.BytesIO() as custom_operations_buffer:
@@ -1068,7 +1077,12 @@ def write_circuit(file_obj, circuit, metadata_serializer=None, use_symengine=Fal
10681077
operation = custom_operations[name]
10691078
new_custom_operations.extend(
10701079
_write_custom_operation(
1071-
custom_operations_buffer, name, operation, custom_operations, use_symengine
1080+
custom_operations_buffer,
1081+
name,
1082+
operation,
1083+
custom_operations,
1084+
use_symengine,
1085+
version,
10721086
)
10731087
)
10741088

qiskit/qpy/binary_io/schedules.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,9 @@ def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symen
574574
return block
575575

576576

577-
def write_schedule_block(file_obj, block, metadata_serializer=None, use_symengine=False):
577+
def write_schedule_block(
578+
file_obj, block, metadata_serializer=None, use_symengine=False, version=common.QPY_VERSION
579+
): # pylint: disable=unused-argument
578580
"""Write a single ScheduleBlock object in the file like object.
579581
580582
Args:
@@ -588,6 +590,7 @@ def write_schedule_block(file_obj, block, metadata_serializer=None, use_symengin
588590
native mechanism. This is a faster serialization alternative, but not supported in all
589591
platforms. Please check that your target platform is supported by the symengine library
590592
before setting this option, as it will be required by qpy to deserialize the payload.
593+
version (int): The QPY format version to use for serializing this circuit block
591594
Raises:
592595
TypeError: If any of the instructions is invalid data format.
593596
"""

qiskit/qpy/common.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
from qiskit.qpy import formats
2222

23-
QPY_VERSION = 10
23+
QPY_VERSION = 11
2424
QPY_COMPATIBILITY_VERSION = 10
2525
ENCODE = "utf8"
2626

qiskit/qpy/interface.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,11 @@ def dump(
199199

200200
for program in programs:
201201
writer(
202-
file_obj, program, metadata_serializer=metadata_serializer, use_symengine=use_symengine
202+
file_obj,
203+
program,
204+
metadata_serializer=metadata_serializer,
205+
use_symengine=use_symengine,
206+
version=version,
203207
)
204208

205209

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
upgrade:
3+
- |
4+
The latest format version of QPY is now :ref:`qpy_version_11` and this
5+
is what is emitted by default when running :func:`.qpy.dump`.
6+
fixes:
7+
- |
8+
Fixed an issue with the QPY serialization when a :class:`.QuantumCircuit`
9+
contained multiple custom instructions instances that have the same
10+
:attr:`~.Instruction.name` attribute. In QPY format versions before
11+
:ref:`qpy_version_11` the QPY payload did not differentiate between
12+
these instances and would only serialize the properties of the first
13+
instance in a circuit. This could potentially cause an incorrect
14+
deserialization if the other properties of the custom instruction were
15+
different but the names were the same. This has been fixed in
16+
QPY :ref:`qpy_version_11` so that each instance of a custom instruction
17+
is serialized individually and there will no longer be a potential
18+
conflict with overlapping names.
19+
Fixes `#8941 <https://github.com/Qiskit/qiskit/issues/8941>`__
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
upgrade:
3+
- |
4+
Remove ``qiskit.test``. This includes ``qiskit.test.QiskitTestCase`` (and ``BasicQiskitTestCase``)
5+
which are now for interal unittesting use.

test/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
import itertools
1616
from ddt import data, unpack
1717

18+
from .utils.base import QiskitTestCase
19+
from .utils.decorators import slow_test
20+
1821

1922
class Case(dict):
2023
"""<no description>"""

test/benchmarks/transpiler_qualitative.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This code is part of Qiskit.
22
#
3-
# (C) Copyright IBM 2023
3+
# (C) Copyright IBM 2023, 2024.
44
#
55
# This code is licensed under the Apache License, Version 2.0. You may
66
# obtain a copy of this license in the LICENSE.txt file in the root directory

test/python/circuit/classical/test_expr_constructors.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
from qiskit.circuit import Clbit, ClassicalRegister, Instruction
1818
from qiskit.circuit.classical import expr, types
19-
from qiskit.test import QiskitTestCase
19+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2020

2121

2222
@ddt.ddt

test/python/circuit/classical/test_expr_helpers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
from qiskit.circuit import Clbit, ClassicalRegister
1919
from qiskit.circuit.classical import expr, types
20-
from qiskit.test import QiskitTestCase
20+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2121

2222

2323
@ddt.ddt

test/python/circuit/classical/test_expr_properties.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@
1414

1515
import copy
1616
import pickle
17-
1817
import ddt
1918

20-
from qiskit.test import QiskitTestCase
2119
from qiskit.circuit import ClassicalRegister, Clbit
2220
from qiskit.circuit.classical import expr, types
21+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2322

2423

2524
@ddt.ddt

test/python/circuit/classical/test_types_ordering.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring
1414

1515
from qiskit.circuit.classical import types
16-
from qiskit.test import QiskitTestCase
16+
from test import QiskitTestCase # pylint: disable=wrong-import-order
1717

1818

1919
class TestTypesOrdering(QiskitTestCase):

test/python/circuit/library/test_adders.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
import numpy as np
1717
from ddt import ddt, data, unpack
1818

19-
from qiskit.test.base import QiskitTestCase
2019
from qiskit.circuit import QuantumCircuit
2120
from qiskit.quantum_info import Statevector
2221
from qiskit.circuit.library import CDKMRippleCarryAdder, DraperQFTAdder, VBERippleCarryAdder
22+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2323

2424

2525
@ddt

test/python/circuit/library/test_blueprintcircuit.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import unittest
1717
from ddt import ddt, data
1818

19-
from qiskit.test.base import QiskitTestCase
2019
from qiskit.circuit import (
2120
QuantumRegister,
2221
Parameter,
@@ -26,6 +25,7 @@
2625
CircuitInstruction,
2726
)
2827
from qiskit.circuit.library import BlueprintCircuit, XGate
28+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2929

3030

3131
class MockBlueprint(BlueprintCircuit):

test/python/circuit/library/test_boolean_logic.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
from ddt import ddt, data, unpack
1717
import numpy as np
1818

19-
from qiskit.test.base import QiskitTestCase
2019
from qiskit.circuit import QuantumCircuit
2120
from qiskit.circuit.library import XOR, InnerProduct, AND, OR
2221
from qiskit.quantum_info import Statevector
22+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2323

2424

2525
@ddt

test/python/circuit/library/test_diagonal.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
from ddt import ddt, data
1717
import numpy as np
1818

19-
from qiskit.test.base import QiskitTestCase
2019
from qiskit.circuit.library import Diagonal
2120
from qiskit.quantum_info import Statevector, Operator
2221
from qiskit.quantum_info.operators.predicates import matrix_equal
22+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2323

2424

2525
@ddt

test/python/circuit/library/test_evolution_gate.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
from qiskit.circuit.library import PauliEvolutionGate
2222
from qiskit.synthesis import LieTrotter, SuzukiTrotter, MatrixExponential, QDrift
2323
from qiskit.converters import circuit_to_dag
24-
from qiskit.test import QiskitTestCase
2524
from qiskit.quantum_info import Operator, SparsePauliOp, Pauli, Statevector
25+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2626

2727
X = SparsePauliOp("X")
2828
Y = SparsePauliOp("Y")

test/python/circuit/library/test_evolved_op_ansatz.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from qiskit.circuit.library import HamiltonianGate
2121
from qiskit.circuit.library.n_local import EvolvedOperatorAnsatz
2222
from qiskit.synthesis.evolution import MatrixExponential
23-
from qiskit.test import QiskitTestCase
23+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2424

2525

2626
class TestEvolvedOperatorAnsatz(QiskitTestCase):

test/python/circuit/library/test_fourier_checking.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
from ddt import ddt, data, unpack
1717
import numpy as np
1818

19-
from qiskit.test.base import QiskitTestCase
2019
from qiskit.circuit.library import FourierChecking
2120
from qiskit.circuit.exceptions import CircuitError
2221
from qiskit.quantum_info import Operator
22+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2323

2424

2525
@ddt

test/python/circuit/library/test_functional_pauli_rotations.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
import numpy as np
1818
from ddt import ddt, data, unpack
1919

20-
from qiskit.test.base import QiskitTestCase
2120
from qiskit.circuit import QuantumCircuit
2221
from qiskit.circuit.library import (
2322
LinearPauliRotations,
2423
PolynomialPauliRotations,
2524
PiecewiseLinearPauliRotations,
2625
)
2726
from qiskit.quantum_info import Statevector
27+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2828

2929

3030
@ddt

test/python/circuit/library/test_global_r.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import unittest
1616
import numpy as np
1717

18-
from qiskit.test.base import QiskitTestCase
1918
from qiskit.circuit import QuantumCircuit
2019
from qiskit.circuit.library import GR, GRX, GRY, GRZ, RGate, RZGate
20+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2121

2222

2323
class TestGlobalRLibrary(QiskitTestCase):

test/python/circuit/library/test_gms.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import unittest
1616
import numpy as np
1717

18-
from qiskit.test.base import QiskitTestCase
1918
from qiskit.circuit.library import GMS, RXXGate
2019
from qiskit.quantum_info import Operator
20+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2121

2222

2323
class TestGMSLibrary(QiskitTestCase):

test/python/circuit/library/test_graph_state.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from qiskit.circuit.exceptions import CircuitError
1818
from qiskit.circuit.library import GraphState
1919
from qiskit.quantum_info import Clifford
20-
from qiskit.test.base import QiskitTestCase
20+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2121

2222

2323
class TestGraphStateLibrary(QiskitTestCase):

test/python/circuit/library/test_grover_operator.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
import unittest
1616
import numpy as np
1717

18-
from qiskit.test.base import QiskitTestCase
1918
from qiskit.circuit import QuantumCircuit
2019
from qiskit.circuit.library import GroverOperator
2120
from qiskit.converters import circuit_to_dag
2221
from qiskit.quantum_info import Operator, Statevector, DensityMatrix
22+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2323

2424

2525
class TestGroverOperator(QiskitTestCase):

test/python/circuit/library/test_hidden_linear_function.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
import unittest
1616
import numpy as np
1717

18-
from qiskit.test.base import QiskitTestCase
1918
from qiskit.circuit import QuantumCircuit
2019
from qiskit.circuit.exceptions import CircuitError
2120
from qiskit.circuit.library import HiddenLinearFunction
2221
from qiskit.quantum_info import Operator
22+
from test import QiskitTestCase # pylint: disable=wrong-import-order
2323

2424

2525
class TestHiddenLinearFunctionLibrary(QiskitTestCase):

0 commit comments

Comments
 (0)