def define_noisy_readout(self, qubit: Union[int, QubitPlaceholder], p00: float, p11: float) -> "Program": """ For this program define a classical bit flip readout error channel parametrized by ``p00`` and ``p11``. This models the effect of thermal noise that corrupts the readout signal **after** it has interrogated the qubit. :param qubit: The qubit with noisy readout. :param p00: The probability of obtaining the measurement result 0 given that the qubit is in state 0. :param p11: The probability of obtaining the measurement result 1 given that the qubit is in state 1. :return: The Program with an appended READOUT-POVM Pragma. """ if not 0.0 <= p00 <= 1.0: raise ValueError("p00 must be in the interval [0,1].") if not 0.0 <= p11 <= 1.0: raise ValueError("p11 must be in the interval [0,1].") if not (isinstance(qubit, int) or isinstance(qubit, QubitPlaceholder)): raise TypeError( "qubit must be a non-negative integer, or QubitPlaceholder.") if isinstance(qubit, int) and qubit < 0: raise ValueError("qubit cannot be negative.") p00 = float(p00) p11 = float(p11) aprobs = [p00, 1.0 - p11, 1.0 - p00, p11] aprobs_str = "({})".format(" ".join( format_parameter(p) for p in aprobs)) pragma = Pragma("READOUT-POVM", [qubit], aprobs_str) return self.inst(pragma)
def test_pretty_print_pi(): test_cases = [ (0.0, "0"), (pi, "pi"), (-pi, "-pi"), (2 * pi / 3.0, "2*pi/3"), (pi / 9, "0.3490658503988659"), (pi / 8, "pi/8"), (-90 * pi / 2, "-45*pi"), ] for test_case in test_cases: assert format_parameter(test_case[0]) == test_case[1]
def test_format_parameter(): test_cases = [ (1, "1"), (1.0, "1.0"), (1j, "i"), (0 + 1j, "i"), (-1j, "-i"), (1e-15 + 1j, "i"), (1e-15 - 1j, "-i"), ] for test_case in test_cases: assert format_parameter(test_case[0]) == test_case[1]
def test_pretty_print_pi(): test_cases = [ (0., '0'), (pi, 'pi'), (-pi, '-pi'), (2 * pi / 3., '2*pi/3'), (pi / 9, '0.3490658503988659'), (pi / 8, 'pi/8'), (-90 * pi / 2, '-45*pi'), ] for test_case in test_cases: assert format_parameter(test_case[0]) == test_case[1]
def format_matrix_element(element: Union[ExpressionDesignator, str]) -> str: """ Formats a parameterized matrix element. :param element: The parameterized element to format. """ if isinstance(element, (int, float, complex, np.int_)): return format_parameter(element) elif isinstance(element, str): return element elif isinstance(element, Expression): return str(element) else: raise TypeError("Invalid matrix element: %r" % element)
def format_matrix_element(element): """ Formats a parameterized matrix element. :param element: {int, float, complex, str} The parameterized element to format. """ if isinstance(element, integer_types) or isinstance( element, (float, complex, np.int_)): return format_parameter(element) elif isinstance(element, string_types): return element elif isinstance(element, Expression): return str(element) else: raise TypeError("Invalid matrix element: %r" % element)
def _format_params(params): return "(" + ",".join(format_parameter(param) for param in params) + ")"
def _format_params(params: Iterable[ParameterDesignator]) -> str: return "(" + ",".join(format_parameter(param) for param in params) + ")"
def _format_parameter(param, settings=None): formatted = format_parameter(param) if settings and settings.texify_numerical_constants: formatted = formatted.replace("pi", r"\pi") return formatted
def _format_parameter(param: ParameterDesignator, settings: Optional[DiagramSettings] = None) -> str: formatted = format_parameter(param) if settings and settings.texify_numerical_constants: formatted = formatted.replace("pi", r"\pi") return formatted
def test_format_parameter(): test_cases = [(1, '1'), (1.0, '1.0'), (1j, 'i'), (0 + 1j, 'i'), (-1j, '-i'), (1e-15 + 1j, 'i'), (1e-15 - 1j, '-i')] for test_case in test_cases: assert format_parameter(test_case[0]) == test_case[1]