Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
test_planner_surface_descriptors.py
Go to the documentation of this file.
1 import sys
2 from pathlib import Path
3 
4 import pytest
5 
6 REPO_ROOT = Path(__file__).resolve().parents[2]
7 if str(REPO_ROOT) not in sys.path:
8  sys.path.insert(0, str(REPO_ROOT))
9 
10 from tests.partitioning.fixtures.continuity import build_phase2_continuity_vqe
12  MANDATORY_NOISE_PATTERNS,
13  STRUCTURED_FAMILY_NAMES,
14  STRUCTURED_QUBITS,
15  build_microcase_descriptor_set,
16  build_microcase_surface,
17  build_structured_surface,
18  iter_microcase_descriptor_sets,
19  iter_structured_descriptor_sets,
20 )
21 from squander import Circuit
22 from squander.partitioning.noisy_planner import (
23  DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
24  PARTITIONED_DENSITY_MODE,
25  PLANNER_OP_KIND_NOISE,
26  build_canonical_planner_surface_from_qgd_circuit,
27  build_descriptor_audit_record,
28  build_partition_descriptor_set,
29  build_phase3_continuity_partition_descriptor_set,
30  build_phase3_continuity_planner_surface,
31  preflight_descriptor_request,
32  validate_partition_descriptor_set,
33  validate_partition_descriptor_set_against_surface,
34 )
35 
36 
37 def _flatten_canonical_indices(payload: dict) -> list[int]:
38  return [
39  member["canonical_operation_index"]
40  for partition in payload["partitions"]
41  for member in partition["members"]
42  ]
43 
44 
45 def _flatten_member_names(payload: dict) -> list[str]:
46  return [
47  member["name"]
48  for partition in payload["partitions"]
49  for member in partition["members"]
50  ]
51 
52 
54  partition: dict,
55 ) -> list[tuple[tuple[int, ...], tuple[int, ...]]]:
56  local_to_global = {
57  local_qbit: global_qbit
58  for local_qbit, global_qbit in enumerate(partition["local_to_global_qbits"])
59  }
60  return [
61  (
62  tuple(member["qubit_support"]),
63  tuple(
64  local_to_global[local_qbit]
65  for local_qbit in member["local_qubit_support"]
66  ),
67  )
68  for member in partition["members"]
69  ]
70 
71 
72 def _expected_partition_parameter_routing(partition: dict) -> list[dict]:
73  return [
74  {
75  "global_param_start": member["param_start"],
76  "local_param_start": member["local_param_start"],
77  "param_count": member["param_count"],
78  }
79  for member in partition["members"]
80  if member["param_count"] > 0
81  ]
82 
83 
84 @pytest.mark.parametrize("qbit_num", [4, 6, 8, 10])
86  vqe, _, _ = build_phase2_continuity_vqe(qbit_num)
89  payload = descriptor_set.to_dict()
90 
91  assert descriptor_set.requested_mode == PARTITIONED_DENSITY_MODE
92  assert descriptor_set.source_type == "generated_hea"
93  assert descriptor_set.workload_id == f"phase2_xxz_hea_q{qbit_num}_continuity"
94  assert descriptor_set.qbit_num == qbit_num
95  assert descriptor_set.parameter_count == surface.parameter_count
96  assert payload["partition_count"] > 0
97  assert payload["descriptor_member_count"] == surface.operation_count
98  assert payload["gate_count"] == surface.gate_count
99  assert payload["noise_count"] == surface.noise_count
100  assert payload["partition_count"] == len(payload["partitions"])
101  assert payload["partition_member_counts"] == [
102  len(partition["members"]) for partition in payload["partitions"]
103  ]
104  assert _flatten_canonical_indices(payload) == list(range(surface.operation_count))
105 
106  for expected_partition_index, partition in enumerate(payload["partitions"]):
107  assert partition["partition_index"] == expected_partition_index
108  assert partition["canonical_operation_indices"] == [
109  member["canonical_operation_index"] for member in partition["members"]
110  ]
111  assert partition["partition_qubit_span"] == partition["local_to_global_qbits"]
112  assert (
113  len(partition["partition_qubit_span"])
114  <= DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS
115  )
116 
117 
119  vqe, _, _ = build_phase2_continuity_vqe(4)
120 
121  first_payload = build_phase3_continuity_partition_descriptor_set(vqe).to_dict()
122  second_payload = build_phase3_continuity_partition_descriptor_set(vqe).to_dict()
123 
124  assert first_payload == second_payload
125 
126 
128  reference_keys = None
129  partition_keys = None
130  member_keys = None
131 
132  for metadata, descriptor_set in iter_microcase_descriptor_sets():
133  payload = descriptor_set.to_dict()
134 
135  if reference_keys is None:
136  reference_keys = set(payload.keys())
137  partition_keys = set(payload["partitions"][0].keys())
138  member_keys = set(payload["partitions"][0]["members"][0].keys())
139  else:
140  assert set(payload.keys()) == reference_keys
141  assert set(payload["partitions"][0].keys()) == partition_keys
142  assert set(payload["partitions"][0]["members"][0].keys()) == member_keys
143 
144  assert payload["requested_mode"] == PARTITIONED_DENSITY_MODE
145  assert payload["source_type"] == "microcase_builder"
146  assert payload["workload_id"] == metadata["case_name"]
147  assert payload["qbit_num"] == metadata["qbit_num"]
148  assert payload["partition_count"] > 0
149  assert (
150  payload["descriptor_member_count"]
151  == payload["gate_count"] + payload["noise_count"]
152  )
153  assert (
154  payload["max_partition_qubits"] == DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS
155  )
156 
157 
159  structured_cases = list(iter_structured_descriptor_sets())
160  assert len(structured_cases) == (
161  len(STRUCTURED_FAMILY_NAMES)
162  * len(STRUCTURED_QUBITS)
163  * len(MANDATORY_NOISE_PATTERNS)
164  )
165 
166  for metadata, descriptor_set in structured_cases:
167  payload = descriptor_set.to_dict()
168 
169  assert payload["requested_mode"] == PARTITIONED_DENSITY_MODE
170  assert payload["source_type"] == "structured_family_builder"
171  assert payload["workload_id"] == metadata["workload_id"]
172  assert payload["qbit_num"] == metadata["qbit_num"]
173  assert payload["partition_count"] > 0
174  assert (
175  payload["descriptor_member_count"]
176  == payload["gate_count"] + payload["noise_count"]
177  )
178  assert (
179  payload["max_partition_qubits"] == DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS
180  )
181 
182 
184  continuity_vqe, _, _ = build_phase2_continuity_vqe(4)
186  continuity_vqe
187  ).to_dict()
188  _, microcase_descriptor_set = next(iter(iter_microcase_descriptor_sets()))
189  _, structured_descriptor_set = next(iter(iter_structured_descriptor_sets()))
190 
191  payloads = (
192  continuity_payload,
193  microcase_descriptor_set.to_dict(),
194  structured_descriptor_set.to_dict(),
195  )
196 
197  top_level_keys = {frozenset(payload.keys()) for payload in payloads}
198  partition_keys = {
199  frozenset(payload["partitions"][0].keys())
200  for payload in payloads
201  if payload["partitions"]
202  }
203  member_keys = {
204  frozenset(payload["partitions"][0]["members"][0].keys())
205  for payload in payloads
206  if payload["partitions"] and payload["partitions"][0]["members"]
207  }
208 
209  assert len(top_level_keys) == 1
210  assert len(partition_keys) == 1
211  assert len(member_keys) == 1
212 
213 
215  workload_ids = set()
216 
217  continuity_vqe, _, _ = build_phase2_continuity_vqe(4)
219  continuity_vqe
220  ).to_dict()
221  workload_ids.add(continuity_payload["workload_id"])
222 
223  for metadata, descriptor_set in iter_microcase_descriptor_sets():
224  assert descriptor_set.workload_id == metadata["case_name"]
225  assert descriptor_set.workload_id not in workload_ids
226  workload_ids.add(descriptor_set.workload_id)
227 
228  for metadata, descriptor_set in iter_structured_descriptor_sets():
229  assert descriptor_set.workload_id == metadata["workload_id"]
230  assert descriptor_set.workload_id not in workload_ids
231  workload_ids.add(descriptor_set.workload_id)
232 
233 
235  vqe, _, _ = build_phase2_continuity_vqe(4)
237  descriptor_payload = build_phase3_continuity_partition_descriptor_set(vqe).to_dict()
238  surface_payload = surface.to_dict()
239 
240  expected_names = [operation["name"] for operation in surface_payload["operations"]]
241  actual_names = _flatten_member_names(descriptor_payload)
242 
243  assert _flatten_canonical_indices(descriptor_payload) == list(
244  range(surface_payload["operation_count"])
245  )
246  assert actual_names == expected_names
247  assert descriptor_payload["noise_count"] == sum(
248  member["kind"] == PLANNER_OP_KIND_NOISE
249  for partition in descriptor_payload["partitions"]
250  for member in partition["members"]
251  )
252 
253 
255  surface = build_microcase_surface("microcase_4q_partition_boundary_triplet")
256  descriptor_payload = build_microcase_descriptor_set(
257  "microcase_4q_partition_boundary_triplet"
258  ).to_dict()
259  surface_payload = surface.to_dict()
260 
261  expected_names = [operation["name"] for operation in surface_payload["operations"]]
262  actual_names = _flatten_member_names(descriptor_payload)
263 
264  assert _flatten_canonical_indices(descriptor_payload) == list(
265  range(surface_payload["operation_count"])
266  )
267  assert actual_names == expected_names
268  assert any(
269  partition["gate_count"] > 0 and partition["noise_count"] > 0
270  for partition in descriptor_payload["partitions"]
271  )
272  assert (
273  sum(partition["noise_count"] for partition in descriptor_payload["partitions"])
274  == surface_payload["noise_count"]
275  )
276 
277 
279  metadata, descriptor_set = next(iter(iter_structured_descriptor_sets()))
280  surface = build_structured_surface(
281  metadata["family_name"],
282  qbit_num=metadata["qbit_num"],
283  noise_pattern=metadata["noise_pattern"],
284  seed=metadata["seed"],
285  )
286  descriptor_payload = descriptor_set.to_dict()
287  surface_payload = surface.to_dict()
288 
289  assert _flatten_canonical_indices(descriptor_payload) == list(
290  range(surface_payload["operation_count"])
291  )
292  assert _flatten_member_names(descriptor_payload) == [
293  operation["name"] for operation in surface_payload["operations"]
294  ]
295 
296 
298  vqe, _, _ = build_phase2_continuity_vqe(4)
300  payload = validate_partition_descriptor_set(descriptor_set).to_dict()
301 
302  assert any(partition["requires_remap"] for partition in payload["partitions"])
303  for partition in payload["partitions"]:
304  for (
305  expected_global_support,
306  reconstructed_global_support,
307  ) in _round_trip_partition_support(partition):
308  assert expected_global_support == reconstructed_global_support
309 
310 
312  descriptor_set = build_microcase_descriptor_set(
313  "microcase_4q_partition_boundary_triplet"
314  )
315  payload = validate_partition_descriptor_set(descriptor_set).to_dict()
316 
317  assert any(partition["parameter_routing"] for partition in payload["partitions"])
318  for partition in payload["partitions"]:
319  assert partition["parameter_routing"] == _expected_partition_parameter_routing(
320  partition
321  )
322 
323 
325  metadata, descriptor_set = next(iter(iter_structured_descriptor_sets()))
326  payload = validate_partition_descriptor_set(descriptor_set).to_dict()
327 
328  assert payload["workload_id"] == metadata["workload_id"]
329  assert any(partition["requires_remap"] for partition in payload["partitions"])
330  assert any(
331  len(partition["partition_qubit_span"])
332  == DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS
333  for partition in payload["partitions"]
334  )
335 
336 
338  vqe, _, _ = build_phase2_continuity_vqe(4)
341  descriptor_set, metadata={"case_kind": "continuity"}
342  )
343 
344  assert audit["provenance"]["source_type"] == "generated_hea"
345  assert audit["summary"]["partition_count"] == descriptor_set.partition_count
346  assert (
347  audit["summary"]["descriptor_member_count"]
348  == descriptor_set.descriptor_member_count
349  )
350  assert audit["metadata"]["case_kind"] == "continuity"
351 
352 
354  metadata, descriptor_set = next(iter(iter_structured_descriptor_sets()))
355  audit = build_descriptor_audit_record(descriptor_set, metadata=metadata)
356 
357  assert audit["provenance"]["source_type"] == "structured_family_builder"
358  assert audit["provenance"]["workload_id"] == metadata["workload_id"]
359  assert audit["summary"]["partition_count"] > 0
360  assert audit["summary"]["parameter_routing_segment_count"] > 0
361 
362 
364  circuit = Circuit(2)
365  circuit.add_U3(0)
366  circuit.add_CNOT(1, 0)
367 
368  descriptor_set = build_partition_descriptor_set(
370  circuit, workload_id="legacy_descriptor_audit"
371  )
372  )
374  descriptor_set, metadata={"case_kind": "legacy_exact"}
375  )
376 
377  assert audit["provenance"]["source_type"] == "legacy_qgd_circuit_exact"
378  assert audit["provenance"]["workload_id"] == "legacy_descriptor_audit"
379  assert audit["summary"]["partition_count"] > 0
380  assert audit["metadata"]["case_kind"] == "legacy_exact"
381 
382 
384  continuity_vqe, _, _ = build_phase2_continuity_vqe(4)
385  continuity_audit = build_descriptor_audit_record(
387  metadata={"case_kind": "continuity"},
388  )
389  _, microcase_descriptor_set = next(iter(iter_microcase_descriptor_sets()))
390  microcase_audit = build_descriptor_audit_record(
391  microcase_descriptor_set, metadata={"case_kind": "microcase"}
392  )
393  _, structured_descriptor_set = next(iter(iter_structured_descriptor_sets()))
394  structured_audit = build_descriptor_audit_record(
395  structured_descriptor_set, metadata={"case_kind": "structured_family"}
396  )
397 
398  circuit = Circuit(2)
399  circuit.add_U3(0)
400  circuit.add_CNOT(1, 0)
401  legacy_audit = build_descriptor_audit_record(
404  circuit, workload_id="legacy_descriptor_shape"
405  )
406  ),
407  metadata={"case_kind": "legacy_exact"},
408  )
409 
410  audits = (continuity_audit, microcase_audit, structured_audit, legacy_audit)
411  top_level_keys = {frozenset(audit.keys()) for audit in audits}
412  summary_keys = {frozenset(audit["summary"].keys()) for audit in audits}
413  partition_keys = {
414  frozenset(audit["partitions"][0].keys())
415  for audit in audits
416  if audit["partitions"]
417  }
418 
419  assert len(top_level_keys) == 1
420  assert len(summary_keys) == 1
421  assert len(partition_keys) == 1
422 
423 
425  vqe, _, _ = build_phase2_continuity_vqe(4)
426  bridge = vqe.describe_density_bridge()
427 
428  descriptor_set = preflight_descriptor_request(
429  source_type="generated_hea",
430  workload_id="phase2_xxz_hea_q4_continuity",
431  bridge_metadata=bridge,
432  )
433 
434  assert descriptor_set.requested_mode == PARTITIONED_DENSITY_MODE
435  assert descriptor_set.partition_count > 0
436  assert descriptor_set.workload_id == "phase2_xxz_hea_q4_continuity"
437 
438 
440  surface = build_microcase_surface("microcase_4q_partition_boundary_triplet")
441  descriptor_set = build_microcase_descriptor_set(
442  "microcase_4q_partition_boundary_triplet"
443  )
444 
446  surface, descriptor_set
447  )
448 
449  assert validated.workload_id == surface.workload_id
450  assert validated.partition_count == descriptor_set.partition_count
def build_phase2_continuity_vqe
def build_phase3_continuity_planner_surface
Build a canonical planner surface from a Phase 2 continuity VQE instance.
def validate_partition_descriptor_set
def build_phase3_continuity_partition_descriptor_set
def validate_partition_descriptor_set_against_surface