1 from __future__
import annotations
3 from dataclasses
import dataclass
4 from typing
import Any, Literal
6 PARTITIONED_DENSITY_MODE =
"partitioned_density" 7 DEFAULT_PARTITION_DESCRIPTOR_MAX_QUBITS = 2
9 SUPPORTED_GATE_NAMES = frozenset({
"U3",
"CNOT"})
10 SUPPORTED_NOISE_NAMES = frozenset(
11 {
"local_depolarizing",
"amplitude_damping",
"phase_damping"}
13 SUPPORTED_PLANNER_SOURCE_TYPES = frozenset(
17 "structured_family_builder",
18 "legacy_qgd_circuit_exact",
22 PLANNER_OP_KIND_GATE =
"gate" 23 PLANNER_OP_KIND_NOISE =
"noise" 24 PLANNER_OP_KINDS: frozenset[str] = frozenset(
25 {PLANNER_OP_KIND_GATE, PLANNER_OP_KIND_NOISE}
27 PlannerOperationKindWire = Literal[
"gate",
"noise"]
30 @dataclass(frozen=
True)
33 kind: PlannerOperationKindWire
36 source_gate_index: int
37 target_qbit: int |
None 38 control_qbit: int |
None 41 fixed_value: float |
None 45 support: list[int] = []
46 if self.control_qbit
is not None:
47 support.append(self.control_qbit)
48 if self.target_qbit
is not None:
49 support.append(self.target_qbit)
57 "is_unitary": self.is_unitary,
58 "source_gate_index": self.source_gate_index,
59 "target_qbit": self.target_qbit,
60 "control_qbit": self.control_qbit,
62 "param_count": self.param_count,
63 "param_start": self.param_start,
64 "fixed_value": self.fixed_value,
68 @dataclass(frozen=
True)
75 operations: tuple[CanonicalNoisyPlannerOperation, ...]
79 return len(self.operations)
83 return sum(op.kind == PLANNER_OP_KIND_GATE
for op
in self.operations)
87 return sum(op.kind == PLANNER_OP_KIND_NOISE
for op
in self.operations)
92 op.name
for op
in self.operations
if op.kind == PLANNER_OP_KIND_GATE
98 op.name
for op
in self.operations
if op.kind == PLANNER_OP_KIND_NOISE
103 return max((len(op.qubit_support)
for op
in self.operations), default=0)
108 "source_type": self.source_type,
109 "workload_id": self.workload_id,
114 "requested_mode": self.requested_mode,
115 "source_type": self.source_type,
116 "workload_id": self.workload_id,
118 "qbit_num": self.qbit_num,
119 "parameter_count": self.parameter_count,
126 "operations": [op.to_dict()
for op
in self.operations],
130 @dataclass(frozen=
True)
132 """Partition-local overlay; canonical gate/noise fields live in `NoisyPartitionDescriptorSet.operations`.""" 134 partition_member_index: int
135 canonical_operation_index: int
136 local_target_qbit: int |
None 137 local_control_qbit: int |
None 138 local_qubit_support: tuple[int, ...]
139 local_param_start: int
141 def to_dict(self, descriptor_set: NoisyPartitionDescriptorSet) -> dict[str, Any]:
142 from squander.partitioning.noisy_descriptor
import descriptor_member_to_dict
147 @dataclass(frozen=
True)
150 local_to_global_qbits: tuple[int, ...]
151 members: tuple[NoisyPartitionDescriptorMember, ...]
155 return len(self.members)
159 """Legacy compatibility name: same tuple as ``local_to_global_qbits`` (global indices).""" 160 return self.local_to_global_qbits
164 return self.local_to_global_qbits != tuple(
165 range(len(self.local_to_global_qbits))
171 (global_qbit, local_qbit)
172 for local_qbit, global_qbit
in enumerate(self.local_to_global_qbits)
175 def to_dict(self, descriptor_set: NoisyPartitionDescriptorSet) -> dict[str, Any]:
176 from squander.partitioning.noisy_descriptor
import descriptor_partition_to_dict
181 @dataclass(frozen=
True)
188 max_partition_qubits: int
190 operations: tuple[CanonicalNoisyPlannerOperation, ...]
191 partitions: tuple[NoisyPartitionDescriptor, ...]
194 self, member: NoisyPartitionDescriptorMember
195 ) -> CanonicalNoisyPlannerOperation:
196 return self.operations[member.canonical_operation_index]
201 for m
in partition.members
208 for m
in partition.members
218 self, partition: NoisyPartitionDescriptor
219 ) -> tuple[int, ...]:
220 return tuple(m.canonical_operation_index
for m
in partition.members)
223 self, partition: NoisyPartitionDescriptor
224 ) -> tuple[tuple[int, int, int], ...]:
231 for m
in partition.members
238 "source_type": self.source_type,
239 "workload_id": self.workload_id,
244 return len(self.partitions)
248 return sum(partition.member_count
for partition
in self.partitions)
261 (len(partition.partition_qubit_span)
for partition
in self.partitions),
267 return tuple(partition.member_count
for partition
in self.partitions)
271 "requested_mode": self.requested_mode,
272 "source_type": self.source_type,
273 "workload_id": self.workload_id,
275 "qbit_num": self.qbit_num,
276 "parameter_count": self.parameter_count,
277 "max_partition_qubits": self.max_partition_qubits,
284 "partitions": [p.to_dict(self)
for p
in self.partitions],
def partition_parameter_count
def descriptor_partition_to_dict
def descriptor_member_count(self)
def partition_parameter_routing
def operation_count(self)
def descriptor_member_to_dict
def partition_noise_count
def partition_canonical_operation_indices
def partition_count(self)
def partition_qubit_span(self)
def canonical_operation_for
def partition_member_counts(self)
def global_to_local_qbits(self)
def max_partition_span(self)