cirq-core 1.5.0.dev20240703215652__py3-none-any.whl → 1.5.0.dev20240710220908__py3-none-any.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.

Potentially problematic release.


This version of cirq-core might be problematic. Click here for more details.

cirq/_version.py CHANGED
@@ -28,4 +28,4 @@ if sys.version_info < (3, 10, 0): # pragma: no cover
28
28
  'of cirq (e.g. "python -m pip install cirq==1.1.*")'
29
29
  )
30
30
 
31
- __version__ = "1.5.0.dev20240703215652"
31
+ __version__ = "1.5.0.dev20240710220908"
cirq/_version_test.py CHANGED
@@ -3,4 +3,4 @@ import cirq
3
3
 
4
4
 
5
5
  def test_version():
6
- assert cirq.__version__ == "1.5.0.dev20240703215652"
6
+ assert cirq.__version__ == "1.5.0.dev20240710220908"
@@ -327,9 +327,9 @@ def test_repeat(add_measurements: bool, use_default_ids_for_initial_rep: bool) -
327
327
  _ = op_base.repeat()
328
328
 
329
329
  with pytest.raises(TypeError, match='Only integer or sympy repetitions are allowed'):
330
- _ = op_base.repeat(1.3) # type: ignore[arg-type]
331
- assert op_base.repeat(3.00000000001).repetitions == 3 # type: ignore[arg-type]
332
- assert op_base.repeat(2.99999999999).repetitions == 3 # type: ignore[arg-type]
330
+ _ = op_base.repeat(1.3)
331
+ assert op_base.repeat(3.00000000001).repetitions == 3
332
+ assert op_base.repeat(2.99999999999).repetitions == 3
333
333
 
334
334
 
335
335
  @pytest.mark.parametrize('add_measurements', [True, False])
@@ -17,8 +17,8 @@ import itertools
17
17
  import functools
18
18
 
19
19
  from typing import (
20
- Any,
21
20
  cast,
21
+ Any,
22
22
  Iterator,
23
23
  List,
24
24
  Optional,
@@ -107,7 +107,6 @@ class RandomizedBenchMarkResult:
107
107
  show_plot = not ax
108
108
  if not ax:
109
109
  fig, ax = plt.subplots(1, 1, figsize=(8, 8)) # pragma: no cover
110
- ax = cast(plt.Axes, ax) # pragma: no cover
111
110
  ax.set_ylim((0.0, 1.0)) # pragma: no cover
112
111
  ax.plot(self._num_cfds_seq, self._gnd_state_probs, 'ro', label='data', **plot_kwargs)
113
112
  x = np.linspace(self._num_cfds_seq[0], self._num_cfds_seq[-1], 100)
@@ -304,7 +303,9 @@ class TomographyResult:
304
303
  """
305
304
  show_plot = axes is None
306
305
  if axes is None:
307
- fig, axes = plt.subplots(1, 2, figsize=(12.0, 5.0), subplot_kw={'projection': '3d'})
306
+ fig, axes_v = plt.subplots(1, 2, figsize=(12.0, 5.0), subplot_kw={'projection': '3d'})
307
+ axes_v = cast(np.ndarray, axes_v)
308
+ axes = list(axes_v)
308
309
  elif len(axes) != 2:
309
310
  raise ValueError('A TomographyResult needs 2 axes to plot.')
310
311
  mat = self._density_matrix
@@ -14,7 +14,7 @@
14
14
  """Single qubit readout experiments using parallel or isolated statistics."""
15
15
  import dataclasses
16
16
  import time
17
- from typing import Any, Dict, Iterable, List, Optional, TYPE_CHECKING
17
+ from typing import cast, Any, Dict, Iterable, List, Optional, TYPE_CHECKING
18
18
 
19
19
  import sympy
20
20
  import numpy as np
@@ -77,8 +77,9 @@ class SingleQubitReadoutCalibrationResult:
77
77
  """
78
78
 
79
79
  if axs is None:
80
- _, axs = plt.subplots(1, 2, dpi=200, facecolor='white', figsize=(12, 4))
81
-
80
+ _, axs_v = plt.subplots(1, 2, dpi=200, facecolor='white', figsize=(12, 4))
81
+ axs_v = cast(np.ndarray, axs_v)
82
+ axs = cast(tuple[plt.Axes, plt.Axes], (axs_v[0], axs_v[1]))
82
83
  else:
83
84
  if (
84
85
  not isinstance(axs, (tuple, list, np.ndarray))
@@ -347,7 +347,7 @@ class InferredXEBResult:
347
347
  return ax
348
348
 
349
349
 
350
- def parallel_two_qubit_xeb(
350
+ def parallel_xeb_workflow(
351
351
  sampler: 'cirq.Sampler',
352
352
  qubits: Optional[Sequence['cirq.GridQubit']] = None,
353
353
  entangling_gate: 'cirq.Gate' = ops.CZ,
@@ -358,8 +358,8 @@ def parallel_two_qubit_xeb(
358
358
  random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
359
359
  ax: Optional[plt.Axes] = None,
360
360
  **plot_kwargs,
361
- ) -> TwoQubitXEBResult:
362
- """A convenience method that runs the full XEB workflow.
361
+ ) -> Tuple[pd.DataFrame, Sequence['cirq.Circuit'], pd.DataFrame]:
362
+ """A utility method that runs the full XEB workflow.
363
363
 
364
364
  Args:
365
365
  sampler: The quantum engine or simulator to run the circuits.
@@ -375,7 +375,12 @@ def parallel_two_qubit_xeb(
375
375
  **plot_kwargs: Arguments to be passed to 'plt.Axes.plot'.
376
376
 
377
377
  Returns:
378
- A TwoQubitXEBResult object representing the results of the experiment.
378
+ - A DataFrame with columns 'cycle_depth' and 'fidelity'.
379
+ - The circuits used to perform XEB.
380
+ - A pandas dataframe with index given by ['circuit_i', 'cycle_depth'].
381
+ Columns always include "sampled_probs". If `combinations_by_layer` is
382
+ not `None` and you are doing parallel XEB, additional metadata columns
383
+ will be attached to the returned DataFrame.
379
384
 
380
385
  Raises:
381
386
  ValueError: If qubits are not specified and the sampler has no device.
@@ -420,6 +425,52 @@ def parallel_two_qubit_xeb(
420
425
  sampled_df=sampled_df, circuits=circuit_library, cycle_depths=cycle_depths
421
426
  )
422
427
 
428
+ return fids, circuit_library, sampled_df
429
+
430
+
431
+ def parallel_two_qubit_xeb(
432
+ sampler: 'cirq.Sampler',
433
+ qubits: Optional[Sequence['cirq.GridQubit']] = None,
434
+ entangling_gate: 'cirq.Gate' = ops.CZ,
435
+ n_repetitions: int = 10**4,
436
+ n_combinations: int = 10,
437
+ n_circuits: int = 20,
438
+ cycle_depths: Sequence[int] = tuple(np.arange(3, 100, 20)),
439
+ random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
440
+ ax: Optional[plt.Axes] = None,
441
+ **plot_kwargs,
442
+ ) -> TwoQubitXEBResult:
443
+ """A convenience method that runs the full XEB workflow.
444
+
445
+ Args:
446
+ sampler: The quantum engine or simulator to run the circuits.
447
+ qubits: Qubits under test. If none, uses all qubits on the sampler's device.
448
+ entangling_gate: The entangling gate to use.
449
+ n_repetitions: The number of repetitions to use.
450
+ n_combinations: The number of combinations to generate.
451
+ n_circuits: The number of circuits to generate.
452
+ cycle_depths: The cycle depths to use.
453
+ random_state: The random state to use.
454
+ ax: the plt.Axes to plot the device layout on. If not given,
455
+ no plot is created.
456
+ **plot_kwargs: Arguments to be passed to 'plt.Axes.plot'.
457
+ Returns:
458
+ A TwoQubitXEBResult object representing the results of the experiment.
459
+ Raises:
460
+ ValueError: If qubits are not specified and the sampler has no device.
461
+ """
462
+ fids, *_ = parallel_xeb_workflow(
463
+ sampler=sampler,
464
+ qubits=qubits,
465
+ entangling_gate=entangling_gate,
466
+ n_repetitions=n_repetitions,
467
+ n_combinations=n_combinations,
468
+ n_circuits=n_circuits,
469
+ cycle_depths=cycle_depths,
470
+ random_state=random_state,
471
+ ax=ax,
472
+ **plot_kwargs,
473
+ )
423
474
  return TwoQubitXEBResult(fit_exponential_decays(fids))
424
475
 
425
476
 
@@ -146,6 +146,69 @@ class XEBCharacterizationOptions(ABC):
146
146
  """Return an initial Nelder-Mead simplex and the names for each parameter."""
147
147
 
148
148
 
149
+ def _try_defaults_from_unitary(gate: 'cirq.Gate') -> Optional[Dict[str, 'cirq.TParamVal']]:
150
+ r"""Try to figure out the PhasedFSim angles from the unitary of the gate.
151
+
152
+ The unitary of a PhasedFSimGate has the form:
153
+ $$
154
+ \begin{bmatrix}
155
+ 1 & 0 & 0 & 0 \\
156
+ 0 & e^{-i \gamma - i \zeta} \cos(\theta) & -i e^{-i \gamma + i\chi} \sin(\theta) & 0 \\
157
+ 0 & -i e^{-i \gamma - i \chi} \sin(\theta) & e^{-i \gamma + i \zeta} \cos(\theta) & 0 \\
158
+ 0 & 0 & 0 & e^{-2i \gamma - i \phi}
159
+ \end{bmatrix}
160
+ $$
161
+ That's the information about the five angles $\theta, \phi, \gamma, \zeta, \chi$ is encoded in
162
+ the submatrix unitary[1:3, 1:3] and the element u[3][3]. With some algebra, we can isolate each
163
+ of the angles as an argument of a combination of those elements (and potentially other angles).
164
+
165
+ Args:
166
+ A cirq gate.
167
+
168
+ Returns:
169
+ A dictionary mapping angles to values or None if the gate doesn't have a unitary or if it
170
+ can't be represented by a PhasedFSimGate.
171
+ """
172
+ u = protocols.unitary(gate, default=None)
173
+ if u is None:
174
+ return None
175
+
176
+ gamma = np.angle(u[1, 1] * u[2, 2] - u[1, 2] * u[2, 1]) / -2
177
+ phi = -np.angle(u[3, 3]) - 2 * gamma
178
+ phased_cos_theta_2 = u[1, 1] * u[2, 2]
179
+ if phased_cos_theta_2 == 0:
180
+ # The zeta phase is multiplied with cos(theta),
181
+ # so if cos(theta) is zero then any value is possible.
182
+ zeta = 0
183
+ else:
184
+ zeta = np.angle(u[2, 2] / u[1, 1]) / 2
185
+
186
+ phased_sin_theta_2 = u[1, 2] * u[2, 1]
187
+ if phased_sin_theta_2 == 0:
188
+ # The chi phase is multiplied with sin(theta),
189
+ # so if sin(theta) is zero then any value is possible.
190
+ chi = 0
191
+ else:
192
+ chi = np.angle(u[1, 2] / u[2, 1]) / 2
193
+
194
+ theta = np.angle(np.exp(1j * (gamma + zeta)) * u[1, 1] - np.exp(1j * (gamma - chi)) * u[1, 2])
195
+
196
+ if np.allclose(
197
+ u,
198
+ protocols.unitary(
199
+ ops.PhasedFSimGate(theta=theta, phi=phi, chi=chi, zeta=zeta, gamma=gamma)
200
+ ),
201
+ ):
202
+ return {
203
+ 'theta_default': theta,
204
+ 'phi_default': phi,
205
+ 'gamma_default': gamma,
206
+ 'zeta_default': zeta,
207
+ 'chi_default': chi,
208
+ }
209
+ return None
210
+
211
+
149
212
  def phased_fsim_angles_from_gate(gate: 'cirq.Gate') -> Dict[str, 'cirq.TParamVal']:
150
213
  """For a given gate, return a dictionary mapping '{angle}_default' to its noiseless value
151
214
  for the five PhasedFSim angles."""
@@ -175,6 +238,11 @@ def phased_fsim_angles_from_gate(gate: 'cirq.Gate') -> Dict[str, 'cirq.TParamVal
175
238
  'phi_default': gate.phi,
176
239
  }
177
240
 
241
+ # Handle all gates that can be represented using an FSimGate.
242
+ from_unitary = _try_defaults_from_unitary(gate)
243
+ if from_unitary is not None:
244
+ return from_unitary
245
+
178
246
  raise ValueError(f"Unknown default angles for {gate}.")
179
247
 
180
248
 
@@ -580,15 +648,6 @@ def _fit_exponential_decay(
580
648
  return a, layer_fid, a_std, layer_fid_std
581
649
 
582
650
 
583
- def _one_unique(df, name, default):
584
- """Helper function to assert that there's one unique value in a column and return it."""
585
- if name not in df.columns:
586
- return default
587
- vals = df[name].unique()
588
- assert len(vals) == 1, name
589
- return vals[0]
590
-
591
-
592
651
  def fit_exponential_decays(fidelities_df: pd.DataFrame) -> pd.DataFrame:
593
652
  """Fit exponential decay curves to a fidelities DataFrame.
594
653
 
@@ -32,6 +32,7 @@ from cirq.experiments.xeb_fitting import (
32
32
  fit_exponential_decays,
33
33
  before_and_after_characterization,
34
34
  XEBPhasedFSimCharacterizationOptions,
35
+ phased_fsim_angles_from_gate,
35
36
  )
36
37
  from cirq.experiments.xeb_sampling import sample_2q_xeb_circuits
37
38
 
@@ -354,7 +355,7 @@ def test_options_with_defaults_from_gate():
354
355
  assert options.zeta_default == 0.0
355
356
 
356
357
  with pytest.raises(ValueError):
357
- _ = XEBPhasedFSimCharacterizationOptions().with_defaults_from_gate(cirq.CZ)
358
+ _ = XEBPhasedFSimCharacterizationOptions().with_defaults_from_gate(cirq.XX)
358
359
 
359
360
 
360
361
  def test_options_defaults_set():
@@ -395,3 +396,34 @@ def test_options_defaults_set():
395
396
  phi_default=0.0,
396
397
  )
397
398
  assert o3.defaults_set() is True
399
+
400
+
401
+ def _random_angles(n, seed):
402
+ rng = np.random.default_rng(seed)
403
+ r = 2 * rng.random((n, 5)) - 1
404
+ return np.pi * r
405
+
406
+
407
+ @pytest.mark.parametrize(
408
+ 'gate',
409
+ [
410
+ cirq.CZ,
411
+ cirq.SQRT_ISWAP,
412
+ cirq.SQRT_ISWAP_INV,
413
+ cirq.ISWAP,
414
+ cirq.ISWAP_INV,
415
+ cirq.cphase(0.1),
416
+ cirq.CZ**0.2,
417
+ ]
418
+ + [cirq.PhasedFSimGate(*r) for r in _random_angles(10, 0)],
419
+ )
420
+ def test_phased_fsim_angles_from_gate(gate):
421
+ angles = phased_fsim_angles_from_gate(gate)
422
+ angles = {k.removesuffix('_default'): v for k, v in angles.items()}
423
+ phasedfsim = cirq.PhasedFSimGate(**angles)
424
+ np.testing.assert_allclose(cirq.unitary(phasedfsim), cirq.unitary(gate), atol=1e-9)
425
+
426
+
427
+ def test_phased_fsim_angles_from_gate_unsupporet_gate():
428
+ with pytest.raises(ValueError, match='Unknown default angles'):
429
+ _ = phased_fsim_angles_from_gate(cirq.testing.TwoQubitGate())
@@ -154,7 +154,7 @@ def _parse_formula_using_token_map(
154
154
  a = vals.pop()
155
155
  # Note: vals seems to be _HangingToken
156
156
  # func operates on _ResolvedTokens. Ignoring type issues for now.
157
- vals.append(op.func(a, b)) # type: ignore[arg-type]
157
+ vals.append(op.func(a, b))
158
158
 
159
159
  def close_paren() -> None:
160
160
  while True:
@@ -899,6 +899,8 @@ def test_cphase_unitary(angle_rads, expected_unitary):
899
899
  np.testing.assert_allclose(cirq.unitary(cirq.cphase(angle_rads)), expected_unitary)
900
900
 
901
901
 
902
+ # TODO(#6663): fix this use case.
903
+ @pytest.mark.xfail
902
904
  def test_parameterized_cphase():
903
905
  assert cirq.cphase(sympy.pi) == cirq.CZ
904
906
  assert cirq.cphase(sympy.pi / 2) == cirq.CZ**0.5
@@ -28,7 +28,7 @@ from cirq.type_workarounds import NotImplementedType
28
28
  class GlobalPhaseGate(raw_types.Gate):
29
29
  def __init__(self, coefficient: 'cirq.TParamValComplex', atol: float = 1e-8) -> None:
30
30
  if not isinstance(coefficient, sympy.Basic):
31
- if abs(1 - abs(coefficient)) > atol: # type: ignore[operator]
31
+ if abs(1 - abs(coefficient)) > atol:
32
32
  raise ValueError(f'Coefficient is not unitary: {coefficient!r}')
33
33
  self._coefficient = coefficient
34
34
 
@@ -402,10 +402,10 @@ def test_run_param_resolver(dtype: Type[np.complexfloating], split: bool):
402
402
  cirq.measure(q1),
403
403
  )
404
404
  param_resolver = {'b0': b0, 'b1': b1}
405
- result = simulator.run(circuit, param_resolver=param_resolver) # type: ignore
405
+ result = simulator.run(circuit, param_resolver=param_resolver)
406
406
  np.testing.assert_equal(result.measurements, {'q(0)': [[b0]], 'q(1)': [[b1]]})
407
407
  # pylint: disable=line-too-long
408
- np.testing.assert_equal(result.params, cirq.ParamResolver(param_resolver)) # type: ignore
408
+ np.testing.assert_equal(result.params, cirq.ParamResolver(param_resolver))
409
409
 
410
410
 
411
411
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
@@ -498,11 +498,11 @@ def test_simulate_param_resolver(dtype: Type[np.complexfloating], split: bool):
498
498
  (cirq.X ** sympy.Symbol('b0'))(q0), (cirq.X ** sympy.Symbol('b1'))(q1)
499
499
  )
500
500
  resolver = {'b0': b0, 'b1': b1}
501
- result = simulator.simulate(circuit, param_resolver=resolver) # type: ignore
501
+ result = simulator.simulate(circuit, param_resolver=resolver)
502
502
  expected_state = np.zeros(shape=(2, 2))
503
503
  expected_state[b0][b1] = 1.0
504
504
  np.testing.assert_equal(result.final_state_vector, np.reshape(expected_state, 4))
505
- assert result.params == cirq.ParamResolver(resolver) # type: ignore
505
+ assert result.params == cirq.ParamResolver(resolver)
506
506
  assert len(result.measurements) == 0
507
507
 
508
508
 
@@ -225,8 +225,7 @@ class _ParamFlattener(resolver.ParamResolver):
225
225
  params = param_dict if param_dict else {}
226
226
  # TODO: Support complex values for typing below.
227
227
  symbol_params: resolver.ParamDictType = {
228
- _ensure_not_str(param): _ensure_not_str(val) # type: ignore[misc]
229
- for param, val in params.items()
228
+ _ensure_not_str(param): _ensure_not_str(val) for param, val in params.items()
230
229
  }
231
230
  super().__init__(symbol_params)
232
231
  if get_param_name is None:
cirq/study/resolver.py CHANGED
@@ -139,10 +139,10 @@ class ParamResolver:
139
139
  if isinstance(param_value, str):
140
140
  param_value = sympy.Symbol(param_value)
141
141
  elif not isinstance(param_value, sympy.Basic):
142
- return value # type: ignore[return-value]
142
+ return value
143
143
  if recursive:
144
144
  param_value = self._value_of_recursive(value)
145
- return param_value # type: ignore[return-value]
145
+ return param_value
146
146
 
147
147
  if not isinstance(value, sympy.Basic):
148
148
  # No known way to resolve this variable, return unchanged.
@@ -207,7 +207,7 @@ class ParamResolver:
207
207
 
208
208
  # There isn't a full evaluation for 'value' yet. Until it's ready,
209
209
  # map value to None to identify loops in component evaluation.
210
- self._deep_eval_map[value] = _RECURSION_FLAG # type: ignore
210
+ self._deep_eval_map[value] = _RECURSION_FLAG
211
211
 
212
212
  v = self.value_of(value, recursive=False)
213
213
  if v == value:
@@ -220,10 +220,8 @@ class ParamResolver:
220
220
  new_dict: Dict['cirq.TParamKey', Union[float, str, sympy.Symbol, sympy.Expr]] = {
221
221
  k: k for k in resolver
222
222
  }
223
- new_dict.update({k: self.value_of(k, recursive) for k in self}) # type: ignore[misc]
224
- new_dict.update(
225
- {k: resolver.value_of(v, recursive) for k, v in new_dict.items()} # type: ignore[misc]
226
- )
223
+ new_dict.update({k: self.value_of(k, recursive) for k in self})
224
+ new_dict.update({k: resolver.value_of(v, recursive) for k, v in new_dict.items()})
227
225
  if recursive and self._param_dict:
228
226
  new_resolver = ParamResolver(cast(ParamDictType, new_dict))
229
227
  # Resolve down to single-step mappings.
cirq/study/sweepable.py CHANGED
@@ -65,11 +65,7 @@ def to_sweeps(sweepable: Sweepable, metadata: Optional[dict] = None) -> List[Swe
65
65
  product_sweep = dict_to_product_sweep(sweepable)
66
66
  return [_resolver_to_sweep(resolver, metadata) for resolver in product_sweep]
67
67
  if isinstance(sweepable, Iterable) and not isinstance(sweepable, str):
68
- return [
69
- sweep
70
- for item in sweepable
71
- for sweep in to_sweeps(item, metadata) # type: ignore[arg-type]
72
- ]
68
+ return [sweep for item in sweepable for sweep in to_sweeps(item, metadata)]
73
69
  raise TypeError(f'Unrecognized sweepable type: {type(sweepable)}.\nsweepable: {sweepable}')
74
70
 
75
71
 
cirq/study/sweeps.py CHANGED
@@ -589,10 +589,7 @@ def dict_to_product_sweep(factor_dict: ProductOrZipSweepLike) -> Product:
589
589
  Cartesian product of the sweeps.
590
590
  """
591
591
  return Product(
592
- *(
593
- Points(k, v if isinstance(v, Sequence) else [v]) # type: ignore
594
- for k, v in factor_dict.items()
595
- )
592
+ *(Points(k, v if isinstance(v, Sequence) else [v]) for k, v in factor_dict.items())
596
593
  )
597
594
 
598
595
 
cirq/vis/heatmap.py CHANGED
@@ -298,7 +298,6 @@ class Heatmap:
298
298
  show_plot = not ax
299
299
  if not ax:
300
300
  fig, ax = plt.subplots(figsize=(8, 8))
301
- ax = cast(plt.Axes, ax)
302
301
  original_config = copy.deepcopy(self._config)
303
302
  self.update_config(**kwargs)
304
303
 
@@ -416,7 +415,6 @@ class TwoQubitInteractionHeatmap(Heatmap):
416
415
  show_plot = not ax
417
416
  if not ax:
418
417
  fig, ax = plt.subplots(figsize=(8, 8))
419
- ax = cast(plt.Axes, ax)
420
418
  original_config = copy.deepcopy(self._config)
421
419
  self.update_config(**kwargs)
422
420
  qubits = set([q for qubits in self._value_map.keys() for q in qubits])
@@ -14,7 +14,7 @@
14
14
 
15
15
  """Tool to visualize the results of a study."""
16
16
 
17
- from typing import cast, Optional, Sequence, SupportsFloat, Union
17
+ from typing import Optional, Sequence, SupportsFloat, Union
18
18
  import collections
19
19
  import numpy as np
20
20
  import matplotlib.pyplot as plt
@@ -87,7 +87,6 @@ def plot_state_histogram(
87
87
  show_fig = not ax
88
88
  if not ax:
89
89
  fig, ax = plt.subplots(1, 1)
90
- ax = cast(plt.Axes, ax)
91
90
  if isinstance(data, result.Result):
92
91
  values = get_state_histogram(data)
93
92
  elif isinstance(data, collections.Counter):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cirq-core
3
- Version: 1.5.0.dev20240703215652
3
+ Version: 1.5.0.dev20240710220908
4
4
  Summary: A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits.
5
5
  Home-page: http://github.com/quantumlib/cirq
6
6
  Author: The Cirq Developers
@@ -4,8 +4,8 @@ cirq/_compat_test.py,sha256=Qq3ZcfgD-Nb81cEppQdJqhAyrVqXKtfXZYGXT0p-Wh0,34718
4
4
  cirq/_doc.py,sha256=yDyWUD_2JDS0gShfGRb-rdqRt9-WeL7DhkqX7np0Nko,2879
5
5
  cirq/_import.py,sha256=p9gMHJscbtDDkfHOaulvd3Aer0pwUF5AXpL89XR8dNw,8402
6
6
  cirq/_import_test.py,sha256=6K_v0riZJXOXUphHNkGA8MY-JcmGlezFaGmvrNhm3OQ,1015
7
- cirq/_version.py,sha256=3_Sg3uzfaOMgG4mv6g4f4SmHc-QPmxmWQIua8U1iYtk,1206
8
- cirq/_version_test.py,sha256=mSjfxLVKVW7U6XVjlcfXqkvjbv2PqlztLLqA6oVn3yk,147
7
+ cirq/_version.py,sha256=ow3fcIM6yzwNASceUWYIGlTgHkysbg9vO85xoQgtdjs,1206
8
+ cirq/_version_test.py,sha256=wmmA2WCnJ-WU8DUtbgS_wyvjUMWTnyl9B8RcZvNYxrI,147
9
9
  cirq/conftest.py,sha256=X7yLFL8GLhg2CjPw0hp5e_dGASfvHx1-QT03aUbhKJw,1168
10
10
  cirq/json_resolver_cache.py,sha256=ytePZtNZgKjOF2NiVpUTuotB-JKZmQNOFIFdvXqsxHw,13271
11
11
  cirq/py.typed,sha256=VFSlmh_lNwnaXzwY-ZuW-C2Ws5PkuDoVgBdNCs0jXJE,63
@@ -19,7 +19,7 @@ cirq/circuits/_bucket_priority_queue.py,sha256=hxFuii2fKD8G6EKT_aVLEsA7FmSfqFXPw
19
19
  cirq/circuits/_bucket_priority_queue_test.py,sha256=t6u_hG7K2e2WKWrgCsKxNRtp4ghKwiCrp0_WSY0W25k,5288
20
20
  cirq/circuits/circuit.py,sha256=XIwQh9Gkb8ya4Q2Q92EfsAUh9W6YZemcGqlu1cZCi2s,114620
21
21
  cirq/circuits/circuit_operation.py,sha256=D4u8jDD4fGOca1xnZPN1obuKTIouXENUfnxOF2JrwgU,34375
22
- cirq/circuits/circuit_operation_test.py,sha256=_0iQJ3h_dnQcQmbGRZbc-NqdglJTXantbj72ggqLKNE,44724
22
+ cirq/circuits/circuit_operation_test.py,sha256=u-23dDZ6htNSiP8oXR67rmtb-XDBmObvbJjJrARhmis,44646
23
23
  cirq/circuits/circuit_test.py,sha256=sRZC558PZZZUHByZ1R00_j8ez6TL9l5ZmT8YLGopH_Q,160117
24
24
  cirq/circuits/frozen_circuit.py,sha256=_0SkmIiQ4UjIug-k_iO00ulDFoFnxmAHvXX2I2HHN8k,9262
25
25
  cirq/circuits/frozen_circuit_test.py,sha256=rHyii8hLhOQ6jdA8dC1OcYPGnyeBC4uY5Q53XspkkCk,4133
@@ -184,22 +184,22 @@ cirq/experiments/n_qubit_tomography.py,sha256=9M_kf2-1hvFxfZOWND7ACwHYgD9SJU5nYF
184
184
  cirq/experiments/n_qubit_tomography_test.py,sha256=wHfV2OpGYSDXfoyEh-B5dc1Dv8sxKNFbUoHyjIWZoFk,4362
185
185
  cirq/experiments/purity_estimation.py,sha256=6D1UwFlQRzHeajXMTyTUfBYAc0jJQ8Cfz4lteFKeUaM,2467
186
186
  cirq/experiments/purity_estimation_test.py,sha256=xlBGp0NOBYR0IhTy3bckHPgi81FkGSGxKqk9hwXG-I8,923
187
- cirq/experiments/qubit_characterizations.py,sha256=Zi925SVZ0U5HbkyuGD6BspjzPAhsqOe5gLxNgZy0FrQ,36702
187
+ cirq/experiments/qubit_characterizations.py,sha256=yimdW20qqP4iP0wyO83W6VSQWDToJKO6Nx4okBxjn_I,36726
188
188
  cirq/experiments/qubit_characterizations_test.py,sha256=b_ONqxyW6s01Ts8T65BEdb4e8Xy24Qp4zTGXWesL0ic,9733
189
189
  cirq/experiments/random_quantum_circuit_generation.py,sha256=R_w7z35plUHEYBY0-F80bPcWJSSSjNQDaP2GbxVBEZg,28143
190
190
  cirq/experiments/random_quantum_circuit_generation_test.py,sha256=1rvgN8-Ajedn_70FyYKVzjvzR6NVpHj6KQgo6tra-Jc,15995
191
191
  cirq/experiments/readout_confusion_matrix.py,sha256=jIyikXfYWGbVrOjU1pbV2VZL-m03VTFYS18KT1Cf2qk,21404
192
192
  cirq/experiments/readout_confusion_matrix_test.py,sha256=ETvKHVuJWvq8KuL0l6w22UOfZHhBNH-TVeWAKqjSQEc,10632
193
- cirq/experiments/single_qubit_readout_calibration.py,sha256=ZmfsARZ_33Pg4lh5toJaoi4h4RGKHISAfWBODq1Icsg,14599
193
+ cirq/experiments/single_qubit_readout_calibration.py,sha256=x6fF6GqU1D4YY05YvW1DFlTlbjC12_bfj7W2psd75-U,14722
194
194
  cirq/experiments/single_qubit_readout_calibration_test.py,sha256=_002QXj2rIFHkH3vw9iTVMh45vCPuCI_fTqOUK8uMe4,7718
195
195
  cirq/experiments/t1_decay_experiment.py,sha256=ealdmc_RTE__z1YUcaDEncDzQOaiT0K6IRWB7lNtPfs,7087
196
196
  cirq/experiments/t1_decay_experiment_test.py,sha256=Pgbm-37JiCdw9iQg2OaXVvs72xGWV2629CgsTQlLQnw,9139
197
197
  cirq/experiments/t2_decay_experiment.py,sha256=lTgZ9yJ7Fk9_ozUCHysQn1qKrMQwTpsgEv-QnvsEif0,19158
198
198
  cirq/experiments/t2_decay_experiment_test.py,sha256=DFR0BGn0Id4qNPfqIExj70TEAqf7Vrc8eK91Wj0YKTc,15031
199
- cirq/experiments/two_qubit_xeb.py,sha256=wdLxBi3LrAlPF-SQV9Tf66k31XC2cVHNPhpR-VLvCao,17762
199
+ cirq/experiments/two_qubit_xeb.py,sha256=NU8JsM6yqpTfWQCPf6dCAlD89MmYpprI5kVz2bxAJhI,19879
200
200
  cirq/experiments/two_qubit_xeb_test.py,sha256=Tlr32vuJpyepkMBVVkN6ipjRyDr8DIixfBumEeGXzDM,10073
201
- cirq/experiments/xeb_fitting.py,sha256=54FKzGqhZgyvAkP_AR2-7peDnL-PJxOp-MkQdfp8bfU,27178
202
- cirq/experiments/xeb_fitting_test.py,sha256=nfFhKPr_Nx5rbfCcvrcUFQxphCZuTnJVnpT-xBjxRFI,14349
201
+ cirq/experiments/xeb_fitting.py,sha256=tD678gTY495cDA6b55YIPdwq22VQFbB2AlnkeX_X9P0,29332
202
+ cirq/experiments/xeb_fitting_test.py,sha256=LEgC76mYFwsX-ZqRqg2j85EiHACq8nK9ITrcl-TgeiA,15286
203
203
  cirq/experiments/xeb_sampling.py,sha256=6ZOidGi7Kt6p4cMQCjK7qQuIUXVHCYl47B2GnL8M-Bw,14987
204
204
  cirq/experiments/xeb_sampling_test.py,sha256=0XkQGvcURsug3IblE_wZrHVDoOQV3WuQilrqCJbDHjI,6784
205
205
  cirq/experiments/xeb_simulation.py,sha256=DpCWVxzWnZvjrdfgIbwR9rWenehqz7Su3LPIVHoK7gI,5055
@@ -228,7 +228,7 @@ cirq/interop/quirk/cells/input_rotation_cells.py,sha256=mo75TGkbtD_phNPM-ZPFs2VJ
228
228
  cirq/interop/quirk/cells/input_rotation_cells_test.py,sha256=1jmEBHbHpmSSB3grPbn8LFzMEwkc6Or3kAULxVofTEg,6318
229
229
  cirq/interop/quirk/cells/measurement_cells.py,sha256=1jLtGMHCbxfNN9r5E_GWPIqz7fLdNKJK0WgrcjXsS3I,1504
230
230
  cirq/interop/quirk/cells/measurement_cells_test.py,sha256=AYYzjn3BrQbk-Rg1L3WjCOQN9eGLRQzqwYr6i8UH0Fk,1574
231
- cirq/interop/quirk/cells/parse.py,sha256=-_-YrhbV8-OpLtbHCUoTK5rkvEKAHS9nqOaxd-z2x-w,11781
231
+ cirq/interop/quirk/cells/parse.py,sha256=lUN0cioK9-1iDnKmrC1X1wpdPwbDwqoEI9QJpF2uFGY,11755
232
232
  cirq/interop/quirk/cells/parse_test.py,sha256=xCTS6lKv4i8HAuTSivH2Tjwun1yMQbnl7HLfB-nEKY4,7473
233
233
  cirq/interop/quirk/cells/qubit_permutation_cells.py,sha256=F9Br_SFB1ys4pP-hYlpPRMXH_4Cd8LePtOl4aTE_p8g,3390
234
234
  cirq/interop/quirk/cells/qubit_permutation_cells_test.py,sha256=n0veQKx0EdFzu_gdY_AVjwqyoHae7JGkDFX6qhLeGrQ,4460
@@ -276,7 +276,7 @@ cirq/ops/common_channels_test.py,sha256=EL_PxbqD3KPC8ioihiukhmW8bUdclqqigKoFyUQp
276
276
  cirq/ops/common_gate_families.py,sha256=e5M8wlDYtdrpWBrhdns6iizIvSqzfxDyIsBdxt8hVMc,8611
277
277
  cirq/ops/common_gate_families_test.py,sha256=Oo3C7BPO3gt3ePuqwsI_lx_lY38et8Ps4AuVydX2Aww,5275
278
278
  cirq/ops/common_gates.py,sha256=YMcadPVRhrvkwYwm6-_TNYM9sz9TY7KSi0g7FvBTeCk,58075
279
- cirq/ops/common_gates_test.py,sha256=XCVswZbd_k9Y2k5n-2TXnS8CnJoLoC3VmBQN0QijIKw,46218
279
+ cirq/ops/common_gates_test.py,sha256=n4Ud_5t-iB2RzMpPSwXngeU1rR198gk0-J7R2xUxp6Q,46271
280
280
  cirq/ops/control_values.py,sha256=nNDN6pgz_aWkUfrpOZ9zHHD42AGFaplWhVQj9rmJwbQ,13410
281
281
  cirq/ops/control_values_test.py,sha256=iDtdQjL39u80MaR16XLp00LRZqWgJqC54cIeADWf0IY,12906
282
282
  cirq/ops/controlled_gate.py,sha256=uVTZk6pA1ZpEwbVggLeXyAFq18_QJ38hWYhk9GbvQnc,14253
@@ -299,7 +299,7 @@ cirq/ops/gate_operation.py,sha256=Fa3O_-bLGAtFznYv-b_RWAn2X4JgvM3yGbqbLcsJkgM,13
299
299
  cirq/ops/gate_operation_test.py,sha256=ftd-GZxvOtzFS1L153K89_PV1volGroU7G5nFGp9afE,17507
300
300
  cirq/ops/gateset.py,sha256=Tx1CIlve0RhnX9jHZsCVw7EHtfC6b3drbBncmCEtcsQ,21634
301
301
  cirq/ops/gateset_test.py,sha256=BY5UJ1k3NC0jz0d4yocyO1qcQU6e4UbN9mapWE7z7AM,16361
302
- cirq/ops/global_phase_op.py,sha256=y4AT1_dQfGl44WHbCkXfp1d1Hh5BN1geQ35HpvI5dLE,4868
302
+ cirq/ops/global_phase_op.py,sha256=XYnzmquhGaVY91oYm9RHo1qbX1eOx2ZqLPzLsl8jyQw,4842
303
303
  cirq/ops/global_phase_op_test.py,sha256=FjtUsohIYabTtiGytvPQw9Rzkqd6dlT7qrj4oltDbTI,9814
304
304
  cirq/ops/greedy_qubit_manager.py,sha256=O9qY8GB1KGxm3B7JEjq50sGVD51bNwTSupJpi3WUeAc,4039
305
305
  cirq/ops/greedy_qubit_manager_test.py,sha256=iVZDKes-r08raTiJHpYNmP-Dp89ok3hIU-QboL2BHdw,3300
@@ -892,7 +892,7 @@ cirq/sim/classical_simulator_test.py,sha256=TxPhVNLoOBPwTlyUCOQoqwid76ZBxQfmN9IP
892
892
  cirq/sim/density_matrix_simulation_state.py,sha256=XRxKsKq13OlXR7429WBbKps_jmOoCBRa6U9PzYrYrTc,14065
893
893
  cirq/sim/density_matrix_simulation_state_test.py,sha256=uqSKZrXEPLYO7R3UW2d1y_Yq6CcyJ0drTSCjGbtzBuc,4369
894
894
  cirq/sim/density_matrix_simulator.py,sha256=-BIY8JjmzAJDmF6tWcv5lbH1yS7UQIlKicU1AJgttfA,17462
895
- cirq/sim/density_matrix_simulator_test.py,sha256=LgND8eN3AXgJzP3nYh0JmsTWJfT878BSzgIo4gZ54xY,61154
895
+ cirq/sim/density_matrix_simulator_test.py,sha256=Wnj0gWABa-EJ6zP5z9G4fyTN7641Q5OrAo2u1FkY1QQ,61122
896
896
  cirq/sim/density_matrix_utils.py,sha256=9Fbzh0c9hzwEff383YwRit2K_tvlpT4Vyq3rjLijRyA,10273
897
897
  cirq/sim/density_matrix_utils_test.py,sha256=ZJpeolcie9rSIvrWhxcGhzr6Ojyn8me00rfrDwn4y-M,14225
898
898
  cirq/sim/mux.py,sha256=gnQGQmArs0LdLnVmxAesOTnVmaudZmgIH6JUatGUXtE,12509
@@ -909,7 +909,7 @@ cirq/sim/simulator_base.py,sha256=mAcIKPT6lsIvAJFdSC4a-cGQFU0kegqbL80K1K7mlFM,18
909
909
  cirq/sim/simulator_base_test.py,sha256=Ik_28QV2Pzdc4tGxYMAVnGrNG1IWMiwuKUJcaCeuG7M,14955
910
910
  cirq/sim/simulator_test.py,sha256=9cHMoY7M5_82gfeBsCg6O0PnictzZu172vQAgUngJqA,18119
911
911
  cirq/sim/sparse_simulator.py,sha256=OvVjqNk5Kb92DM8Nrdw1BGOB7GFlT6yiXwIPpAcLV7I,12854
912
- cirq/sim/sparse_simulator_test.py,sha256=3EAeCHUQeKllAAtdw14X592zBsGQY_vwfIYK-gEr_zA,53587
912
+ cirq/sim/sparse_simulator_test.py,sha256=gv2SxYQL93j1xoP4ocg0zmb9bUxW4Yo5nJxOysuRGkw,53555
913
913
  cirq/sim/state_vector.py,sha256=N6N9EELlW66UaLTBaq62ms0XkfIK7CzN9SBM7t52dXo,13428
914
914
  cirq/sim/state_vector_simulation_state.py,sha256=e4it_DT1J-30S3OX_gfMJiWAttFaVOMEPQ-Y1ARWnDg,17616
915
915
  cirq/sim/state_vector_simulation_state_test.py,sha256=UtGMIurlV6N74nX7qoVnGoRhwF35-ghDEIP7Mj5AXmI,9841
@@ -930,15 +930,15 @@ cirq/sim/clifford/stabilizer_simulation_state_test.py,sha256=dsphoXTaIwRCjprGJQi
930
930
  cirq/sim/clifford/stabilizer_state_ch_form.py,sha256=yz9x7F72wfgqfSiEhoH2rJ-n14nsYMapMvpkhwidIOY,14032
931
931
  cirq/sim/clifford/stabilizer_state_ch_form_test.py,sha256=FK0IsyrTfT6ZPZeBYmyPG2xpzUT7RG6P6UQw_61c6kU,3149
932
932
  cirq/study/__init__.py,sha256=HCuFRBzCJGGDhtoHRzrnD5IWB8EnMrX-4M6AmVO0tP0,1220
933
- cirq/study/flatten_expressions.py,sha256=LIePrTJJW3PfdQS2jJ-DxhjpuOdwdBZi0WbtXHf2qmw,15638
933
+ cirq/study/flatten_expressions.py,sha256=B-CQcj8eSWAJPIff5bQiZGobnYx8kB0c5WTLowfCVXo,15604
934
934
  cirq/study/flatten_expressions_test.py,sha256=6e7pTkaBrZW-EmG4teZxcwemqnxCtJW3kq2KOlPcwW8,6078
935
- cirq/study/resolver.py,sha256=-X6R4FQ5nkEyaf4YsNFTN1Ui8Ss-Mkn39pHOV-vgsZQ,11773
935
+ cirq/study/resolver.py,sha256=YiX2VBxQScGJCm01ZkSyiJufxubKiMBN67oMOeXwgdQ,11631
936
936
  cirq/study/resolver_test.py,sha256=QQe9Rr0z6qNbSWPEvCKd_DNka6454AWVKbG2J2DD1Wg,10228
937
937
  cirq/study/result.py,sha256=KzjpjvDVCTFjMyq9r91pZSYdtcD1x3yj8jP_StlOSMg,19285
938
938
  cirq/study/result_test.py,sha256=fq5BH78RswfTiYjMchJ4wEDDyaJu0QdJoGobMjKDeSI,15591
939
- cirq/study/sweepable.py,sha256=IsOw1rdaKGT4HGj6zpOM1ZhaiRoETRwIeqyyzJIRXMU,4428
939
+ cirq/study/sweepable.py,sha256=hHBXn5MQZJawiiIXWZdn_qygbPeIFtt300wIqVHiYl8,4356
940
940
  cirq/study/sweepable_test.py,sha256=ENv03_GJmbUc_ukJoqfgG-H5C_yyx1jCcvxohSMyQVU,5502
941
- cirq/study/sweeps.py,sha256=8mUc5dnOJxZH8m_6ncgkZRY7a2TBe7_9d3WcvJAyZlA,19900
941
+ cirq/study/sweeps.py,sha256=zKz8hmLnpukNzUp7YjsrD8wEGxf2peX19522kUKUfWI,19850
942
942
  cirq/study/sweeps_test.py,sha256=YdXHzZO10OHoPTU2ifmsfH7KByIJeeANy91AHqX8nwg,12135
943
943
  cirq/testing/__init__.py,sha256=cACho8s-V5tNOjBcDUtr2DipQxQcbUgbr4MESJb4l1I,3870
944
944
  cirq/testing/circuit_compare.py,sha256=nBQES45wLVThOqC3WrPrYKLQP7HQ2pH5DjlJ5bHkrtU,19176
@@ -1148,11 +1148,11 @@ cirq/value/value_equality_attr_test.py,sha256=k_nl5hWxo4yMO6WNu0wU68wyeb-RN9Ua_I
1148
1148
  cirq/vis/__init__.py,sha256=e3Z1PI-Ay0hDHhIgFZEDwQIuO8C_aayNdL-EByF0J4o,1001
1149
1149
  cirq/vis/density_matrix.py,sha256=kMAPcRh6f0ghZKSe86nB_2iFngrDsw0pNael1EZ5BEw,4819
1150
1150
  cirq/vis/density_matrix_test.py,sha256=Xg41NQZBfoyrkaX3n9pW4q1LIxWpOW3Cr_I_Wx51GlQ,6965
1151
- cirq/vis/heatmap.py,sha256=9FHviJR0-OY9ksdoh0OrjdDvkb5ISd5OxcYd9WRlqYo,17758
1151
+ cirq/vis/heatmap.py,sha256=VVAj_aW0u4jRId2T1RUl_gL-xcxsG6jjKbf8qVJQl9A,17686
1152
1152
  cirq/vis/heatmap_test.py,sha256=5kWIxJZZbZcc93XZrZ18lF2gRUleR1iqYbWfHs4cvu4,20531
1153
1153
  cirq/vis/histogram.py,sha256=gQUrcebsk5wgPT38pWFW55jG9zaKhxp8zLRGmmVDk8s,5107
1154
1154
  cirq/vis/histogram_test.py,sha256=Qlw0e3amw_MFga-hNweiLzRCH174W9bB2qkmX_RiS-U,1904
1155
- cirq/vis/state_histogram.py,sha256=i8PvGLMHu74mJVD18EuS7YFGw9aM3pTa-ocnZHOW2kc,4298
1155
+ cirq/vis/state_histogram.py,sha256=lmYrPrqWoxhdXGbBdMahKK4isqmmeO6v45KKVbH3MkA,4260
1156
1156
  cirq/vis/state_histogram_test.py,sha256=KzxDJedwE-KZR-K_TZlMh01DroSnZPArZPOo4CBEYWI,3761
1157
1157
  cirq/vis/vis_utils.py,sha256=CsNHb9vMBF9UjxZ2k5XqMESbATOx0FXhWAwxFbq-9pQ,1239
1158
1158
  cirq/vis/vis_utils_test.py,sha256=-aiL5WmhPDs_5BF2lDol1koD4JuHTiYxLK2ofyWrbCU,939
@@ -1175,8 +1175,8 @@ cirq/work/sampler.py,sha256=JEAeQQRF3bqlO9AkOf4XbrTATDI5f5JgyM_FAUCNxao,19751
1175
1175
  cirq/work/sampler_test.py,sha256=B2ZsuqGT854gQtBIAh8k0LiG9Vj5wSzcGvkxOUoTcW4,13217
1176
1176
  cirq/work/zeros_sampler.py,sha256=x1C7cup66a43n-3tm8QjhiqJa07qcJW10FxNp9jJ59Q,2356
1177
1177
  cirq/work/zeros_sampler_test.py,sha256=JIkpBBFPJe5Ba4142vzogyWyboG1Q1ZAm0UVGgOoZn8,3279
1178
- cirq_core-1.5.0.dev20240703215652.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1179
- cirq_core-1.5.0.dev20240703215652.dist-info/METADATA,sha256=P59m_cyl4kh6I1druK4i0HC1Mw4BwyITZcPin2G-zLY,2007
1180
- cirq_core-1.5.0.dev20240703215652.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
1181
- cirq_core-1.5.0.dev20240703215652.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1182
- cirq_core-1.5.0.dev20240703215652.dist-info/RECORD,,
1178
+ cirq_core-1.5.0.dev20240710220908.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1179
+ cirq_core-1.5.0.dev20240710220908.dist-info/METADATA,sha256=8GDfDiN4H53cFOnyL9z749aiCNozOl8b8rUfcmqfL20,2007
1180
+ cirq_core-1.5.0.dev20240710220908.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
1181
+ cirq_core-1.5.0.dev20240710220908.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1182
+ cirq_core-1.5.0.dev20240710220908.dist-info/RECORD,,