Noise
Noise for simulations
Section titled “Noise for simulations”
NoiseHandler(protocol, options=dict())
Section titled “
NoiseHandler(protocol, options=dict())
”A container for multiple sources of noise.
Note NoiseProtocol.ANALOG and NoiseProtocol.DIGITAL sources cannot be both present.
Also NoiseProtocol.READOUT can only be present once as the last noise sources, and only
exclusively with NoiseProtocol.DIGITAL sources.
| PARAMETER | DESCRIPTION |
|---|---|
protocol
|
The protocol(s) applied. To be defined from
TYPE:
|
options
|
A list of options defining the protocol.
For
TYPE:
|
Examples:
from qadence import NoiseProtocol, NoiseHandler
analog_options = {"noise_probs": 0.1} digital_options = {"error_probability": 0.1} readout_options = {"error_probability": 0.1, "seed": 0}
# single noise sources analog_noise = NoiseHandler(NoiseProtocol.ANALOG.DEPOLARIZING, analog_options) digital_depo_noise = NoiseHandler(NoiseProtocol.DIGITAL.DEPOLARIZING, digital_options) readout_noise = NoiseHandler(NoiseProtocol.READOUT, readout_options)
# init from multiple sources protocols: list = [NoiseProtocol.DIGITAL.DEPOLARIZING, NoiseProtocol.READOUT] options: list = [digital_options, readout_noise] noise_combination = NoiseHandler(protocols, options)
# Appending noise sources noise_combination = NoiseHandler(NoiseProtocol.DIGITAL.BITFLIP, digital_options) noise_combination.append([digital_depo_noise, readout_noise])Source code in qadence/noise/protocols.py
4647484950515253def __init__( self, protocol: NoiseEnum | list[NoiseEnum], options: dict | list[dict] = dict(),) -> None: self.protocol = protocol if isinstance(protocol, list) else [protocol] self.options = options if isinstance(options, list) else [options] * len(self.protocol) self.verify_all_protocols()
append(other)
Section titled “
append(other)
”Append noises.
| PARAMETER | DESCRIPTION |
|---|---|
other
|
The noises to add.
TYPE:
|
Source code in qadence/noise/protocols.py
104105106107108109110111112113114115116117118119120121122123def append(self, other: NoiseHandler | list[NoiseHandler]) -> None: """Append noises.
Args: other (NoiseHandler | list[NoiseHandler]): The noises to add. """ # To avoid overwriting the noise_sources list if an error is raised, make a copy other_list = other if isinstance(other, list) else [other] protocols = self.protocol[:] options = self.options[:]
for noise in other_list: protocols += noise.protocol options += noise.options
# init may raise an error temp_handler = NoiseHandler(protocols, options) # if verify passes, replace protocols and options self.protocol = temp_handler.protocol self.options = temp_handler.options
verify_all_protocols()
Section titled “
verify_all_protocols()
”Make sure all protocols are correct in terms and their combination too.
Source code in qadence/noise/protocols.py
6667686970717273747576777879808182838485868788899091929394def verify_all_protocols(self) -> None: """Make sure all protocols are correct in terms and their combination too."""
if len(self.protocol) == 0: raise ValueError("NoiseHandler should be specified with one valid configuration.")
if len(self.protocol) != len(self.options): raise ValueError("Specify lists of same length when defining noises.")
for protocol, option in zip(self.protocol, self.options): self._verify_single_protocol(protocol, option)
types = [type(p) for p in self.protocol] unique_types = set(types) if NoiseProtocol.DIGITAL in unique_types and NoiseProtocol.ANALOG in unique_types: raise ValueError("Cannot define a config with both Digital and Analog noises.")
if NoiseProtocol.ANALOG in unique_types: if NoiseProtocol.READOUT in unique_types: raise ValueError("Cannot define a config with both READOUT and Analog noises.") if types.count(NoiseProtocol.ANALOG) > 1: raise ValueError("Multiple Analog Noises are not supported yet.")
if NoiseProtocol.READOUT in unique_types: if ( not isinstance(self.protocol[-1], NoiseProtocol.READOUT) or types.count(NoiseProtocol.READOUT) > 1 ): raise ValueError("Only define a NoiseHandler with one READOUT as the last Noise.")