commit 31d550bc8974ea442ff179d0a876a57679e27aa5 Author: Artur Mukhamadiev Date: Fri Oct 3 20:42:27 2025 +0300 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6960e49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.cache +.py +compile_commands.json +build diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..beaf6b4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.5) +project(white-screen-qt) + +add_executable(${PROJECT_NAME} main.cpp) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "") + +find_package(Qt5 COMPONENTS Widgets Gui REQUIRED) + +target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets Qt5::Gui) + +qt5_wrap_cpp(${PROJECT_NAME} main.cpp) \ No newline at end of file diff --git a/conanfile.txt b/conanfile.txt new file mode 100644 index 0000000..a42aa03 --- /dev/null +++ b/conanfile.txt @@ -0,0 +1,7 @@ +[requires] +qt/6.8.3 +[generators] +CMakeDeps +CMakeToolchain +[layout] +cmake_layout \ No newline at end of file diff --git a/delay_distribution_ci_95.png b/delay_distribution_ci_95.png new file mode 100644 index 0000000..e2d4758 Binary files /dev/null and b/delay_distribution_ci_95.png differ diff --git a/delay_distribution_ci_99.png b/delay_distribution_ci_99.png new file mode 100644 index 0000000..1d28094 Binary files /dev/null and b/delay_distribution_ci_99.png differ diff --git a/delays.csv b/delays.csv new file mode 100644 index 0000000..05cdc24 --- /dev/null +++ b/delays.csv @@ -0,0 +1,527 @@ +0,40.04 +1,45.29 +2,42.51 +3,47.70 +4,41.81 +5,38.94 +6,47.21 +7,44.49 +8,47.85 +9,37.17 +10,35.34 +11,38.51 +12,45.75 +13,42.85 +14,42.02 +15,45.20 +16,42.42 +17,48.65 +18,39.86 +19,44.28 +20,43.61 +21,36.93 +22,49.29 +23,44.65 +24,38.64 +25,36.87 +26,45.01 +27,36.96 +28,44.16 +29,44.49 +30,48.80 +31,41.11 +32,47.27 +33,48.46 +34,38.73 +35,41.96 +36,43.09 +37,36.38 +38,36.53 +39,38.64 +40,43.95 +41,40.16 +42,43.24 +43,39.37 +44,40.53 +45,39.79 +46,49.99 +47,44.13 +48,40.31 +49,42.57 +50,42.79 +51,39.92 +52,38.02 +53,36.32 +54,38.48 +55,38.57 +56,38.88 +57,40.04 +58,44.16 +59,45.56 +60,46.75 +61,44.95 +62,37.17 +63,46.30 +64,42.42 +65,37.72 +66,44.01 +67,48.19 +68,42.42 +69,38.54 +70,37.69 +71,41.90 +72,39.00 +73,43.37 +74,41.60 +75,39.61 +76,33.87 +77,39.98 +78,42.27 +79,38.27 +80,42.36 +81,40.62 +82,41.81 +83,39.83 +84,41.99 +85,45.07 +86,35.16 +87,49.29 +88,41.38 +89,41.60 +90,43.91 +91,40.99 +92,44.19 +93,42.48 +94,40.59 +95,34.79 +96,40.74 +97,43.76 +98,39.89 +99,40.01 +100,41.11 +101,40.22 +102,46.42 +103,41.69 +104,38.91 +105,34.91 +106,47.21 +107,41.38 +108,42.63 +109,35.64 +110,41.78 +111,35.77 +112,41.84 +113,46.02 +114,41.29 +115,36.35 +116,45.59 +117,42.79 +118,36.83 +119,41.11 +120,39.28 +121,47.58 +122,43.98 +123,44.22 +124,38.42 +125,36.62 +126,41.63 +127,43.82 +128,49.10 +129,36.35 +130,39.52 +131,41.60 +132,40.86 +133,36.07 +134,40.16 +135,43.37 +136,40.56 +137,38.54 +138,35.77 +139,41.05 +140,45.38 +141,43.46 +142,46.78 +143,42.02 +144,45.26 +145,39.49 +146,38.67 +147,39.92 +148,43.95 +149,40.04 +150,43.12 +151,38.09 +152,40.41 +153,35.55 +154,39.70 +155,39.83 +156,46.17 +157,39.22 +158,39.52 +159,37.60 +160,46.94 +161,42.94 +162,41.08 +163,39.09 +164,46.33 +165,41.38 +166,35.68 +167,38.85 +168,36.07 +169,41.11 +170,48.40 +171,41.56 +172,42.63 +173,41.87 +174,40.92 +175,38.24 +176,36.29 +177,47.52 +178,39.73 +179,38.76 +180,36.99 +181,37.11 +182,42.14 +183,40.31 +184,41.38 +185,36.56 +186,45.93 +187,40.13 +188,38.48 +189,39.55 +190,38.70 +191,38.94 +192,39.18 +193,39.28 +194,40.50 +195,41.60 +196,39.67 +197,41.72 +198,39.95 +199,43.06 +200,36.10 +201,35.34 +202,42.66 +203,36.99 +204,36.10 +205,35.10 +206,43.15 +207,35.22 +208,40.50 +209,40.71 +210,37.69 +211,40.89 +212,35.86 +213,42.97 +214,39.06 +215,42.33 +216,41.60 +217,42.69 +218,36.71 +219,42.79 +220,37.99 +221,38.06 +222,51.39 +223,39.55 +224,41.60 +225,35.80 +226,40.95 +227,43.30 +228,44.49 +229,41.66 +230,36.71 +231,48.98 +232,45.17 +233,41.44 +234,34.67 +235,41.81 +236,35.83 +237,43.03 +238,38.09 +239,35.34 +240,42.51 +241,42.69 +242,42.76 +243,50.02 +244,41.08 +245,42.45 +246,41.50 +247,47.67 +248,44.95 +249,41.14 +250,36.16 +251,35.28 +252,43.40 +253,48.58 +254,41.72 +255,40.80 +256,49.13 +257,41.38 +258,35.34 +259,38.42 +260,37.41 +261,37.60 +262,40.80 +263,44.89 +264,38.91 +265,36.90 +266,40.13 +267,43.27 +268,36.47 +269,43.55 +270,38.57 +271,42.63 +272,41.69 +273,48.00 +274,40.22 +275,39.43 +276,40.71 +277,40.74 +278,35.86 +279,38.06 +280,38.12 +281,46.26 +282,39.34 +283,41.50 +284,37.66 +285,37.84 +286,34.09 +287,43.15 +288,43.40 +289,45.53 +290,41.78 +291,42.91 +292,35.98 +293,48.07 +294,38.33 +295,40.50 +296,44.56 +297,42.91 +298,36.04 +299,37.23 +300,40.44 +301,41.66 +302,38.85 +303,42.14 +304,38.39 +305,36.62 +306,41.72 +307,39.00 +308,38.18 +309,43.21 +310,42.45 +311,37.69 +312,46.02 +313,42.11 +314,45.20 +315,43.58 +316,46.78 +317,39.03 +318,38.24 +319,45.59 +320,45.84 +321,45.20 +322,45.29 +323,40.41 +324,44.77 +325,42.97 +326,38.06 +327,39.09 +328,38.33 +329,34.58 +330,39.70 +331,43.88 +332,43.09 +333,38.24 +334,44.34 +335,41.56 +336,48.98 +337,39.18 +338,40.37 +339,39.58 +340,42.72 +341,44.10 +342,44.34 +343,40.47 +344,47.70 +345,37.96 +346,40.01 +347,36.19 +348,38.21 +349,39.40 +350,42.45 +351,45.62 +352,38.73 +353,35.95 +354,37.11 +355,45.47 +356,38.73 +357,47.06 +358,40.34 +359,35.58 +360,40.89 +361,34.94 +362,47.24 +363,42.30 +364,41.38 +365,37.63 +366,47.03 +367,39.18 +368,43.55 +369,37.63 +370,42.97 +371,42.24 +372,45.32 +373,38.39 +374,49.50 +375,39.67 +376,37.87 +377,39.06 +378,44.46 +379,38.70 +380,34.88 +381,38.02 +382,42.18 +383,40.47 +384,52.83 +385,45.01 +386,41.08 +387,50.51 +388,42.51 +389,53.71 +390,44.92 +391,39.06 +392,39.37 +393,44.74 +394,41.99 +395,36.16 +396,41.47 +397,38.67 +398,35.71 +399,46.08 +400,44.28 +401,36.25 +402,39.43 +403,45.59 +404,36.59 +405,39.79 +406,44.98 +407,49.13 +408,41.38 +409,40.41 +410,35.71 +411,44.89 +412,39.00 +413,46.11 +414,43.33 +415,48.65 +416,38.73 +417,38.88 +418,41.02 +419,44.25 +420,51.51 +421,45.84 +422,40.07 +423,44.22 +424,43.40 +425,46.75 +426,37.87 +427,42.97 +428,41.17 +429,38.21 +430,39.34 +431,34.33 +432,43.46 +433,44.59 +434,35.68 +435,39.76 +436,46.05 +437,40.34 +438,46.48 +439,43.67 +440,41.90 +441,53.31 +442,43.43 +443,39.46 +444,36.47 +445,46.69 +446,34.88 +447,41.96 +448,38.12 +449,36.38 +450,40.50 +451,45.84 +452,35.98 +453,38.18 +454,44.28 +455,36.29 +456,37.41 +457,42.72 +458,42.91 +459,43.21 +460,44.53 +461,37.51 +462,39.73 +463,44.89 +464,41.11 +465,43.52 +466,42.69 +467,37.90 +468,38.15 +469,35.40 +470,37.57 +471,44.83 +472,44.10 +473,40.44 +474,44.56 +475,42.69 +476,36.80 +477,39.00 +478,40.22 +479,37.32 +480,40.44 +481,40.71 +482,39.92 +483,45.29 +484,41.60 +485,41.66 +486,42.82 +487,47.21 +488,43.49 +489,47.76 +490,44.04 +491,41.29 +492,37.26 +493,39.49 +494,44.80 +495,39.03 +496,42.21 +497,45.59 +498,46.72 +499,41.05 +500,38.24 +501,40.44 +502,42.57 +503,53.38 +504,67.84 +505,44.98 +506,43.06 +507,43.18 +508,45.50 +509,47.88 +510,36.04 +511,40.22 +512,44.62 +513,43.76 +514,40.95 +515,39.15 +516,39.43 +517,39.55 +518,41.75 +519,48.00 +520,35.16 +521,43.52 +522,39.61 +523,36.68 +524,39.79 +525,51.21 +526,40.37 \ No newline at end of file diff --git a/histogram.png b/histogram.png new file mode 100644 index 0000000..fd7f80b Binary files /dev/null and b/histogram.png differ diff --git a/latency.py b/latency.py new file mode 100644 index 0000000..49e8785 --- /dev/null +++ b/latency.py @@ -0,0 +1,208 @@ +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np +from scipy import stats + +def calculate_confidence_interval(data, confidence=0.95): + """ + Вычисление доверительного интервала для среднего значения + + Parameters: + data: массив данных + confidence: уровень доверия (по умолчанию 95%) + + Returns: + tuple: (среднее, нижняя граница, верхняя граница, стандартная ошибка) + """ + n = len(data) + mean = np.mean(data) + std_error = stats.sem(data) # Стандартная ошибка среднего + + # Вычисление доверительного интервала с использованием t-распределения + ci = stats.t.interval(confidence, n-1, loc=mean, scale=std_error) + + return mean, ci[0], ci[1], std_error + +def plot_delay_histogram_with_ci(csv_file_path, save_to_file=True, show_plot=False, + confidence_level=0.99, delimiter=','): + """ + Универсальный скрипт для построения гистограммы с доверительным интервалом + """ + + try: + # Чтение данных + df = pd.read_csv(csv_file_path, delimiter=delimiter, header=None, + names=['index', 'delay_ms']) + delays = df['delay_ms'].values + + # Вычисление базовой статистики + mean_delay = np.mean(delays) + median_delay = np.median(delays) + std_delay = np.std(delays) + min_delay = np.min(delays) + max_delay = np.max(delays) + + # Вычисление доверительного интервала + mean_ci, ci_lower, ci_upper, std_error = calculate_confidence_interval( + delays, confidence_level) + + # Вывод статистики + print("=" * 60) + print("АНАЛИЗ ЗАДЕРЖЕК С ДОВЕРИТЕЛЬНЫМ ИНТЕРВАЛОМ") + print("=" * 60) + print(f"Количество измерений (n): {len(delays)}") + print(f"Уровень доверия: {confidence_level*100}%") + print("\n--- ОСНОВНАЯ СТАТИСТИКА ---") + print(f"Минимальная задержка: {min_delay:.2f} мс") + print(f"Максимальная задержка: {max_delay:.2f} мс") + print(f"Средняя задержка: {mean_delay:.2f} мс") + print(f"Медианная задержка: {median_delay:.2f} мс") + print(f"Стандартное отклонение: {std_delay:.2f} мс") + print(f"Стандартная ошибка: {std_error:.4f} мс") + + print(f"\n--- ДОВЕРИТЕЛЬНЫЙ ИНТЕРВАЛ {confidence_level*100}% ---") + print(f"Точечная оценка среднего: {mean_ci:.2f} мс") + print(f"Доверительный интервал: [{ci_lower:.2f}, {ci_upper:.2f}] мс") + print(f"Ширина интервала: {ci_upper - ci_lower:.2f} мс") + print(f"Погрешность: ±{(ci_upper - ci_lower)/2:.2f} мс") + + # Дополнительные метрики + cv = (std_delay / mean_delay) * 100 # Коэффициент вариации + print(f"\n--- ДОПОЛНИТЕЛЬНЫЕ МЕТРИКИ ---") + print(f"Коэффициент вариации: {cv:.1f}%") + print(f"Q1 (25-й перцентиль): {np.percentile(delays, 25):.2f} мс") + print(f"Q3 (75-й перцентиль): {np.percentile(delays, 75):.2f} мс") + print(f"IQR (межквартильный размах): {np.percentile(delays, 75) - np.percentile(delays, 25):.2f} мс") + + # Создание гистограммы + plt.figure(figsize=(14, 8)) + n_bins = min(30, len(delays) // 5) + + # Гистограмма + n, bins, patches = plt.hist(delays, bins=n_bins, alpha=0.7, color='steelblue', + edgecolor='black', linewidth=0.5, density=False) + + plt.xlabel('Задержка (мс)', fontsize=12) + plt.ylabel('Частота', fontsize=12) + plt.title(f'Распределение задержек на обработку нажатия мыши (n={len(delays)}, CI={confidence_level*100}%)', + fontsize=14, fontweight='bold') + plt.grid(True, alpha=0.3) + + # Добавление статистических линий + plt.axvline(mean_delay, color='red', linestyle='-', linewidth=2, + label=f'Среднее ({mean_delay:.1f} мс)') + plt.axvline(median_delay, color='green', linestyle='-', linewidth=2, + label=f'Медиана ({median_delay:.1f} мс)') + + # Добавление доверительного интервала + plt.axvspan(ci_lower, ci_upper, alpha=0.2, color='yellow', + label=f'ДИ {confidence_level*100}%: [{ci_lower:.1f}, {ci_upper:.1f}] мс') + + # Вертикальные линии для границ доверительного интервала + plt.axvline(ci_lower, color='orange', linestyle='--', linewidth=1, alpha=0.7) + plt.axvline(ci_upper, color='orange', linestyle='--', linewidth=1, alpha=0.7) + + plt.legend(loc='upper right', fontsize=10) + plt.tight_layout() + + # Сохранение в файл + if save_to_file: + output_file = f'delay_distribution_ci_{int(confidence_level*100)}.png' + plt.savefig(output_file, dpi=300, bbox_inches='tight') + print(f"\n✓ Гистограмма сохранена как: {output_file}") + + # Показ графика + if show_plot: + plt.show() + else: + plt.close() + + print("\n✓ Анализ завершен успешно") + + return { + 'data': delays, + 'mean': mean_delay, + 'median': median_delay, + 'std': std_delay, + 'ci_lower': ci_lower, + 'ci_upper': ci_upper, + 'confidence_level': confidence_level + } + + except FileNotFoundError: + print(f"✗ Ошибка: Файл '{csv_file_path}' не найден") + return None + except Exception as e: + print(f"✗ Ошибка: {e}") + return None + +def compare_confidence_intervals(csv_file_path, confidence_levels=[0.90, 0.95, 0.99], delimiter=','): + """ + Сравнение доверительных интервалов для разных уровней доверия + """ + try: + df = pd.read_csv(csv_file_path, delimiter=delimiter, header=None, + names=['index', 'delay_ms']) + delays = df['delay_ms'].values + + print("=" * 70) + print("СРАВНЕНИЕ ДОВЕРИТЕЛЬНЫХ ИНТЕРВАЛОВ ДЛЯ РАЗНЫХ УРОВНЕЙ ДОВЕРИЯ") + print("=" * 70) + print(f"Количество измерений: {len(delays)}") + print(f"Среднее значение: {np.mean(delays):.2f} мс") + print(f"Стандартная ошибка: {stats.sem(delays):.4f} мс\n") + + results = [] + for conf in confidence_levels: + mean, ci_lower, ci_upper, std_error = calculate_confidence_interval(delays, conf) + width = ci_upper - ci_lower + margin = width / 2 + + results.append({ + 'confidence': conf, + 'mean': mean, + 'ci_lower': ci_lower, + 'ci_upper': ci_upper, + 'width': width, + 'margin': margin + }) + + print(f"Доверительный интервал {conf*100:.0f}%:") + print(f" [{ci_lower:.2f}, {ci_upper:.2f}] мс") + print(f" Ширина: {width:.2f} мс, Погрешность: ±{margin:.2f} мс") + print() + + return results + + except Exception as e: + print(f"Ошибка при сравнении интервалов: {e}") + return None + +# Пример использования +if __name__ == "__main__": + # Укажите путь к вашему файлу + csv_file = "delays.csv" + + print("АНАЛИЗ ДОВЕРИТЕЛЬНЫХ ИНТЕРВАЛОВ ДЛЯ ЗАДЕРЖЕК") + print("=" * 50) + + # Основной анализ с 95% доверительным интервалом + results = plot_delay_histogram_with_ci( + csv_file_path=csv_file, + save_to_file=True, + show_plot=False, + confidence_level=0.99 + ) + + print("\n" + "=" * 50) + + # Сравнение разных уровней доверия + compare_results = compare_confidence_intervals(csv_file, [0.90, 0.95, 0.99]) + + # Интерпретация результатов + if results: + print("\n--- ИНТЕРПРЕТАЦИЯ РЕЗУЛЬТАТОВ ---") + print(f"С вероятностью 95% истинное среднее значение задержки ") + print(f"находится в интервале от {results['ci_lower']:.2f} до {results['ci_upper']:.2f} мс.") + print(f"Это означает, что если бы мы повторили эксперимент много раз,") + print(f"95% вычисленных таким образом интервалов содержали бы истинное среднее значение.") \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..07f8a72 --- /dev/null +++ b/main.cpp @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include +#include + +class ClickableWindow : public QWidget +{ +public: + ClickableWindow(QWidget *parent = nullptr) : QWidget(parent) + { + // Create a label to show instructions + QLabel *label = new QLabel("Click anywhere to change background color!"); + label->setAlignment(Qt::AlignCenter); + + // Set up layout + QVBoxLayout *layout = new QVBoxLayout(this); + layout->addWidget(label); + + // Set initial background color + setStyleSheet("background-color: black;"); + + // Set window properties + setWindowTitle("Click to Change Background Color"); + resize(400, 300); + } + +protected: + void mousePressEvent(QMouseEvent *event) override + { + if (event->button() == Qt::LeftButton) { + setStyleSheet("background-color: white"); + } + + QTimer::singleShot(200, this, &ClickableWindow::backToBlack); + + QWidget::mousePressEvent(event); + } + + void backToBlack() + { + setStyleSheet("background-color: black"); + } +}; + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + ClickableWindow window; + window.show(); + + return app.exec(); +} \ No newline at end of file