cirq-core 1.5.0.dev20241120233534__py3-none-any.whl → 1.5.0.dev20241122173038__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.dev20241120233534"
31
+ __version__ = "1.5.0.dev20241122173038"
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.dev20241120233534"
6
+ assert cirq.__version__ == "1.5.0.dev20241122173038"
@@ -14,7 +14,7 @@
14
14
 
15
15
  """Utility classes for representing QASM."""
16
16
 
17
- from typing import Callable, Dict, Iterator, Optional, Sequence, Set, Tuple, Union, TYPE_CHECKING
17
+ from typing import Callable, Dict, Iterator, Optional, Sequence, Tuple, Union, TYPE_CHECKING
18
18
 
19
19
  import re
20
20
  import numpy as np
@@ -203,6 +203,7 @@ class QasmOutput:
203
203
  qubit_id_map=qubit_id_map,
204
204
  meas_key_id_map=meas_key_id_map,
205
205
  )
206
+ self.cregs = self._generate_cregs()
206
207
 
207
208
  def _generate_measurement_ids(self) -> Tuple[Dict[str, str], Dict[str, Optional[str]]]:
208
209
  # Pick an id for the creg that will store each measurement
@@ -226,6 +227,30 @@ class QasmOutput:
226
227
  def _generate_qubit_ids(self) -> Dict['cirq.Qid', str]:
227
228
  return {qubit: f'q[{i}]' for i, qubit in enumerate(self.qubits)}
228
229
 
230
+ def _generate_cregs(self) -> Dict[str, tuple[int, str]]:
231
+ """Pick an id for the creg that will store each measurement
232
+
233
+ This function finds the largest measurement using each key.
234
+ That is, if multiple measurements are made with the same key,
235
+ it will use the key with the most number of qubits.
236
+
237
+ Returns: dictionary with key of measurement id and value of (#qubits, comment).
238
+ """
239
+ cregs: Dict[str, tuple[int, str]] = {}
240
+ for meas in self.measurements:
241
+ key = protocols.measurement_key_name(meas)
242
+ meas_id = self.args.meas_key_id_map[key]
243
+
244
+ if self.meas_comments[key] is not None:
245
+ comment = f' // Measurement: {self.meas_comments[key]}'
246
+ else:
247
+ comment = ''
248
+
249
+ if meas_id not in cregs or cregs[meas_id][0] < len(meas.qubits):
250
+ cregs[meas_id] = (len(meas.qubits), comment)
251
+
252
+ return cregs
253
+
229
254
  def is_valid_qasm_id(self, id_str: str) -> bool:
230
255
  """Test if id_str is a valid id in QASM grammar."""
231
256
  return self.valid_id_re.match(id_str) is not None
@@ -287,24 +312,15 @@ class QasmOutput:
287
312
  output(f'qreg q[{len(self.qubits)}];\n')
288
313
  else:
289
314
  output(f'qubit[{len(self.qubits)}] q;\n')
290
- # Classical registers
291
- # Pick an id for the creg that will store each measurement
292
- already_output_keys: Set[str] = set()
293
- for meas in self.measurements:
294
- key = protocols.measurement_key_name(meas)
295
- if key in already_output_keys:
296
- continue
297
- already_output_keys.add(key)
298
- meas_id = self.args.meas_key_id_map[key]
299
- if self.meas_comments[key] is not None:
300
- comment = f' // Measurement: {self.meas_comments[key]}'
301
- else:
302
- comment = ''
303
315
 
316
+ # Classical registers
317
+ for meas_id in self.cregs:
318
+ length, comment = self.cregs[meas_id]
304
319
  if self.args.version == '2.0':
305
- output(f'creg {meas_id}[{len(meas.qubits)}];{comment}\n')
320
+ output(f'creg {meas_id}[{length}];{comment}\n')
306
321
  else:
307
- output(f'bit[{len(meas.qubits)}] {meas_id};{comment}\n')
322
+ output(f'bit[{length}] {meas_id};{comment}\n')
323
+
308
324
  # In OpenQASM 2.0, the transformation of global phase gates is ignored.
309
325
  # Therefore, no newline is created when the operations contained in
310
326
  # a circuit consist only of global phase gates.
@@ -590,3 +590,58 @@ reset q[0];
590
590
  reset q[1];
591
591
  """.strip()
592
592
  )
593
+
594
+
595
+ def test_different_sized_registers():
596
+ qubits = cirq.LineQubit.range(2)
597
+ c = cirq.Circuit(cirq.measure(qubits[0], key='c'), cirq.measure(qubits, key='c'))
598
+ output = cirq.QasmOutput(
599
+ c.all_operations(), tuple(sorted(c.all_qubits())), header='Generated from Cirq!'
600
+ )
601
+ assert (
602
+ str(output)
603
+ == """// Generated from Cirq!
604
+
605
+ OPENQASM 2.0;
606
+ include "qelib1.inc";
607
+
608
+
609
+ // Qubits: [q(0), q(1)]
610
+ qreg q[2];
611
+ creg m_c[2];
612
+
613
+
614
+ measure q[0] -> m_c[0];
615
+
616
+ // Gate: cirq.MeasurementGate(2, cirq.MeasurementKey(name='c'), ())
617
+ measure q[0] -> m_c[0];
618
+ measure q[1] -> m_c[1];
619
+ """
620
+ )
621
+ # OPENQASM 3.0
622
+ output3 = cirq.QasmOutput(
623
+ c.all_operations(),
624
+ tuple(sorted(c.all_qubits())),
625
+ header='Generated from Cirq!',
626
+ version='3.0',
627
+ )
628
+ assert (
629
+ str(output3)
630
+ == """// Generated from Cirq!
631
+
632
+ OPENQASM 3.0;
633
+ include "stdgates.inc";
634
+
635
+
636
+ // Qubits: [q(0), q(1)]
637
+ qubit[2] q;
638
+ bit[2] m_c;
639
+
640
+
641
+ m_c[0] = measure q[0];
642
+
643
+ // Gate: cirq.MeasurementGate(2, cirq.MeasurementKey(name='c'), ())
644
+ m_c[0] = measure q[0];
645
+ m_c[1] = measure q[1];
646
+ """
647
+ )
@@ -401,6 +401,7 @@ def parallel_xeb_workflow(
401
401
  ax: Optional[plt.Axes] = None,
402
402
  pairs: Optional[Sequence[tuple['cirq.GridQubit', 'cirq.GridQubit']]] = None,
403
403
  pool: Optional['multiprocessing.pool.Pool'] = None,
404
+ batch_size: int = 9,
404
405
  **plot_kwargs,
405
406
  ) -> Tuple[pd.DataFrame, Sequence['cirq.Circuit'], pd.DataFrame]:
406
407
  """A utility method that runs the full XEB workflow.
@@ -418,6 +419,9 @@ def parallel_xeb_workflow(
418
419
  no plot is created.
419
420
  pairs: Pairs to use. If not specified, use all pairs between adjacent qubits.
420
421
  pool: An optional multiprocessing pool.
422
+ batch_size: We call `run_batch` on the sampler, which can speed up execution in certain
423
+ environments. The number of (circuit, cycle_depth) tasks to be run in each batch
424
+ is given by this number.
421
425
  **plot_kwargs: Arguments to be passed to 'plt.Axes.plot'.
422
426
 
423
427
  Returns:
@@ -462,6 +466,7 @@ def parallel_xeb_workflow(
462
466
  combinations_by_layer=combs_by_layer,
463
467
  shuffle=rs,
464
468
  repetitions=n_repetitions,
469
+ batch_size=batch_size,
465
470
  )
466
471
 
467
472
  fids = benchmark_2q_xeb_fidelities(
@@ -482,6 +487,7 @@ def parallel_two_qubit_xeb(
482
487
  random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
483
488
  ax: Optional[plt.Axes] = None,
484
489
  pairs: Optional[Sequence[tuple['cirq.GridQubit', 'cirq.GridQubit']]] = None,
490
+ batch_size: int = 9,
485
491
  **plot_kwargs,
486
492
  ) -> TwoQubitXEBResult:
487
493
  """A convenience method that runs the full XEB workflow.
@@ -498,6 +504,9 @@ def parallel_two_qubit_xeb(
498
504
  ax: the plt.Axes to plot the device layout on. If not given,
499
505
  no plot is created.
500
506
  pairs: Pairs to use. If not specified, use all pairs between adjacent qubits.
507
+ batch_size: We call `run_batch` on the sampler, which can speed up execution in certain
508
+ environments. The number of (circuit, cycle_depth) tasks to be run in each batch
509
+ is given by this number.
501
510
  **plot_kwargs: Arguments to be passed to 'plt.Axes.plot'.
502
511
  Returns:
503
512
  A TwoQubitXEBResult object representing the results of the experiment.
@@ -515,6 +524,7 @@ def parallel_two_qubit_xeb(
515
524
  cycle_depths=cycle_depths,
516
525
  random_state=random_state,
517
526
  ax=ax,
527
+ batch_size=batch_size,
518
528
  **plot_kwargs,
519
529
  )
520
530
  return TwoQubitXEBResult(fit_exponential_decays(fids))
@@ -533,6 +543,7 @@ def run_rb_and_xeb(
533
543
  xeb_combinations: int = 10,
534
544
  random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
535
545
  pairs: Optional[Sequence[tuple['cirq.GridQubit', 'cirq.GridQubit']]] = None,
546
+ batch_size: int = 9,
536
547
  ) -> InferredXEBResult:
537
548
  """A convenience method that runs both RB and XEB workflows.
538
549
 
@@ -547,6 +558,9 @@ def run_rb_and_xeb(
547
558
  xeb_combinations: The number of combinations to generate for XEB.
548
559
  random_state: The random state to use.
549
560
  pairs: Pairs to use. If not specified, use all pairs between adjacent qubits.
561
+ batch_size: We call `run_batch` on the sampler, which can speed up execution in certain
562
+ environments. The number of (circuit, cycle_depth) tasks to be run in each batch
563
+ is given by this number.
550
564
 
551
565
  Returns:
552
566
  An InferredXEBResult object representing the results of the experiment.
@@ -575,6 +589,7 @@ def run_rb_and_xeb(
575
589
  cycle_depths=depths_xeb,
576
590
  n_combinations=xeb_combinations,
577
591
  random_state=random_state,
592
+ batch_size=batch_size,
578
593
  )
579
594
 
580
595
  return InferredXEBResult(rb, xeb)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cirq-core
3
- Version: 1.5.0.dev20241120233534
3
+ Version: 1.5.0.dev20241122173038
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=Vpw7ogLDvHEtwUmt0PWS86YxwvfTBHzf2H5ozGsjGX4,1206
8
- cirq/_version_test.py,sha256=98FHCYSWpiencHGZFgwAHsrlf12_WFY-XR69vsgHreI,147
7
+ cirq/_version.py,sha256=cXnObSc4jh25fDMNoaPWQ5f9EWNeQlSkrnE-8h_58Fc,1206
8
+ cirq/_version_test.py,sha256=1NNSquOuZBon7uf5AJWxpzksetacHdW9i7_g3kdIqS8,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
@@ -28,8 +28,8 @@ cirq/circuits/moment.py,sha256=MskIVl5jbGnZdKKLNWbrQhWI5FHwjsuPOEm0hze8GDE,26299
28
28
  cirq/circuits/moment_test.py,sha256=oNHNXhiPEoCKbzeh16tRwiW1qZWlg4X2O_uiVDP1D58,27375
29
29
  cirq/circuits/optimization_pass.py,sha256=uw3ne0-ebZo6GNjwfQMuQ3b5u9RCgyaXRfhpbljlxao,6468
30
30
  cirq/circuits/optimization_pass_test.py,sha256=eQB0NBJ9EvqjgSFGQMgaHIh5niQhksdnvqSXhsj3nOg,5947
31
- cirq/circuits/qasm_output.py,sha256=RrqtLmGHRcKaHIJPT0ZGIK8aC5mrixE_D8nhDUVMPNE,12441
32
- cirq/circuits/qasm_output_test.py,sha256=vFKolO5mo9hX9J3O9vrJbhv0OUR71eyFk8_fquhzHKs,12539
31
+ cirq/circuits/qasm_output.py,sha256=atCdZwEx3T8NgiFuA7X4vx0jEo9REh1MyjiROutx4cg,12963
32
+ cirq/circuits/qasm_output_test.py,sha256=PawmzjqGpwauWgESqoi_U_iaYVZAMg_eIhZ_2VrPkPw,13634
33
33
  cirq/circuits/text_diagram_drawer.py,sha256=ctZUG5fk2pf4XswHTJG4kteQYzzH0TefL9JWUagLJvc,17232
34
34
  cirq/circuits/text_diagram_drawer_test.py,sha256=2bSoBIeQajRi0aQxqYDpbMlT2eqpx_f-Cmg9XO6A9Jk,10750
35
35
  cirq/contrib/__init__.py,sha256=Mha0eF2ci88OVQX3laQiXgdEVo0yGwM7R5a13ryQ8jM,1065
@@ -195,7 +195,7 @@ cirq/experiments/t1_decay_experiment.py,sha256=ealdmc_RTE__z1YUcaDEncDzQOaiT0K6I
195
195
  cirq/experiments/t1_decay_experiment_test.py,sha256=Pgbm-37JiCdw9iQg2OaXVvs72xGWV2629CgsTQlLQnw,9139
196
196
  cirq/experiments/t2_decay_experiment.py,sha256=lTgZ9yJ7Fk9_ozUCHysQn1qKrMQwTpsgEv-QnvsEif0,19158
197
197
  cirq/experiments/t2_decay_experiment_test.py,sha256=DFR0BGn0Id4qNPfqIExj70TEAqf7Vrc8eK91Wj0YKTc,15031
198
- cirq/experiments/two_qubit_xeb.py,sha256=QsGQ-wR8T-m4YhOOJ1COXKi6roJuZmFuv1u8YWXkHBI,21636
198
+ cirq/experiments/two_qubit_xeb.py,sha256=BxGKj0yVPSwgdDIwNXMGUhEmb9BfjvFS6HYsTTKFlcQ,22482
199
199
  cirq/experiments/two_qubit_xeb_test.py,sha256=wJi-ulxtSJyE5pzJPoUgoV8X2NLZG_H0jlW1JKHSo_I,10681
200
200
  cirq/experiments/xeb_fitting.py,sha256=Tzo2kg62udpRp654XArSDVcyVNhlhkNmpx9UVyxZiiw,30337
201
201
  cirq/experiments/xeb_fitting_test.py,sha256=0GQ6ifSWdvEJ6-ICIcSR-R9lFLRwBykgf6toLElmg0o,15483
@@ -1187,8 +1187,8 @@ cirq/work/sampler.py,sha256=y6qtCpAwO8SqZ_JKU8PwlbMLHpJskNPqGWD_pNbyZew,19779
1187
1187
  cirq/work/sampler_test.py,sha256=hL2UWx3dz2ukZVNxWftiKVvJcQoLplLZdQm-k1QcA40,13282
1188
1188
  cirq/work/zeros_sampler.py,sha256=x1C7cup66a43n-3tm8QjhiqJa07qcJW10FxNp9jJ59Q,2356
1189
1189
  cirq/work/zeros_sampler_test.py,sha256=JIkpBBFPJe5Ba4142vzogyWyboG1Q1ZAm0UVGgOoZn8,3279
1190
- cirq_core-1.5.0.dev20241120233534.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1191
- cirq_core-1.5.0.dev20241120233534.dist-info/METADATA,sha256=1-jjDNKO-NFEVTOQY2DZbUf27V0_P5XX9JMubj1miv8,1992
1192
- cirq_core-1.5.0.dev20241120233534.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
1193
- cirq_core-1.5.0.dev20241120233534.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1194
- cirq_core-1.5.0.dev20241120233534.dist-info/RECORD,,
1190
+ cirq_core-1.5.0.dev20241122173038.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1191
+ cirq_core-1.5.0.dev20241122173038.dist-info/METADATA,sha256=VH24wo8YSSqYHFvLY6zfFlfM3ODnFzDpfIR9zFGCTjM,1992
1192
+ cirq_core-1.5.0.dev20241122173038.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
1193
+ cirq_core-1.5.0.dev20241122173038.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1194
+ cirq_core-1.5.0.dev20241122173038.dist-info/RECORD,,