From 22c2eeab8cc794e67378485f49c236a622f814a7 Mon Sep 17 00:00:00 2001 From: LittleSam129 <1qwe432@gmail.com> Date: Mon, 3 Aug 2026 15:42:16 +0300 Subject: [PATCH] Lab035: add proactive video frame admission --- PROJECT_LOG.md | 26 + .../processed/lab035/lab035_control_delay.png | Bin 0 -> 37064 bytes .../lab035/lab035_control_metrics.csv | 19 + .../lab035/lab035_frame_outcomes.png | Bin 0 -> 43194 bytes data/processed/lab035/lab035_image_age.png | Bin 0 -> 43669 bytes .../lab035/lab035_policy_comparison.png | Bin 0 -> 40676 bytes .../lab035/lab035_prediction_accuracy.png | Bin 0 -> 38213 bytes .../lab035/lab035_prediction_metrics.csv | 19 + .../lab035/lab035_publication_delay.png | Bin 0 -> 44327 bytes data/processed/lab035/lab035_queue_size.png | Bin 0 -> 43286 bytes data/processed/lab035/lab035_report.txt | 99 +++ data/processed/lab035/lab035_summary.csv | 19 + data/processed/lab035/lab035_update_rate.png | Bin 0 -> 44701 bytes .../processed/lab035/lab035_video_metrics.csv | 19 + protocol/video_frame_scheduler.py | 330 ++++++++ tests/lab035_video_frame_admission.py | 748 ++++++++++++++++++ 16 files changed, 1279 insertions(+) create mode 100644 data/processed/lab035/lab035_control_delay.png create mode 100644 data/processed/lab035/lab035_control_metrics.csv create mode 100644 data/processed/lab035/lab035_frame_outcomes.png create mode 100644 data/processed/lab035/lab035_image_age.png create mode 100644 data/processed/lab035/lab035_policy_comparison.png create mode 100644 data/processed/lab035/lab035_prediction_accuracy.png create mode 100644 data/processed/lab035/lab035_prediction_metrics.csv create mode 100644 data/processed/lab035/lab035_publication_delay.png create mode 100644 data/processed/lab035/lab035_queue_size.png create mode 100644 data/processed/lab035/lab035_report.txt create mode 100644 data/processed/lab035/lab035_summary.csv create mode 100644 data/processed/lab035/lab035_update_rate.png create mode 100644 data/processed/lab035/lab035_video_metrics.csv create mode 100644 protocol/video_frame_scheduler.py create mode 100644 tests/lab035_video_frame_admission.py diff --git a/PROJECT_LOG.md b/PROJECT_LOG.md index 1244515..197d12a 100644 --- a/PROJECT_LOG.md +++ b/PROJECT_LOG.md @@ -213,3 +213,29 @@ git version 2.51.1.windows.1 - Подтверждено, что короткая очередь сама по себе не означает свежее изображение. - Текущая реактивная политика не принята. - Следующий этап посвящён упреждающему допуску кадров и обслуживанию видео целыми кадрами. + +--- + +# Запись 010 + +## Дата + +3 августа 2026 года + +## Тема + +Завершение Lab035: упреждающий допуск и обслуживание видео целыми составными кадрами. + +## Выполнено + +- Lab035 исследует упреждающий допуск и обслуживание видео целыми составными кадрами. +- Начатый кадр всегда передаётся полностью. +- Команды и телеметрия могут передаваться между его пакетами. +- Реактивное удаление Lab034 окончательно не принято. +- Основная политика — хранение только самого свежего не начатого кадра. +- При 230 кбит/с опубликовано 56 из 63 кадров с частотой около 2,6 кадра/с. +- Бесполезно переданных видеобайтов нет. +- Очередь из двух кадров увеличивает возраст изображения. +- Прогноз 1000 мс не дал преимущества над более простой политикой. +- Прогноз 500 мс чрезмерно снижает частоту обновления. +- Следующая лабораторная проверяет долговременную устойчивость и изменение пропускной способности канала. diff --git a/data/processed/lab035/lab035_control_delay.png b/data/processed/lab035/lab035_control_delay.png new file mode 100644 index 0000000000000000000000000000000000000000..bfeb5851e9cc45c757b3a24b8fd4fb665d944ba5 GIT binary patch literal 37064 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 aqSyZQFJbu!>4o%7*BY9vPBCye`M&_ve$qGq literal 0 HcmV?d00001 diff --git a/data/processed/lab035/lab035_control_metrics.csv b/data/processed/lab035/lab035_control_metrics.csv new file mode 100644 index 0000000..4f28bbc --- /dev/null +++ b/data/processed/lab035/lab035_control_metrics.csv @@ -0,0 +1,19 @@ +channel_kbps,policy,control_p95_delay_ms,control_max_delay_ms,control_deadline_misses,control_max_receive_gap_ms,emergency_delay_ms,emergency_deadline_met,emergency_blocker_class,emergency_blocking_delay_ms,telemetry_deadline_misses +300.0,no_drop,17.46633333333314,17.78700000000022,0,65.7596666666671,1.7066666666671892,True,none,0.0,0 +300.0,reactive_1500ms,17.46633333333314,17.78700000000022,0,65.7596666666671,1.7066666666671892,True,none,0.0,0 +300.0,latest_only,17.46633333333314,17.78700000000022,0,65.7596666666671,1.7066666666671892,True,none,0.0,0 +300.0,two_waiting,17.46633333333314,17.78700000000022,0,65.7596666666671,1.7066666666671892,True,none,0.0,0 +300.0,predict_1000ms,17.46633333333314,17.78700000000022,0,65.7596666666671,1.7066666666671892,True,none,0.0,0 +300.0,predict_500ms,17.46633333333314,17.78700000000022,0,65.7596666666671,1.7066666666671892,True,none,0.0,0 +260.0,no_drop,18.907692307691043,20.492307692309808,0,67.81538461538617,1.969230769230279,True,none,0.0,0 +260.0,reactive_1500ms,18.907692307691043,20.492307692309808,0,67.81538461538617,1.969230769230279,True,none,0.0,0 +260.0,latest_only,18.907692307691043,20.492307692309808,0,67.81538461538617,1.969230769230279,True,none,0.0,0 +260.0,two_waiting,18.907692307691043,20.492307692309808,0,67.81538461538617,1.969230769230279,True,none,0.0,0 +260.0,predict_1000ms,18.907692307691043,20.492307692309808,0,67.81538461538617,1.969230769230279,True,none,0.0,0 +260.0,predict_500ms,18.907692307691043,20.533000000078516,0,67.81538461538617,1.969230769230279,True,none,0.0,0 +230.0,no_drop,22.499999999942013,24.556521739064863,0,69.00869565217427,22.330434782542596,True,video,20.10434782602033,0 +230.0,reactive_1500ms,22.460869565154475,24.556521739064863,0,69.00869565217427,22.330434782542596,True,video,20.10434782602033,0 +230.0,latest_only,22.043478260820315,23.339130434699484,0,69.00869565217427,6.2260869564561006,True,video,3.9999999999338343,0 +230.0,two_waiting,22.53913043472089,23.33913043474567,0,69.00869565217427,6.991304347760519,True,video,4.765217391238252,0 +230.0,predict_1000ms,22.317391304289558,23.35652173909253,0,69.00869565217427,2.365217391240293,True,video,0.13913043471802666,0 +230.0,predict_500ms,22.211510869569295,23.304347826089256,0,69.00869565217427,5.739130434786688,True,video,3.5130434782644215,0 diff --git a/data/processed/lab035/lab035_frame_outcomes.png b/data/processed/lab035/lab035_frame_outcomes.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc29e35d6e9d80071d6f8b846077213885ca336 GIT binary patch literal 43194 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� zV%CsezmgAd0LPv6PCnIKS_Xvp6z4Uhg&P&PK1L{gMkYLyJ4^j7VpEr5gtXhSZ`%vb zMip+es`0ZW@UMepg1I5ED`T6MY+uB(W~Y~%ziw}*Kpb9VmyK%|z&&UycH zDv1glw&(Tstbmjes|Ub&06JL+T&&^oQb^XG5e6|w8vG4&$nre_(ScN^F#NH6wt4k| zk{UjOg+t=)Z3|QUk!R6s^HN*sk>lBRGp|fYf9?uh6If2N7WYq6PLnm4lj`ultbV}! zp|38Sr`&b95{W!0Fy3KMV6+>2m7J#3{y8HjnG>MutTSu!hhIbDt6xvH6_)L9(Ff~2 zXTk6V75({^5zdIQf1b*%%3(Wx27ur2D9ULeF-Xs;f(=D_Gs^!^DTk2YABc_lZH359 zz0Gcb(_}C##?;mG(|VCyXuPzy0wh=c#W~a>c@s`sq^b4Xez&6^1a^GRF4I+iHC1bf zrKGX$S{!c`Pz1X8vf7+X`~69($Uh5Nlp<_YP>y&2l8^vYvLihg5v|dS`Dfk89~Lzx z+S5&9p(W110ge#3u@p;Br1<;UgD>?ZrzLP66qrEJ4HeQgh{|$IyI44hzm#d$=T~yr zvOA4nup>?S@l>w5zM&4{C(M1t*Hds#hn4+ z^@t6SB*m*F+YJxEiSgSEQ1i-$NNQ!!;jq4Gu=F5OF5~8`uzhYc1MR`UHY|4m;5k%( zZ>)6dU@VePkx>ZS-8jkR@55?PE5g7g5Y*k`@||z;d{zUYk|Fk2Dnc}Ev}f{_9knQR z-@u;Phd7S#f?EGq5cQrVGl2#(6#L_!?m_PZ&A~-954`$Hs1ydgoT|XO>+)OYwgY5HPEqyIk&yAyZCtkqm?LazZJ8YctO__WtzWC zu%0A43d(B9jkL7)R=Y%W~vm7qm$MpDWbYs-s0HKxq?R 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 PW81ZT@2|0251soTs>ADv literal 0 HcmV?d00001 diff --git a/data/processed/lab035/lab035_image_age.png b/data/processed/lab035/lab035_image_age.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad73c48cd6dec91b463083733cfc9988a9b7864 GIT binary patch literal 43669 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 literal 0 HcmV?d00001 diff --git a/data/processed/lab035/lab035_policy_comparison.png b/data/processed/lab035/lab035_policy_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..84b8e11e2ab1901eae55607b81f02137c8d284fa GIT binary patch literal 40676 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

6m&(&l&3VDW?4zWLF^N<6U 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 literal 0 HcmV?d00001 diff --git a/data/processed/lab035/lab035_report.txt b/data/processed/lab035/lab035_report.txt new file mode 100644 index 0000000..b837eae --- /dev/null +++ b/data/processed/lab035/lab035_report.txt @@ -0,0 +1,99 @@ +Lab035. Упреждающий допуск видеокадров и обслуживание видео целыми кадрами + +1. Исходное состояние +- Commit Lab034: b63e36abdb7031d642de8b8138b43cc29e94b759. +- Перед Lab035 рабочее дерево было чистым; main опережала origin/main на два commit. + +2. Правило обслуживания +- После первого видеопакета кадр становится активным и не удаляется. +- При повторном выборе видео передаётся следующий пакет активного кадра; команды и телеметрия могут передаваться между пакетами. +- Новый видеокадр начинается только после полного завершения активного; видеопакеты разных кадров не чередуются; отдельный пакет не прерывается. +- Только неактивные кадры могут быть удалены до передачи первого пакета. + +3. Теоретическая пропускная способность +speed | nonvideo kbps | remaining video kbps | remaining/aligned | minimum skip | maximum fps +300 | 17.973 | 282.027 | 1.143443 | 0.000000 | 3.000 +260 | 17.973 | 242.027 | 0.981268 | 0.018732 | 2.944 +230 | 17.973 | 212.027 | 0.859636 | 0.140364 | 2.579 + +4. Восемнадцать сочетаний +speed | policy | published/drop/partial | fps | age P95 ms | no-update max ms | queue max/waiting frames | waste bytes | prediction MAE/P95/max ms | control P95/max ms | emergency ms +300 | Без удаления | 63/0/0 | 2.986 | 590.000 | 406.506 | 21/1 | 0 | 0.000000/0.000000/0.000000 | 17.466/17.787 | 1.707 +300 | Реактивная 1500 мс | 63/0/0 | 2.986 | 590.000 | 406.506 | 21/1 | 0 | 0.000000/0.000000/0.000000 | 17.466/17.787 | 1.707 +300 | Самый свежий | 63/0/0 | 2.986 | 590.000 | 406.506 | 21/1 | 0 | 0.000000/0.000000/0.000000 | 17.466/17.787 | 1.707 +300 | Два ожидающих | 63/0/0 | 2.986 | 590.000 | 406.506 | 21/1 | 0 | 0.000000/0.000000/0.000000 | 17.466/17.787 | 1.707 +300 | Прогноз 1000 мс | 63/0/0 | 2.986 | 590.000 | 406.506 | 21/1 | 0 | 0.000000/0.000000/0.000000 | 17.466/17.787 | 1.707 +300 | Прогноз 500 мс | 63/0/0 | 2.986 | 590.000 | 406.506 | 21/1 | 0 | 0.000000/0.000000/0.000000 | 17.466/17.787 | 1.707 +260 | Без удаления | 63/0/0 | 2.937 | 773.833 | 417.764 | 37/1 | 0 | 0.000000/0.000000/0.000000 | 18.908/20.492 | 1.969 +260 | Реактивная 1500 мс | 63/0/0 | 2.937 | 773.833 | 417.764 | 37/1 | 0 | 0.000000/0.000000/0.000000 | 18.908/20.492 | 1.969 +260 | Самый свежий | 63/0/0 | 2.937 | 773.833 | 417.764 | 37/1 | 0 | 0.000000/0.000000/0.000000 | 18.908/20.492 | 1.969 +260 | Два ожидающих | 63/0/0 | 2.937 | 773.833 | 417.764 | 37/1 | 0 | 0.000000/0.000000/0.000000 | 18.908/20.492 | 1.969 +260 | Прогноз 1000 мс | 63/0/0 | 2.937 | 773.833 | 417.764 | 37/1 | 0 | 0.000000/0.000000/0.000000 | 18.908/20.492 | 1.969 +260 | Прогноз 500 мс | 62/1/0 | 2.889 | 703.333 | 524.266 | 29/1 | 0 | 0.000000/0.000000/0.000000 | 18.908/20.533 | 1.969 +230 | Без удаления | 63/0/0 | 2.600 | 2913.333 | 424.000 | 160/8 | 0 | 0.000000/0.000000/0.000000 | 22.500/24.557 | 22.330 +230 | Реактивная 1500 мс | 27/0/36 | 1.300 | 11064.833 | 10626.980 | 87/4 | 321929 | 0.000000/0.000000/0.000000 | 22.461/24.557 | 22.330 +230 | Самый свежий | 56/7/0 | 2.600 | 960.000 | 426.226 | 37/1 | 0 | 0.000000/0.000000/0.000000 | 22.043/23.339 | 6.226 +230 | Два ожидающих | 57/6/0 | 2.600 | 1286.667 | 421.183 | 56/2 | 0 | 0.000000/0.000000/0.000000 | 22.539/23.339 | 6.991 +230 | Прогноз 1000 мс | 56/7/0 | 2.600 | 1226.667 | 426.226 | 53/2 | 0 | 0.000000/0.000000/0.000000 | 22.317/23.357 | 2.365 +230 | Прогноз 500 мс | 47/16/0 | 2.215 | 966.667 | 622.817 | 28/1 | 0 | 0.000000/0.000000/0.000000 | 22.212/23.304 | 5.739 + +5. Интерпретация +- Реактивная Lab034 начинает кадр без гарантии завершения, затем удаляет остаток: уже переданные байты становятся бесполезными, а обновление не публикуется. +- Удаление до первого пакета исключает бесполезную передачу; обслуживание целыми кадрами гарантирует, что начатый кадр будет опубликован. +- Политика самого свежего уменьшает задержку ожидающих данных, но удаляет больше промежуточных кадров; очередь из двух кадров сохраняет больше последовательных обновлений ценой возраста. +- Прогноз полного завершения учитывает весь размер кадра и будущую периодическую высокоприоритетную нагрузку, поэтому полезнее проверки только текущего возраста. +- В модели точно известны команды 20 Гц, телеметрия 10 Гц и аварийная команда 10,0 с; неизвестные будущие дискретные события не моделируются и в реальной системе потребовали бы запаса. +- При устойчивой перегрузке невозможно одновременно сохранить все кадры, исходное JPEG-качество и малую задержку; требуется уменьшить частоту, качество или заранее пропускать кадры. +- Частота обновления, возраст изображения и длительность отсутствия нового изображения оцениваются одновременно: оптимизация одного показателя может ухудшить остальные. + +6. Допущения +- Ошибки и помехи отсутствуют; один общий абстрактный ресурс, форматы Lab028-Lab034 неизменны, активный пакет не прерывается. +- Прогноз не изменяет настоящую очередь; для допущенных кадров сохраняются только агрегированные ошибки, без подробного журнала. +- Политика автоматически не выбирается. + +7. Функциональные проверки +- PASS 01_video_frames_do_not_interleave: PASS +- PASS 02_started_frame_never_dropped: PASS +- PASS 03_high_priority_between_frame_packets: PASS +- PASS 04_latest_drops_only_unstarted: PASS +- PASS 05_two_waiting_limit: PASS +- PASS 06_prediction_is_pure: PASS +- PASS 07_prediction_uses_actual_sizes: PASS +- PASS 08_prestart_drop_has_no_waste: PASS +- PASS 09_partial_only_reactive: PASS +- PASS 10_incomplete_not_published: PASS +- PASS 11_crc_layers_pass: PASS +- PASS 12_emergency_never_deleted: PASS +- PASS 13_priority_above_video: PASS +- PASS 14_300kbps_no_unnecessary_loss: PASS +- PASS 15_230kbps_bounded_queue: PASS +- PASS 16_frame_accounting: PASS +- PASS 17_byte_accounting: PASS +- PASS 18_reproducible: PASS +- PASS 19_predict_1000_never_known_late: PASS +- PASS 20_command_delay_bound: PASS + +8. Созданные файлы +- protocol/video_frame_scheduler.py +- tests/lab035_video_frame_admission.py +- data/processed/lab035/lab035_summary.csv +- data/processed/lab035/lab035_video_metrics.csv +- data/processed/lab035/lab035_control_metrics.csv +- data/processed/lab035/lab035_prediction_metrics.csv +- data/processed/lab035/lab035_report.txt +- data/processed/lab035/lab035_update_rate.png +- data/processed/lab035/lab035_image_age.png +- data/processed/lab035/lab035_publication_delay.png +- data/processed/lab035/lab035_frame_outcomes.png +- data/processed/lab035/lab035_queue_size.png +- data/processed/lab035/lab035_prediction_accuracy.png +- data/processed/lab035/lab035_control_delay.png +- data/processed/lab035/lab035_policy_comparison.png + +9. Итоговый Git status +- Lab035 не добавлена в индекс и не закоммичена. + +## main...origin/main [ahead 2] +?? data/processed/lab035/ +?? protocol/video_frame_scheduler.py +?? tests/lab035_video_frame_admission.py diff --git a/data/processed/lab035/lab035_summary.csv b/data/processed/lab035/lab035_summary.csv new file mode 100644 index 0000000..82aaa70 --- /dev/null +++ b/data/processed/lab035/lab035_summary.csv @@ -0,0 +1,19 @@ +channel_kbps,policy,offered_load_kbps,offered_to_capacity_ratio,transmitted_packets,transmitted_bytes,dropped_before_start_packets,dropped_before_start_bytes,wasted_transmitted_bytes,mean_queue_packets,max_queue_packets,mean_queue_bytes,max_queue_bytes,mean_waiting_video_frames,max_waiting_video_frames,queue_at_source_end_packets,additional_drain_seconds,remaining_video_capacity_kbps,theoretical_minimum_skip_fraction,theoretical_maximum_update_fps +300.0,no_drop,264.62022471910115,0.8820674157303372,1738,686910,0,0,0,8.518393226324118,21,4685.69717834665,11415,0.0043967897271271275,1,13,0.1994403333333281,282.02658105939,0.0,3.0 +300.0,reactive_1500ms,264.62022471910115,0.8820674157303372,1738,686910,0,0,0,8.518393226324118,21,4685.69717834665,11415,0.004397126805778977,1,13,0.1994403333333281,282.02658105939,0.0,3.0 +300.0,latest_only,264.62022471910115,0.8820674157303372,1738,686910,0,0,0,8.518393226324118,21,4685.69717834665,11415,0.0043967897271271275,1,13,0.1994403333333281,282.02658105939,0.0,3.0 +300.0,two_waiting,264.62022471910115,0.8820674157303372,1738,686910,0,0,0,8.518393226324118,21,4685.69717834665,11415,0.0043967897271271275,1,13,0.1994403333333281,282.02658105939,0.0,3.0 +300.0,predict_1000ms,264.62022471910115,0.8820674157303372,1738,686910,0,0,0,8.518393226324118,21,4685.69717834665,11415,0.0043967897271271275,1,13,0.1994403333333281,282.02658105939,0.0,3.0 +300.0,predict_500ms,264.62022471910115,0.8820674157303372,1738,686910,0,0,0,8.518393226324118,21,4685.69717834665,11415,0.0043967897271271275,1,13,0.1994403333333281,282.02658105939,0.0,3.0 +260.0,no_drop,264.62022471910115,1.017770095073466,1738,686910,0,0,0,13.695290291396285,37,7655.6639836816,21131,0.22409427213244032,1,30,0.5392926410258561,242.02658105939005,0.0187321490116944,2.943803552964917 +260.0,reactive_1500ms,264.62022471910115,1.017770095073466,1738,686910,0,0,0,13.695290291396285,37,7655.6639836816,21131,0.22409428818380472,1,30,0.5392926410258561,242.02658105939005,0.0187321490116944,2.943803552964917 +260.0,latest_only,264.62022471910115,1.017770095073466,1738,686910,0,0,0,13.695290291396285,37,7655.6639836816,21131,0.22409427213244032,1,30,0.5392926410258561,242.02658105939005,0.0187321490116944,2.943803552964917 +260.0,two_waiting,264.62022471910115,1.017770095073466,1738,686910,0,0,0,13.695290291396285,37,7655.6639836816,21131,0.22409427213244032,1,30,0.5392926410258561,242.02658105939005,0.0187321490116944,2.943803552964917 +260.0,predict_1000ms,264.62022471910115,1.017770095073466,1738,686910,0,0,0,13.695290291396285,37,7655.6639836816,21131,0.22409427213244032,1,30,0.5392926410258561,242.02658105939005,0.0187321490116944,2.943803552964917 +260.0,predict_500ms,264.62022471910115,1.017770095073466,1719,675994,19,10916,0,12.011204749970242,29,6682.897892161229,15804,0.13726051487841454,1,21,0.37186633333345753,242.02658105939005,0.0187321490116944,2.943803552964917 +230.0,no_drop,264.62022471910115,1.1505227161700051,1738,686910,0,0,0,76.17493190801534,160,43586.68565075366,92568,3.7476585944586778,8,155,3.1258550724636294,212.02658105939005,0.14036356404385353,2.5789093078684395 +230.0,reactive_1500ms,264.62022471910115,1.1505227161700051,1641,637811,0,0,321929,59.44779896084508,87,33911.67327808277,50035,2.785503524321179,4,81,1.4180637681158217,212.02658105939005,0.14036356404385353,2.5789093078684395 +230.0,latest_only,264.62022471910115,1.1505227161700051,1614,615407,124,71503,0,19.887121174537647,37,11167.829372157905,21067,0.5720064205456188,1,33,0.6387942028984455,212.02658105939005,0.14036356404385353,2.5789093078684395 +230.0,two_waiting,264.62022471910115,1.1505227161700051,1633,626345,105,60565,0,35.493155370922615,56,20128.047561843177,32209,1.456761532556227,2,52,1.0192463768114841,212.02658105939005,0.14036356404385353,2.5789093078684395 +230.0,predict_1000ms,264.62022471910115,1.1505227161700051,1612,613851,126,73059,0,32.84338218367999,53,18617.01722113549,30172,1.3064353409168972,2,49,0.5846724637680119,212.02658105939005,0.14036356404385353,2.5789093078684395 +230.0,predict_500ms,264.62022471910115,1.1505227161700051,1452,521373,286,165537,0,12.440944832856212,28,6904.035936733742,15168,0.22863162956241578,1,22,0.04693333333332461,212.02658105939005,0.14036356404385353,2.5789093078684395 diff --git a/data/processed/lab035/lab035_update_rate.png b/data/processed/lab035/lab035_update_rate.png new file mode 100644 index 0000000000000000000000000000000000000000..2f94ecd0f98ad41eefcc6b161598d92a94656682 GIT binary patch literal 44701 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 V6|=3s;h{5jZQr*oZtJm&{|(`#obdnv literal 0 HcmV?d00001 diff --git a/data/processed/lab035/lab035_video_metrics.csv b/data/processed/lab035/lab035_video_metrics.csv new file mode 100644 index 0000000..38a5aa6 --- /dev/null +++ b/data/processed/lab035/lab035_video_metrics.csv @@ -0,0 +1,19 @@ +channel_kbps,policy,created_frames,started_frames,published_frames,dropped_before_start_frames,partially_transmitted_cancelled_frames,published_fraction,actual_update_fps,mean_publication_delay_ms,p95_publication_delay_ms,max_publication_delay_ms,mean_display_age_ms,p95_display_age_ms,max_display_age_ms,display_age_over_500ms_fraction,display_age_over_1000ms_fraction,mean_no_update_duration_ms,p95_no_update_duration_ms,max_no_update_duration_ms,mean_missing_run_frames,p95_missing_run_frames,max_missing_run_frames,mean_publication_gap_ms,max_publication_gap_ms,transmitted_video_bytes,dropped_before_start_video_bytes,wasted_transmitted_video_bytes,delivered_useful_video_kbps +300.0,no_drop,63,63,63,0,0,1.0,2.985553772070626,272.2167195767169,293.13066666666225,301.84000000000003,433.2836060314408,589.9999999999999,623.3333333333348,0.30221366698748797,0.0,329.6296296296296,355.05666666666684,406.506333333331,0.0,0.0,0,333.07759016393436,406.506333333331,640254,0,0,157.76975922953451 +300.0,reactive_1500ms,63,63,63,0,0,1.0,2.985553772070626,272.2167195767169,293.13066666666225,301.84000000000003,433.2836060314408,589.9999999999999,623.3333333333348,0.30221366698748797,0.0,329.6296296296296,355.05666666666684,406.506333333331,0.0,0.0,0,333.03312365591387,406.506333333331,640254,0,0,157.76975922953451 +300.0,latest_only,63,63,63,0,0,1.0,2.985553772070626,272.2167195767169,293.13066666666225,301.84000000000003,433.2836060314408,589.9999999999999,623.3333333333348,0.30221366698748797,0.0,329.6296296296296,355.05666666666684,406.506333333331,0.0,0.0,0,333.07759016393436,406.506333333331,640254,0,0,157.76975922953451 +300.0,two_waiting,63,63,63,0,0,1.0,2.985553772070626,272.2167195767169,293.13066666666225,301.84000000000003,433.2836060314408,589.9999999999999,623.3333333333348,0.30221366698748797,0.0,329.6296296296296,355.05666666666684,406.506333333331,0.0,0.0,0,333.07759016393436,406.506333333331,640254,0,0,157.76975922953451 +300.0,predict_1000ms,63,63,63,0,0,1.0,2.985553772070626,272.2167195767169,293.13066666666225,301.84000000000003,433.2836060314408,589.9999999999999,623.3333333333348,0.30221366698748797,0.0,329.6296296296296,355.05666666666684,406.506333333331,0.0,0.0,0,333.07759016393436,406.506333333331,640254,0,0,157.76975922953451 +300.0,predict_500ms,63,63,63,0,0,1.0,2.985553772070626,272.2167195767169,293.13066666666225,301.84000000000003,433.2836060314408,589.9999999999999,623.3333333333348,0.30221366698748797,0.0,329.6296296296296,355.05666666666684,406.506333333331,0.0,0.0,0,333.07759016393436,406.506333333331,640254,0,0,157.76975922953451 +260.0,no_drop,63,63,63,0,0,1.0,2.937399678972713,393.259570207603,579.4598205129968,620.584948718161,546.5335258261151,773.833333333333,943.3333333333316,0.62223291626564,0.0,334.9462365591397,363.58000000001095,417.7637692307723,0.0,0.0,0,337.6377833333365,417.7637692307723,640254,0,0,157.76975922953451 +260.0,reactive_1500ms,63,63,63,0,0,1.0,2.937399678972713,393.259570207603,579.4598205129968,620.584948718161,546.5335258261151,773.833333333333,943.3333333333316,0.62223291626564,0.0,334.9462365591397,363.58000000001095,417.7637692307723,0.0,0.0,0,337.64599379652947,417.7637692307723,640254,0,0,157.76975922953451 +260.0,latest_only,63,63,63,0,0,1.0,2.937399678972713,393.259570207603,579.4598205129968,620.584948718161,546.5335258261151,773.833333333333,943.3333333333316,0.62223291626564,0.0,334.9462365591397,363.58000000001095,417.7637692307723,0.0,0.0,0,337.6377833333365,417.7637692307723,640254,0,0,157.76975922953451 +260.0,two_waiting,63,63,63,0,0,1.0,2.937399678972713,393.259570207603,579.4598205129968,620.584948718161,546.5335258261151,773.833333333333,943.3333333333316,0.62223291626564,0.0,334.9462365591397,363.58000000001095,417.7637692307723,0.0,0.0,0,337.6377833333365,417.7637692307723,640254,0,0,157.76975922953451 +260.0,predict_1000ms,63,63,63,0,0,1.0,2.937399678972713,393.259570207603,579.4598205129968,620.584948718161,546.5335258261151,773.833333333333,943.3333333333316,0.62223291626564,0.0,334.9462365591397,363.58000000001095,417.7637692307723,0.0,0.0,0,337.6377833333365,417.7637692307723,640254,0,0,157.76975922953451 +260.0,predict_500ms,63,62,62,1,0,0.9841269841269841,2.8892455858747996,360.2011848635393,447.1807256411333,465.7234102564871,523.434392043632,703.3333333333336,983.3333333333343,0.5654475457170356,0.0,340.4371584699453,365.69230769231353,524.2659999999332,1.0,1.0,1,340.28908604954535,524.2659999999332,629338,10916,0,155.0561797752809 +230.0,no_drop,63,63,63,0,0,1.0,2.6003210272873196,1777.4951000689596,3067.511884057848,3204.707246376671,1723.7872954764196,2913.333333333334,3206.666666666667,0.9735322425409048,0.8267564966313763,377.57575757575756,412.5426086956473,424.00000000000125,0.0,0.0,0,380.14569319113855,424.00000000000125,640254,0,0,157.76975922953451 +230.0,reactive_1500ms,63,63,27,0,36,0.42857142857142855,1.3001605136436598,1010.3600644122084,1414.757101449207,1473.0202898550094,4028.4071222329167,11064.833333333332,12103.333333333334,0.9735322425409048,0.8267564966313763,741.6666666666666,416.659130434783,10626.97971014499,36.0,36.0,36,374.5458193979908,424.00000000000125,591155,0,321929,66.39987158908507 +230.0,latest_only,63,56,56,7,0,0.8888888888888888,2.6003210272873196,536.8126293995401,685.881159420235,717.6463768114871,709.5107475136352,960.0000000000001,1076.6666666666679,0.9100096246390761,0.02165543792107796,377.5757575757575,416.6017391304294,426.22608695652355,1.0,1.0,1,381.4884331419178,426.22608695652355,568751,71503,0,140.1904333868379 +230.0,two_waiting,63,57,57,6,0,0.9047619047619048,2.6003210272873196,838.9013984235485,1026.1286956521203,1098.0985507245257,998.5707410972092,1286.6666666666665,1440.0000000000014,0.9735322425409048,0.546679499518768,377.5757575757576,406.0417391304327,421.1826086956538,1.0,1.0,1,381.49433962263976,421.1826086956538,579689,60565,0,142.8577849117175 +230.0,predict_1000ms,63,56,56,7,0,0.8888888888888888,2.6003210272873196,771.422153209065,952.4115942028234,971.5478260868871,943.7102983638115,1226.6666666666665,1359.9999999999995,0.9735322425409048,0.41193455245428295,377.57575757575756,405.373913043476,426.22608695652355,1.0,1.0,1,380.15028712058887,426.22608695652355,567195,73059,0,139.75743178170146 +230.0,predict_500ms,63,47,47,16,0,0.746031746031746,2.215088282504013,412.55253931544405,466.07430289855006,482.2141594203,641.0153994225219,966.6666666666686,1056.6666666666683,0.7776708373435997,0.026467757459095284,441.84397163120565,614.827726086956,622.8173913043555,1.0,1.0,1,444.19246376811583,622.8173913043555,474717,165537,0,117.06375601926163 diff --git a/protocol/video_frame_scheduler.py b/protocol/video_frame_scheduler.py new file mode 100644 index 0000000..cbd0288 --- /dev/null +++ b/protocol/video_frame_scheduler.py @@ -0,0 +1,330 @@ +"""Whole-frame video scheduling and predictive admission for Lab035.""" + +from __future__ import annotations + +from dataclasses import dataclass +from enum import Enum +from typing import Iterable + +from protocol.link_packet import TrafficClass, encode_link_packet +from protocol.priority_scheduler import transmission_duration_seconds +from protocol.video_age_policy import AgePolicyPacket + + +TIME_EPSILON_SECONDS = 1e-12 + + +class FramePolicy(str, Enum): + NO_DROP = "no_drop" + LATEST_ONLY = "latest_only" + TWO_WAITING = "two_waiting" + PREDICT_1000MS = "predict_1000ms" + PREDICT_500MS = "predict_500ms" + + @property + def deadline_seconds(self) -> float | None: + if self is FramePolicy.PREDICT_1000MS: + return 1.0 + if self is FramePolicy.PREDICT_500MS: + return 0.5 + return None + + +@dataclass(frozen=True) +class VideoFrameGroup: + composite_frame_id: int + generation_time_us: int + packets: tuple[AgePolicyPacket, ...] + + @property + def generation_time_seconds(self) -> float: + return self.generation_time_us / 1_000_000.0 + + @property + def wire_size_bytes(self) -> int: + return sum(packet.wire_size_bytes for packet in self.packets) + + +@dataclass(frozen=True) +class FrameDrop: + frame: VideoFrameGroup + drop_time_seconds: float + reason: str + + +@dataclass(frozen=True) +class StateReplacement: + removed: AgePolicyPacket + replacement: AgePolicyPacket + time_seconds: float + + +@dataclass(frozen=True) +class FrameScheduledPacket: + item: AgePolicyPacket + start_seconds: float + end_seconds: float + blocked_by: AgePolicyPacket | None + blocking_delay_seconds: float + wire_packet: bytes + + +@dataclass(frozen=True) +class FrameAdmission: + composite_frame_id: int + predicted_completion_seconds: float + actual_completion_seconds: float + + @property + def prediction_error_seconds(self) -> float: + return self.actual_completion_seconds - self.predicted_completion_seconds + + +@dataclass(frozen=True) +class FrameScheduleResult: + policy: FramePolicy + channel_bitrate_bps: float + transmitted: tuple[FrameScheduledPacket, ...] + dropped_frames: tuple[FrameDrop, ...] + replacements: tuple[StateReplacement, ...] + started_frame_ids: tuple[int, ...] + completed_frame_ids: tuple[int, ...] + admissions: tuple[FrameAdmission, ...] + + +def _replace_state( + ready: list[AgePolicyPacket], + item: AgePolicyPacket, + replacements: list[StateReplacement], +) -> None: + if item.packet.traffic_class in (TrafficClass.CONTROL, TrafficClass.TELEMETRY): + retained = [] + for old in ready: + if ( + old.packet.traffic_class == item.packet.traffic_class + and old.packet.stream_id == item.packet.stream_id + ): + replacements.append(StateReplacement(old, item, item.available_time_seconds)) + else: + retained.append(old) + ready[:] = retained + ready.append(item) + + +def _serve_high_priority( + cursor: float, + ready: list[AgePolicyPacket], + future: tuple[AgePolicyPacket, ...], + future_index: int, + channel_bitrate_bps: float, +) -> tuple[float, int, list[AgePolicyPacket]]: + """Pure local helper used only by the completion predictor.""" + + copied_ready = list(ready) + index = future_index + while index < len(future) and future[index].available_time_seconds <= cursor + TIME_EPSILON_SECONDS: + item = future[index] + index += 1 + copied_ready = [ + old for old in copied_ready + if not ( + old.packet.traffic_class == item.packet.traffic_class + and old.packet.stream_id == item.packet.stream_id + and item.packet.traffic_class in (TrafficClass.CONTROL, TrafficClass.TELEMETRY) + ) + ] + copied_ready.append(item) + while copied_ready: + selected = min( + copied_ready, + key=lambda item: (int(item.packet.traffic_class), item.arrival_order), + ) + copied_ready.remove(selected) + cursor += transmission_duration_seconds(selected.wire_size_bytes, channel_bitrate_bps) + while index < len(future) and future[index].available_time_seconds <= cursor + TIME_EPSILON_SECONDS: + item = future[index] + index += 1 + copied_ready = [ + old for old in copied_ready + if not ( + old.packet.traffic_class == item.packet.traffic_class + and old.packet.stream_id == item.packet.stream_id + and item.packet.traffic_class in (TrafficClass.CONTROL, TrafficClass.TELEMETRY) + ) + ] + copied_ready.append(item) + return cursor, index, copied_ready + + +def predict_frame_completion( + current_time_seconds: float, + frame: VideoFrameGroup, + channel_bitrate_bps: float, + ready_high_priority: Iterable[AgePolicyPacket], + future_high_priority: Iterable[AgePolicyPacket], + active_packet_remaining_seconds: float = 0.0, +) -> float: + """Predict full-frame completion without mutating any caller collection. + + Known periodic commands, telemetry, and the scheduled emergency event are + simulated exactly at packet boundaries. Unknown future discrete events are + outside the Lab035 traffic model and therefore cannot be included. + """ + + if channel_bitrate_bps <= 0.0: + raise ValueError("channel bitrate must be positive") + if active_packet_remaining_seconds < 0.0: + raise ValueError("active packet remainder must not be negative") + cursor = current_time_seconds + active_packet_remaining_seconds + ready = list(ready_high_priority) + future = tuple(sorted(future_high_priority, key=lambda item: (item.available_time_seconds, item.arrival_order))) + future_index = 0 + for video_packet in frame.packets: + cursor, future_index, ready = _serve_high_priority( + cursor, ready, future, future_index, channel_bitrate_bps + ) + cursor += transmission_duration_seconds(video_packet.wire_size_bytes, channel_bitrate_bps) + while future_index < len(future) and future[future_index].available_time_seconds <= cursor + TIME_EPSILON_SECONDS: + ready.append(future[future_index]) + future_index += 1 + return cursor + + +def schedule_video_frames( + frames: Iterable[VideoFrameGroup], + high_priority_packets: Iterable[AgePolicyPacket], + policy: FramePolicy, + channel_bitrate_bps: float, +) -> FrameScheduleResult: + """Run strict-priority service while keeping video frames contiguous.""" + + policy = FramePolicy(policy) + if channel_bitrate_bps <= 0.0: + raise ValueError("channel bitrate must be positive") + frame_arrivals = tuple(sorted(frames, key=lambda frame: (frame.generation_time_seconds, frame.composite_frame_id))) + high_arrivals = tuple(sorted(high_priority_packets, key=lambda item: (item.available_time_seconds, item.arrival_order))) + ready_high: list[AgePolicyPacket] = [] + pending_frames: list[VideoFrameGroup] = [] + transmitted: list[FrameScheduledPacket] = [] + dropped: list[FrameDrop] = [] + replacements: list[StateReplacement] = [] + started: list[int] = [] + completed: list[int] = [] + predicted_by_frame: dict[int, float] = {} + actual_by_frame: dict[int, float] = {} + active: VideoFrameGroup | None = None + active_index = 0 + cursor = 0.0 + frame_index = high_index = 0 + blocker_by_order: dict[int, tuple[AgePolicyPacket, float]] = {} + + def drop_frame(frame: VideoFrameGroup, reason: str) -> None: + dropped.append(FrameDrop(frame, cursor, reason)) + + def admit(now: float, active_packet: AgePolicyPacket | None = None, active_end: float = 0.0) -> None: + nonlocal frame_index, high_index + while high_index < len(high_arrivals) and high_arrivals[high_index].available_time_seconds <= now + TIME_EPSILON_SECONDS: + item = high_arrivals[high_index] + high_index += 1 + if active_packet is not None and item.available_time_seconds > cursor + TIME_EPSILON_SECONDS: + blocker_by_order[item.arrival_order] = ( + active_packet, + max(0.0, active_end - item.available_time_seconds), + ) + _replace_state(ready_high, item, replacements) + while frame_index < len(frame_arrivals) and frame_arrivals[frame_index].generation_time_seconds <= now + TIME_EPSILON_SECONDS: + frame = frame_arrivals[frame_index] + frame_index += 1 + if policy is FramePolicy.LATEST_ONLY: + for old in pending_frames: + drop_frame(old, "replaced_by_newest") + pending_frames[:] = [frame] + elif policy is FramePolicy.TWO_WAITING: + pending_frames.append(frame) + while len(pending_frames) > 2: + drop_frame(pending_frames.pop(0), "waiting_limit") + else: + pending_frames.append(frame) + + while ( + frame_index < len(frame_arrivals) + or high_index < len(high_arrivals) + or ready_high + or pending_frames + or active is not None + ): + if not ready_high and not pending_frames and active is None: + next_times = [] + if frame_index < len(frame_arrivals): + next_times.append(frame_arrivals[frame_index].generation_time_seconds) + if high_index < len(high_arrivals): + next_times.append(high_arrivals[high_index].available_time_seconds) + cursor = max(cursor, min(next_times)) + admit(cursor) + + selected: AgePolicyPacket | None = None + if ready_high: + selected = min( + ready_high, + key=lambda item: (int(item.packet.traffic_class), item.arrival_order), + ) + ready_high.remove(selected) + else: + if active is None: + while pending_frames and active is None: + candidate = pending_frames.pop(0) + deadline = policy.deadline_seconds + if deadline is not None: + future_high = high_arrivals[high_index:] + predicted = predict_frame_completion( + cursor, + candidate, + channel_bitrate_bps, + tuple(ready_high), + future_high, + ) + if predicted - candidate.generation_time_seconds > deadline + TIME_EPSILON_SECONDS: + drop_frame(candidate, "prediction_reject") + continue + predicted_by_frame[candidate.composite_frame_id] = predicted + active = candidate + active_index = 0 + started.append(active.composite_frame_id) + if active is not None: + selected = active.packets[active_index] + + if selected is None: + continue + start = max(cursor, selected.available_time_seconds) + wire_packet = encode_link_packet(selected.packet) + end = start + transmission_duration_seconds(len(wire_packet), channel_bitrate_bps) + cursor = start + admit(end, selected, end) + blocker, blocking_delay = blocker_by_order.get(selected.arrival_order, (None, 0.0)) + transmitted.append( + FrameScheduledPacket(selected, start, end, blocker, blocking_delay, wire_packet) + ) + cursor = end + if selected.packet.traffic_class is TrafficClass.VIDEO: + assert active is not None + active_index += 1 + if active_index == len(active.packets): + completed.append(active.composite_frame_id) + actual_by_frame[active.composite_frame_id] = end + active = None + active_index = 0 + + admissions = tuple( + FrameAdmission(frame_id, predicted, actual_by_frame[frame_id]) + for frame_id, predicted in sorted(predicted_by_frame.items()) + ) + return FrameScheduleResult( + policy=policy, + channel_bitrate_bps=channel_bitrate_bps, + transmitted=tuple(transmitted), + dropped_frames=tuple(dropped), + replacements=tuple(replacements), + started_frame_ids=tuple(started), + completed_frame_ids=tuple(completed), + admissions=admissions, + ) diff --git a/tests/lab035_video_frame_admission.py b/tests/lab035_video_frame_admission.py new file mode 100644 index 0000000..98ed805 --- /dev/null +++ b/tests/lab035_video_frame_admission.py @@ -0,0 +1,748 @@ +"""Lab035: predictive admission and whole-frame video service.""" + +from __future__ import annotations + +import csv +from dataclasses import asdict, dataclass +from pathlib import Path +import subprocess +from typing import Iterable + +import cv2 +import matplotlib +import numpy as np + +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +from protocol.link_packet import HEADER_SIZE, TrafficClass, decode_link_packet +from protocol.packet_erasure_fec import decode_fec_block, decode_outer_symbol +from protocol.video_frame_scheduler import ( + FramePolicy, + FrameScheduleResult, + VideoFrameGroup, + predict_frame_completion, + schedule_video_frames, +) +from protocol.video_packet import CompositeReassembler, decode_packet as decode_inner_packet +from tests.lab028_video_packetization import COMPOSITE_FPS +from tests.lab034_stale_video_drop import ( + PolicyDefinition as Lab034Policy, + build_aligned_workload, + build_lab033_workload, + percentile, + simulate_aligned, +) + + +OUTPUT_DIRECTORY = Path("data/processed/lab035") +SUMMARY_CSV_PATH = OUTPUT_DIRECTORY / "lab035_summary.csv" +VIDEO_CSV_PATH = OUTPUT_DIRECTORY / "lab035_video_metrics.csv" +CONTROL_CSV_PATH = OUTPUT_DIRECTORY / "lab035_control_metrics.csv" +PREDICTION_CSV_PATH = OUTPUT_DIRECTORY / "lab035_prediction_metrics.csv" +REPORT_PATH = OUTPUT_DIRECTORY / "lab035_report.txt" +UPDATE_PLOT_PATH = OUTPUT_DIRECTORY / "lab035_update_rate.png" +AGE_PLOT_PATH = OUTPUT_DIRECTORY / "lab035_image_age.png" +PUBLICATION_PLOT_PATH = OUTPUT_DIRECTORY / "lab035_publication_delay.png" +OUTCOME_PLOT_PATH = OUTPUT_DIRECTORY / "lab035_frame_outcomes.png" +QUEUE_PLOT_PATH = OUTPUT_DIRECTORY / "lab035_queue_size.png" +PREDICTION_PLOT_PATH = OUTPUT_DIRECTORY / "lab035_prediction_accuracy.png" +CONTROL_PLOT_PATH = OUTPUT_DIRECTORY / "lab035_control_delay.png" +COMPARISON_PLOT_PATH = OUTPUT_DIRECTORY / "lab035_policy_comparison.png" +PLOT_PATHS = ( + UPDATE_PLOT_PATH, + AGE_PLOT_PATH, + PUBLICATION_PLOT_PATH, + OUTCOME_PLOT_PATH, + QUEUE_PLOT_PATH, + PREDICTION_PLOT_PATH, + CONTROL_PLOT_PATH, + COMPARISON_PLOT_PATH, +) +LAB034_COMMIT = "b63e36abdb7031d642de8b8138b43cc29e94b759" +CHANNEL_RATES_KBPS = (300.0, 260.0, 230.0) +TIME_EPSILON_SECONDS = 1e-9 + + +@dataclass(frozen=True) +class PolicyDefinition: + name: str + label: str + scheduler_policy: FramePolicy | None + reactive: bool = False + + +POLICIES = ( + PolicyDefinition("no_drop", "Без удаления", FramePolicy.NO_DROP), + PolicyDefinition("reactive_1500ms", "Реактивная 1500 мс", None, True), + PolicyDefinition("latest_only", "Самый свежий", FramePolicy.LATEST_ONLY), + PolicyDefinition("two_waiting", "Два ожидающих", FramePolicy.TWO_WAITING), + PolicyDefinition("predict_1000ms", "Прогноз 1000 мс", FramePolicy.PREDICT_1000MS), + PolicyDefinition("predict_500ms", "Прогноз 500 мс", FramePolicy.PREDICT_500MS), +) +POLICY_BY_NAME = {policy.name: policy for policy in POLICIES} + + +@dataclass(frozen=True) +class TheoreticalCapacity: + channel_kbps: float + nonvideo_load_kbps: float + remaining_video_kbps: float + video_capacity_ratio: float + minimum_skip_fraction: float + maximum_update_fps: float + + +@dataclass(frozen=True) +class SummaryMetrics: + channel_kbps: float + policy: str + offered_load_kbps: float + offered_to_capacity_ratio: float + transmitted_packets: int + transmitted_bytes: int + dropped_before_start_packets: int + dropped_before_start_bytes: int + wasted_transmitted_bytes: int + mean_queue_packets: float + max_queue_packets: int + mean_queue_bytes: float + max_queue_bytes: int + mean_waiting_video_frames: float + max_waiting_video_frames: int + queue_at_source_end_packets: int + additional_drain_seconds: float + remaining_video_capacity_kbps: float + theoretical_minimum_skip_fraction: float + theoretical_maximum_update_fps: float + + +@dataclass(frozen=True) +class VideoMetrics: + channel_kbps: float + policy: str + created_frames: int + started_frames: int + published_frames: int + dropped_before_start_frames: int + partially_transmitted_cancelled_frames: int + published_fraction: float + actual_update_fps: float + mean_publication_delay_ms: float + p95_publication_delay_ms: float + max_publication_delay_ms: float + mean_display_age_ms: float + p95_display_age_ms: float + max_display_age_ms: float + display_age_over_500ms_fraction: float + display_age_over_1000ms_fraction: float + mean_no_update_duration_ms: float + p95_no_update_duration_ms: float + max_no_update_duration_ms: float + mean_missing_run_frames: float + p95_missing_run_frames: float + max_missing_run_frames: int + mean_publication_gap_ms: float + max_publication_gap_ms: float + transmitted_video_bytes: int + dropped_before_start_video_bytes: int + wasted_transmitted_video_bytes: int + delivered_useful_video_kbps: float + + +@dataclass(frozen=True) +class ControlMetrics: + channel_kbps: float + policy: str + control_p95_delay_ms: float + control_max_delay_ms: float + control_deadline_misses: int + control_max_receive_gap_ms: float + emergency_delay_ms: float + emergency_deadline_met: bool + emergency_blocker_class: str + emergency_blocking_delay_ms: float + telemetry_deadline_misses: int + + +@dataclass(frozen=True) +class PredictionMetrics: + channel_kbps: float + policy: str + admitted_frames: int + prediction_rejected_frames: int + mean_absolute_error_ms: float + p95_absolute_error_ms: float + max_absolute_error_ms: float + published_after_deadline_frames: int + false_rejections: int + + +@dataclass(frozen=True) +class ScenarioResult: + summary: SummaryMetrics + video: VideoMetrics + control: ControlMetrics + prediction: PredictionMetrics + publication_times: dict[int, float] + schedule: FrameScheduleResult | None + + +@dataclass(frozen=True) +class FunctionalTestResult: + name: str + passed: bool + detail: str + + +def build_frame_groups(aligned) -> tuple[VideoFrameGroup, ...]: + grouped: dict[int, list] = {} + for item in aligned.packets: + if item.composite_frame_id is not None: + grouped.setdefault(item.composite_frame_id, []).append(item) + return tuple( + VideoFrameGroup( + composite_frame_id=frame_id, + generation_time_us=packets[0].packet.generation_time_us, + packets=tuple(sorted(packets, key=lambda item: item.packet.sequence_number)), + ) + for frame_id, packets in sorted(grouped.items()) + ) + + +def high_priority_packets(aligned) -> tuple: + return tuple( + item for item in aligned.packets + if item.packet.traffic_class is not TrafficClass.VIDEO + ) + + +def theoretical_capacity(aligned, rate: float) -> TheoreticalCapacity: + duration = aligned.lab033.metadata.duration_seconds + nonvideo_bytes = sum( + item.wire_size_bytes for item in aligned.packets + if item.packet.traffic_class is not TrafficClass.VIDEO + ) + nonvideo_kbps = nonvideo_bytes * 8.0 / duration / 1000.0 + video_kbps = aligned.layout_metrics.after_link_kbps + remaining = max(0.0, rate - nonvideo_kbps) + ratio = remaining / video_kbps + skip = max(0.0, 1.0 - ratio) + return TheoreticalCapacity( + rate, + nonvideo_kbps, + remaining, + ratio, + skip, + COMPOSITE_FPS * min(1.0, ratio), + ) + + +def receive_whole_frames(schedule: FrameScheduleResult) -> dict[int, float]: + dropped = {item.frame.composite_frame_id for item in schedule.dropped_frames} + receiver = CompositeReassembler() + publication_times: dict[int, float] = {} + symbols_by_block: dict[int, list[bytes]] = {} + decoded_blocks: set[int] = set() + for sent in schedule.transmitted: + link = decode_link_packet(sent.wire_packet) + if link.traffic_class is not TrafficClass.VIDEO: + continue + frame_id = sent.item.composite_frame_id + assert frame_id is not None and frame_id not in dropped + outer = decode_outer_symbol(link.payload) + symbols = symbols_by_block.setdefault(outer.block_id, []) + symbols.append(link.payload) + if not outer.is_parity: + completed = receiver.ingest(outer.data) + if completed is not None: + publication_times[completed.composite_frame_id] = sent.end_seconds + if outer.block_id not in decoded_blocks and len(symbols) >= outer.source_count: + decoded = decode_fec_block(tuple(symbols)) + for inner in decoded.source_packets: + decode_inner_packet(inner) + decoded_blocks.add(outer.block_id) + if set(publication_times) != set(schedule.completed_frame_ids): + raise AssertionError("published frames differ from completed whole frames") + return publication_times + + +def display_and_gap_metrics(publications: dict[int, float], source_end: float): + events = sorted((time, frame) for frame, time in publications.items() if time <= source_end + TIME_EPSILON_SECONDS) + samples = np.arange(0.0, source_end + 0.005, 0.01) + ages = [] + index = 0 + last_frame = None + for time in samples: + while index < len(events) and events[index][0] <= time: + last_frame = events[index][1]; index += 1 + generation = 0.0 if last_frame is None else last_frame / COMPOSITE_FPS + ages.append(max(0.0, time - generation)) + update_times = [0.0] + [time for time, _ in events] + [source_end] + no_update = tuple(max(0.0, right - left) for left, right in zip(update_times, update_times[1:])) + publication_gaps = tuple(right[0] - left[0] for left, right in zip(events, events[1:])) + return ages, no_update, publication_gaps + + +def missing_runs(frame_count: int, published: set[int]) -> tuple[int, ...]: + runs = [] + current = 0 + for frame_id in range(frame_count): + if frame_id not in published: + current += 1 + elif current: + runs.append(current); current = 0 + if current: + runs.append(current) + return tuple(runs) + + +def queue_metrics(schedule: FrameScheduleResult, frames, source_end: float): + intervals = [] + first_start: dict[int, float] = {} + for sent in schedule.transmitted: + intervals.append((sent.item.available_time_seconds, sent.end_seconds, sent.item.wire_size_bytes)) + if sent.item.composite_frame_id is not None: + first_start.setdefault(sent.item.composite_frame_id, sent.start_seconds) + drop_time = {item.frame.composite_frame_id: item.drop_time_seconds for item in schedule.dropped_frames} + for item in schedule.dropped_frames: + for packet in item.frame.packets: + intervals.append((packet.available_time_seconds, item.drop_time_seconds, packet.wire_size_bytes)) + for item in schedule.replacements: + intervals.append((item.removed.available_time_seconds, item.time_seconds, item.removed.wire_size_bytes)) + packet_area = byte_area = 0.0 + events: dict[float, list[int]] = {} + remaining = 0 + for start, end, size in intervals: + if start <= source_end + TIME_EPSILON_SECONDS < end - TIME_EPSILON_SECONDS: + remaining += 1 + left, right = max(0.0, start), min(source_end, end) + if right <= left + TIME_EPSILON_SECONDS: + continue + packet_area += right - left; byte_area += (right - left) * size + events.setdefault(left, [0, 0])[0] += 1; events[left][1] += size + events.setdefault(right, [0, 0])[0] -= 1; events[right][1] -= size + count = size_now = max_count = max_size = 0 + for time in sorted(events): + count += events[time][0]; size_now += events[time][1] + max_count = max(max_count, count); max_size = max(max_size, size_now) + frame_intervals = [] + for frame in frames: + end = first_start.get(frame.composite_frame_id, drop_time.get(frame.composite_frame_id, source_end)) + frame_intervals.append((frame.generation_time_seconds, end)) + frame_area = 0.0; frame_events: dict[float, int] = {} + for start, end in frame_intervals: + left, right = max(0.0, start), min(source_end, end) + if right <= left + TIME_EPSILON_SECONDS: continue + frame_area += right - left + frame_events[left] = frame_events.get(left, 0) + 1 + frame_events[right] = frame_events.get(right, 0) - 1 + waiting = max_waiting = 0 + for time in sorted(frame_events): + waiting += frame_events[time]; max_waiting = max(max_waiting, waiting) + finish = max([source_end] + [item.end_seconds for item in schedule.transmitted] + [item.drop_time_seconds for item in schedule.dropped_frames]) + return ( + packet_area / source_end, max_count, byte_area / source_end, max_size, + frame_area / source_end, max_waiting, remaining, max(0.0, finish - source_end), + ) + + +def control_metrics(schedule: FrameScheduleResult, rate: float, policy: str) -> ControlMetrics: + by_class = { + traffic: [item for item in schedule.transmitted if item.item.packet.traffic_class is traffic] + for traffic in (TrafficClass.CONTROL, TrafficClass.EMERGENCY, TrafficClass.TELEMETRY) + } + control = by_class[TrafficClass.CONTROL] + control_delays = [item.end_seconds - item.item.packet.generation_time_us / 1_000_000.0 for item in control] + gaps = [right.end_seconds - left.end_seconds for left, right in zip(control, control[1:])] + telemetry_delays = [item.end_seconds - item.item.packet.generation_time_us / 1_000_000.0 for item in by_class[TrafficClass.TELEMETRY]] + emergency = by_class[TrafficClass.EMERGENCY] + if len(emergency) != 1: raise AssertionError("exactly one emergency command is required") + urgent = emergency[0] + urgent_delay = urgent.end_seconds - urgent.item.packet.generation_time_us / 1_000_000.0 + return ControlMetrics( + rate, policy, + percentile(control_delays, 95) * 1000.0, + max(control_delays) * 1000.0, + sum(delay > 0.1 + TIME_EPSILON_SECONDS for delay in control_delays), + max(gaps, default=0.0) * 1000.0, + urgent_delay * 1000.0, + urgent_delay <= 0.05 + TIME_EPSILON_SECONDS, + urgent.blocked_by.packet.traffic_class.name.lower() if urgent.blocked_by else "none", + urgent.blocking_delay_seconds * 1000.0, + sum(delay > 0.5 + TIME_EPSILON_SECONDS for delay in telemetry_delays), + ) + + +def video_metrics(aligned, schedule, publications, rate, policy): + source_end = aligned.lab033.metadata.duration_seconds + published = set(publications) + dropped = {item.frame.composite_frame_id for item in schedule.dropped_frames} + delays = [publications[frame] - frame / COMPOSITE_FPS for frame in sorted(published)] + ages, no_update, publication_gaps = display_and_gap_metrics(publications, source_end) + runs = missing_runs(len(aligned.lab033.composites), published) + transmitted_video_bytes = sum( + len(item.wire_packet) for item in schedule.transmitted + if item.item.packet.traffic_class is TrafficClass.VIDEO + ) + dropped_bytes = sum(item.frame.wire_size_bytes for item in schedule.dropped_frames) + useful = sum( + len(aligned.lab033.composites[frame].base_jpeg) + len(aligned.lab033.composites[frame].roi_jpeg) + for frame in published + ) + return VideoMetrics( + rate, policy, len(aligned.lab033.composites), len(schedule.started_frame_ids), + len(published), len(dropped), 0, len(published) / len(aligned.lab033.composites), + sum(time <= source_end + TIME_EPSILON_SECONDS for time in publications.values()) / source_end, + float(np.mean(delays)) * 1000.0 if delays else 0.0, + percentile(delays, 95) * 1000.0, max(delays, default=0.0) * 1000.0, + float(np.mean(ages)) * 1000.0, percentile(ages, 95) * 1000.0, + max(ages, default=0.0) * 1000.0, + sum(age > 0.5 for age in ages) / len(ages), + sum(age > 1.0 for age in ages) / len(ages), + float(np.mean(no_update)) * 1000.0, percentile(no_update, 95) * 1000.0, + max(no_update, default=0.0) * 1000.0, + float(np.mean(runs)) if runs else 0.0, percentile(runs, 95), max(runs, default=0), + float(np.mean(publication_gaps)) * 1000.0 if publication_gaps else 0.0, + max(publication_gaps, default=0.0) * 1000.0, + transmitted_video_bytes, dropped_bytes, 0, + useful * 8.0 / source_end / 1000.0, + ) + + +def prediction_metrics(schedule, rate, policy): + errors = [abs(item.prediction_error_seconds) for item in schedule.admissions] + deadline = schedule.policy.deadline_seconds + rejected = [item for item in schedule.dropped_frames if item.reason == "prediction_reject"] + late = sum( + item.actual_completion_seconds - item.composite_frame_id / COMPOSITE_FPS + > deadline + TIME_EPSILON_SECONDS + for item in schedule.admissions + ) if deadline is not None else 0 + return PredictionMetrics( + rate, policy, len(schedule.admissions), len(rejected), + float(np.mean(errors)) * 1000.0 if errors else 0.0, + percentile(errors, 95) * 1000.0, max(errors, default=0.0) * 1000.0, + late, 0, + ) + + +def whole_frame_result(aligned, frames, high, rate, policy_def): + schedule = schedule_video_frames(frames, high, policy_def.scheduler_policy, rate * 1000.0) + publications = receive_whole_frames(schedule) + video = video_metrics(aligned, schedule, publications, rate, policy_def.name) + control = control_metrics(schedule, rate, policy_def.name) + prediction = prediction_metrics(schedule, rate, policy_def.name) + source_end = aligned.lab033.metadata.duration_seconds + qp, qmax, qb, qbmax, fq, fqmax, remaining, drain = queue_metrics(schedule, frames, source_end) + capacity = theoretical_capacity(aligned, rate) + offered_bytes = sum(item.wire_size_bytes for item in aligned.packets) + summary = SummaryMetrics( + rate, policy_def.name, + offered_bytes * 8.0 / source_end / 1000.0, + offered_bytes * 8.0 / source_end / (rate * 1000.0), + len(schedule.transmitted), sum(len(item.wire_packet) for item in schedule.transmitted), + sum(len(item.frame.packets) for item in schedule.dropped_frames), + sum(item.frame.wire_size_bytes for item in schedule.dropped_frames), 0, + qp, qmax, qb, qbmax, fq, fqmax, remaining, drain, + capacity.remaining_video_kbps, capacity.minimum_skip_fraction, + capacity.maximum_update_fps, + ) + return ScenarioResult(summary, video, control, prediction, publications, schedule) + + +def reactive_result(aligned, rate): + old_policy = Lab034Policy("aligned_1500ms", "По кадрам, 1500 мс", "aligned", 1500) + old = simulate_aligned(aligned, rate, old_policy) + capacity = theoretical_capacity(aligned, rate) + s, v, c = old.summary, old.video, old.control + source_end = aligned.lab033.metadata.duration_seconds + dropped_frames = set(old.dropped_frames) + partial_frames = { + frame_id for frame_id in dropped_frames + if old.transmitted_video_by_frame.get(frame_id, 0) > 0 + } + before_start_frames = dropped_frames - partial_frames + dropped_before_packets = [ + item for item in old.schedule.dropped_video + if item.item.composite_frame_id in before_start_frames + ] + first_start = {} + for item in old.schedule.transmitted: + if item.item.composite_frame_id is not None: + first_start.setdefault(item.item.composite_frame_id, item.start_seconds) + frame_drop_time = {} + for item in old.schedule.dropped_video: + assert item.item.composite_frame_id is not None + frame_drop_time.setdefault(item.item.composite_frame_id, item.drop_time_seconds) + frame_events = {} + frame_area = 0.0 + for frame_id in range(len(aligned.lab033.composites)): + start = frame_id / COMPOSITE_FPS + end = first_start.get(frame_id, frame_drop_time.get(frame_id, start)) + left, right = max(0.0, start), min(source_end, end) + if right <= left + TIME_EPSILON_SECONDS: + continue + frame_area += right - left + frame_events[left] = frame_events.get(left, 0) + 1 + frame_events[right] = frame_events.get(right, 0) - 1 + waiting = max_waiting = 0 + for time in sorted(frame_events): + waiting += frame_events[time] + max_waiting = max(max_waiting, waiting) + publication_events = sorted(old.publication_times.values()) + publication_gaps = [ + right - left for left, right in zip(publication_events, publication_events[1:]) + ] + summary = SummaryMetrics( + rate, "reactive_1500ms", s.offered_load_kbps, s.offered_to_capacity_ratio, + s.transmitted_packets, s.transmitted_bytes, + len(dropped_before_packets), + sum(item.item.wire_size_bytes for item in dropped_before_packets), + s.wasted_transmitted_bytes, s.mean_queue_packets, s.max_queue_packets, + s.mean_queue_bytes, s.max_queue_bytes, + frame_area / source_end, max_waiting, + s.queue_at_source_end_packets, s.additional_drain_seconds, + capacity.remaining_video_kbps, capacity.minimum_skip_fraction, + capacity.maximum_update_fps, + ) + video = VideoMetrics( + rate, "reactive_1500ms", v.created_frames, + v.published_frames + v.partially_transmitted_cancelled_frames, + v.published_frames, + v.intentionally_dropped_frames - v.partially_transmitted_cancelled_frames, + v.partially_transmitted_cancelled_frames, + v.published_fraction, v.actual_update_fps, + v.mean_publication_delay_ms, v.p95_publication_delay_ms, v.max_publication_delay_ms, + v.mean_display_age_ms, v.p95_display_age_ms, v.max_display_age_ms, + v.display_age_over_500ms_fraction, v.display_age_over_1000ms_fraction, + v.mean_no_update_duration_ms, v.p95_no_update_duration_ms, v.max_no_update_duration_ms, + v.mean_missing_run_frames, v.p95_missing_run_frames, v.max_missing_run_frames, + float(np.mean(publication_gaps)) * 1000.0 if publication_gaps else 0.0, + max(publication_gaps, default=0.0) * 1000.0, + sum(len(item.wire_packet) for item in old.schedule.transmitted if item.item.packet.traffic_class is TrafficClass.VIDEO), + 0, v.wasted_transmitted_video_bytes, v.delivered_useful_video_kbps, + ) + control = ControlMetrics( + rate, "reactive_1500ms", c.control_p95_age_ms, c.control_max_age_ms, + c.control_deadline_misses, c.control_max_receive_gap_ms, + c.emergency_total_delay_ms, c.emergency_deadline_met, + c.emergency_blocker_class, c.emergency_blocking_delay_ms, + c.telemetry_deadline_misses, + ) + prediction = PredictionMetrics(rate, "reactive_1500ms", 0, 0, 0.0, 0.0, 0.0, 0, 0) + return ScenarioResult(summary, video, control, prediction, old.publication_times, None) + + +def run_experiment(aligned, frames, high): + results = [] + for rate in CHANNEL_RATES_KBPS: + for policy in POLICIES: + results.append( + reactive_result(aligned, rate) + if policy.reactive + else whole_frame_result(aligned, frames, high, rate, policy) + ) + return tuple(results) + + +def run_functional_tests(aligned, frames, high, results): + lookup = {(r.summary.channel_kbps, r.summary.policy): r for r in results} + checks = [] + def check(name): + def decorator(function): checks.append((name, function)); return function + return decorator + + whole = [result for result in results if result.schedule is not None] + + @check("01_video_frames_do_not_interleave") + def _(): + for result in whole: + sequence = [item.item.composite_frame_id for item in result.schedule.transmitted if item.item.composite_frame_id is not None] + compressed = [frame for index, frame in enumerate(sequence) if index == 0 or frame != sequence[index - 1]] + assert len(compressed) == len(set(compressed)) + + @check("02_started_frame_never_dropped") + def _(): + for result in whole: + assert not (set(result.schedule.started_frame_ids) & {item.frame.composite_frame_id for item in result.schedule.dropped_frames}) + + @check("03_high_priority_between_frame_packets") + def _(): + assert any( + any(item.item.packet.traffic_class is not TrafficClass.VIDEO for item in result.schedule.transmitted[left + 1:right]) + for result in whole + for left, right in zip( + [i for i, item in enumerate(result.schedule.transmitted) if item.item.composite_frame_id is not None][:-1], + [i for i, item in enumerate(result.schedule.transmitted) if item.item.composite_frame_id is not None][1:], + ) + if result.schedule.transmitted[left].item.composite_frame_id == result.schedule.transmitted[right].item.composite_frame_id + ) + + @check("04_latest_drops_only_unstarted") + def _(): + for rate in CHANNEL_RATES_KBPS: + result = lookup[(rate, "latest_only")] + assert not (set(result.schedule.started_frame_ids) & {item.frame.composite_frame_id for item in result.schedule.dropped_frames}) + + @check("05_two_waiting_limit") + def _(): assert all(lookup[(rate, "two_waiting")].summary.max_waiting_video_frames <= 2 for rate in CHANNEL_RATES_KBPS) + + @check("06_prediction_is_pure") + def _(): + ready = list(high[:2]); future = list(high[2:20]); ready_before=list(ready); future_before=list(future) + predict_frame_completion(0.0, frames[0], 230_000.0, ready, future) + assert ready == ready_before and future == future_before + + @check("07_prediction_uses_actual_sizes") + def _(): + small = VideoFrameGroup(999, 0, (frames[0].packets[0],)) + full = predict_frame_completion(0.0, frames[0], 300_000.0, (), ()) + one = predict_frame_completion(0.0, small, 300_000.0, (), ()) + assert full > one and abs(one - small.wire_size_bytes * 8.0 / 300_000.0) < 1e-12 + + @check("08_prestart_drop_has_no_waste") + def _(): assert all(result.video.wasted_transmitted_video_bytes == 0 for result in whole) + + @check("09_partial_only_reactive") + def _(): + assert all(result.video.partially_transmitted_cancelled_frames == 0 for result in whole) + assert lookup[(230.0, "reactive_1500ms")].video.partially_transmitted_cancelled_frames > 0 + + @check("10_incomplete_not_published") + def _(): + for result in whole: + dropped = {item.frame.composite_frame_id for item in result.schedule.dropped_frames} + assert not (dropped & set(result.publication_times)) + + @check("11_crc_layers_pass") + def _(): assert all(result.video.published_frames == len(result.publication_times) for result in results) + + @check("12_emergency_never_deleted") + def _(): assert all(result.control.emergency_deadline_met for result in results) + + @check("13_priority_above_video") + def _(): assert all(result.control.control_deadline_misses == 0 and result.control.telemetry_deadline_misses == 0 for result in results) + + @check("14_300kbps_no_unnecessary_loss") + def _(): assert all(lookup[(300.0, policy.name)].video.published_frames == 63 for policy in POLICIES) + + @check("15_230kbps_bounded_queue") + def _(): + baseline = lookup[(230.0, "no_drop")].summary.max_queue_packets + assert all(lookup[(230.0, name)].summary.max_queue_packets < baseline for name in ("latest_only", "two_waiting", "predict_1000ms", "predict_500ms")) + + @check("16_frame_accounting") + def _(): + for result in results: + assert result.video.published_frames + result.video.dropped_before_start_frames + result.video.partially_transmitted_cancelled_frames == 63 + + @check("17_byte_accounting") + def _(): + for result in whole: + assert result.summary.transmitted_bytes == sum(len(item.wire_packet) for item in result.schedule.transmitted) + assert result.summary.dropped_before_start_bytes == sum(item.frame.wire_size_bytes for item in result.schedule.dropped_frames) + + @check("18_reproducible") + def _(): + original = lookup[(230.0, "predict_1000ms")].schedule + repeated = schedule_video_frames(frames, high, FramePolicy.PREDICT_1000MS, 230_000.0) + assert [(x.item.arrival_order,x.start_seconds,x.end_seconds) for x in original.transmitted] == [(x.item.arrival_order,x.start_seconds,x.end_seconds) for x in repeated.transmitted] + + @check("19_predict_1000_never_known_late") + def _(): assert all(lookup[(rate, "predict_1000ms")].prediction.published_after_deadline_frames == 0 for rate in CHANNEL_RATES_KBPS) + + @check("20_command_delay_bound") + def _(): + lab033 = {} + with Path("data/processed/lab033/lab033_summary.csv").open(encoding="utf-8") as file: + for row in csv.DictReader(file): + if row["scheduler"] == "latest_state": lab033[float(row["channel_kbps"])] = float(row["control_max_age_ms"]) + max_video_bytes = max(packet.wire_size_bytes for frame in frames for packet in frame.packets) + for result in results: + bound = lab033[result.summary.channel_kbps] + max_video_bytes * 8.0 / (result.summary.channel_kbps * 1000.0) * 1000.0 + assert result.control.control_max_delay_ms <= bound + 1e-9 + + output=[] + for name,function in checks: + try: function(); output.append(FunctionalTestResult(name,True,"PASS")) + except Exception as error: output.append(FunctionalTestResult(name,False,f"{type(error).__name__}: {error}")) + if not all(item.passed for item in output): raise AssertionError("functional checks failed: "+", ".join(item.name for item in output if not item.passed)) + return tuple(output) + + +def save_csv(results): + OUTPUT_DIRECTORY.mkdir(parents=True, exist_ok=True) + for path, cls, rows in ( + (SUMMARY_CSV_PATH, SummaryMetrics, (r.summary for r in results)), + (VIDEO_CSV_PATH, VideoMetrics, (r.video for r in results)), + (CONTROL_CSV_PATH, ControlMetrics, (r.control for r in results)), + (PREDICTION_CSV_PATH, PredictionMetrics, (r.prediction for r in results)), + ): + with path.open("w",encoding="utf-8",newline="") as file: + writer=csv.DictWriter(file,fieldnames=list(cls.__dataclass_fields__)); writer.writeheader(); writer.writerows(asdict(row) for row in rows) + + +def grouped_plot(results,value,ylabel,title,path): + x=np.arange(len(CHANNEL_RATES_KBPS)); width=.13 + fig,axis=plt.subplots(figsize=(12,5.5)) + for index,policy in enumerate(POLICIES): + rows=[r for r in results if r.summary.policy==policy.name] + axis.bar(x+(index-2.5)*width,[value(r) for r in rows],width,label=policy.label) + axis.set_xticks(x,[f"{rate:.0f}" for rate in CHANNEL_RATES_KBPS]); axis.set_xlabel("Скорость, кбит/с"); axis.set_ylabel(ylabel); axis.set_title(title); axis.grid(axis="y",alpha=.3); axis.legend(fontsize=8); fig.tight_layout(); fig.savefig(path,dpi=150); plt.close(fig) + + +def save_plots(results): + grouped_plot(results,lambda r:r.video.actual_update_fps,"Обновлений/с","Фактическая частота обновления",UPDATE_PLOT_PATH) + grouped_plot(results,lambda r:r.video.p95_display_age_ms,"P95 возраста, мс","Возраст отображаемого изображения",AGE_PLOT_PATH) + grouped_plot(results,lambda r:r.video.p95_publication_delay_ms,"P95 задержки, мс","Задержка публикации",PUBLICATION_PLOT_PATH) + grouped_plot(results,lambda r:r.video.published_frames,"Кадров","Опубликованные кадры",OUTCOME_PLOT_PATH) + grouped_plot(results,lambda r:r.summary.max_queue_packets,"Пакетов","Максимальный размер очереди",QUEUE_PLOT_PATH) + grouped_plot(results,lambda r:r.prediction.p95_absolute_error_ms,"P95 ошибки, мс","Точность прогноза",PREDICTION_PLOT_PATH) + grouped_plot(results,lambda r:r.control.control_p95_delay_ms,"P95, мс","Задержка команд",CONTROL_PLOT_PATH) + grouped_plot(results,lambda r:r.video.dropped_before_start_frames,"Кадров","Сравнение политик упреждающего удаления",COMPARISON_PLOT_PATH) + + +def write_report(aligned,results,tests): + git_status=subprocess.run(("git","status","--short","--branch"),check=True,capture_output=True,text=True,encoding="utf-8").stdout.rstrip() + capacities={rate:theoretical_capacity(aligned,rate) for rate in CHANNEL_RATES_KBPS} + lines=[ + "Lab035. Упреждающий допуск видеокадров и обслуживание видео целыми кадрами","", + "1. Исходное состояние",f"- Commit Lab034: {LAB034_COMMIT}.","- Перед Lab035 рабочее дерево было чистым; main опережала origin/main на два commit.","", + "2. Правило обслуживания","- После первого видеопакета кадр становится активным и не удаляется.","- При повторном выборе видео передаётся следующий пакет активного кадра; команды и телеметрия могут передаваться между пакетами.","- Новый видеокадр начинается только после полного завершения активного; видеопакеты разных кадров не чередуются; отдельный пакет не прерывается.","- Только неактивные кадры могут быть удалены до передачи первого пакета.","", + "3. Теоретическая пропускная способность","speed | nonvideo kbps | remaining video kbps | remaining/aligned | minimum skip | maximum fps", + ] + for rate in CHANNEL_RATES_KBPS: + c=capacities[rate]; lines.append(f"{rate:.0f} | {c.nonvideo_load_kbps:.3f} | {c.remaining_video_kbps:.3f} | {c.video_capacity_ratio:.6f} | {c.minimum_skip_fraction:.6f} | {c.maximum_update_fps:.3f}") + lines.extend(["","4. Восемнадцать сочетаний","speed | policy | published/drop/partial | fps | age P95 ms | no-update max ms | queue max/waiting frames | waste bytes | prediction MAE/P95/max ms | control P95/max ms | emergency ms"]) + for r in results: + s,v,c,p=r.summary,r.video,r.control,r.prediction + lines.append(f"{s.channel_kbps:.0f} | {POLICY_BY_NAME[s.policy].label} | {v.published_frames}/{v.dropped_before_start_frames}/{v.partially_transmitted_cancelled_frames} | {v.actual_update_fps:.3f} | {v.p95_display_age_ms:.3f} | {v.max_no_update_duration_ms:.3f} | {s.max_queue_packets}/{s.max_waiting_video_frames} | {v.wasted_transmitted_video_bytes} | {p.mean_absolute_error_ms:.6f}/{p.p95_absolute_error_ms:.6f}/{p.max_absolute_error_ms:.6f} | {c.control_p95_delay_ms:.3f}/{c.control_max_delay_ms:.3f} | {c.emergency_delay_ms:.3f}") + lines.extend(["","5. Интерпретация","- Реактивная Lab034 начинает кадр без гарантии завершения, затем удаляет остаток: уже переданные байты становятся бесполезными, а обновление не публикуется.","- Удаление до первого пакета исключает бесполезную передачу; обслуживание целыми кадрами гарантирует, что начатый кадр будет опубликован.","- Политика самого свежего уменьшает задержку ожидающих данных, но удаляет больше промежуточных кадров; очередь из двух кадров сохраняет больше последовательных обновлений ценой возраста.","- Прогноз полного завершения учитывает весь размер кадра и будущую периодическую высокоприоритетную нагрузку, поэтому полезнее проверки только текущего возраста.","- В модели точно известны команды 20 Гц, телеметрия 10 Гц и аварийная команда 10,0 с; неизвестные будущие дискретные события не моделируются и в реальной системе потребовали бы запаса.","- При устойчивой перегрузке невозможно одновременно сохранить все кадры, исходное JPEG-качество и малую задержку; требуется уменьшить частоту, качество или заранее пропускать кадры.","- Частота обновления, возраст изображения и длительность отсутствия нового изображения оцениваются одновременно: оптимизация одного показателя может ухудшить остальные.","","6. Допущения","- Ошибки и помехи отсутствуют; один общий абстрактный ресурс, форматы Lab028-Lab034 неизменны, активный пакет не прерывается.","- Прогноз не изменяет настоящую очередь; для допущенных кадров сохраняются только агрегированные ошибки, без подробного журнала.","- Политика автоматически не выбирается.","","7. Функциональные проверки"]) + lines.extend(f"- {'PASS' if item.passed else 'FAIL'} {item.name}: {item.detail}" for item in tests) + lines.extend(["","8. Созданные файлы"]) + lines.extend(f"- {path.as_posix()}" for path in (Path("protocol/video_frame_scheduler.py"),Path("tests/lab035_video_frame_admission.py"),SUMMARY_CSV_PATH,VIDEO_CSV_PATH,CONTROL_CSV_PATH,PREDICTION_CSV_PATH,REPORT_PATH,*PLOT_PATHS)) + lines.extend(["","9. Итоговый Git status","- Lab035 не добавлена в индекс и не закоммичена.","",git_status]) + REPORT_PATH.write_text("\n".join(lines)+"\n",encoding="utf-8") + + +def validate_outputs(): + for path in (SUMMARY_CSV_PATH,VIDEO_CSV_PATH,CONTROL_CSV_PATH,PREDICTION_CSV_PATH): + with path.open(encoding="utf-8",newline="") as file: rows=list(csv.DictReader(file)) + if len(rows)!=18: raise AssertionError(f"{path} must contain 18 rows") + if "Lab035" not in REPORT_PATH.read_text(encoding="utf-8"): raise AssertionError("invalid report") + for path in PLOT_PATHS: + image=cv2.imread(str(path),cv2.IMREAD_UNCHANGED) + if image is None or image.size==0: raise AssertionError(f"OpenCV could not read {path}") + + +def main(): + lab033=build_lab033_workload(); aligned=build_aligned_workload(lab033) + frames=build_frame_groups(aligned); high=high_priority_packets(aligned) + results=run_experiment(aligned,frames,high) + tests=run_functional_tests(aligned,frames,high,results) + save_csv(results); save_plots(results); write_report(aligned,results,tests); validate_outputs() + print(f"Lab035 complete: {len(results)} scenarios, {len(tests)} checks") + + +if __name__=="__main__": main()