qiskit 1.4.0__cp39-abi3-win32.whl → 1.4.2__cp39-abi3-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
qiskit/VERSION.txt CHANGED
@@ -1 +1 @@
1
- 1.4.0
1
+ 1.4.2
qiskit/_accelerate.pyd CHANGED
Binary file
@@ -64,14 +64,20 @@ class Instruction(Operation):
64
64
  def __init__(self, name, num_qubits, num_clbits, params, duration=None, unit="dt", label=None):
65
65
  """Create a new instruction.
66
66
 
67
+ .. deprecated:: 1.3
68
+ The parameters ``duration`` and ``unit`` are deprecated since
69
+ Qiskit 1.3, and they will be removed in 2.0 or later.
70
+ An instruction's duration is defined in a backend's Target object.
71
+
67
72
  Args:
68
73
  name (str): instruction name
69
74
  num_qubits (int): instruction's qubit width
70
75
  num_clbits (int): instruction's clbit width
71
76
  params (list[int|float|complex|str|ndarray|list|ParameterExpression]):
72
77
  list of parameters
73
- duration (int or float): instruction's duration. it must be integer if ``unit`` is 'dt'
74
- unit (str): time unit of duration
78
+ duration (int|float): (DEPRECATED) instruction's duration. it must be
79
+ an integer if ``unit`` is ``'dt'``
80
+ unit (str): (DEPRECATED) time unit of duration
75
81
  label (str or None): An optional label for identifying the instruction.
76
82
 
77
83
  Raises:
@@ -25,7 +25,7 @@ import operator
25
25
  import numpy
26
26
  import symengine
27
27
 
28
- from qiskit.circuit.exceptions import CircuitError
28
+ from qiskit.circuit.exceptions import CircuitError, QiskitError
29
29
 
30
30
  # This type is redefined at the bottom to insert the full reference to "ParameterExpression", so it
31
31
  # can safely be used by runtime type-checkers like Sphinx. Mypy does not need this because it
@@ -528,6 +528,9 @@ class ParameterExpression:
528
528
  def __str__(self):
529
529
  from sympy import sympify, sstr
530
530
 
531
+ if not isinstance(self._symbol_expr, symengine.Basic):
532
+ raise QiskitError("Invalid ParameterExpression")
533
+
531
534
  return sstr(sympify(self._symbol_expr), full_prec=False)
532
535
 
533
536
  def __complex__(self):
@@ -608,6 +611,8 @@ class ParameterExpression:
608
611
  return False
609
612
  from sympy import sympify
610
613
 
614
+ if not isinstance(self._symbol_expr, symengine.Basic):
615
+ raise QiskitError("Invalid ParameterExpression")
611
616
  return sympify(self._symbol_expr).equals(sympify(other._symbol_expr))
612
617
  elif isinstance(other, numbers.Number):
613
618
  return len(self.parameters) == 0 and complex(self._symbol_expr) == other
@@ -49,7 +49,10 @@ def pi_check(inpt, eps=1e-9, output="text", ndigits=None):
49
49
  if isinstance(inpt, ParameterExpression):
50
50
  param_str = str(inpt)
51
51
  from sympy import sympify
52
+ import symengine
52
53
 
54
+ if not isinstance(inpt._symbol_expr, symengine.Basic):
55
+ raise QiskitError("Invalid ParameterExpression provided")
53
56
  expr = sympify(inpt._symbol_expr)
54
57
  syms = expr.atoms()
55
58
  for sym in syms:
qiskit/pulse/utils.py CHANGED
@@ -51,7 +51,7 @@ def format_parameter_value(
51
51
  decimal: Number of digit to round returned value.
52
52
 
53
53
  Returns:
54
- Value casted to non-parameter data type, when possible.
54
+ Value cast to non-parameter data type, when possible.
55
55
  """
56
56
  if isinstance(operand, ParameterExpression):
57
57
  try:
@@ -638,7 +638,7 @@ def _read_custom_operations(file_obj, version, vectors):
638
638
  return custom_operations
639
639
 
640
640
 
641
- def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
641
+ def _read_calibrations(file_obj, version, vectors, metadata_deserializer, trust_input=False):
642
642
  calibrations = {}
643
643
 
644
644
  header = formats.CALIBRATION._make(
@@ -656,7 +656,12 @@ def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
656
656
  params = tuple(
657
657
  value.read_value(file_obj, version, vectors) for _ in range(defheader.num_params)
658
658
  )
659
- schedule = schedules.read_schedule_block(file_obj, version, metadata_deserializer)
659
+ schedule = schedules.read_schedule_block(
660
+ file_obj,
661
+ version,
662
+ metadata_deserializer,
663
+ trust_input=trust_input,
664
+ )
660
665
 
661
666
  if name not in calibrations:
662
667
  calibrations[name] = {(qubits, params): schedule}
@@ -1327,7 +1332,9 @@ def write_circuit(
1327
1332
  _write_layout(file_obj, circuit)
1328
1333
 
1329
1334
 
1330
- def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=False):
1335
+ def read_circuit(
1336
+ file_obj, version, metadata_deserializer=None, use_symengine=False, trust_input=False
1337
+ ):
1331
1338
  """Read a single QuantumCircuit object from the file like object.
1332
1339
 
1333
1340
  Args:
@@ -1345,6 +1352,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1345
1352
  supported in all platforms. Please check that your target platform is supported by
1346
1353
  the symengine library before setting this option, as it will be required by qpy to
1347
1354
  deserialize the payload.
1355
+ trust_input (bool): If true, deserialize vulnerable schedule block payloads.
1348
1356
  Returns:
1349
1357
  QuantumCircuit: The circuit object from the file.
1350
1358
 
@@ -1454,7 +1462,11 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1454
1462
  # Read calibrations
1455
1463
  if version >= 5:
1456
1464
  circ._calibrations_prop = _read_calibrations(
1457
- file_obj, version, vectors, metadata_deserializer
1465
+ file_obj,
1466
+ version,
1467
+ vectors,
1468
+ metadata_deserializer,
1469
+ trust_input=trust_input,
1458
1470
  )
1459
1471
 
1460
1472
  for vec_name, (vector, initialized_params) in vectors.items():
@@ -0,0 +1,121 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2025.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Parser for sympy expressions srepr from ParameterExpression internals."""
14
+
15
+ import ast
16
+
17
+ from qiskit.qpy.exceptions import QpyError
18
+
19
+
20
+ ALLOWED_CALLERS = {
21
+ "Abs",
22
+ "Add",
23
+ "Sub",
24
+ "Mul",
25
+ "Div",
26
+ "Pow",
27
+ "Symbol",
28
+ "Integer",
29
+ "Rational",
30
+ "Complex",
31
+ "Float",
32
+ "log",
33
+ "sin",
34
+ "cos",
35
+ "tan",
36
+ "atan",
37
+ "acos",
38
+ "asin",
39
+ "exp",
40
+ "conjugate",
41
+ }
42
+
43
+ UNARY = {
44
+ "sin",
45
+ "cos",
46
+ "tan",
47
+ "atan",
48
+ "acos",
49
+ "asin",
50
+ "conjugate",
51
+ "Symbol",
52
+ "Integer",
53
+ "Complex",
54
+ "Abs",
55
+ "Float",
56
+ }
57
+
58
+
59
+ class ParseSympyWalker(ast.NodeVisitor):
60
+ """A custom ast walker that is passed the sympy srepr from QPY < 13 and creates a custom
61
+ expression."""
62
+
63
+ def __init__(self):
64
+ self.stack = []
65
+
66
+ def visit_UnaryOp(self, node: ast.UnaryOp): # pylint: disable=invalid-name
67
+ """Visit a python unary op node"""
68
+ self.visit(node.operand)
69
+ arg = self.stack.pop()
70
+ if isinstance(node.op, ast.UAdd):
71
+ self.stack.append(+arg)
72
+ elif isinstance(node.op, ast.USub):
73
+ self.stack.append(-arg)
74
+ elif isinstance(node.op, ast.Not):
75
+ self.stack.append(not arg)
76
+ elif isinstance(node.op, ast.Invert):
77
+ self.stack.append(~arg)
78
+ else:
79
+ raise QpyError(f"Invalid unary op as part of sympy srepr: {node.op}")
80
+
81
+ def visit_Constant(self, node: ast.Constant): # pylint: disable=invalid-name
82
+ """Visit a constant node."""
83
+ self.stack.append(node.value)
84
+
85
+ def visit_Call(self, node: ast.Call): # pylint: disable=invalid-name
86
+ """Visit a call node
87
+
88
+ This can only be parameter expression allowed sympy call types.
89
+ """
90
+ import sympy
91
+
92
+ if isinstance(node.func, ast.Name):
93
+ name = node.func.id
94
+ else:
95
+ raise QpyError("Unknown node type")
96
+
97
+ if name not in ALLOWED_CALLERS:
98
+ raise QpyError(f"{name} is not part of a valid sympy expression srepr")
99
+
100
+ args = node.args
101
+ if name in UNARY:
102
+ if len(args) != 1:
103
+ raise QpyError(f"{name} has an invalid number of args in sympy srepr")
104
+ self.visit(args[0])
105
+ obj = getattr(sympy, name)(self.stack.pop())
106
+ self.stack.append(obj)
107
+ else:
108
+ for arg in args:
109
+ self.visit(arg)
110
+ out_args = [self.stack.pop() for _ in range(len(args))]
111
+ out_args.reverse()
112
+ obj = getattr(sympy, name)(*out_args)
113
+ self.stack.append(obj)
114
+
115
+
116
+ def parse_sympy_repr(sympy_repr: str):
117
+ """Parse a given sympy srepr into a symbolic expression object."""
118
+ tree = ast.parse(sympy_repr, mode="eval")
119
+ visitor = ParseSympyWalker()
120
+ visitor.visit(tree)
121
+ return visitor.stack.pop()
@@ -99,7 +99,7 @@ def _read_discriminator(file_obj, version):
99
99
  return Discriminator(name=name, **params)
100
100
 
101
101
 
102
- def _loads_symbolic_expr(expr_bytes, use_symengine=False):
102
+ def _loads_symbolic_expr(expr_bytes, use_symengine=False, trust_input=False):
103
103
  if expr_bytes == b"":
104
104
  return None
105
105
  expr_bytes = zlib.decompress(expr_bytes)
@@ -108,12 +108,18 @@ def _loads_symbolic_expr(expr_bytes, use_symengine=False):
108
108
  else:
109
109
  from sympy import parse_expr
110
110
 
111
+ if not trust_input:
112
+ raise QpyError(
113
+ "This payload can not be loaded unless you set ``trust_payload`` to "
114
+ "True, as it's using sympy for serialization of symbolic expressions which "
115
+ "is insecure."
116
+ )
111
117
  expr_txt = expr_bytes.decode(common.ENCODE)
112
118
  expr = parse_expr(expr_txt)
113
119
  return sym.sympify(expr)
114
120
 
115
121
 
116
- def _read_symbolic_pulse(file_obj, version):
122
+ def _read_symbolic_pulse(file_obj, version, trust_input=False):
117
123
  make = formats.SYMBOLIC_PULSE._make
118
124
  pack = formats.SYMBOLIC_PULSE_PACK
119
125
  size = formats.SYMBOLIC_PULSE_SIZE
@@ -125,9 +131,13 @@ def _read_symbolic_pulse(file_obj, version):
125
131
  )
126
132
  )
127
133
  pulse_type = file_obj.read(header.type_size).decode(common.ENCODE)
128
- envelope = _loads_symbolic_expr(file_obj.read(header.envelope_size))
129
- constraints = _loads_symbolic_expr(file_obj.read(header.constraints_size))
130
- valid_amp_conditions = _loads_symbolic_expr(file_obj.read(header.valid_amp_conditions_size))
134
+ envelope = _loads_symbolic_expr(file_obj.read(header.envelope_size), trust_input=trust_input)
135
+ constraints = _loads_symbolic_expr(
136
+ file_obj.read(header.constraints_size), trust_input=trust_input
137
+ )
138
+ valid_amp_conditions = _loads_symbolic_expr(
139
+ file_obj.read(header.valid_amp_conditions_size), trust_input=trust_input
140
+ )
131
141
  parameters = common.read_mapping(
132
142
  file_obj,
133
143
  deserializer=value.loads_value,
@@ -189,7 +199,7 @@ def _read_symbolic_pulse(file_obj, version):
189
199
  raise NotImplementedError(f"Unknown class '{class_name}'")
190
200
 
191
201
 
192
- def _read_symbolic_pulse_v6(file_obj, version, use_symengine):
202
+ def _read_symbolic_pulse_v6(file_obj, version, use_symengine, trust_input=False):
193
203
  make = formats.SYMBOLIC_PULSE_V2._make
194
204
  pack = formats.SYMBOLIC_PULSE_PACK_V2
195
205
  size = formats.SYMBOLIC_PULSE_SIZE_V2
@@ -202,10 +212,14 @@ def _read_symbolic_pulse_v6(file_obj, version, use_symengine):
202
212
  )
203
213
  class_name = file_obj.read(header.class_name_size).decode(common.ENCODE)
204
214
  pulse_type = file_obj.read(header.type_size).decode(common.ENCODE)
205
- envelope = _loads_symbolic_expr(file_obj.read(header.envelope_size), use_symengine)
206
- constraints = _loads_symbolic_expr(file_obj.read(header.constraints_size), use_symengine)
215
+ envelope = _loads_symbolic_expr(
216
+ file_obj.read(header.envelope_size), use_symengine, trust_input=trust_input
217
+ )
218
+ constraints = _loads_symbolic_expr(
219
+ file_obj.read(header.constraints_size), use_symengine, trust_input=trust_input
220
+ )
207
221
  valid_amp_conditions = _loads_symbolic_expr(
208
- file_obj.read(header.valid_amp_conditions_size), use_symengine
222
+ file_obj.read(header.valid_amp_conditions_size), use_symengine, trust_input=trust_input
209
223
  )
210
224
  parameters = common.read_mapping(
211
225
  file_obj,
@@ -277,15 +291,21 @@ def _read_alignment_context(file_obj, version):
277
291
 
278
292
 
279
293
  # pylint: disable=too-many-return-statements
280
- def _loads_operand(type_key, data_bytes, version, use_symengine):
294
+ def _loads_operand(type_key, data_bytes, version, use_symengine, trust_input=False):
281
295
  if type_key == type_keys.ScheduleOperand.WAVEFORM:
282
296
  return common.data_from_binary(data_bytes, _read_waveform, version=version)
283
297
  if type_key == type_keys.ScheduleOperand.SYMBOLIC_PULSE:
284
298
  if version < 6:
285
- return common.data_from_binary(data_bytes, _read_symbolic_pulse, version=version)
299
+ return common.data_from_binary(
300
+ data_bytes, _read_symbolic_pulse, version=version, trust_input=trust_input
301
+ )
286
302
  else:
287
303
  return common.data_from_binary(
288
- data_bytes, _read_symbolic_pulse_v6, version=version, use_symengine=use_symengine
304
+ data_bytes,
305
+ _read_symbolic_pulse_v6,
306
+ version=version,
307
+ use_symengine=use_symengine,
308
+ trust_input=trust_input,
289
309
  )
290
310
  if type_key == type_keys.ScheduleOperand.CHANNEL:
291
311
  return common.data_from_binary(data_bytes, _read_channel, version=version)
@@ -307,14 +327,20 @@ def _loads_operand(type_key, data_bytes, version, use_symengine):
307
327
  return value.loads_value(type_key, data_bytes, version, {})
308
328
 
309
329
 
310
- def _read_element(file_obj, version, metadata_deserializer, use_symengine):
330
+ def _read_element(file_obj, version, metadata_deserializer, use_symengine, trust_input=False):
311
331
  type_key = common.read_type_key(file_obj)
312
332
 
313
333
  if type_key == type_keys.Program.SCHEDULE_BLOCK:
314
- return read_schedule_block(file_obj, version, metadata_deserializer, use_symengine)
334
+ return read_schedule_block(
335
+ file_obj, version, metadata_deserializer, use_symengine, trust_input=trust_input
336
+ )
315
337
 
316
338
  operands = common.read_sequence(
317
- file_obj, deserializer=_loads_operand, version=version, use_symengine=use_symengine
339
+ file_obj,
340
+ deserializer=_loads_operand,
341
+ version=version,
342
+ use_symengine=use_symengine,
343
+ trust_input=trust_input,
318
344
  )
319
345
  name = value.read_value(file_obj, version, {})
320
346
 
@@ -326,7 +352,7 @@ def _read_element(file_obj, version, metadata_deserializer, use_symengine):
326
352
  return instance
327
353
 
328
354
 
329
- def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version):
355
+ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version, trust_input=False):
330
356
  if type_key == type_keys.Value.NULL:
331
357
  return None
332
358
  if type_key == type_keys.Program.SCHEDULE_BLOCK:
@@ -335,6 +361,7 @@ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version):
335
361
  deserializer=read_schedule_block,
336
362
  version=version,
337
363
  metadata_deserializer=metadata_deserializer,
364
+ trust_input=trust_input,
338
365
  )
339
366
 
340
367
  raise QpyError(
@@ -408,6 +435,9 @@ def _dumps_symbolic_expr(expr, use_symengine):
408
435
  else:
409
436
  from sympy import srepr, sympify
410
437
 
438
+ if not isinstance(expr, sym.Basic):
439
+ raise QiskitError("Invalid ParameterExpression")
440
+
411
441
  expr_bytes = srepr(sympify(expr)).encode(common.ENCODE)
412
442
  return zlib.compress(expr_bytes)
413
443
 
@@ -512,7 +542,9 @@ def _dumps_reference_item(schedule, metadata_serializer, version):
512
542
 
513
543
 
514
544
  @ignore_pulse_deprecation_warnings
515
- def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symengine=False):
545
+ def read_schedule_block(
546
+ file_obj, version, metadata_deserializer=None, use_symengine=False, trust_input=False
547
+ ):
516
548
  """Read a single ScheduleBlock from the file like object.
517
549
 
518
550
  Args:
@@ -529,6 +561,14 @@ def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symen
529
561
  native mechanism. This is a faster serialization alternative, but not supported in all
530
562
  platforms. Please check that your target platform is supported by the symengine library
531
563
  before setting this option, as it will be required by qpy to deserialize the payload.
564
+ trust_input (bool): if set to ``False`` (the default),
565
+ :class:`.ScheduleBlock` objects in the payload that were
566
+ serialized using ``sympy`` are not allowed and will error. This
567
+ is because the ``sympy`` parsing uses :func:`eval`, which
568
+ can allow for arbitrary code execution.
569
+ The flag should only be set
570
+ to ``True`` if you trust the QPY payload you are loading.
571
+
532
572
  Returns:
533
573
  ScheduleBlock: The schedule block object from the file.
534
574
 
@@ -556,7 +596,9 @@ def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symen
556
596
  alignment_context=context,
557
597
  )
558
598
  for _ in range(data.num_elements):
559
- block_elm = _read_element(file_obj, version, metadata_deserializer, use_symengine)
599
+ block_elm = _read_element(
600
+ file_obj, version, metadata_deserializer, use_symengine, trust_input=trust_input
601
+ )
560
602
  block.append(block_elm, inplace=True)
561
603
 
562
604
  # Load references
@@ -566,6 +608,7 @@ def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symen
566
608
  deserializer=_loads_reference_item,
567
609
  version=version,
568
610
  metadata_deserializer=metadata_deserializer,
611
+ trust_input=trust_input,
569
612
  )
570
613
  ref_dict = {}
571
614
  for key_str, schedule in flat_key_refdict.items():
@@ -34,6 +34,7 @@ from qiskit.circuit.parameterexpression import (
34
34
  )
35
35
  from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
36
36
  from qiskit.qpy import common, formats, exceptions, type_keys
37
+ from qiskit.qpy.binary_io.parse_sympy_repr import parse_sympy_repr
37
38
 
38
39
 
39
40
  def _write_parameter(file_obj, obj):
@@ -142,6 +143,8 @@ def _encode_replay_subs(subs, file_obj, version):
142
143
 
143
144
 
144
145
  def _write_parameter_expression_v13(file_obj, obj, version):
146
+ # A symbol is `Parameter` or `ParameterVectorElement`.
147
+ # `symbol_map` maps symbols to ParameterExpression (which may be a symbol).
145
148
  symbol_map = {}
146
149
  for inst in obj._qpy_replay:
147
150
  if isinstance(inst, _SUBS):
@@ -169,6 +172,9 @@ def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
169
172
  else:
170
173
  from sympy import srepr, sympify
171
174
 
175
+ if not isinstance(obj._symbol_expr, symengine.Basic):
176
+ raise exceptions.QpyError("Invalid ParameterExpression")
177
+
172
178
  expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
173
179
  else:
174
180
  with io.BytesIO() as buf:
@@ -234,9 +240,17 @@ def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
234
240
  # serialize key
235
241
  if symbol_key == type_keys.Value.PARAMETER_VECTOR:
236
242
  symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
243
+ elif symbol_key == type_keys.Value.PARAMETER_EXPRESSION:
244
+ symbol_data = common.data_to_binary(
245
+ symbol,
246
+ _write_parameter_expression,
247
+ use_symengine=use_symengine,
248
+ version=version,
249
+ )
237
250
  else:
238
251
  symbol_data = common.data_to_binary(symbol, _write_parameter)
239
252
  # serialize value
253
+
240
254
  value_key, value_data = dumps_value(
241
255
  symbol, version=version, use_symengine=use_symengine
242
256
  )
@@ -409,9 +423,9 @@ def _read_parameter_expression(file_obj):
409
423
  data = formats.PARAMETER_EXPR(
410
424
  *struct.unpack(formats.PARAMETER_EXPR_PACK, file_obj.read(formats.PARAMETER_EXPR_SIZE))
411
425
  )
412
- from sympy.parsing.sympy_parser import parse_expr
413
426
 
414
- expr_ = symengine.sympify(parse_expr(file_obj.read(data.expr_size).decode(common.ENCODE)))
427
+ sympy_str = file_obj.read(data.expr_size).decode(common.ENCODE)
428
+ expr_ = symengine.sympify(parse_sympy_repr(sympy_str))
415
429
  symbol_map = {}
416
430
  for _ in range(data.map_elements):
417
431
  elem_data = formats.PARAM_EXPR_MAP_ELEM(
@@ -450,9 +464,8 @@ def _read_parameter_expression_v3(file_obj, vectors, use_symengine):
450
464
  if use_symengine:
451
465
  expr_ = common.load_symengine_payload(payload)
452
466
  else:
453
- from sympy.parsing.sympy_parser import parse_expr
454
-
455
- expr_ = symengine.sympify(parse_expr(payload.decode(common.ENCODE)))
467
+ sympy_str = payload.decode(common.ENCODE)
468
+ expr_ = symengine.sympify(parse_sympy_repr(sympy_str))
456
469
 
457
470
  symbol_map = {}
458
471
  for _ in range(data.map_elements):
@@ -516,10 +529,13 @@ def _read_parameter_expression_v13(file_obj, vectors, version):
516
529
  symbol = _read_parameter(file_obj)
517
530
  elif symbol_key == type_keys.Value.PARAMETER_VECTOR:
518
531
  symbol = _read_parameter_vec(file_obj, vectors)
532
+ elif symbol_key == type_keys.Value.PARAMETER_EXPRESSION:
533
+ symbol = _read_parameter_expression_v13(file_obj, vectors, version)
519
534
  else:
520
535
  raise exceptions.QpyError(f"Invalid parameter expression map type: {symbol_key}")
521
536
 
522
537
  elem_key = type_keys.Value(elem_data.type)
538
+
523
539
  binary_data = file_obj.read(elem_data.size)
524
540
  if elem_key == type_keys.Value.INTEGER:
525
541
  value = struct.unpack("!q", binary_data)
@@ -534,6 +550,7 @@ def _read_parameter_expression_v13(file_obj, vectors, version):
534
550
  binary_data,
535
551
  _read_parameter_expression_v13,
536
552
  vectors=vectors,
553
+ version=version,
537
554
  )
538
555
  else:
539
556
  raise exceptions.QpyError(f"Invalid parameter expression map type: {elem_key}")
qiskit/qpy/interface.py CHANGED
@@ -238,6 +238,7 @@ def dump(
238
238
  def load(
239
239
  file_obj: BinaryIO,
240
240
  metadata_deserializer: Optional[Type[JSONDecoder]] = None,
241
+ trust_payload: bool = False,
241
242
  ) -> List[QPY_SUPPORTED_TYPES]:
242
243
  """Load a QPY binary file
243
244
 
@@ -277,6 +278,18 @@ def load(
277
278
  If this is not specified the circuit metadata will
278
279
  be parsed as JSON with the stdlib ``json.load()`` function using
279
280
  the default ``JSONDecoder`` class.
281
+ trust_payload: if set to ``False`` (the default),
282
+ :class:`.ScheduleBlock` objects in the payload that were
283
+ serialized using ``sympy`` are not allowed and will error. This
284
+ is because the ``sympy`` parsing uses :func:`eval`, which
285
+ can allow for arbitrary code execution.
286
+ The flag should only be set
287
+ to ``True`` if you trust the QPY payload you are loading.
288
+
289
+ .. warning::
290
+
291
+ If ``trust_payload`` is set to ``True`` this can enable arbitrary
292
+ code execution because internally ``sympy`` relies on :func:`eval`.
280
293
 
281
294
  Returns:
282
295
  The list of Qiskit programs contained in the QPY data.
@@ -344,6 +357,11 @@ def load(
344
357
  else:
345
358
  type_key = common.read_type_key(file_obj)
346
359
 
360
+ if data.qpy_version < 10:
361
+ use_symengine = False
362
+ else:
363
+ use_symengine = data.symbolic_encoding == type_keys.SymExprEncoding.SYMENGINE
364
+
347
365
  if type_key == type_keys.Program.CIRCUIT:
348
366
  loader = binary_io.read_circuit
349
367
  elif type_key == type_keys.Program.SCHEDULE_BLOCK:
@@ -359,11 +377,6 @@ def load(
359
377
  else:
360
378
  raise TypeError(f"Invalid payload format data kind '{type_key}'.")
361
379
 
362
- if data.qpy_version < 10:
363
- use_symengine = False
364
- else:
365
- use_symengine = data.symbolic_encoding == type_keys.SymExprEncoding.SYMENGINE
366
-
367
380
  programs = []
368
381
  for _ in range(data.num_programs):
369
382
  programs.append(
@@ -372,6 +385,7 @@ def load(
372
385
  data.qpy_version,
373
386
  metadata_deserializer=metadata_deserializer,
374
387
  use_symengine=use_symengine,
388
+ trust_input=trust_payload,
375
389
  )
376
390
  )
377
391
  return programs
@@ -37,6 +37,8 @@ _1q_inverses = {
37
37
  "tdg": "t",
38
38
  "s": "sdg",
39
39
  "sdg": "s",
40
+ "sx": "sxdg",
41
+ "sxdg": "sx",
40
42
  }
41
43
 
42
44
  _1q_gates = {
@@ -59,6 +59,7 @@ class ApplyLayout(TransformationPass):
59
59
  q = QuantumRegister(len(layout), "q")
60
60
 
61
61
  new_dag = DAGCircuit()
62
+ new_dag.name = dag.name
62
63
  new_dag.add_qreg(q)
63
64
  for var in dag.iter_input_vars():
64
65
  new_dag.add_input_var(var)
@@ -495,7 +495,6 @@ class TemplateSubstitution:
495
495
  parameter constraints, returns None.
496
496
  """
497
497
  import sympy as sym
498
- from sympy.parsing.sympy_parser import parse_expr
499
498
 
500
499
  if _optionals.HAS_SYMENGINE:
501
500
  import symengine
@@ -571,7 +570,8 @@ class TemplateSubstitution:
571
570
  if isinstance(circuit_param, ParameterExpression):
572
571
  circ_param_sym = circuit_param.sympify()
573
572
  else:
574
- circ_param_sym = parse_expr(str(circuit_param))
573
+ # if it's not a ParameterExpression we're a float
574
+ circ_param_sym = sym.Float(circuit_param)
575
575
  equations.append(sym.Eq(template_param.sympify(), circ_param_sym))
576
576
 
577
577
  for param in template_param.parameters:
@@ -142,6 +142,15 @@ class DrawerCanvas:
142
142
  def load_program(self, program: circuit.QuantumCircuit, target: Target | None = None):
143
143
  """Load quantum circuit and create drawing..
144
144
 
145
+ .. deprecated:: 1.3
146
+ Visualization of unscheduled circuits with the timeline drawer has been
147
+ deprecated in Qiskit 1.3.
148
+ This circuit should be transpiled with a scheduler, despite having instructions
149
+ with explicit durations.
150
+
151
+ .. deprecated:: 1.3
152
+ Targets with duration-less operations are going to error in Qiskit 2.0.
153
+
145
154
  Args:
146
155
  program: Scheduled circuit object to draw.
147
156
  target: The target the circuit is scheduled for. This contains backend information
@@ -52,6 +52,10 @@ def draw(
52
52
  ):
53
53
  r"""Generate visualization data for scheduled circuit programs.
54
54
 
55
+ .. deprecated:: 1.3
56
+ The ``target`` parameter needs to be specified in Qiskit 2.0 in order to get the
57
+ instruction durations.
58
+
55
59
  Args:
56
60
  program: Program to visualize. This program should be a `QuantumCircuit` which is
57
61
  transpiled with a scheduling_method, thus containing gate time information.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: qiskit
3
- Version: 1.4.0
3
+ Version: 1.4.2
4
4
  Summary: An open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.
5
5
  Author-email: Qiskit Development Team <qiskit@us.ibm.com>
6
6
  License: Apache 2.0
@@ -1,6 +1,6 @@
1
- qiskit/VERSION.txt,sha256=OC5XeCBcNEYZq9AQa8SFh6OoScfpTIDLjjKXVN5osfY,7
1
+ qiskit/VERSION.txt,sha256=1jWI6kt46Do30SGdfJ9iXlCApbJp0XhIGcupOobBTuE,7
2
2
  qiskit/__init__.py,sha256=j9lFyrT2s7TLHjKJjaSavWx6ozEFjtqli3KXOaFNVv0,7712
3
- qiskit/_accelerate.pyd,sha256=GUm0oO6vi7uhjUhKQdSgPPPMxgrjiuDGxNGiLP7qWmc,8562176
3
+ qiskit/_accelerate.pyd,sha256=xCliFojscIZuXy46kvszj5Awijmr3dyHirkoR6E3cY4,8565760
4
4
  qiskit/_numpy_compat.py,sha256=EV1RihNRJnvWzjb57z8sjMbv9EeRPzk8Mnegzw7ItR0,2888
5
5
  qiskit/exceptions.py,sha256=UamBNQmDJTx6ruzmj7iXgcsrBcvkfE-bZ4TH2-K_ngw,5772
6
6
  qiskit/user_config.py,sha256=IKxY7cK1EX-GqkvPE4Lsss1NMoEcYie6Qq8hkNOtLJA,10371
@@ -28,12 +28,12 @@ qiskit/circuit/equivalence.py,sha256=1R1wJ4Go5STtH43B-GTKOg-oJfKJtYXhiD9WXQk9Xs0
28
28
  qiskit/circuit/equivalence_library.py,sha256=goJMAeNvJzASJGxHeiVUh8FjAU4Qz6UfH_khNU028M0,726
29
29
  qiskit/circuit/exceptions.py,sha256=39XWKqnHRfjGt3VK7gH84CZD-oqSoel7m7wcPGZNk4g,710
30
30
  qiskit/circuit/gate.py,sha256=iqxIhC1zjuSfuvI-BwHcFJVkCc3Eb0MVAkFltK9hBlk,10505
31
- qiskit/circuit/instruction.py,sha256=SC2iVVswlmelUkeSoZqR2cN0wwBNoIlhVHPS7lWYOSE,27307
31
+ qiskit/circuit/instruction.py,sha256=2Wshz4gJqI-wNtv2pi6IVuVf5H95FtwpGK6wEaJtE3U,27604
32
32
  qiskit/circuit/instructionset.py,sha256=Y-r7p8gjJh2_hFCOSwHL_9fpRLoL2aiXolgObd4ZRw0,7892
33
33
  qiskit/circuit/measure.py,sha256=kSmG-pF_yeT3lgAYsDO6SMcSmszPApeuLNM_EHWp0Ck,1514
34
34
  qiskit/circuit/operation.py,sha256=85i2oVIhvEF5mh4TTlpyEXdhfqKwver7LKD0ac2YLRQ,2145
35
35
  qiskit/circuit/parameter.py,sha256=5nZhW0cUdhRtSOwvxQHSKTZztFWl_yalcr0jK3Hwefk,7283
36
- qiskit/circuit/parameterexpression.py,sha256=vmGuv0SctX6730IP3PoBR2JZwU6e-Vqbumz_zuMr7t4,27743
36
+ qiskit/circuit/parameterexpression.py,sha256=sVeZs0tjRnDIRzbzqp_69i39UqlqC_0mdypuPvPuqD4,28018
37
37
  qiskit/circuit/parametertable.py,sha256=4u7EuKAiVskcnWQW8dnfU8jgYKZ92KdH2g6PeTvvjjA,3388
38
38
  qiskit/circuit/parametervector.py,sha256=NgNAy0Tzvy0fdfLIhTI6Bg0kqckevhKVPBP9ONMF3uU,4907
39
39
  qiskit/circuit/quantumcircuit.py,sha256=3XOdXkdaXpnWktYNY0w1biLQjmUgTy5UNWqI_PWKcjA,303689
@@ -252,7 +252,7 @@ qiskit/circuit/library/templates/rzx/rzx_zz3.py,sha256=RDqK1pcyg-vRulclzK-0Ugooq
252
252
  qiskit/circuit/random/__init__.py,sha256=8Ndr3sYxCq3r03sI2KeFTXhSry8LX2TQy8VI5SuubOE,604
253
253
  qiskit/circuit/random/utils.py,sha256=l6hzBa9bhKTno8h2_lffhWIgV2ly0UtL_H2BzciP_YM,15167
254
254
  qiskit/circuit/tools/__init__.py,sha256=6O50HcNi3ilZfSEAWqlF0m4VSBkd2Pi2w3c2n0qBmkM,556
255
- qiskit/circuit/tools/pi_check.py,sha256=P6Ww17q3G86cML7zeBp1lNloXeJJyX9ZLKOj7m2mRfo,7363
255
+ qiskit/circuit/tools/pi_check.py,sha256=BjWYX21ini1YvxaPWwjbsTtmeslA1aQaP-a5WzwfBa0,7524
256
256
  qiskit/compiler/__init__.py,sha256=QgVwc3S8rElQDmk21P__XJBDyRMAdFDUCbRWVzFNXE8,1022
257
257
  qiskit/compiler/assembler.py,sha256=ROqW9rVRRNVoYw362gNLwKkzJzb5iTj_-T9l-4gL9wg,28900
258
258
  qiskit/compiler/scheduler.py,sha256=l9N81WqYzhf62CCC7iuj3FWUpRSrnYJPjL5ipfk9gAI,4641
@@ -384,7 +384,7 @@ qiskit/pulse/parameter_manager.py,sha256=xW74Hi5wH-EMnKUpFn1jPr_wPjtUr43s7Qns_mf
384
384
  qiskit/pulse/parser.py,sha256=ru9vtb_YGLSaM6m2I15B-HfYgcY3fYpdHzDgoW_zTTk,10366
385
385
  qiskit/pulse/reference_manager.py,sha256=3t6VK1iCfhR3twIDOoPH9745caOhX9HmOUY6KC3jsDQ,2103
386
386
  qiskit/pulse/schedule.py,sha256=7wgf4TZeyGZDv48Qeem_M-ln1QnQUv-MX3ks8jzZ3Cw,74798
387
- qiskit/pulse/utils.py,sha256=SyQzG9bXatYVYUSvZSmwuWyO0hTpHjxKPbT3HYsCMfY,6122
387
+ qiskit/pulse/utils.py,sha256=jQ5FKw0DGS4RM_MaQuiEuhCkiP1NqHw_qpYPh7ENnBM,6120
388
388
  qiskit/pulse/instructions/__init__.py,sha256=64cGUjTcFZMwZIF8XRJhyArivAJ1kpN1pn76ae0mU0o,2344
389
389
  qiskit/pulse/instructions/acquire.py,sha256=E9SYY0N4EmopmFZojExFK1J58mhMMcaFiCaX61FKKjk,6292
390
390
  qiskit/pulse/instructions/delay.py,sha256=JKZCQBhVxNweSRIZj4J90TtAXuhQoU2rEAu9XU9DW0E,2490
@@ -433,12 +433,13 @@ qiskit/qpy/__init__.py,sha256=BGdJuGrmsAFROxwuybrsj2Cmsld4oy88Oo0n9BvOXYE,64895
433
433
  qiskit/qpy/common.py,sha256=Xn99CjXUNg2kmvz49PoDpcp9uGP3_V00IWhO_HKzmAk,12608
434
434
  qiskit/qpy/exceptions.py,sha256=BX1ILW35oUPDmotmttybw2bY1IvUwziOVpsf7z_mIkY,1900
435
435
  qiskit/qpy/formats.py,sha256=J8_gNHZg_TUtA6qm-Zrq0rUWJY1g1nZ_b_gtEyu578I,11921
436
- qiskit/qpy/interface.py,sha256=5C9tOHo_Fg3l58nSBtODLuvR_W0exQBnHOmpE2KQSTg,14508
436
+ qiskit/qpy/interface.py,sha256=lyZkCmQ8ImfU8iyFK_odd-F6F_YohtnU5eyLi0WWM_U,15202
437
437
  qiskit/qpy/type_keys.py,sha256=gRuzYEeXhrSHUE6uNXe3oTCP8g5Q1I_DfB1wiY0ARhM,16333
438
438
  qiskit/qpy/binary_io/__init__.py,sha256=kBTRGy5cJdiDk-X1CSjSEpgLV-i_xT0IqcmI1a_AhOY,1109
439
- qiskit/qpy/binary_io/circuits.py,sha256=qhfLU-srQgiyEUK5faP5zpYeQSENKwf7J20UBgrcudo,59148
440
- qiskit/qpy/binary_io/schedules.py,sha256=jPV6hCD5Oc91c27clsqlj-EzpROH9xjZ1ot39Z9xdfg,24575
441
- qiskit/qpy/binary_io/value.py,sha256=6Uk0nero7Jj6wsjCy-zMC30VoTNtyH3t_JHBoaAGckI,41134
439
+ qiskit/qpy/binary_io/circuits.py,sha256=BcvJ_jlUrdnvMYz1TWYpM-10Hu-j1Cq22CKENpwm8gg,59447
440
+ qiskit/qpy/binary_io/parse_sympy_repr.py,sha256=EbCXrVMc0CNjzEnq81HHkAzyoveLbwjIquJ9E4Rqd9g,3411
441
+ qiskit/qpy/binary_io/schedules.py,sha256=jG2QfYSRz17oQ_zkxhBs5lpYFNd-QagtXWey-1nMNho,26161
442
+ qiskit/qpy/binary_io/value.py,sha256=kGdL601UgibLcLEZ7j-jN6dSQUWVTQwex893CR7eak8,41935
442
443
  qiskit/quantum_info/__init__.py,sha256=aJ0-ScJplIxqOZf7MYtQzF1xWXqq3_y_TvGZQfo_n_c,3589
443
444
  qiskit/quantum_info/quaternion.py,sha256=qlB8jMmWBmYzBgzDwiLjINGD9KlfllfS5D5yCr2DML4,5040
444
445
  qiskit/quantum_info/random.py,sha256=N9f6Vgo_oWf03xbV3drM6Pmi0jWw7w2SC6hpO5BQiaE,941
@@ -544,7 +545,7 @@ qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py,sha256=yqsjx5
544
545
  qiskit/synthesis/discrete_basis/__init__.py,sha256=AT21B-kaBO1TsTURuN2bjAAg9IRUU5xEL3OgNOmQais,672
545
546
  qiskit/synthesis/discrete_basis/commutator_decompose.py,sha256=cqyk7x1H8UCvd598gi3NJo_N_0rkaCW-Ji0Z0-MF72c,7794
546
547
  qiskit/synthesis/discrete_basis/gate_sequence.py,sha256=ZqGAgo8_EwyTI5ZxIy0iGuLvGmK8hZBpizSIJi5BB6A,14323
547
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py,sha256=WfOYX5VNVqq2O3xMLCHhVDwdIuzGmh8tdS-Edkm1P_M,5428
548
+ qiskit/synthesis/discrete_basis/generate_basis_approximations.py,sha256=v7fTOFrYCOIKelVob2NRGdy1YJlngFR7MmoTdRmQFv8,5466
548
549
  qiskit/synthesis/discrete_basis/solovay_kitaev.py,sha256=ewBl23r6BAx847uAFBNCTYBHvQ3Ci3DbpVa7XpGP55M,9033
549
550
  qiskit/synthesis/evolution/__init__.py,sha256=bOPqU_1tLiycg_5Ck4gJP8DwKIjxh5TywJEaXQaPdEY,849
550
551
  qiskit/synthesis/evolution/evolution_synthesis.py,sha256=i1MFzTnDhNrWdPnwj_7fjfQVt06IsQB-VmznX5dmcS8,1565
@@ -641,7 +642,7 @@ qiskit/transpiler/passes/calibration/rzx_builder.py,sha256=lp4K6usaHfioPjah47T8v
641
642
  qiskit/transpiler/passes/calibration/rzx_templates.py,sha256=B2n9HBEYWUX2-qpFkn1beVZR4piPiuiTD9lcqyhHjBM,1839
642
643
  qiskit/transpiler/passes/layout/__init__.py,sha256=BHZJXEnfbSQ404Hh65pbtOqkoD_H6yy9dok1u1_v-P8,1068
643
644
  qiskit/transpiler/passes/layout/_csp_custom_solver.py,sha256=38KoabU0j3br4ArNrjQEw-L08aeN3MNtWK2hTTLLbeM,2813
644
- qiskit/transpiler/passes/layout/apply_layout.py,sha256=IemilWNDqz5jDwbQJwpGrOjKQOJzxYfbrxG_-w8N3ic,5523
645
+ qiskit/transpiler/passes/layout/apply_layout.py,sha256=jwOPuAg6Q70uXsloLUT-uL1um1Tnr6o60bELRldAkPE,5556
645
646
  qiskit/transpiler/passes/layout/csp_layout.py,sha256=ca9OAncR3kFWzuve88i5MR-F1hrytUDs01ra6oCPsdo,5553
646
647
  qiskit/transpiler/passes/layout/dense_layout.py,sha256=P_t0AhtPiZsPfu_HP8qkY_bludoXyRWZpLLo7sBRPL0,8390
647
648
  qiskit/transpiler/passes/layout/disjoint_utils.py,sha256=icKy_q9EKn3K_omLAe6JOLXnzOaBFQYuuhmiaL9z2_I,9628
@@ -691,7 +692,7 @@ qiskit/transpiler/passes/optimization/template_matching/backward_match.py,sha256
691
692
  qiskit/transpiler/passes/optimization/template_matching/forward_match.py,sha256=iDZUdCBeHZpVZXKFWLHWuUqjJQrEX42iZ1cgF4a4PeQ,17762
692
693
  qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py,sha256=vKrypbcMr58X6j2_bDHV9ZO-SSh2jGfCcaWJ7H0sBLI,2514
693
694
  qiskit/transpiler/passes/optimization/template_matching/template_matching.py,sha256=RSmJS7acqs8LxBrkkZ4a8Qxn7-A_uZUPJIvJ4H5zmmw,18025
694
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py,sha256=1zKBbwOJsGQAQHBylKG2jG_tPQvh69hrX3MQGwmWGkU,26474
695
+ qiskit/transpiler/passes/optimization/template_matching/template_substitution.py,sha256=sxxdC31iINaNyt3ExOlpgeyryZuRde--2v71LAOmWnc,26480
695
696
  qiskit/transpiler/passes/routing/__init__.py,sha256=p4KrE73QTCX1TX1pKRwP0EXRojPDi2RzZnURdHnWdCw,964
696
697
  qiskit/transpiler/passes/routing/basic_swap.py,sha256=2-psCRJsvxCKoNCKt_Tx9mC9vQp-V9AWr2hNSPc5MLs,6896
697
698
  qiskit/transpiler/passes/routing/layout_transformation.py,sha256=IWqOrP4_5V1DKNBSejSjFCyXCB51iMzJfGL4MjxWE44,4804
@@ -818,19 +819,19 @@ qiskit/visualization/pulse_v2/plotters/__init__.py,sha256=UfqlDwwKIoLlp0US6VaYxE
818
819
  qiskit/visualization/pulse_v2/plotters/base_plotter.py,sha256=dbsX6uvcfKTJ75B9GMyowmTkL1oPb52UQStbGtiUjLE,1604
819
820
  qiskit/visualization/pulse_v2/plotters/matplotlib.py,sha256=s6WwdMG3LKucEx7a4YkmBtcGuAcwytZvrJg8qHCR5dg,7760
820
821
  qiskit/visualization/timeline/__init__.py,sha256=w86QdzX299xNYYUxxLQ9ZTqRNDEqQSk5S6j3MzGFGeA,722
821
- qiskit/visualization/timeline/core.py,sha256=pRXbe3v7nPMZrokqy-HYMmYvMtYO28arEnkGKGDHwso,19413
822
+ qiskit/visualization/timeline/core.py,sha256=0PGu9TQkyHx0w_aLAZJV_Vvaft3NvDF3N9OBOEkDswY,19810
822
823
  qiskit/visualization/timeline/drawings.py,sha256=czvk3OoIl0jUnuSdxxN9m40GhG7CyseDHc8wx7pcckE,9981
823
824
  qiskit/visualization/timeline/generators.py,sha256=u5wNwq78O6Y_ngpWIU112iFsHOdH5bYI78Lc_xB7yzc,15765
824
- qiskit/visualization/timeline/interface.py,sha256=I-YdOWRxWrv_CBnur1zDXk1nWme7_LCr9M_cXINgtcI,21738
825
+ qiskit/visualization/timeline/interface.py,sha256=v-TTmM6yQEePzzjStgNQNSDErMGjLD0i1Hr5QWEaKuo,21885
825
826
  qiskit/visualization/timeline/layouts.py,sha256=zeNRv2HgF8j3q9cJ3J28u3kTnK7HuMTIJWoUAhjaC2Q,3302
826
827
  qiskit/visualization/timeline/stylesheet.py,sha256=KzzFPJeltHqbhufqBikTjFBj6YTxevpW8PeqBK4ORUA,11215
827
828
  qiskit/visualization/timeline/types.py,sha256=jtpipQWUpahayNPQYKUst4GG6BqauovO0qgpE5U7W54,4775
828
829
  qiskit/visualization/timeline/plotters/__init__.py,sha256=Klg9a1cSUIQhc815g8OpnD5vO1hcI51L9KlFfKzcuRg,588
829
830
  qiskit/visualization/timeline/plotters/base_plotter.py,sha256=taRkL2ZbyorRUEf6nJS8egdzKW2eznQ3w5oBLtMG_U8,1805
830
831
  qiskit/visualization/timeline/plotters/matplotlib.py,sha256=lqqNH3-bdf1F1cS2mDla9dLr5qEOeIFuqVl9Rhdg-Dw,7086
831
- qiskit-1.4.0.dist-info/LICENSE.txt,sha256=pUbmRuPr1gJTTTWZu2c8UmNSntz-pDdKfGR-86NRkok,11619
832
- qiskit-1.4.0.dist-info/METADATA,sha256=QI5zSplLW1isryhVYYkJxr-KW89orZc-LDqe322A-24,12948
833
- qiskit-1.4.0.dist-info/WHEEL,sha256=0t-5NY-EnDFOJkFnD10hK8OJuwmlGPfUSIb7R7_TSAQ,95
834
- qiskit-1.4.0.dist-info/entry_points.txt,sha256=8f4O6ZbFAIr5AzsP3wWosbp6n4_WI-sYGkgID9Y9JSE,5673
835
- qiskit-1.4.0.dist-info/top_level.txt,sha256=_vjFXLv7qrHyJJOC2-JXfG54o4XQygW9GuQPxgtSt9Q,7
836
- qiskit-1.4.0.dist-info/RECORD,,
832
+ qiskit-1.4.2.dist-info/LICENSE.txt,sha256=pUbmRuPr1gJTTTWZu2c8UmNSntz-pDdKfGR-86NRkok,11619
833
+ qiskit-1.4.2.dist-info/METADATA,sha256=YJB7rQGVIHeLZb1f9Ei-mkvGYGF_nb5IH26gKrxtvgU,12948
834
+ qiskit-1.4.2.dist-info/WHEEL,sha256=mxpng385xFLh4gFixsisd2mud6MkyJuDFOovadnxUqw,95
835
+ qiskit-1.4.2.dist-info/entry_points.txt,sha256=8f4O6ZbFAIr5AzsP3wWosbp6n4_WI-sYGkgID9Y9JSE,5673
836
+ qiskit-1.4.2.dist-info/top_level.txt,sha256=_vjFXLv7qrHyJJOC2-JXfG54o4XQygW9GuQPxgtSt9Q,7
837
+ qiskit-1.4.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp39-abi3-win32
5
5