Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -217,22 +217,22 @@ def __init__(self):
],
parity_group_z=[
ParityGroup(
_parity_type=StabilizerType.STABILIZER_X,
_parity_type=StabilizerType.STABILIZER_Z,
_ancilla_qubit=QubitIDObj('X1'),
_data_qubits=[QubitIDObj('D1'), QubitIDObj('D2')]
),
ParityGroup(
_parity_type=StabilizerType.STABILIZER_X,
_parity_type=StabilizerType.STABILIZER_Z,
_ancilla_qubit=QubitIDObj('X2'),
_data_qubits=[QubitIDObj('D2'), QubitIDObj('D3')]
),
ParityGroup(
_parity_type=StabilizerType.STABILIZER_X,
_parity_type=StabilizerType.STABILIZER_Z,
_ancilla_qubit=QubitIDObj('X3'),
_data_qubits=[QubitIDObj('D7'), QubitIDObj('D8')]
),
ParityGroup(
_parity_type=StabilizerType.STABILIZER_X,
_parity_type=StabilizerType.STABILIZER_Z,
_ancilla_qubit=QubitIDObj('X4'),
_data_qubits=[QubitIDObj('D8'), QubitIDObj('D9')]
),
Expand Down
218 changes: 218 additions & 0 deletions src/qce_circuit/structure/circuit_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,36 @@ def copy(self, relation_transfer_lookup: Optional[Dict[ICircuitOperation, ICircu
# endregion


@dataclass(frozen=False, unsafe_hash=True)
class RxTheta(SingleQubitOperation, ICircuitOperation):
"""
Rotation-X (theta degrees) operation.
"""
duration_strategy: IDurationStrategy = field(init=False, default=GlobalDurationStrategy(GlobalRegistryKey.MICROWAVE))

# region Interface Properties
@property
def channel_identifiers(self) -> List[ChannelIdentifier]:
""":return: Array-like of channel identifiers to which this operation applies to."""
return [
ChannelIdentifier(_id=self.qubit_index, _channel=QubitChannel.MICROWAVE),
]
# endregion

# region Interface Methods
def copy(self, relation_transfer_lookup: Optional[Dict[ICircuitOperation, ICircuitOperation]] = None) -> 'RxTheta':
"""
Creates a copy from self. Excluding any relation details.
:param relation_transfer_lookup: Lookup table used to transfer relation link.
:return: Copy of self with updated relation link.
"""
return RxTheta(
qubit_index=self.qubit_index,
relation=self.relation.copy(relation_transfer_lookup=relation_transfer_lookup),
)
# endregion


@dataclass(frozen=False, unsafe_hash=True)
class Ry180(SingleQubitOperation, ICircuitOperation):
"""
Expand Down Expand Up @@ -410,6 +440,36 @@ def copy(self, relation_transfer_lookup: Optional[Dict[ICircuitOperation, ICircu
# endregion


@dataclass(frozen=False, unsafe_hash=True)
class RyTheta(SingleQubitOperation, ICircuitOperation):
"""
Rotation-Y (theta degrees) operation.
"""
duration_strategy: IDurationStrategy = field(init=False, default=GlobalDurationStrategy(GlobalRegistryKey.MICROWAVE))

# region Interface Properties
@property
def channel_identifiers(self) -> List[ChannelIdentifier]:
""":return: Array-like of channel identifiers to which this operation applies to."""
return [
ChannelIdentifier(_id=self.qubit_index, _channel=QubitChannel.MICROWAVE),
]
# endregion

# region Interface Methods
def copy(self, relation_transfer_lookup: Optional[Dict[ICircuitOperation, ICircuitOperation]] = None) -> 'RyTheta':
"""
Creates a copy from self. Excluding any relation details.
:param relation_transfer_lookup: Lookup table used to transfer relation link.
:return: Copy of self with updated relation link.
"""
return RyTheta(
qubit_index=self.qubit_index,
relation=self.relation.copy(relation_transfer_lookup=relation_transfer_lookup),
)
# endregion


@dataclass(frozen=False, unsafe_hash=True)
class Rx180ef(SingleQubitOperation, ICircuitOperation):
"""
Expand Down Expand Up @@ -477,6 +537,8 @@ class VirtualPark(SingleQubitOperation, ICircuitOperation):
Usually only interesting when working with frequency-tunable qubits.
"""
duration_strategy: IDurationStrategy = field(init=False, default=GlobalDurationStrategy(GlobalRegistryKey.FLUX))
net_zero: bool = field(init=True, default=False)
"""Boolean describing the net-zero behaviour of the virtual parking. - Mainly useful for visualization."""

# region Interface Properties
@property
Expand Down Expand Up @@ -980,6 +1042,162 @@ def copy(self, relation_transfer_lookup: Optional[Dict[ICircuitOperation, ICircu
# endregion


@dataclass(frozen=False, unsafe_hash=True)
class VirtualOptional(ICircuitOperation):
"""
Data class, containing single-qubit operation.
Acts as a visualization wrapper.
"""
operation: SingleQubitOperation

# region Interface Properties
@property
def channel_identifiers(self) -> List[ChannelIdentifier]:
""":return: Array-like of channel identifiers to which this operation applies to."""
return self.operation.channel_identifiers

@property
def nr_of_repetitions(self) -> int:
""":return: Number of repetitions for this object."""
return self.operation.nr_of_repetitions

@property
def relation_link(self) -> IRelationLink[ICircuitOperation]:
""":return: Description of relation to other circuit node."""
return self.operation.relation

@relation_link.setter
def relation_link(self, link: IRelationLink[ICircuitOperation]):
""":sets: Description of relation to other circuit node."""
self.operation.relation = link

@property
def start_time(self) -> float:
""":return: Start time [a.u.]."""
return self.operation.start_time

@property
def duration(self) -> float:
""":return: Duration [ns]."""
return self.operation.duration
# endregion

# region Interface Methods
def copy(self, relation_transfer_lookup: Optional[Dict[ICircuitOperation, ICircuitOperation]] = None) -> 'VirtualOptional':
"""
Creates a copy from self. Excluding any relation details.
:param relation_transfer_lookup: Lookup table used to transfer relation link.
:return: Copy of self with updated relation link.
"""
return VirtualOptional(
operation=self.operation.copy(
relation_transfer_lookup=relation_transfer_lookup,
)
)

def apply_modifiers_to_self(self) -> ICircuitOperation:
"""
WARNING: Applies modifiers inplace.
Applies modifiers such as repetition and state-control.
:return: Modified self.
"""
return self

def decomposed_operations(self) -> List[ICircuitOperation]:
"""
Functions similar to a 'flatten' operation.
Mostly intended for composite-operations such that they can apply repetition and state-dependent registries.
:return: Array-like of decomposed operations.
"""
return [self]

def apply_flatten_to_self(self) -> ICircuitOperation:
"""
WARNING: Applies a flatten modification inplace.
:return: Modified self.
"""
return self
# endregion


@dataclass(frozen=False, unsafe_hash=True)
class VirtualInjectedError(ICircuitOperation):
"""
Data class, containing single-qubit operation.
Acts as a visualization wrapper for injected errors.
"""
operation: SingleQubitOperation

# region Interface Properties
@property
def channel_identifiers(self) -> List[ChannelIdentifier]:
""":return: Array-like of channel identifiers to which this operation applies to."""
return self.operation.channel_identifiers

@property
def nr_of_repetitions(self) -> int:
""":return: Number of repetitions for this object."""
return self.operation.nr_of_repetitions

@property
def relation_link(self) -> IRelationLink[ICircuitOperation]:
""":return: Description of relation to other circuit node."""
return self.operation.relation

@relation_link.setter
def relation_link(self, link: IRelationLink[ICircuitOperation]):
""":sets: Description of relation to other circuit node."""
self.operation.relation = link

@property
def start_time(self) -> float:
""":return: Start time [a.u.]."""
return self.operation.start_time

@property
def duration(self) -> float:
""":return: Duration [ns]."""
return self.operation.duration
# endregion

# region Interface Methods
def copy(self, relation_transfer_lookup: Optional[Dict[ICircuitOperation, ICircuitOperation]] = None) -> 'VirtualInjectedError':
"""
Creates a copy from self. Excluding any relation details.
:param relation_transfer_lookup: Lookup table used to transfer relation link.
:return: Copy of self with updated relation link.
"""
return VirtualInjectedError(
operation=self.operation.copy(
relation_transfer_lookup=relation_transfer_lookup,
)
)

def apply_modifiers_to_self(self) -> ICircuitOperation:
"""
WARNING: Applies modifiers inplace.
Applies modifiers such as repetition and state-control.
:return: Modified self.
"""
return self

def decomposed_operations(self) -> List[ICircuitOperation]:
"""
Functions similar to a 'flatten' operation.
Mostly intended for composite-operations such that they can apply repetition and state-dependent registries.
:return: Array-like of decomposed operations.
"""
return [self]

def apply_flatten_to_self(self) -> ICircuitOperation:
"""
WARNING: Applies a flatten modification inplace.
:return: Modified self.
"""
return self
# endregion


if __name__ == '__main__':
from qce_circuit.structure.registry_duration import (
DurationRegistry,
Expand Down
68 changes: 43 additions & 25 deletions src/qce_circuit/visualization/visualize_circuit/display_circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,19 @@
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from typing import List, Optional, TypeVar, Dict, Any, Tuple
from copy import deepcopy
from qce_circuit.structure.intrf_circuit_operation import RelationLink
from qce_circuit.structure.circuit_operations import (
Reset,
Wait,
Rx180,
Rx90,
Rxm90,
RxTheta,
Ry180,
Ry90,
Rym90,
RyTheta,
Rx180ef,
VirtualPhase,
Rphi90,
Expand All @@ -28,6 +31,8 @@
VirtualVacant,
VirtualTwoQubitVacant,
VirtualEmpty,
VirtualOptional,
VirtualInjectedError,
)
from qce_circuit.visualization.visualize_circuit.draw_components.annotation_components import (
HorizontalVariableIndicator,
Expand Down Expand Up @@ -87,9 +92,11 @@
Rx180Factory,
Rx90Factory,
Rxm90Factory,
RxThetaFactory,
Ry180Factory,
Ry90Factory,
Rym90Factory,
RyThetaFactory,
Rx180efFactory,
ZPhaseFactory,
Rphi90Factory,
Expand All @@ -103,6 +110,8 @@
VirtualVacantFactory,
VirtualTwoQubitVacantFactory,
VirtualEmptyFactory,
VirtualOptionalFactory,
VirtualInjectedErrorFactory,
)
from qce_circuit.visualization.visualize_circuit.draw_components.factory_multi_draw_components import \
MultiTwoQubitBlockFactory
Expand Down Expand Up @@ -186,32 +195,41 @@ def get_transform_constructor(self) -> TransformConstructor:
)

def get_operation_draw_components(self) -> List[IDrawComponent]:
individual_component_factory = DrawComponentFactoryManager(
default_factory=DefaultFactory(),
factory_lookup={
CPhase: TwoQubitBlockFactory(),
DispersiveMeasure: MeasureFactory(),
Reset: ResetFactory(),
Wait: WaitFactory(),
Rx180: Rx180Factory(),
Rx90: Rx90Factory(),
Rxm90: Rxm90Factory(),
RxTheta: RxThetaFactory(),
Ry180: Ry180Factory(),
Ry90: Ry90Factory(),
Rym90: Rym90Factory(),
RyTheta: RyThetaFactory(),
Rx180ef: Rx180efFactory(),
Rphi90: Rphi90Factory(),
VirtualPhase: ZPhaseFactory(),
Identity: IdentityFactory(),
Hadamard: HadamardFactory(),
Barrier: BarrierFactory(),
VirtualPark: VirtualParkFactory(),
VirtualVacant: VirtualVacantFactory(),
VirtualTwoQubitVacant: VirtualTwoQubitVacantFactory(),
VirtualEmpty: VirtualEmptyFactory(),
}
)
callback_draw_manager = deepcopy(individual_component_factory)
individual_component_factory.factory_lookup.update({
VirtualOptional: VirtualOptionalFactory(callback_draw_manager=callback_draw_manager),
VirtualInjectedError: VirtualInjectedErrorFactory(callback_draw_manager=callback_draw_manager),
})

factory_manager: BulkDrawComponentFactoryManager = BulkDrawComponentFactoryManager(
individual_component_factory=DrawComponentFactoryManager(
default_factory=DefaultFactory(),
factory_lookup={
CPhase: TwoQubitBlockFactory(),
DispersiveMeasure: MeasureFactory(),
Reset: ResetFactory(),
Wait: WaitFactory(),
Rx180: Rx180Factory(),
Rx90: Rx90Factory(),
Rxm90: Rxm90Factory(),
Ry180: Ry180Factory(),
Ry90: Ry90Factory(),
Rym90: Rym90Factory(),
Rx180ef: Rx180efFactory(),
Rphi90: Rphi90Factory(),
VirtualPhase: ZPhaseFactory(),
Identity: IdentityFactory(),
Hadamard: HadamardFactory(),
Barrier: BarrierFactory(),
VirtualPark: VirtualParkFactory(),
VirtualVacant: VirtualVacantFactory(),
VirtualTwoQubitVacant: VirtualTwoQubitVacantFactory(),
VirtualEmpty: VirtualEmptyFactory(),
}
),
individual_component_factory=individual_component_factory,
factory_lookup={
TwoQubitOperation: MultiTwoQubitBlockFactory(factory_lookup={
CPhase: TwoQubitBlockFactory(),
Expand Down
Loading