Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
correctness_evidence/case_selection.py
Go to the documentation of this file.
1 from __future__ import annotations
2 
3 from copy import deepcopy
4 from dataclasses import dataclass, replace
5 from functools import lru_cache
6 from typing import Any
7 
8 import numpy as np
9 
10 from benchmarks.density_matrix.correctness_evidence.common import (
11  CORRECTNESS_EVIDENCE_REFERENCE_BACKEND_EXTERNAL,
12  CORRECTNESS_EVIDENCE_REFERENCE_BACKEND_INTERNAL,
13  build_correctness_evidence_selected_candidate,
14  build_validation_slice,
15 )
16 from benchmarks.density_matrix.partitioned_runtime.common import build_initial_parameters
17 from benchmarks.density_matrix.planner_surface.common import build_phase2_continuity_vqe
18 from benchmarks.density_matrix.planner_surface.workloads import (
19  DEFAULT_STRUCTURED_SEED,
20  PHASE31_CONTROL_NOISE_PATTERNS,
21  PHASE31_CONTROL_STRUCTURED_FAMILY_NAMES,
22  PHASE31_PRIMARY_NOISE_PATTERNS,
23  PHASE31_PRIMARY_SEEDS,
24  PHASE31_PRIMARY_STRUCTURED_FAMILY_NAMES,
25  MANDATORY_NOISE_PATTERNS,
26  STRUCTURED_FAMILY_NAMES,
27  STRUCTURED_QUBITS,
28  build_microcase_descriptor_set,
29  build_phase31_microcase_descriptor_set,
30  build_phase31_structured_descriptor_set,
31  build_structured_descriptor_set,
32  mandatory_microcase_definitions,
33  phase31_microcase_definitions,
34 )
35 from squander.partitioning.noisy_planner import (
36  NoisyPartitionDescriptorSet,
37  build_phase3_continuity_partition_descriptor_set,
38 )
39 
40 CORRECTNESS_EVIDENCE_CASE_KIND_CONTINUITY = "continuity"
41 CORRECTNESS_EVIDENCE_CASE_KIND_MICROCASE = "microcase"
42 CORRECTNESS_EVIDENCE_CASE_KIND_STRUCTURED = "structured_family"
43 CORRECTNESS_EVIDENCE_CONTINUITY_QUBITS = (4, 6, 8, 10)
44 CORRECTNESS_EVIDENCE_EXTERNAL_REFERENCE_CONTINUITY_QUBITS = (4,)
45 PHASE31_CORRECTNESS_CONTINUITY_QUBITS = (4, 6)
46 
47 # Frozen counted microcase IDs for Stage-A bounded package (excludes non-counted smoke workloads).
48 PHASE31_BOUNDED_COUNTED_MICROCASE_IDS: tuple[str, ...] = (
49  "phase31_microcase_1q_u3_local_noise_chain",
50  "phase31_microcase_2q_cnot_local_noise_pair",
51  "phase31_microcase_2q_multi_noise_entangler_chain",
52  "phase31_microcase_2q_dense_same_support_motif",
53 )
54 
55 
56 @dataclass(frozen=True)
58  metadata: dict[str, Any]
59  descriptor_set: NoisyPartitionDescriptorSet
60  parameters: np.ndarray
61  hamiltonian: Any | None = None
62 
63 
65  return int(build_correctness_evidence_selected_candidate()["max_partition_qubits"])
66 
67 
69  descriptor_set: NoisyPartitionDescriptorSet,
70  *,
71  case_kind: str,
72  family_name: str | None = None,
73  noise_pattern: str | None = None,
74  seed: int | None = None,
75  topology: list[tuple[int, int]] | None = None,
76 ) -> dict[str, Any]:
77  external_reference_required = case_kind == CORRECTNESS_EVIDENCE_CASE_KIND_MICROCASE or (
78  case_kind == CORRECTNESS_EVIDENCE_CASE_KIND_CONTINUITY
79  and descriptor_set.qbit_num in CORRECTNESS_EVIDENCE_EXTERNAL_REFERENCE_CONTINUITY_QUBITS
80  )
82  return {
83  "case_name": descriptor_set.workload_id,
84  "case_kind": case_kind,
85  "candidate_id": selected_candidate["candidate_id"],
86  "planner_family": selected_candidate["planner_family"],
87  "planner_variant": selected_candidate["planner_variant"],
88  "max_partition_qubits": selected_candidate["max_partition_qubits"],
89  "planner_settings": dict(selected_candidate["planner_settings"]),
90  "planner_calibration_selected_candidate_id": selected_candidate["selected_candidate_id"],
91  "planner_calibration_claim_selection_schema_version": selected_candidate[
92  "claim_selection_schema_version"
93  ],
94  "planner_calibration_claim_selection_rule": selected_candidate["claim_selection_rule"],
95  "source_type": descriptor_set.source_type,
96  "workload_id": descriptor_set.workload_id,
97  "qbit_num": descriptor_set.qbit_num,
98  "parameter_count": descriptor_set.parameter_count,
99  "family_name": family_name,
100  "noise_pattern": noise_pattern,
101  "seed": seed,
102  "topology": list(topology) if topology is not None else None,
103  "validation_slice": build_validation_slice(
104  external_reference_required=external_reference_required
105  ),
106  "external_reference_required": external_reference_required,
107  "reference_backend_internal": CORRECTNESS_EVIDENCE_REFERENCE_BACKEND_INTERNAL,
108  "reference_backend": (
109  CORRECTNESS_EVIDENCE_REFERENCE_BACKEND_EXTERNAL if external_reference_required else None
110  ),
111  }
112 
113 
115  max_partition_qubits = _selected_partition_qubits()
116  for qbit_num in CORRECTNESS_EVIDENCE_CONTINUITY_QUBITS:
117  vqe, hamiltonian, topology = build_phase2_continuity_vqe(qbit_num)
118  workload_id = f"phase2_xxz_hea_q{qbit_num}_continuity"
120  vqe,
121  workload_id=workload_id,
122  max_partition_qubits=max_partition_qubits,
123  )
125  descriptor_set,
126  case_kind=CORRECTNESS_EVIDENCE_CASE_KIND_CONTINUITY,
127  topology=topology,
128  )
130  metadata=metadata,
131  descriptor_set=descriptor_set,
132  parameters=build_initial_parameters(vqe.get_Parameter_Num()),
133  hamiltonian=hamiltonian,
134  )
135 
136 
138  max_partition_qubits = _selected_partition_qubits()
139  for definition in mandatory_microcase_definitions():
140  descriptor_set = build_microcase_descriptor_set(
141  definition["case_name"],
142  max_partition_qubits=max_partition_qubits,
143  )
145  descriptor_set,
146  case_kind=CORRECTNESS_EVIDENCE_CASE_KIND_MICROCASE,
147  noise_pattern=definition["noise_pattern"],
148  )
150  metadata=metadata,
151  descriptor_set=descriptor_set,
152  parameters=build_initial_parameters(descriptor_set.parameter_count),
153  )
154 
155 
157  max_partition_qubits = _selected_partition_qubits()
158  for family_name in STRUCTURED_FAMILY_NAMES:
159  for qbit_num in STRUCTURED_QUBITS:
160  for noise_pattern in MANDATORY_NOISE_PATTERNS:
161  descriptor_set = build_structured_descriptor_set(
162  family_name,
163  qbit_num=qbit_num,
164  noise_pattern=noise_pattern,
165  seed=DEFAULT_STRUCTURED_SEED,
166  max_partition_qubits=max_partition_qubits,
167  )
169  descriptor_set,
170  case_kind=CORRECTNESS_EVIDENCE_CASE_KIND_STRUCTURED,
171  family_name=family_name,
172  noise_pattern=noise_pattern,
173  seed=DEFAULT_STRUCTURED_SEED,
174  )
176  metadata=metadata,
177  descriptor_set=descriptor_set,
178  parameters=build_initial_parameters(descriptor_set.parameter_count),
179  )
180 
181 
183  """Planning helper for the Phase 3.1 counted microcase surface.
184 
185  This is intentionally separate from the default Phase 3 correctness package
186  until Phase 3.1 implementation work wires the new path into the bundle
187  builders.
188  """
189 
190  max_partition_qubits = _selected_partition_qubits()
191  for definition in phase31_microcase_definitions():
193  definition["case_name"],
194  max_partition_qubits=max_partition_qubits,
195  )
197  descriptor_set,
198  case_kind=CORRECTNESS_EVIDENCE_CASE_KIND_MICROCASE,
199  noise_pattern=definition["noise_pattern"],
200  )
201  metadata.update(
202  {
203  "claim_surface_id": "phase31_bounded_mixed_motif_v1",
204  "representation_primary": "kraus_bundle",
205  "fused_block_support_qbits": list(definition["support_qbits"]),
206  "contains_noise": True,
207  "counted_phase31_case": True,
208  }
209  )
211  metadata=metadata,
212  descriptor_set=descriptor_set,
213  parameters=build_initial_parameters(descriptor_set.parameter_count),
214  )
215 
216 
218  """Planning helper for the bounded Phase 3.1 continuity anchors."""
219 
220  max_partition_qubits = _selected_partition_qubits()
221  for qbit_num in PHASE31_CORRECTNESS_CONTINUITY_QUBITS:
222  vqe, hamiltonian, topology = build_phase2_continuity_vqe(qbit_num)
223  workload_id = f"phase2_xxz_hea_q{qbit_num}_continuity"
225  vqe,
226  workload_id=workload_id,
227  max_partition_qubits=max_partition_qubits,
228  )
230  descriptor_set,
231  case_kind=CORRECTNESS_EVIDENCE_CASE_KIND_CONTINUITY,
232  topology=topology,
233  )
234  metadata.update(
235  {
236  "claim_surface_id": "phase31_bounded_mixed_motif_v1",
237  "representation_primary": "kraus_bundle",
238  "contains_noise": True,
239  "counted_phase31_case": True,
240  }
241  )
243  metadata=metadata,
244  descriptor_set=descriptor_set,
245  parameters=build_initial_parameters(vqe.get_Parameter_Num()),
246  hamiltonian=hamiltonian,
247  )
248 
249 
251  """Planning helper for the Phase 3.1 counted performance carry-forward set."""
252 
253  max_partition_qubits = _selected_partition_qubits()
254  for family_name in PHASE31_PRIMARY_STRUCTURED_FAMILY_NAMES:
255  for qbit_num in STRUCTURED_QUBITS:
256  for noise_pattern in PHASE31_PRIMARY_NOISE_PATTERNS:
257  for seed in PHASE31_PRIMARY_SEEDS:
259  family_name,
260  qbit_num=qbit_num,
261  noise_pattern=noise_pattern,
262  seed=seed,
263  max_partition_qubits=max_partition_qubits,
264  )
266  descriptor_set,
267  case_kind=CORRECTNESS_EVIDENCE_CASE_KIND_STRUCTURED,
268  family_name=family_name,
269  noise_pattern=noise_pattern,
270  seed=seed,
271  )
272  metadata.update(
273  {
274  "claim_surface_id": "phase31_bounded_mixed_motif_v1",
275  "representation_primary": "kraus_bundle",
276  "contains_noise": True,
277  "counted_phase31_case": True,
278  }
279  )
281  metadata=metadata,
282  descriptor_set=descriptor_set,
283  parameters=build_initial_parameters(
284  descriptor_set.parameter_count
285  ),
286  )
287  for family_name in PHASE31_CONTROL_STRUCTURED_FAMILY_NAMES:
288  for qbit_num in STRUCTURED_QUBITS:
289  for noise_pattern in PHASE31_CONTROL_NOISE_PATTERNS:
291  family_name,
292  qbit_num=qbit_num,
293  noise_pattern=noise_pattern,
294  seed=DEFAULT_STRUCTURED_SEED,
295  max_partition_qubits=max_partition_qubits,
296  )
298  descriptor_set,
299  case_kind=CORRECTNESS_EVIDENCE_CASE_KIND_STRUCTURED,
300  family_name=family_name,
301  noise_pattern=noise_pattern,
302  seed=DEFAULT_STRUCTURED_SEED,
303  )
304  metadata.update(
305  {
306  "claim_surface_id": "phase31_bounded_mixed_motif_v1",
307  "representation_primary": "kraus_bundle",
308  "contains_noise": True,
309  "counted_phase31_case": True,
310  }
311  )
313  metadata=metadata,
314  descriptor_set=descriptor_set,
315  parameters=build_initial_parameters(descriptor_set.parameter_count),
316  )
317 
318 
319 @lru_cache(maxsize=1)
320 def _build_correctness_evidence_case_contexts_cached() -> tuple[CorrectnessEvidenceCaseContext, ...]:
321  cases: list[CorrectnessEvidenceCaseContext] = []
325  return tuple(cases)
326 
327 
328 def build_correctness_evidence_case_contexts() -> list[CorrectnessEvidenceCaseContext]:
329  return deepcopy(list(_build_correctness_evidence_case_contexts_cached()))
330 
331 
332 @lru_cache(maxsize=1)
334  CorrectnessEvidenceCaseContext, ...
335 ]:
336  """Bounded Stage-A package: four counted microcases + q4/q6 continuity; no structured rows."""
337 
338  contexts: list[CorrectnessEvidenceCaseContext] = []
340  if ctx.descriptor_set.workload_id not in PHASE31_BOUNDED_COUNTED_MICROCASE_IDS:
341  continue
342  contexts.append(deepcopy(ctx))
344  meta = dict(ctx.metadata)
345  # Whole-workload hybrid routing; not a single fused support tuple (§10.6 audit field).
346  meta["fused_block_support_qbits"] = None
347  contexts.append(replace(deepcopy(ctx), metadata=meta))
348  if len(contexts) != 6:
349  raise AssertionError(
350  "expected 6 Phase 3.1 bounded contexts, got {}".format(len(contexts))
351  )
352  return tuple(contexts)
353 
354 
355 def build_phase31_correctness_evidence_case_contexts() -> list[CorrectnessEvidenceCaseContext]:
356  """Stage-A sibling selector for P31-S10-E02 (does not alter default Phase 3 case matrix)."""
def build_phase2_continuity_vqe
def build_phase3_continuity_partition_descriptor_set
def build_correctness_evidence_selected_candidate()