Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
test_planner_surface_entry.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  iter_microcase_surfaces,
16  iter_structured_surfaces,
17  mandatory_microcase_definitions,
18 )
19 from squander import Circuit
20 from squander.partitioning.noisy_planner import (
21  PARTITIONED_DENSITY_MODE,
22  PLANNER_OP_KIND_GATE,
23  PLANNER_OP_KIND_NOISE,
24  SUPPORTED_GATE_NAMES,
25  SUPPORTED_NOISE_NAMES,
26  NoisyPlannerValidationError,
27  build_bridge_overlap_report,
28  build_canonical_planner_surface_from_bridge_metadata,
29  build_canonical_planner_surface_from_qgd_circuit,
30  build_phase3_continuity_planner_surface,
31  build_planner_audit_record,
32  preflight_planner_request,
33 )
34 
35 
36 @pytest.mark.parametrize("qbit_num", [4, 6, 8, 10])
38  vqe, _, _ = build_phase2_continuity_vqe(qbit_num)
39 
40  bridge = vqe.describe_density_bridge()
42  payload = surface.to_dict()
43 
44  assert surface.requested_mode == PARTITIONED_DENSITY_MODE
45  assert surface.source_type == "generated_hea"
46  assert surface.workload_id == f"phase2_xxz_hea_q{qbit_num}_continuity"
47  assert surface.qbit_num == qbit_num
48  assert surface.parameter_count == bridge["parameter_count"]
49  assert surface.operation_count == bridge["operation_count"]
50  assert surface.gate_count == bridge["gate_count"]
51  assert surface.noise_count == bridge["noise_count"]
52  for actual, expected in zip(payload["operations"], bridge["operations"]):
53  for key in (
54  "index",
55  "kind",
56  "name",
57  "is_unitary",
58  "source_gate_index",
59  "target_qbit",
60  "control_qbit",
61  "param_count",
62  "param_start",
63  "fixed_value",
64  ):
65  assert actual[key] == expected[key]
66  assert actual["qubit_support"] == [
67  q
68  for q in (expected["control_qbit"], expected["target_qbit"])
69  if q is not None
70  ]
71  assert payload["gate_count"] + payload["noise_count"] == payload["operation_count"]
72  assert payload["operations"][0]["kind"] == PLANNER_OP_KIND_GATE
73  assert any(
74  op["kind"] == PLANNER_OP_KIND_NOISE for op in payload["operations"]
75  )
76 
77 
79  vqe, _, _ = build_phase2_continuity_vqe(4)
80 
81  with pytest.raises(
82  NoisyPlannerValidationError,
83  match="supports only 'partitioned_density' requests",
84  ) as err:
85  build_phase3_continuity_planner_surface(vqe, requested_mode="state_vector")
86 
87  assert err.value.category == "mode"
88  assert err.value.first_unsupported_condition == "unsupported_mode"
89  assert err.value.failure_stage == "planner_entry_from_bridge_metadata_preflight"
90 
91 
93  vqe, _, _ = build_phase2_continuity_vqe(4)
94  bridge = vqe.describe_density_bridge()
95  bridge["operations"] = [
96  {
97  "index": 0,
98  "kind": PLANNER_OP_KIND_NOISE,
99  "name": "local_depolarizing",
100  "is_unitary": False,
101  "source_gate_index": 99,
102  "target_qbit": 0,
103  "control_qbit": None,
104  "param_count": 0,
105  "param_start": 0,
106  "fixed_value": 0.1,
107  }
108  ]
109 
110  with pytest.raises(
111  NoisyPlannerValidationError,
112  match="references unsupported after_gate_index 99",
113  ) as err:
115  bridge,
116  workload_id="broken_bridge_case",
117  )
118 
119  assert err.value.category == "noise_insertion"
120  assert err.value.first_unsupported_condition == "after_gate_index"
121 
122 
124  reference_keys = None
125  operation_keys = None
126 
127  for metadata, surface in iter_microcase_surfaces():
128  payload = surface.to_dict()
129 
130  if reference_keys is None:
131  reference_keys = set(payload.keys())
132  operation_keys = set(payload["operations"][0].keys())
133  else:
134  assert set(payload.keys()) == reference_keys
135  assert set(payload["operations"][0].keys()) == operation_keys
136 
137  assert payload["requested_mode"] == PARTITIONED_DENSITY_MODE
138  assert payload["source_type"] == "microcase_builder"
139  assert payload["workload_id"] == metadata["case_name"]
140  assert payload["qbit_num"] == metadata["qbit_num"]
141  assert payload["gate_count"] > 0
142  assert payload["noise_count"] > 0
143  assert set(surface.gate_names).issubset(SUPPORTED_GATE_NAMES)
144  assert set(surface.noise_names).issubset(SUPPORTED_NOISE_NAMES)
145 
146 
148  structured_cases = list(iter_structured_surfaces())
149  assert len(structured_cases) == (
150  len(STRUCTURED_FAMILY_NAMES)
151  * len(STRUCTURED_QUBITS)
152  * len(MANDATORY_NOISE_PATTERNS)
153  )
154 
155  for metadata, surface in structured_cases:
156  payload = surface.to_dict()
157 
158  assert payload["requested_mode"] == PARTITIONED_DENSITY_MODE
159  assert payload["source_type"] == "structured_family_builder"
160  assert payload["workload_id"] == metadata["workload_id"]
161  assert payload["qbit_num"] == metadata["qbit_num"]
162  assert payload["gate_count"] > 0
163  assert payload["noise_count"] > 0
164  assert set(surface.gate_names).issubset(SUPPORTED_GATE_NAMES)
165  assert set(surface.noise_names).issubset(SUPPORTED_NOISE_NAMES)
166 
167 
169  workload_ids = set()
170 
171  for metadata, surface in iter_microcase_surfaces():
172  assert surface.workload_id == metadata["case_name"]
173  assert surface.workload_id not in workload_ids
174  workload_ids.add(surface.workload_id)
175 
176  for metadata, surface in iter_structured_surfaces():
177  assert surface.workload_id == metadata["workload_id"]
178  assert surface.workload_id not in workload_ids
179  workload_ids.add(surface.workload_id)
180 
181 
183  vqe, _, _ = build_phase2_continuity_vqe(4)
185  audit = build_planner_audit_record(surface, metadata={"case_kind": "continuity"})
186  overlap = build_bridge_overlap_report(surface, vqe.describe_density_bridge())
187 
188  assert audit["provenance"]["source_type"] == "generated_hea"
189  assert audit["summary"]["operation_count"] == surface.operation_count
190  assert audit["summary"]["max_qubit_span"] >= 1
191  assert audit["operations"][0]["qubit_support"]
192  assert audit["metadata"]["case_kind"] == "continuity"
193  assert overlap["bridge_overlap_pass"]
194 
195 
197  metadata, surface = next(iter(iter_structured_surfaces()))
198  audit = build_planner_audit_record(surface, metadata=metadata)
199 
200  assert audit["provenance"]["source_type"] == "structured_family_builder"
201  assert audit["provenance"]["workload_id"] == metadata["workload_id"]
202  assert audit["summary"]["gate_sequence"]
203  assert audit["summary"]["noise_sequence"]
204  assert audit["summary"]["max_qubit_span"] >= 1
205 
206 
208  circuit = Circuit(2)
209  circuit.add_U3(0)
210  circuit.add_U3(1)
211  circuit.add_CNOT(1, 0)
212  circuit.add_U3(0)
213 
215  circuit,
216  workload_id="legacy_manual_u3_cnot",
217  )
218  gate_payloads = [
219  op
220  for op in surface.to_dict()["operations"]
221  if op["kind"] == PLANNER_OP_KIND_GATE
222  ]
223  source_gates = circuit.get_Gates()
224 
225  assert surface.source_type == "legacy_qgd_circuit_exact"
226  assert [op["name"] for op in gate_payloads] == ["U3", "U3", "CNOT", "U3"]
227  assert [op["param_start"] for op in gate_payloads] == [
228  gate.get_Parameter_Start_Index() for gate in source_gates
229  ]
230  assert [op["param_count"] for op in gate_payloads] == [
231  gate.get_Parameter_Num() for gate in source_gates
232  ]
233 
234 
236  circuit = Circuit(2)
237  circuit.add_U3(0)
238  circuit.add_CNOT(1, 0)
239 
241  circuit,
242  workload_id="legacy_manual_with_noise",
243  density_noise=[
244  {
245  "channel": "local_depolarizing",
246  "target": 1,
247  "after_gate_index": 1,
248  "error_rate": 0.1,
249  }
250  ],
251  )
252  payload = surface.to_dict()
253 
254  assert payload["noise_count"] == 1
255  assert payload["operations"][2]["kind"] == PLANNER_OP_KIND_NOISE
256  assert payload["operations"][2]["name"] == "local_depolarizing"
257  assert payload["operations"][2]["source_gate_index"] == 1
258  assert payload["operations"][2]["fixed_value"] == pytest.approx(0.1)
259 
260 
262  circuit = Circuit(1)
263  circuit.add_H(0)
264 
265  with pytest.raises(
266  NoisyPlannerValidationError,
267  match="Unsupported Phase 3 planner gate 'H' in legacy-source lowering",
268  ) as err:
270  circuit,
271  workload_id="legacy_manual_with_h",
272  )
273 
274  assert err.value.category == "gate_family"
275  assert err.value.first_unsupported_condition == "H"
276 
277 
279  circuit = Circuit(2)
280  circuit.add_U3(0)
281  circuit.add_CNOT(1, 0)
282 
283  with pytest.raises(
284  NoisyPlannerValidationError,
285  match="unsupported after_gate_index 99",
286  ) as err:
288  circuit,
289  workload_id="legacy_manual_bad_noise_index",
290  density_noise=[
291  {
292  "channel": "phase_damping",
293  "target": 0,
294  "after_gate_index": 99,
295  "lambda": 0.07,
296  }
297  ],
298  )
299 
300  assert err.value.category == "noise_insertion"
301 
302 
304  vqe, _, _ = build_phase2_continuity_vqe(4)
305  bridge = vqe.describe_density_bridge()
306  surface = preflight_planner_request(
307  source_type="generated_hea",
308  workload_id="phase2_xxz_hea_q4_continuity",
309  bridge_metadata=bridge,
310  )
311 
312  assert surface.requested_mode == PARTITIONED_DENSITY_MODE
313 
314 
316  with pytest.raises(
317  NoisyPlannerValidationError,
318  match="Unsupported Phase 3 planner source type 'binary_import'",
319  ) as err:
321  source_type="binary_import",
322  workload_id="unsupported_source_case",
323  operation_specs=[],
324  qbit_num=2,
325  )
326 
327  assert err.value.category == "source_type"
328  assert err.value.first_unsupported_condition == "binary_import"
329 
330 
332  with pytest.raises(
333  NoisyPlannerValidationError,
334  match="requires exactly one source payload",
335  ) as err:
337  source_type="microcase_builder",
338  workload_id="missing_payload_case",
339  qbit_num=2,
340  )
341 
342  assert err.value.category == "malformed_request"
343  assert err.value.first_unsupported_condition == "missing_source_payload"
344 
345 
347  microcase = mandatory_microcase_definitions()[0]
348  bad_specs = list(microcase["operation_specs"])
349  bad_specs.append(
350  {
351  "kind": "noise",
352  "name": "readout_noise",
353  "target_qbit": 0,
354  "source_gate_index": 2,
355  "fixed_value": 0.1,
356  "param_count": 0,
357  }
358  )
359 
360  with pytest.raises(
361  NoisyPlannerValidationError,
362  match="Unsupported Phase 3 planner noise model 'readout_noise'",
363  ) as err:
365  source_type="microcase_builder",
366  workload_id="unsupported_noise_case",
367  operation_specs=bad_specs,
368  qbit_num=microcase["qbit_num"],
369  )
370 
371  assert err.value.category == "noise_type"
372 
373 
375  microcase = mandatory_microcase_definitions()[0]
376  with pytest.raises(
377  NoisyPlannerValidationError,
378  match="supports only 'partitioned_density' requests",
379  ) as err:
381  source_type="microcase_builder",
382  workload_id="wrong_mode_case",
383  requested_mode="state_vector",
384  operation_specs=microcase["operation_specs"],
385  qbit_num=microcase["qbit_num"],
386  )
387 
388  assert err.value.category == "mode"
def test_continuity_surface_matches_bridge_metadata(qbit_num)
def build_bridge_overlap_report
Build a bridge overlap report from a canonical planner surface and a bridge metadata.
def test_microcases_share_canonical_schema()
def test_audit_record_tracks_continuity_provenance()
def test_preflight_rejects_missing_source_payload()
def test_legacy_lowering_accepts_explicit_supported_noise()
def test_audit_record_tracks_structured_workload_provenance()
def build_phase2_continuity_vqe
def test_rejects_unsupported_legacy_gate_family()
def test_rejects_bridge_noise_with_invalid_after_gate_index()
def test_rejects_non_partitioned_density_mode()
def test_preflight_accepts_supported_bridge_request()
def build_phase3_continuity_planner_surface
Build a canonical planner surface from a Phase 2 continuity VQE instance.
def test_preflight_rejects_disallowed_mode_claim()
def test_preflight_rejects_unsupported_noise_model_in_operation_specs()
def test_rejects_invalid_legacy_noise_schedule()
def test_structured_families_share_canonical_schema()
def test_preflight_rejects_unsupported_source_type()
def test_workload_ids_are_unique()
def test_exact_qgd_circuit_lowering_preserves_order_and_param_spans()