cirq-core 1.5.0.dev20241120233534__py3-none-any.whl → 1.5.0.dev20241122145042__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.dev20241122145042"
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.dev20241122145042"
@@ -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
+ )
@@ -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.dev20241122145042
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=XjIeSY8WKIWhGLgodeSyCtawAjZPlguzDgvoeD0yolU,1206
8
+ cirq/_version_test.py,sha256=AILj5qsds81og90a0QuY362o3WNzZLY_Ou91IJeQKTM,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
@@ -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.dev20241122145042.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
1191
+ cirq_core-1.5.0.dev20241122145042.dist-info/METADATA,sha256=lB-DsJBzFZpD3HAkSm3ia7EoK-Y9ddZaFKEk62F8BVE,1992
1192
+ cirq_core-1.5.0.dev20241122145042.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
1193
+ cirq_core-1.5.0.dev20241122145042.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
1194
+ cirq_core-1.5.0.dev20241122145042.dist-info/RECORD,,