Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
planner_calibration/case_selection.py
Go to the documentation of this file.
1 from __future__ import annotations
2 
3 from time import perf_counter
4 
5 from benchmarks.density_matrix.partitioned_runtime.common import build_initial_parameters
6 from benchmarks.density_matrix.planner_calibration.common import (
7  PlannerCandidate,
8  build_planner_candidates,
9 )
10 from benchmarks.density_matrix.planner_surface.common import (
11  build_phase2_continuity_vqe,
12 )
13 from benchmarks.density_matrix.planner_surface.workloads import (
14  DEFAULT_STRUCTURED_SEED,
15  MANDATORY_NOISE_PATTERNS,
16  STRUCTURED_FAMILY_NAMES,
17  STRUCTURED_QUBITS,
18  build_microcase_descriptor_set,
19  build_structured_descriptor_set,
20  mandatory_microcase_definitions,
21 )
22 from squander.partitioning.noisy_planner import (
23  build_phase3_continuity_partition_descriptor_set,
24 )
25 
26 PLANNER_CALIBRATION_CASE_KIND_CONTINUITY = "continuity"
27 PLANNER_CALIBRATION_CASE_KIND_MICROCASE = "microcase"
28 PLANNER_CALIBRATION_CASE_KIND_STRUCTURED = "structured_family"
29 PLANNER_CALIBRATION_CONTINUITY_QUBITS = (4, 6, 8, 10)
30 DENSITY_SIGNAL_CONTINUITY_QUBITS = (4,)
31 DENSITY_SIGNAL_MICROCASE_IDS = ("microcase_4q_partition_boundary_triplet",)
32 DENSITY_SIGNAL_STRUCTURED_FILTER = {
33  "family_name": "layered_nearest_neighbor",
34  "qbit_num": 8,
35  "noise_patterns": ("sparse", "dense"),
36 }
37 
38 
40  candidate: PlannerCandidate,
41  descriptor_set,
42  *,
43  case_kind: str,
44  planning_time_ms: float,
45  family_name: str | None = None,
46  noise_pattern: str | None = None,
47  seed: int | None = None,
48 ) -> dict:
49  return {
50  "candidate_id": candidate.candidate_id,
51  "planner_family": candidate.planner_family,
52  "planner_variant": candidate.planner_variant,
53  "max_partition_qubits": candidate.max_partition_qubits,
54  "case_kind": case_kind,
55  "source_type": descriptor_set.source_type,
56  "workload_family": descriptor_set.source_type,
57  "workload_id": descriptor_set.workload_id,
58  "qbit_num": descriptor_set.qbit_num,
59  "planning_time_ms": planning_time_ms,
60  "family_name": family_name,
61  "noise_pattern": noise_pattern,
62  "seed": seed,
63  }
64 
65 
67  candidates: tuple[PlannerCandidate, ...] | None = None,
68 ):
69  active_candidates = (
70  build_planner_candidates() if candidates is None else tuple(candidates)
71  )
72  for candidate in active_candidates:
73  for qbit_num in PLANNER_CALIBRATION_CONTINUITY_QUBITS:
74  vqe, hamiltonian, topology = build_phase2_continuity_vqe(qbit_num)
75  start = perf_counter()
77  vqe,
78  workload_id=f"phase2_xxz_hea_q{qbit_num}_continuity",
79  max_partition_qubits=candidate.max_partition_qubits,
80  )
81  planning_time_ms = (perf_counter() - start) * 1000.0
82  parameters = build_initial_parameters(vqe.get_Parameter_Num())
83  metadata = _metadata_from_descriptor(
84  candidate,
85  descriptor_set,
86  case_kind=PLANNER_CALIBRATION_CASE_KIND_CONTINUITY,
87  planning_time_ms=planning_time_ms,
88  )
89  metadata["topology"] = topology
90  yield metadata, descriptor_set, parameters, hamiltonian
91 
92 
94  candidates: tuple[PlannerCandidate, ...] | None = None,
95 ):
96  active_candidates = (
97  build_planner_candidates() if candidates is None else tuple(candidates)
98  )
99  for candidate in active_candidates:
100  for definition in mandatory_microcase_definitions():
101  start = perf_counter()
102  descriptor_set = build_microcase_descriptor_set(
103  definition["case_name"],
104  max_partition_qubits=candidate.max_partition_qubits,
105  )
106  planning_time_ms = (perf_counter() - start) * 1000.0
107  metadata = _metadata_from_descriptor(
108  candidate,
109  descriptor_set,
110  case_kind=PLANNER_CALIBRATION_CASE_KIND_MICROCASE,
111  planning_time_ms=planning_time_ms,
112  noise_pattern=definition["noise_pattern"],
113  )
114  parameters = build_initial_parameters(descriptor_set.parameter_count)
115  yield metadata, descriptor_set, parameters, None
116 
117 
119  candidates: tuple[PlannerCandidate, ...] | None = None,
120 ):
121  active_candidates = (
122  build_planner_candidates() if candidates is None else tuple(candidates)
123  )
124  for candidate in active_candidates:
125  for family_name in STRUCTURED_FAMILY_NAMES:
126  for qbit_num in STRUCTURED_QUBITS:
127  for noise_pattern in MANDATORY_NOISE_PATTERNS:
128  start = perf_counter()
129  descriptor_set = build_structured_descriptor_set(
130  family_name,
131  qbit_num=qbit_num,
132  noise_pattern=noise_pattern,
133  seed=DEFAULT_STRUCTURED_SEED,
134  max_partition_qubits=candidate.max_partition_qubits,
135  )
136  planning_time_ms = (perf_counter() - start) * 1000.0
137  metadata = _metadata_from_descriptor(
138  candidate,
139  descriptor_set,
140  case_kind=PLANNER_CALIBRATION_CASE_KIND_STRUCTURED,
141  planning_time_ms=planning_time_ms,
142  family_name=family_name,
143  noise_pattern=noise_pattern,
144  seed=DEFAULT_STRUCTURED_SEED,
145  )
146  parameters = build_initial_parameters(descriptor_set.parameter_count)
147  yield metadata, descriptor_set, parameters, None
148 
149 
151  candidates: tuple[PlannerCandidate, ...] | None = None,
152 ):
153  active_candidates = (
154  build_planner_candidates() if candidates is None else tuple(candidates)
155  )
156  yield from iter_planner_calibration_continuity_cases(active_candidates)
157  yield from iter_planner_calibration_microcase_cases(active_candidates)
158  yield from iter_planner_calibration_structured_cases(active_candidates)
159 
160 
162  candidates: tuple[PlannerCandidate, ...] | None = None,
163 ):
164  active_candidates = (
165  build_planner_candidates() if candidates is None else tuple(candidates)
166  )
167  continuity_qbits = set(DENSITY_SIGNAL_CONTINUITY_QUBITS)
168  microcase_ids = set(DENSITY_SIGNAL_MICROCASE_IDS)
169  structured_noise_patterns = set(DENSITY_SIGNAL_STRUCTURED_FILTER["noise_patterns"])
170 
171  for metadata, descriptor_set, parameters, hamiltonian in iter_planner_calibration_continuity_cases(
172  active_candidates
173  ):
174  if metadata["qbit_num"] in continuity_qbits:
175  yield metadata, descriptor_set, parameters, hamiltonian
176 
177  for metadata, descriptor_set, parameters, hamiltonian in iter_planner_calibration_microcase_cases(
178  active_candidates
179  ):
180  if metadata["workload_id"] in microcase_ids:
181  yield metadata, descriptor_set, parameters, hamiltonian
182 
183  for metadata, descriptor_set, parameters, hamiltonian in iter_planner_calibration_structured_cases(
184  active_candidates
185  ):
186  if (
187  metadata["family_name"] == DENSITY_SIGNAL_STRUCTURED_FILTER["family_name"]
188  and metadata["qbit_num"] == DENSITY_SIGNAL_STRUCTURED_FILTER["qbit_num"]
189  and metadata["noise_pattern"] in structured_noise_patterns
190  ):
191  yield metadata, descriptor_set, parameters, hamiltonian
def build_phase2_continuity_vqe
def build_phase3_continuity_partition_descriptor_set