1 """Mandatory microcase and structured workload surfaces for partitioning API tests (mirrors benchmarks planner_surface.workloads).""" 3 from __future__
import annotations
6 from typing
import Iterable
8 from squander.partitioning.noisy_planner
import (
9 DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
10 build_partition_descriptor_set,
11 build_canonical_planner_surface_from_operation_specs,
15 MICROCASE_QUBITS = (2, 3, 4)
16 STRUCTURED_QUBITS = (8, 10)
17 MANDATORY_NOISE_PATTERNS = (
"sparse",
"periodic",
"dense")
18 STRUCTURED_FAMILY_NAMES = (
19 "layered_nearest_neighbor",
20 "seeded_random_layered",
21 "partition_stress_ladder",
23 DEFAULT_STRUCTURED_SEED = 20260318
24 PHASE31_PRIMARY_STRUCTURED_FAMILY_NAMES = (
25 "phase31_pair_repeat",
26 "phase31_alternating_ladder",
28 PHASE31_CONTROL_STRUCTURED_FAMILY_NAMES = (
"layered_nearest_neighbor",)
29 PHASE31_PRIMARY_NOISE_PATTERNS = (
"periodic",
"dense")
30 PHASE31_CONTROL_NOISE_PATTERNS = (
"sparse",)
31 PHASE31_PRIMARY_SEEDS = (
32 DEFAULT_STRUCTURED_SEED,
33 DEFAULT_STRUCTURED_SEED + 1,
34 DEFAULT_STRUCTURED_SEED + 2,
38 def _u3(target_qbit: int) -> dict:
42 "target_qbit": target_qbit,
47 def _cnot(target_qbit: int, control_qbit: int) -> dict:
51 "target_qbit": target_qbit,
52 "control_qbit": control_qbit,
57 def _noise(channel: str, target_qbit: int, after_gate_index: int, fixed_value: float) -> dict:
61 "target_qbit": target_qbit,
62 "source_gate_index": after_gate_index,
63 "fixed_value": fixed_value,
70 "local_depolarizing": 0.1,
71 "amplitude_damping": 0.05,
72 "phase_damping": 0.07,
79 "case_name":
"microcase_2q_entangler_local_depolarizing",
81 "noise_pattern":
"sparse",
91 "case_name":
"microcase_3q_mixed_local_noise_sequence",
93 "noise_pattern":
"periodic",
106 "case_name":
"microcase_4q_partition_boundary_triplet",
108 "noise_pattern":
"dense",
128 "case_name":
"phase31_microcase_1q_u3_local_noise_chain",
130 "noise_pattern":
"dense",
131 "support_qbits": (0,),
141 "case_name":
"phase31_microcase_2q_cnot_local_noise_pair",
143 "noise_pattern":
"periodic",
144 "support_qbits": (0, 1),
155 "case_name":
"phase31_microcase_2q_multi_noise_entangler_chain",
157 "noise_pattern":
"periodic",
158 "support_qbits": (0, 1),
172 "case_name":
"phase31_microcase_2q_dense_same_support_motif",
174 "noise_pattern":
"dense",
175 "support_qbits": (0, 1),
189 "case_name":
"phase31_local_support_q4_spectator_embedding_smoke",
191 "noise_pattern":
"periodic",
192 "support_qbits": (0, 1, 2, 3),
198 "amplitude_damping", 1, 2,
_noise_value(
"amplitude_damping")
206 "amplitude_damping", 3, 6,
_noise_value(
"amplitude_damping")
219 if candidate[
"case_name"] == case_name
226 qbit_num=case[
"qbit_num"],
227 source_type=
"microcase_builder",
228 workload_id=case[
"case_name"],
229 operation_specs=case[
"operation_specs"],
246 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
250 max_partition_qubits=max_partition_qubits,
256 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
260 case[
"case_name"], max_partition_qubits=max_partition_qubits
267 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
271 max_partition_qubits=max_partition_qubits,
277 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
281 case[
"case_name"], max_partition_qubits=max_partition_qubits
286 layers: list[list[dict]] = []
287 for layer_index
in range(layer_count):
288 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
289 start = layer_index % 2
290 for control
in range(start, qbit_num - 1, 2):
291 layer_specs.append(
_cnot(control + 1, control))
292 layers.append(layer_specs)
297 qbit_num: int, layer_count: int, seed: int
298 ) -> list[list[dict]]:
299 rng = random.Random(seed)
300 layers: list[list[dict]] = []
301 for layer_index
in range(layer_count):
302 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
303 start = layer_index % 2
304 for left
in range(start, qbit_num - 1, 2):
305 if rng.random() < 0.5:
306 layer_specs.append(
_cnot(left + 1, left))
308 layer_specs.append(
_cnot(left, left + 1))
309 layers.append(layer_specs)
314 layers: list[list[dict]] = []
315 for layer_index
in range(layer_count):
316 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
317 if layer_index % 2 == 0:
318 for control
in range(qbit_num - 1):
319 layer_specs.append(
_cnot(control + 1, control))
321 for target
in range(qbit_num - 2, -1, -1):
322 layer_specs.append(
_cnot(target, target + 1))
323 layers.append(layer_specs)
328 layers: list[list[dict]] = []
329 for layer_index
in range(layer_count):
330 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
331 start = layer_index % 2
332 for left
in range(start, qbit_num - 1, 2):
333 layer_specs.append(
_cnot(left + 1, left))
334 layer_specs.append(
_u3(left))
335 layer_specs.append(
_u3(left + 1))
336 layer_specs.append(
_cnot(left, left + 1))
337 layers.append(layer_specs)
342 layers: list[list[dict]] = []
343 for layer_index
in range(layer_count):
344 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
345 if layer_index % 2 == 0:
346 for left
in range(qbit_num - 1):
347 layer_specs.append(
_cnot(left + 1, left))
348 layer_specs.extend(
_u3(target)
for target
in range(qbit_num))
349 for left
in range(qbit_num - 2, -1, -1):
350 layer_specs.append(
_cnot(left, left + 1))
352 for left
in range(qbit_num - 2, -1, -1):
353 layer_specs.append(
_cnot(left, left + 1))
354 layer_specs.extend(
_u3(target)
for target
in range(qbit_num))
355 for left
in range(qbit_num - 1):
356 layer_specs.append(
_cnot(left + 1, left))
357 layers.append(layer_specs)
362 layers: Iterable[list[dict]], qbit_num: int, noise_pattern: str
364 operations: list[dict] = []
366 entangler_counter = 0
367 channels = (
"local_depolarizing",
"amplitude_damping",
"phase_damping")
369 for layer_index, layer
in enumerate(layers):
370 layer_entanglers: list[tuple[int, dict]] = []
372 operations.append(gate)
374 if gate[
"name"] ==
"CNOT":
375 layer_entanglers.append((gate_index, gate))
377 if not layer_entanglers:
380 if noise_pattern ==
"sparse":
381 if layer_index % 2 == 0:
382 gate_idx, gate = layer_entanglers[0]
383 channel = channels[layer_index % len(channels)]
387 elif noise_pattern ==
"periodic":
388 gate_idx, gate = layer_entanglers[-1]
389 channel = channels[layer_index % len(channels)]
393 elif noise_pattern ==
"dense":
394 for gate_idx, gate
in layer_entanglers:
395 channel = channels[entangler_counter % len(channels)]
399 entangler_counter += 1
403 "Unsupported structured workload noise pattern '{}'".format(noise_pattern)
406 entangler_counter += len(layer_entanglers)
416 ) -> list[list[dict]]:
417 layer_count = 3
if qbit_num <= 8
else 4
418 if family_name ==
"layered_nearest_neighbor":
420 if family_name ==
"seeded_random_layered":
422 if family_name ==
"partition_stress_ladder":
424 if family_name ==
"phase31_pair_repeat":
426 if family_name ==
"phase31_alternating_ladder":
428 raise ValueError(
"Unsupported structured workload family '{}'".format(family_name))
436 seed: int = DEFAULT_STRUCTURED_SEED,
440 workload_id =
"{}_q{}_{}_seed{}".format(family_name, qbit_num, noise_pattern, seed)
443 source_type=
"structured_family_builder",
444 workload_id=workload_id,
445 operation_specs=operation_specs,
450 for family_name
in STRUCTURED_FAMILY_NAMES:
451 for qbit_num
in STRUCTURED_QUBITS:
452 for noise_pattern
in MANDATORY_NOISE_PATTERNS:
454 "family_name": family_name,
455 "qbit_num": qbit_num,
456 "noise_pattern": noise_pattern,
458 "workload_id":
"{}_q{}_{}_seed{}".format(
459 family_name, qbit_num, noise_pattern, seed
465 noise_pattern=noise_pattern,
475 seed: int = DEFAULT_STRUCTURED_SEED,
476 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
482 noise_pattern=noise_pattern,
485 max_partition_qubits=max_partition_qubits,
491 seed: int = DEFAULT_STRUCTURED_SEED,
492 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
494 for family_name
in STRUCTURED_FAMILY_NAMES:
495 for qbit_num
in STRUCTURED_QUBITS:
496 for noise_pattern
in MANDATORY_NOISE_PATTERNS:
498 "family_name": family_name,
499 "qbit_num": qbit_num,
500 "noise_pattern": noise_pattern,
502 "workload_id":
"{}_q{}_{}_seed{}".format(
503 family_name, qbit_num, noise_pattern, seed
509 noise_pattern=noise_pattern,
511 max_partition_qubits=max_partition_qubits,
516 for family_name
in PHASE31_PRIMARY_STRUCTURED_FAMILY_NAMES:
517 for qbit_num
in STRUCTURED_QUBITS:
518 for noise_pattern
in PHASE31_PRIMARY_NOISE_PATTERNS:
519 for seed
in PHASE31_PRIMARY_SEEDS:
521 "family_name": family_name,
522 "qbit_num": qbit_num,
523 "noise_pattern": noise_pattern,
525 "workload_id":
"{}_q{}_{}_seed{}".format(
526 family_name, qbit_num, noise_pattern, seed
532 noise_pattern=noise_pattern,
535 for family_name
in PHASE31_CONTROL_STRUCTURED_FAMILY_NAMES:
536 for qbit_num
in STRUCTURED_QUBITS:
537 for noise_pattern
in PHASE31_CONTROL_NOISE_PATTERNS:
539 "family_name": family_name,
540 "qbit_num": qbit_num,
541 "noise_pattern": noise_pattern,
542 "seed": DEFAULT_STRUCTURED_SEED,
543 "workload_id":
"{}_q{}_{}_seed{}".format(
544 family_name, qbit_num, noise_pattern, DEFAULT_STRUCTURED_SEED
550 noise_pattern=noise_pattern,
551 seed=DEFAULT_STRUCTURED_SEED,
560 seed: int = DEFAULT_STRUCTURED_SEED,
561 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
566 noise_pattern=noise_pattern,
568 max_partition_qubits=max_partition_qubits,
574 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
578 metadata[
"family_name"],
579 qbit_num=metadata[
"qbit_num"],
580 noise_pattern=metadata[
"noise_pattern"],
581 seed=metadata[
"seed"],
582 max_partition_qubits=max_partition_qubits,
def build_phase31_structured_descriptor_set
def build_microcase_surface
def build_phase31_microcase_descriptor_set
def iter_phase31_microcase_descriptor_sets
def mandatory_microcase_definitions()
def _layered_nearest_neighbor_layers
def _phase31_alternating_ladder_layers
def _phase31_pair_repeat_layers
def iter_phase31_structured_surfaces()
def build_partition_descriptor_set
def phase31_microcase_definitions()
def _partition_stress_layers
def build_structured_descriptor_set
def _lookup_microcase_definition
def iter_microcase_descriptor_sets
def iter_structured_surfaces
def iter_microcase_surfaces()
def build_canonical_planner_surface_from_operation_specs
def _seeded_random_layered_layers
def iter_phase31_microcase_surfaces()
def build_structured_surface
def iter_structured_descriptor_sets
def _structured_family_layers
def iter_phase31_structured_descriptor_sets
def build_microcase_descriptor_set