Не работает программа предназначенная для использования квантового алгоритма Гровера в цифровых сигналах на Python

Написал программу для модуляции цифрового сигнала и последующей демодуляции с использованием квантового алгоритма Гровера. Программа работает, но результатов нет и я не могу понять, что нужно сделать

import tkinter as tk
from tkinter import messagebox
import numpy as np
import matplotlib.pyplot as plt
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, 
transpile
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram


   class ModulationApp(tk.Tk):
       def __init__(self):
           super().__init__()
           self.title("Модуляция")
           self.geometry("500x300")

           self.input_label = tk.Label(self, text="Введите цифровой сигнал (0 и 1):")
           self.input_entry = tk.Entry(self)
           self.process_button = tk.Button(self, text="Начать обработку", command=self.start_processing)

           self.input_label.pack(pady=10)
           self.input_entry.pack(pady=10)
           self.process_button.pack(pady=10)

def start_processing(self):
    try:
        digital_signal = self.validate_input(self.input_entry.get())
        self.run_modulation(digital_signal)
    except ValueError as e:
        messagebox.showerror("Ошибка ввода", str(e))

def validate_input(self, input_str):
    """Проверяет ввод пользователя на корректность."""
    if not all(char in '01' for char in input_str):
        raise ValueError("Пожалуйста, введите последовательность из 0 и 1.")
    return list(map(int, input_str))

def run_modulation(self, digital_signal):
    sampling_rate = 1000  # Частота дискретизации
    carrier_freq = 50  # Частота несущего сигнала
    signal_freq = 10  # Частота информационного сигнала
    time = np.arange(0, 1, 1 / sampling_rate)  # Время

    # Преобразование цифрового сигнала в аналоговый
    analog_info_signal = np.repeat(digital_signal, len(time) // len(digital_signal)) * np.sin(
        2 * np.pi * signal_freq * time)

    # Генерация несущего сигнала
    carrier_signal = np.sin(2 * np.pi * carrier_freq * time)

    # Амплитудная модуляция
    modulated_signal = analog_info_signal * carrier_signal

    # Добавление шума
    noise = np.random.normal(0, 0.05, len(modulated_signal))
    noisy_modulated_signal = modulated_signal + noise

    # Квантовая часть
    n_qubits = int(np.log2(len(digital_signal))) + 1  # добавляем еще один кубит для оракула
    qr = QuantumRegister(n_qubits)
    cr = ClassicalRegister(n_qubits - 1)
    circuit = QuantumCircuit(qr, cr)

    # Решение, которое мы ищем (например, последнее состояние)
    solution_state = format((1 << (n_qubits - 1)) - 1, f'0{(n_qubits - 1)}b')  # Это будет строка вида "111...1"

    # Запускаем алгоритм Гровера
    self.run_grovers_algorithm(circuit, lambda c: self.oracle_for_demodulation(c, solution_state), 1)

    # Выполняем схему на симуляторе
    simulator = AerSimulator()
    circuit_transpiled = transpile(circuit, backend=simulator)
    job = simulator.run(circuit_transpiled)
    result = job.result()
    counts = result.get_counts()

    # Визуализируем результат
    plot_histogram(counts)

    # Визуализация сигналов
    plt.figure(figsize=(12, 8))
    plt.subplot(511)
    plt.step(np.linspace(0, 1, len(digital_signal)), digital_signal, where='post',
             label='Цифровой входной сигнал')
    plt.legend()
    plt.title('Цифровой входной сигнал')

    plt.subplot(512)
    plt.plot(time, analog_info_signal, label='Аналоговый информационный сигнал')
    plt.legend()
    plt.title('Аналоговый информационный сигнал')

    plt.subplot(513)
    plt.plot(time, modulated_signal, label='Модулированный сигнал')
    plt.legend()
    plt.title('Модулированный сигнал')

    plt.subplot(514)
    plt.plot(time, noisy_modulated_signal, label='Шумный модулированный сигнал')
    plt.legend()
    plt.title('Шумный модулированный сигнал')

    plt.tight_layout()

    # Вместо plt.show():
    plt.draw()
    

def run_grovers_algorithm(self, circuit, oracle, iterations):
    """Запускает алгоритм Гровера для нахождения решения."""
    n_qubits = circuit.num_qubits
    # Начальная подготовка всех кубитов к суперпозиции состояний
    circuit.h(range(n_qubits))

    # Цикл для выполнения итераций алгоритма Гровера
    for _ in range(iterations):
        # Применение оракула
        oracle(circuit)

        # Инверсия относительно среднего значения
        self.grovers_diffusion_operator(circuit, n_qubits)

    # Измеряем все кубиты
    circuit.measure(range(n_qubits - 1), range(n_qubits - 1))

def grovers_diffusion_operator(self, circuit, n_qubits):
    """Реализация оператора диффузии для алгоритма Гровера."""
    circuit.h(range(n_qubits))
    circuit.x(range(n_qubits))

    # Применяем mcx ко всем кубитам, кроме последнего
    circuit.mcx(list(range(n_qubits - 1)), n_qubits - 1)

    circuit.x(range(n_qubits))
    circuit.h(range(n_qubits))

def oracle_for_demodulation(self, circuit, solution_state):
    """Оракул для отметки конкретного состояния."""
    n_qubits = circuit.num_qubits

    # Переводим решение в целое число
    target_value = int(solution_state, 2)

    # Применяем операцию CNOT для каждого кубита, который равен 1 в решении
    for i in range(n_qubits - 1):
        if solution_state[i] == '1':
            circuit.cx(i, n_qubits - 1)

    # Применяем NOT ко всем вспомогательным кубитам
    circuit.x(n_qubits - 1)

    # Применяем многоразрядную операцию NOT
    circuit.mcx(list(range(n_qubits - 1)), n_qubits - 1)

    # Возвращаемся обратно
    circuit.x(n_qubits - 1)

    # Отменяем CNOT операции
    for i in range(n_qubits - 1):
        if solution_state[i] == '1':
            circuit.cx(i, n_qubits - 1)


  if __name__ == "__main__":
      app = ModulationApp()
      app.mainloop()

Ответы (0 шт):