1 from __future__
import annotations
4 from typing
import Iterable
6 from squander.partitioning.noisy_planner
import (
7 DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
8 build_partition_descriptor_set,
9 build_canonical_planner_surface_from_operation_specs,
13 MICROCASE_QUBITS = (2, 3, 4)
14 STRUCTURED_QUBITS = (8, 10)
15 MANDATORY_NOISE_PATTERNS = (
"sparse",
"periodic",
"dense")
16 STRUCTURED_FAMILY_NAMES = (
17 "layered_nearest_neighbor",
18 "seeded_random_layered",
19 "partition_stress_ladder",
21 DEFAULT_STRUCTURED_SEED = 20260318
22 PHASE31_PRIMARY_STRUCTURED_FAMILY_NAMES = (
23 "phase31_pair_repeat",
24 "phase31_alternating_ladder",
26 PHASE31_CONTROL_STRUCTURED_FAMILY_NAMES = (
"layered_nearest_neighbor",)
27 PHASE31_PRIMARY_NOISE_PATTERNS = (
"periodic",
"dense")
28 PHASE31_CONTROL_NOISE_PATTERNS = (
"sparse",)
29 PHASE31_PRIMARY_SEEDS = (
30 DEFAULT_STRUCTURED_SEED,
31 DEFAULT_STRUCTURED_SEED + 1,
32 DEFAULT_STRUCTURED_SEED + 2,
36 def _u3(target_qbit: int) -> dict:
40 "target_qbit": target_qbit,
45 def _cnot(target_qbit: int, control_qbit: int) -> dict:
49 "target_qbit": target_qbit,
50 "control_qbit": control_qbit,
55 def _noise(channel: str, target_qbit: int, after_gate_index: int, fixed_value: float) -> dict:
59 "target_qbit": target_qbit,
60 "source_gate_index": after_gate_index,
61 "fixed_value": fixed_value,
68 "local_depolarizing": 0.1,
69 "amplitude_damping": 0.05,
70 "phase_damping": 0.07,
77 "case_name":
"microcase_2q_entangler_local_depolarizing",
79 "noise_pattern":
"sparse",
89 "case_name":
"microcase_3q_mixed_local_noise_sequence",
91 "noise_pattern":
"periodic",
104 "case_name":
"microcase_4q_partition_boundary_triplet",
106 "noise_pattern":
"dense",
126 "case_name":
"phase31_microcase_1q_u3_local_noise_chain",
128 "noise_pattern":
"dense",
129 "support_qbits": (0,),
139 "case_name":
"phase31_microcase_2q_cnot_local_noise_pair",
141 "noise_pattern":
"periodic",
142 "support_qbits": (0, 1),
153 "case_name":
"phase31_microcase_2q_multi_noise_entangler_chain",
155 "noise_pattern":
"periodic",
156 "support_qbits": (0, 1),
170 "case_name":
"phase31_microcase_2q_dense_same_support_motif",
172 "noise_pattern":
"dense",
173 "support_qbits": (0, 1),
187 "case_name":
"phase31_local_support_q4_spectator_embedding_smoke",
189 "noise_pattern":
"periodic",
190 "support_qbits": (0, 1, 2, 3),
196 "amplitude_damping", 1, 2,
_noise_value(
"amplitude_damping")
204 "amplitude_damping", 3, 6,
_noise_value(
"amplitude_damping")
217 if candidate[
"case_name"] == case_name
224 qbit_num=case[
"qbit_num"],
225 source_type=
"microcase_builder",
226 workload_id=case[
"case_name"],
227 operation_specs=case[
"operation_specs"],
244 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
248 max_partition_qubits=max_partition_qubits,
254 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
258 case[
"case_name"], max_partition_qubits=max_partition_qubits
265 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
269 max_partition_qubits=max_partition_qubits,
275 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
279 case[
"case_name"], max_partition_qubits=max_partition_qubits
284 layers: list[list[dict]] = []
285 for layer_index
in range(layer_count):
286 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
287 start = layer_index % 2
288 for control
in range(start, qbit_num - 1, 2):
289 layer_specs.append(
_cnot(control + 1, control))
290 layers.append(layer_specs)
295 qbit_num: int, layer_count: int, seed: int
296 ) -> list[list[dict]]:
297 rng = random.Random(seed)
298 layers: list[list[dict]] = []
299 for layer_index
in range(layer_count):
300 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
301 start = layer_index % 2
302 for left
in range(start, qbit_num - 1, 2):
303 if rng.random() < 0.5:
304 layer_specs.append(
_cnot(left + 1, left))
306 layer_specs.append(
_cnot(left, left + 1))
307 layers.append(layer_specs)
312 layers: list[list[dict]] = []
313 for layer_index
in range(layer_count):
314 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
315 if layer_index % 2 == 0:
316 for control
in range(qbit_num - 1):
317 layer_specs.append(
_cnot(control + 1, control))
319 for target
in range(qbit_num - 2, -1, -1):
320 layer_specs.append(
_cnot(target, target + 1))
321 layers.append(layer_specs)
326 layers: list[list[dict]] = []
327 for layer_index
in range(layer_count):
328 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
329 start = layer_index % 2
330 for left
in range(start, qbit_num - 1, 2):
331 layer_specs.append(
_cnot(left + 1, left))
332 layer_specs.append(
_u3(left))
333 layer_specs.append(
_u3(left + 1))
334 layer_specs.append(
_cnot(left, left + 1))
335 layers.append(layer_specs)
340 layers: list[list[dict]] = []
341 for layer_index
in range(layer_count):
342 layer_specs = [
_u3(target)
for target
in range(qbit_num)]
343 if layer_index % 2 == 0:
344 for left
in range(qbit_num - 1):
345 layer_specs.append(
_cnot(left + 1, left))
346 layer_specs.extend(
_u3(target)
for target
in range(qbit_num))
347 for left
in range(qbit_num - 2, -1, -1):
348 layer_specs.append(
_cnot(left, left + 1))
350 for left
in range(qbit_num - 2, -1, -1):
351 layer_specs.append(
_cnot(left, left + 1))
352 layer_specs.extend(
_u3(target)
for target
in range(qbit_num))
353 for left
in range(qbit_num - 1):
354 layer_specs.append(
_cnot(left + 1, left))
355 layers.append(layer_specs)
360 layers: Iterable[list[dict]], qbit_num: int, noise_pattern: str
362 operations: list[dict] = []
364 entangler_counter = 0
365 channels = (
"local_depolarizing",
"amplitude_damping",
"phase_damping")
367 for layer_index, layer
in enumerate(layers):
368 layer_entanglers: list[tuple[int, dict]] = []
370 operations.append(gate)
372 if gate[
"name"] ==
"CNOT":
373 layer_entanglers.append((gate_index, gate))
375 if not layer_entanglers:
378 if noise_pattern ==
"sparse":
379 if layer_index % 2 == 0:
380 gate_idx, gate = layer_entanglers[0]
381 channel = channels[layer_index % len(channels)]
385 elif noise_pattern ==
"periodic":
386 gate_idx, gate = layer_entanglers[-1]
387 channel = channels[layer_index % len(channels)]
391 elif noise_pattern ==
"dense":
392 for gate_idx, gate
in layer_entanglers:
393 channel = channels[entangler_counter % len(channels)]
397 entangler_counter += 1
401 "Unsupported structured workload noise pattern '{}'".format(noise_pattern)
404 entangler_counter += len(layer_entanglers)
414 ) -> list[list[dict]]:
415 layer_count = 3
if qbit_num <= 8
else 4
416 if family_name ==
"layered_nearest_neighbor":
418 if family_name ==
"seeded_random_layered":
420 if family_name ==
"partition_stress_ladder":
422 if family_name ==
"phase31_pair_repeat":
424 if family_name ==
"phase31_alternating_ladder":
426 raise ValueError(
"Unsupported structured workload family '{}'".format(family_name))
434 seed: int = DEFAULT_STRUCTURED_SEED,
438 workload_id =
"{}_q{}_{}_seed{}".format(family_name, qbit_num, noise_pattern, seed)
441 source_type=
"structured_family_builder",
442 workload_id=workload_id,
443 operation_specs=operation_specs,
448 for family_name
in STRUCTURED_FAMILY_NAMES:
449 for qbit_num
in STRUCTURED_QUBITS:
450 for noise_pattern
in MANDATORY_NOISE_PATTERNS:
452 "family_name": family_name,
453 "qbit_num": qbit_num,
454 "noise_pattern": noise_pattern,
456 "workload_id":
"{}_q{}_{}_seed{}".format(
457 family_name, qbit_num, noise_pattern, seed
463 noise_pattern=noise_pattern,
473 seed: int = DEFAULT_STRUCTURED_SEED,
474 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
480 noise_pattern=noise_pattern,
483 max_partition_qubits=max_partition_qubits,
489 seed: int = DEFAULT_STRUCTURED_SEED,
490 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
492 for family_name
in STRUCTURED_FAMILY_NAMES:
493 for qbit_num
in STRUCTURED_QUBITS:
494 for noise_pattern
in MANDATORY_NOISE_PATTERNS:
496 "family_name": family_name,
497 "qbit_num": qbit_num,
498 "noise_pattern": noise_pattern,
500 "workload_id":
"{}_q{}_{}_seed{}".format(
501 family_name, qbit_num, noise_pattern, seed
507 noise_pattern=noise_pattern,
509 max_partition_qubits=max_partition_qubits,
514 for family_name
in PHASE31_PRIMARY_STRUCTURED_FAMILY_NAMES:
515 for qbit_num
in STRUCTURED_QUBITS:
516 for noise_pattern
in PHASE31_PRIMARY_NOISE_PATTERNS:
517 for seed
in PHASE31_PRIMARY_SEEDS:
519 "family_name": family_name,
520 "qbit_num": qbit_num,
521 "noise_pattern": noise_pattern,
523 "workload_id":
"{}_q{}_{}_seed{}".format(
524 family_name, qbit_num, noise_pattern, seed
530 noise_pattern=noise_pattern,
533 for family_name
in PHASE31_CONTROL_STRUCTURED_FAMILY_NAMES:
534 for qbit_num
in STRUCTURED_QUBITS:
535 for noise_pattern
in PHASE31_CONTROL_NOISE_PATTERNS:
537 "family_name": family_name,
538 "qbit_num": qbit_num,
539 "noise_pattern": noise_pattern,
540 "seed": DEFAULT_STRUCTURED_SEED,
541 "workload_id":
"{}_q{}_{}_seed{}".format(
542 family_name, qbit_num, noise_pattern, DEFAULT_STRUCTURED_SEED
548 noise_pattern=noise_pattern,
549 seed=DEFAULT_STRUCTURED_SEED,
558 seed: int = DEFAULT_STRUCTURED_SEED,
559 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
564 noise_pattern=noise_pattern,
566 max_partition_qubits=max_partition_qubits,
572 max_partition_qubits: int = DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS,
576 metadata[
"family_name"],
577 qbit_num=metadata[
"qbit_num"],
578 noise_pattern=metadata[
"noise_pattern"],
579 seed=metadata[
"seed"],
580 max_partition_qubits=max_partition_qubits,
def _phase31_alternating_ladder_layers
def iter_phase31_microcase_surfaces()
def iter_phase31_structured_descriptor_sets
def phase31_microcase_definitions()
def build_microcase_descriptor_set
def _seeded_random_layered_layers
def iter_structured_surfaces
def mandatory_microcase_definitions()
def iter_phase31_structured_surfaces()
def build_phase31_structured_descriptor_set
def build_microcase_surface
def build_partition_descriptor_set
def iter_phase31_microcase_descriptor_sets
def _layered_nearest_neighbor_layers
def iter_structured_descriptor_sets
def build_phase31_microcase_descriptor_set
def build_canonical_planner_surface_from_operation_specs
def iter_microcase_surfaces()
def _phase31_pair_repeat_layers
def iter_microcase_descriptor_sets
def _structured_family_layers
def build_structured_descriptor_set
def _lookup_microcase_definition
def _partition_stress_layers
def build_structured_surface