Beispiel #1
0
def plot_state(quantum_state, method='city', filename=None):
    """Plot the quantum state.

    Args:
        quantum_state (ndarray): statevector or density matrix
                                 representation of a quantum state.
        method (str): Plotting method to use.
        filename (str): the output file to save the plot as. If specified it
            will save and exit and not open up the plot in a new window. If
            `bloch` method is used a `-n` will be added to the filename before
            the extension for each qubit.

    Raises:
        VisualizationError: if the input is not a statevector or density
        matrix, or if the state is not an multi-qubit quantum state.
    """

    # Check if input is a statevector, and convert to density matrix
    rho = np.array(quantum_state)
    if rho.ndim == 1:
        rho = np.outer(rho, np.conj(rho))
    # Check the shape of the input is a square matrix
    shape = np.shape(rho)
    if len(shape) != 2 or shape[0] != shape[1]:
        raise VisualizationError("Input is not a valid quantum state.")
    # Check state is an n-qubit state
    num = int(np.log2(len(rho)))
    if 2**num != len(rho):
        raise VisualizationError("Input is not a multi-qubit quantum state.")

    if method == 'city':
        plot_state_city(rho, filename=filename)
    elif method == "paulivec":
        plot_state_paulivec(rho, filename=filename)
    elif method == "qsphere":
        plot_state_qsphere(rho, filename=filename)
    elif method == "bloch":
        orig_filename = filename
        for i in range(num):
            if orig_filename:
                filename_parts = orig_filename.split('.')
                filename_parts[-2] += '-%d' % i
                filename = '.'.join(filename_parts)
                print(filename)
            pauli_singles = [
                Pauli.pauli_single(num, i, 'X'),
                Pauli.pauli_single(num, i, 'Y'),
                Pauli.pauli_single(num, i, 'Z')
            ]
            bloch_state = list(
                map(lambda x: np.real(np.trace(np.dot(x.to_matrix(), rho))),
                    pauli_singles))
            plot_bloch_vector(bloch_state,
                              "qubit " + str(i),
                              filename=filename)
    elif method == "wigner":
        plot_wigner_function(rho, filename=filename)
    elif method == "hinton":
        plot_hinton(rho, filename=filename)
def iplot_state(quantum_state, method='city', figsize=None):
    """Plot the quantum state.

    Args:
        quantum_state (ndarray): statevector or density matrix
                                 representation of a quantum state.
        method (str): Plotting method to use.
        figsize (tuple): Figure size in inches.

    Raises:
        VisualizationError: if the input is not a statevector or density
        matrix, or if the state is not an multi-qubit quantum state.
    """
    warnings.warn(
        "iplot_state is deprecated, and will be removed in \
                  the 0.9 release. Use the iplot_state_ * functions \
                  instead.", DeprecationWarning)
    rho = _validate_input_state(quantum_state)
    if method == "city":
        iplot_state_city(rho, figsize=figsize)
    elif method == "paulivec":
        iplot_state_paulivec(rho, figsize=figsize)
    elif method == "qsphere":
        iplot_state_qsphere(rho, figsize=figsize)
    elif method == "bloch":
        iplot_bloch_multivector(rho, figsize=figsize)
    elif method == "hinton":
        iplot_state_hinton(rho, figsize=figsize)
    else:
        raise VisualizationError('Invalid plot state method.')
def bit_string_index(text):
    """Return the index of a string of 0s and 1s."""
    n = len(text)
    k = text.count("1")
    if text.count("0") != n - k:
        raise VisualizationError("s must be a string of 0 and 1")
    ones = [pos for pos, char in enumerate(text) if char == "1"]
    return lex_index(n, k, ones)
def plot_state(quantum_state, method='city'):
    """Plot the quantum state.

    Args:
        quantum_state (ndarray): statevector or density matrix
                                 representation of a quantum state.
        method (str): Plotting method to use.

    Raises:
        VisualizationError: if the input is not a statevector or density
        matrix, or if the state is not an multi-qubit quantum state.
    """

    # Check if input is a statevector, and convert to density matrix
    rho = np.array(quantum_state)
    if rho.ndim == 1:
        rho = np.outer(rho, np.conj(rho))
    # Check the shape of the input is a square matrix
    shape = np.shape(rho)
    if len(shape) != 2 or shape[0] != shape[1]:
        raise VisualizationError("Input is not a valid quantum state.")
    # Check state is an n-qubit state
    num = int(np.log2(len(rho)))
    if 2**num != len(rho):
        raise VisualizationError("Input is not a multi-qubit quantum state.")

    if method == 'city':
        plot_state_city(rho)
    elif method == "paulivec":
        plot_state_paulivec(rho)
    elif method == "qsphere":
        plot_state_qsphere(rho)
    elif method == "bloch":
        for i in range(num):
            bloch_state = list(
                map(lambda x: np.real(np.trace(np.dot(x.to_matrix(), rho))),
                    pauli_singles(i, num)))
            plot_bloch_vector(bloch_state, "qubit " + str(i))
    elif method == "wigner":
        plot_wigner_function(rho)
def iplot_state(quantum_state, method='city', options=None):
    """Plot the quantum state.

    Args:
        quantum_state (ndarray): statevector or density matrix
                                 representation of a quantum state.
        method (str): Plotting method to use.
        options (dict): Plotting settings.

    Raises:
        VisualizationError: if the input is not a statevector or density
        matrix, or if the state is not an multi-qubit quantum state.
    """

    # Check if input is a statevector, and convert to density matrix
    rho = np.array(quantum_state)
    if rho.ndim == 1:
        rho = np.outer(rho, np.conj(rho))
    # Check the shape of the input is a square matrix
    shape = np.shape(rho)
    if len(shape) != 2 or shape[0] != shape[1]:
        raise VisualizationError("Input is not a valid quantum state.")
    # Check state is an n-qubit state
    num = int(np.log2(len(rho)))
    if 2**num != len(rho):
        raise VisualizationError("Input is not a multi-qubit quantum state.")

    if method == "city":
        iplot_cities(rho, options)
    elif method == "paulivec":
        iplot_paulivec(rho, options)
    elif method == "qsphere":
        iplot_qsphere(rho, options)
    elif method == "bloch":
        iplot_blochsphere(rho, options)
    elif method == "hinton":
        iplot_hinton(rho, options)
    else:
        print("Unknown method '" + method + "'.")
def lex_index(n, k, lst):
    """Return  the lex index of a combination..

    Args:
        n (int): the total number of options .
        k (int): The number of elements.
        lst (list): list

    Returns:
        int: returns int index for lex order

    Raises:
        VisualizationError: if length of list is not equal to k
    """
    if len(lst) != k:
        raise VisualizationError("list should have length k")
    comb = list(map(lambda x: n - 1 - x, lst))
    dualm = sum([n_choose_k(comb[k - 1 - i], i + 1) for i in range(k)])
    return int(dualm)
def plot_state(quantum_state, method='city', filename=None, show=False):
    """Plot the quantum state.

    Args:
        quantum_state (ndarray): statevector or density matrix
                                 representation of a quantum state.
        method (str): Plotting method to use.
        filename (str): the output file to save the plot as. If specified it
            will save and exit and not open up the plot in a new window. If
            `bloch` method is used a `-n` will be added to the filename before
            the extension for each qubit.
        show (bool): If set to true the rendered image will open in a new
            window
    Returns:
         matplotlib.Figure: The matplotlib.Figure of the visualization
    Raises:
        VisualizationError: if the input is not a statevector or density
        matrix, or if the state is not an multi-qubit quantum state.
    """

    # Check if input is a statevector, and convert to density matrix
    rho = np.array(quantum_state)
    if rho.ndim == 1:
        rho = np.outer(rho, np.conj(rho))
    # Check the shape of the input is a square matrix
    shape = np.shape(rho)
    if len(shape) != 2 or shape[0] != shape[1]:
        raise VisualizationError("Input is not a valid quantum state.")
    # Check state is an n-qubit state
    num = int(np.log2(len(rho)))
    if 2**num != len(rho):
        raise VisualizationError("Input is not a multi-qubit quantum state.")
    fig = None
    if method == 'city':
        fig = plot_state_city(rho, filename=filename, show=show)
    elif method == "paulivec":
        fig = plot_state_paulivec(rho, filename=filename, show=show)
    elif method == "qsphere":
        fig = plot_state_qsphere(rho, filename=filename, show=show)
    elif method == "bloch":
        aspect = float(1 / num)
        fig = plt.figure(figsize=plt.figaspect(aspect))
        for i in range(num):
            ax = fig.add_subplot(1, num, i + 1, projection='3d')
            pauli_singles = [
                Pauli.pauli_single(num, i, 'X'),
                Pauli.pauli_single(num, i, 'Y'),
                Pauli.pauli_single(num, i, 'Z')
            ]
            bloch_state = list(
                map(lambda x: np.real(np.trace(np.dot(x.to_matrix(), rho))),
                    pauli_singles))
            plot_bloch_vector(bloch_state, "qubit " + str(i), ax=ax)
        if filename:
            plt.savefig(filename)
        elif show:
            plt.show()
    elif method == "wigner":
        fig = plot_wigner_function(rho, filename=filename, show=show)
    elif method == "hinton":
        fig = plot_hinton(rho, filename=filename, show=show)
    return fig