From edab87b5d20374a5fa2aea5f7e7eeed6e03c00bf Mon Sep 17 00:00:00 2001 From: LittleSam129 <1qwe432@gmail.com> Date: Wed, 29 Jul 2026 11:40:37 +0300 Subject: [PATCH] Lab030: add packet erasure FEC --- PROJECT_LOG.md | 21 + .../lab030/lab030_composite_success.png | Bin 0 -> 91374 bytes data/processed/lab030/lab030_delay_queue.png | Bin 0 -> 62213 bytes .../lab030/lab030_mode_comparison.png | Bin 0 -> 43253 bytes .../lab030/lab030_no_image_duration.png | Bin 0 -> 94867 bytes data/processed/lab030/lab030_report.txt | 87 + data/processed/lab030/lab030_results.csv | 17 + .../lab030/lab030_stream_rate_overhead.png | Bin 0 -> 63109 bytes protocol/packet_erasure_fec.py | 613 ++++++ tests/lab030_packet_erasure_fec.py | 1711 +++++++++++++++++ 10 files changed, 2449 insertions(+) create mode 100644 data/processed/lab030/lab030_composite_success.png create mode 100644 data/processed/lab030/lab030_delay_queue.png create mode 100644 data/processed/lab030/lab030_mode_comparison.png create mode 100644 data/processed/lab030/lab030_no_image_duration.png create mode 100644 data/processed/lab030/lab030_report.txt create mode 100644 data/processed/lab030/lab030_results.csv create mode 100644 data/processed/lab030/lab030_stream_rate_overhead.png create mode 100644 protocol/packet_erasure_fec.py create mode 100644 tests/lab030_packet_erasure_fec.py diff --git a/PROJECT_LOG.md b/PROJECT_LOG.md index 3f8a36d..aa6d4f6 100644 --- a/PROJECT_LOG.md +++ b/PROJECT_LOG.md @@ -96,3 +96,24 @@ git version 2.51.1.windows.1 - Payload 512 байт выбран для дальнейшей разработки. - Payload 1024 байта оставлен резервным вариантом. - Подтверждено, что без исправления ошибок возможны длительные прерывания видеопотока. + +--- + +# Запись 005 + +## Дата + +29 июля 2026 года + +## Тема + +Завершение Lab030: блочное исправление стираний. + +## Выполнено + +- Реализовано блочное исправление стираний над GF(256). +- Проверены режимы без исправления, 8+1, 8+2 и 8+4. +- Режим 8+2 выбран основным рабочим режимом. +- Режим 8+4 оставлен контрольным. +- Подтверждено, что без перемежения продолжительные серии потерь не исправляются. +- Следующая лабораторная посвящена перемежению пакетов. diff --git a/data/processed/lab030/lab030_composite_success.png b/data/processed/lab030/lab030_composite_success.png new file mode 100644 index 0000000000000000000000000000000000000000..ca1f27b640716ea66ddbd54e03779c173b4e460c GIT binary patch literal 91374 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

pTVkBYwC5)O3 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

eAY2we!8u!Mn%WvD<{4eS!6B~3# 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 literal 0 HcmV?d00001 diff --git a/data/processed/lab030/lab030_mode_comparison.png b/data/processed/lab030/lab030_mode_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ac51ce290848554d1031d1c84d4d289e9c4731 GIT binary patch literal 43253 zcmdqJS6GzU76piHn^D>-fOS5_PKvq{`~s2Y-^dAnATG+ zoKa+ATJegBY5C37EAeky<*PgKf5+|4s@o}98QD4N+ZZxk(zm;5Ze?d~a&5PRp^dGH zm8Fotae#P7}xXO+4LLNpPwXF-`l(E)pG4zw-U;#`bkBJbTw3 zQaR(lfA`)xl@l(jhVE=SwZ4dZPvpmOzj=plzSc{>UElO>d>~lrz(;;t<8+|}g|V)* z9bWpY@#*As>*6bkB?7jPOI20Pcz#*?ynW=DyypG?ylXc zSpH~NmhZh&aUzhK{YisgNE2E^6if}Wx7n-{ZouXoy+b$ zdL&}O9>{a#$mbm*<}Z3^w4gETyxiO!It32L$g^@AEWhP>+dnL2sOYcTw|zSc9Ayso z7HwZ#TpZ#s4wZEFiIRIB-KyZ`R`@yk(#{xnCue6?A>$h1A{Hj5u~k9{Kc^3Fi?ai4 z5)O%6aT*y$ZRv&&1+;TtH72MfxX_1XFJ5eTb@KMqWUY*Z`FMYS)Hz=^lfDm6H1lkt zrbpXj9&Q&L{@znMH#-ofQs7`gsY@wYj1QG^eJS$j^WqL<;hawhj*G)N@m^z-1$iKnjJf5#NKB1R;^Q{Oi-eY0z+_h`3b(}9=^tlqR%yXK$ zaoaYdckkbK(xs_Xs!#N#pthR&AHC%nhU~13IaYe@>UvH+EB5W*zrT8pS1noi)TvWG zArg)+MfNlO%&8b0pxs)w+?<|nt2(w&b8D#J;bGGYN6A--mppW+@^|`5`eCu8>E|Yin zHriOHEyd1EPdBaNblXjNaPQtHD!1I23+J|nXQf=GQWsnq)1$3NANi;kI3$(%aSBpQ zKfU_XWB$i^XIIyl)@U5dwlo88#MC9$%}j6dp6j|)OiyBwGOW2~2FRYh{cA-?Ky#9o z+NB_oXIu-5jPVD4ehMna^FMzeX#9hMf~05ro+|gxPW0C!g19IJ;-&`paL=V&fdpU*$zRTIc7DBx8Hm5f(O2sr1*ku*3s$UKwdIIe3y zRChK!JbYqmN*RG9?l>0wt@JOC1-cqV@yXt^Bqey;BX{r!3JOx{aI(g~u3jqd?ChM* z$VwU6ao**e&yGDj$Avj%JlwoE_ix>?BlgXk69pDc-dFJam+s%c&n9Xa%;7q6WX12l zf9USk!$GZA({qn{_wG#0f^NPYMP~l{?Y11Nl&|j}R+X2RPhTy|wrDqf|6r@hBVInf zk3Gu^-Q3)iU!PfHPiv|+ar$H9#wR_i%r$3(%v%n}*dtt{Qi|tf*Ru&*)!1 zo1KWGJl+3N$oLU+>CF~_2$pGCt3n=6&PVUc%M+C26ti87*yYZ3I16}UTN<&_&J%r4 z{QUe5DaXF@lUY1hddh7A(h^VdmIJi&BNT-CFY1J)V zG*QWWNUyli=G#XePEO9Pg1Xw(FOSvx^C;P&Bo%N7GVR`ZeUjOniHYOjOvdl!+x6U@ zj4k(;eRjz3%$YM{=3zE#9(8*#s=rT9JG9_Iy^nYRGNW>M>m8|yw~p-pRvqMp(_z8-m|-ZjwE2L%Fq`m=FH?@%IhH!T z_>UVHPJK_#*SY&m4b_(q?O3~AAlTAXR8-VptRpY3jYGymvUJ>n=Hazr*Kn%acvsOm z#D5+8`G?#1*`*_oM(CL-SQR#%&8rU)}PU8#;i5E`LBFw4tx!Dak4%2vH21i`^L`Z75c4*&}B^zdl>v;hi;)LdhE1 z>D=@83RELii}viskAXtml$4@r&3IN7BfotSB9;y3-o5a;ns{8 zZ5^Fs`hWj^DOl`C^^wAb>Go`IN1YN6o%4Pijd#{;-txyEukPIWy=ZPYK~`3_GSfhQ zs3A@%UM(dQ7$o_(6>D#FyX5bMsE1`cS7@RN=Y^O&PNdGdrL zifqfyc+}$yR4-=M*N9pH6$bFw4J1}1f+k>`hIkd;_wV0FNf?zLZYXkf0z zq9+Gx%_^weE;ycC6!I_kD}=f=_wJPOD4ZT?wQU|9YeW_?myw}2C~crA$6h{p+Kc%! zr{{e5@>LrKk($=Burv#n%)jb)Q0UVbCyI&B^=?m9De46qhp1o(Nh5-{1&OopW0@`);#85kJ&zIwI0{o}izKb^eYNxXY;?K^z< z(>-5bdv#*~zHHaacrOcBzfcdS z*XP9Q(y<{6KYRVs)%ggBsBg8_aOVpR4V@dwsAUgWm?>Gx(iwLwwlb;>O^S^@n3tDl z^7Y+)8(Ul3Ht&>_6!bD*?D&67^jFcE^*o>DOUzlwh)=Q8;d&mkXAweKyjr<8!{x)IlUA;0i?ti7lV_yX zysi$B$SGZwLaC#rlq4%g$x`a1s+qHo(p(C(YNcj^hZ_@~n--Lml#r82$+zi$u#Hds zagTJj`;3lGp3PYt&m8yZ>t2Y0%I@y&>9uRuDgufeGpXa+%Aq*Ov&XZeaIZH0yAaC4+wOzW9W?0<0o{%0&s5?T7IZ~vN@m`Hd1R0F8UO+gsS zW`v<6it)Qnw;FSEdrEnfdachMJ@+7G%y>%Qbtq8G`t_*U04afh-Sobv3d3j?)sVmG z^$Idkrg%mUE`H6-RM*u8vS{U1(Cl$j&~MqQ51?CP6TA6p^yD*3OUvw;^OY%AV`ezg zjxwJnT|A4-{3~ESB`V4KF$RU4B}sX$v*w;SqFn+D`55zQT64;Cu47hR9b+syJm}L~9$6smu)4g^P}Q|^$Fa}pkrqHDdMivi58TDytE(9u~$lmI71b6p9YR%B~6=?LpE*RycI<~P{>%E`HE0) zhOmUR-}ubjvq+i6pQjZk=s^b*IBZw0W%{7_`zI!*>(uYxZ$1;$(@iOyc%Yi79u62M zu47DZ%QBN^tXaMKg6%gI;5!SM^JmVqcuY@DW-PGp+!^#uT`3^O-0=WfjoI1R3N%Z5 z_Uv)_7HFJl(=Q9We*VajBQAi#nHKFL1^-k6X2#J?e1^(_M-A)vauz)l7cCRfbfy3S z-uU?9NL#UcL9%X9JhsAnA(GBPO1j0#hj;;dHej9cF{G!Ro1>-Fvl}eT(MJ~#+YHda z$F9A* zCrmS%PK!JcF&-2oYBfySg|a*V6XEi~@$r<=_8j9I!4eK5sSER9Y)tX1*`9)W#oCD3 zj1_7Uj$?%nBj&?Uh}W}=U8V|OeZ$m#vDYVkrSjALm(q3itzzM5AV=}bm#b2fABE)G zbpf`J{-0d;EU}B!&aOx(;?CUPL}l*|Voyu9Sm>~=?VMzG zG6oRgEuq`$7HEfNJg?$>G|)cwPu06 zx1yM@V+Z#X2ZYs4-$D2VG&YA&``C_N|Dcm2s1)sktPxWmqhQwa_g(6usB608c$bOC zsC56V+;|~_!H_V2zR^ezM>%3V&4+ye_&v+AQyiR$+0@|Yz@x>Pxw*Lqt-1s3M&#BdnujagO)bmX)`+w~z7Cy4@yynM*ID z@65FBJx3q>d>Wm;BB3?L#|33%N|?QCtV$NL`ETTbjgk)$kJ`$s8Vd%b4cXVUA@<3) zO&oFod}(H$0|}SIPvHnJ4-7tT+g7c6k@l>~yehLS62Md*%A6a!yaN`9p3vF(e&iQ@hFm-*(y?0>1Sk&yZc#W&h z+I>+3Z6Uor28)G4$VDNDu9K}61XBYdpl^6M9>jq5inUul#VN&@|9Smf;g7PNgggcu zvS4W{+@7SBqYC&s1?Xn_;qjh)htZedA)?T$Mz#uI@qlQbb44+{nQ5FG__sZ*e?|95 z$w{O(x$^DV^VWf-aI(uT28_Z5M1(4i`1tTlXrSWaBPD?~c0jQqlFo`$^X`K-TuH8R z^q)d5m%37rh7z!LZ5hUXAZ3Lu+Jv)A8xM6lfQ-9>ci@g%&|qU_jRUEEL3TmoC98W! zf@_h-!omUyt2AYa(eeBLa%y5mQgG4$F9mOzQ+-&r7TLsy6#3Iu8s{u7 zFnIUuIawVfs)izVv|)dOAL$!OYhIcTHp2|m0+nh!R**YCF7r95*T=`FVZ3C?qn07# z_A|B1bIF}jvCIHJ#LX?}e%Pk(f>sfL+o$PI#kX!Txziifs8r4iFP~U#N(AQtfD!Qi z+Gmjbx=58H}0h@XG#ECaLzO^H? zQOhWLUYgyI;`?{+F37rD$qs>?VG}a)iR?2}4wicJ*&NJC`a-Y`kB`4lP)MiTQz}*1 z_S?l6cP&3pz*hO^Q5T#qb@{z`vE!IUn=*RAr+6ALAq~ic%sDw80gGTxP2wN7bH;gUj6Po<{l8P8lo#$EU8Xue_lri}uhpqeDBf|iBOyyW-XpZ$;H zbDZx1DNMkGQzL33 zmDyQ7+;Qmm;)bu6i5)!+pxXeVhf;?nPbR69u{*lkb4f=fLA4Qee^)@*aoclXQ{qa~ z|6IPR?KkRJXF>ZjjqZKOIgUT+-({BOl}MY>w#xreON+YJ9}c2I_k`lFS5QfXitKC6 ze8llbKpmadY!3?KBIkKokQ~im9rgg-Y26Iih-M3|Z5?6hQu+GnU7$n?((xcX2M=CQ zoM?+{(s)nO3pA$#VQz{@G>ICgFV*9V9dn-R;%BfR-S@<&ii9ALU8C5yr+L+oy?}!M5u2`%#bR)X+r{pwSiO4n;opAy&F9+t2doIJW9Y7pgT?JDUmP`j zuyMzZ8yAjBN=o_^xz317dVyMRe-w_+s|;J?3(azeSySSXP^YhJv|8t9CwFB#T3a7^ zDQacu#u&{h1D^6h8{LaUS_YZY2bvr!mLrRfkJs4;9n#;LUB;tBH3pSoXlWuC+{!UP z8dDlCqWmWSmk)Mv2Rh|rSf;DG%!9eMT1oV4lG)WfH#pFwLHpgAgo zLg|CF&IZXLqtO|CgQD-ge%AyjP-XZnAM(J!Nx~%4l%oC|M35xaICi@~kM{#M05y}- z?a`hKq%mp_`OE-~r$g@&2!oK&T0D4^b4?fwsdm0y z#ZSg~i7#lORtIL(g`>~`73m~Hl{PjuKED3@%9U)T-YlXH<6Rco#cr+l9y~Y-%F*Ov zsATI696+M$X(N9pFOblXC_~&wf@imNpB~X5ypb1IFHp)w70V(=4LuSlK!%Eqax}*h z)F7=^XpN(lIE;p5OLCDly%<8wr8nv#?{`XFM|S)5#qgdxKrz46Pg4h@1f1Z5tR7?P zDbuWV4$bEKp@Ea<{Dk_Q*R5M8gv#%Oc-aYgrVM=)QIFZ6%4IhO3Y#dtT#!53(b2)~ zQ5;E^sJ!RT&`7_2zwZgNAe4(x$1p&%F4K}MsI5SIjRwn3C*-_JmgE1CDE+d5B0We!%U-m>}S*AXh_p+sh zanJRfoMCo;RfvJX&Vn3kaDmm+L*?*(TAVP`a_+Xw$-Jh4|G*KBb}mNWU=Bo9rq5vHbsgQCv3wAfq<;1K_4eX52vw=h z#i+i^%}+iuzY>}-t&jHI2wosQ3}>eGZmDB2`ep+@jdZT+v~%ar$2fC(PE;K5y}$W@ z5!vBNvqKSr#?89_c@jpky5L)kB9DhcrsFr#E9;Y5xZB2`OJh?_^XFO70jP#Vl8zf}*nq(wl%#>RyMAjT@i z$b;E<4y(XZBL?=^6x;@(E&M?qw5x}DE;?JZq`nwFIW|97cHx));5Uj9v{dz(+LQ+ymy?TnCr7L>u$+nAxvBa(Y@7Yd+QE&1nk$E;~wu-J~foaCAYd#KV2X%9WMX)t4am9zth8 z3>VOH^L7d#3UAX9gV;6WG}HP=z1>Lla0dakOm;s zW6p$Mx3DGq<0(xD))r=WjkzDb->avmhwLW{hP>&)R$gJKw$9GZQSm#sY>C9e49hId z`aRgfv-e+Cb%lBSA5na^jk+&w+| zO+8&(q0|DP=pmmd0&zkTJP0HOCsG`0;;(0gC8VD5!4w+{$nWnk(n4SpA%S3KdV&ym zuw5|OsQRS|A)mNapwNgs)W81SL=rx*rE5)D)+LNF344f;uB&c)`k<7Ch*_UP@oG%f zFHLt9bNY~|TcnA_dd@|-8-0EKR*BvC)m6kJ^3Ut=3X=MMz20mgJm5bsr9U8o{`0zc z61?y~ufuoWA7l^!nQ~=7ED^39#6i02!GAw*@gy`%LF~cV z^XG%I{XDCg2Vwg%o9L?`$PmHKg$0HW$Q_$7luh_t;uwRM0~|~O^p?5rr7S4xNy6>B z#BQG0CE=iqc9DpefJ#HYqFtZR0t*erMgsD2@855v>G|L1?jqbN7@}cmJ}>k7q~ahWCmIZYj__vnUi0r~viNvjVp@O*WP$=YH}1KVfUvKs ztrhGPi8$x0sI47L&J%R@3-At6m2+?EUkVXdp$bEtApVi8pu_rq5lDR0uyPRPgm5Wb zJh1S*JZ>8exR420GTM^1@2TIWe?O3eed#6BoF)2&73;QLpq92)!ccb^<(w=dP)FOd z1&Bw~NI=m_RM6x^kVK{}so`8E;I@pIcm4M^tAGC_f9Bk|;gQx1Y9zjzc%ngPF<6=Q zY>3(x-Ng&Z?f*vYn^G^Pw)-HvDb$#ln6=yZ22w5;GzuArbxiF&gEEnGt=JhkZsk)-rwBW0)o*zgM@DiHhbHnp*qZ%rE19mZDLuSp*DfN-k^exUP+Fz9c4Aqs#9rRhUmK=J z90VYK8?npE_Dv~zf)p31#}@4f8RaP1t;8k>o|9z%59@wAI{g|O8CwipP zicfH(eS)Uj4;hUZEt3-=jI|XyXF!9C2EfrtPEO8FCsqm=+kQ#&P4mltt=#oBw7Q*C ze+fs+6)RR4PToUS-p0YfLF#uxLV|!^aU!gK2NC})?>J9r{IzdANJ$a}q}GE+YAqJG z2Uvzir$cSXFjl})bSLYCNxS=tTIrIM1*?EEpb-~ge29wT|M)Sf>I5TbxSk*j!Bo%1 z&CLVOMsZ@q7<%qY`s9H5PsQviygSf~*Tkq4;>sDqki20<@*%m)3_vfE~!qD`1 z1H0HOkS8c-CQwM@{-U{V+_Y&g1zK@~`^*aRY`Knj8*!Vydt5|o$R5C=Jysc;&N#@M z{+=Xro@}PLSlH^fwmb*URbg0@9~U;=kpNWhJrpr0*n7*MDA1Z2vbU zPcjnKN=f-&EGSj>qQ9Qn%a8C3 zxEKN3eXg?I8X~pr*K5B0PEnRvf%nbkyGX?rX@l&>|Z?JknjF2YIm(9dZJcj!h@JZ-X>4p811mzUsd($Tx!sH$z_n z)wvFtf9tkw0rBzxn8Z1ReWeHpB<@|yv~;GU=+_dS2q2_u*`r;&l)0}D1=+o7c~I@- zkisuyx&Qe3-n1h(ZQ@%sFEJuQye57E`B2HB)G$C5)a|op&isP!$mbw1$T5O|qKVcj zJ0CJb0z}Lt_Tx4Ok$s8EWDgvu><(>E6SW7`RS92~5CPBlG!y~$h^@QCV}Ve&G3DD( z;6SSoOh{a!s1=Qol+ADpHR!v;#|RdvF;3|`YzhP6W4eH$wRb3IzJr!6mu}{DJt~hw01LHxE zM#p>N`>fw3u8ihY70A4AU?2v?H5R9~4aX#Y4qfp}6kTM5C~&L*v2p0*U0{N-BaNnk zX6B72fR>R^C@MQUb#Qd!)ze<Cbi^e5s2ml3<}KT{MI&R~Kw^C<<(f^B z9Bg3?`t2y~H$J^ON!ATuI~u2U2rS8GbY@uw|)=reF{7?P9QI z+=7BB%I<7l;Ur@tq7GeoeW%i&CjxZVFr3Gq@qU>&lqiX{$<=s6V)fT4a#6vTiN75F z7bucU=%hrgC#^UgG+#>=D|}JV`}ldB-3K6b5#hHDWCB6oSgM0uTwK+*Y8ghCAh`|0 z$%pPuCH&M~b3^#nG8fo^OHlbtVZfwDqH8)NEUb)({pD$`4vN9SY|o;A-Oy5o)!=6ed6!2DP|Hn@-O_q9*19nLE=ji+tI6!&e-2b)J$41y zLLx-URTWHFJ>CwKzcA_40p>G<*0{rl>B}l~4$XZ7medYK*`hW5ECx>M@wvqIyp>;5 zxN{P$tN1_F8k>ebv1Zz3AjHv}PV9;h;fU#)#4WJ|frJ=BV7bipKL?wxVL#Gxq;o;T z{b!H&17F`piSfb+;vfV-A=Qf*9`JVY_$AgcUVc2I5OJTQvS`JzsTYc;~_&I7J9z@KuSlVC3Q~0cPHA12A#P#=CAR**OG^py z03vV@v=E_dP{*&%NGM#m@agfM(|yn+aa;$nS8e(B2^%=26JbolqMyaWK1f;w3zh{F zmP))bg_sGkeOdN2RWgV{FdXdBdstZfE*{sr)%x#*(un|4)41Z0iDw$R#3%E>m^duE zfmAjHNO1`AIGIOC)W~4Zwrb0aTe*S#hL)Q6?%i*)x!z;_uycY%-~V2hJqNHtS{iPi z#-kfmk@eUx12f#5V%4q+5ZQj32`-@&oQl>;BZ&F{Yd~Z}U=NN%X6 zkVh;Spf$;i2@wY%H)gh%0C*#+ULl)^vv+r!Gl!&@iW5=T+d?K8N9+bK!vvH7mn4}Uf-T6x5Eh}~PvN(boekSXtiPT? zN{I)(F$X)RV)gD6or3I6#t7t`Cakv#x+#A3)HecCwcss0e)g<_W^an(ByRon4i^a~ z;ua%@e;7hq>EqZbB)kMrzS$N{wvEV$%DrotnHw-j(%0K->u0?BgXX{RX15$c!_<+# z-ue)b4`=Z~N_Ic9A{m)V(JkVl@Tw->Y=LktrD!3?nks%MMLRE@tM%>&9%m<~ShP2B z*=nc|AhoIbI~;n`7CW#l-f}L?I}V>vocK6AICz6naWdDx(C+;8>yf3_*8`9%4+;p# z!+K$p8|e+*0-}NdMH5-oYcBKAQcRdfW#OM)dqhN3fsp;V+Bw(PW!&sJMX4C*sIM35 zoP*EdF&EBW%^1rnRS-#}=VLBSy*r5thKk;R^pb^zwwuwHQiI5;dhy~#uSd(BE~l;h zhtBw**z~D}EwRgY-}y%ed3Y+O4@;g$i*tZNQbp+m2!N=zZ98_n2%muUM|?yGf`$GL z9*SY5|7RqCkurmYJP-&Q+Wo;K0nz8XGqN9XNW~*SNUM)*)`-(XYIb9ao*n@sNHZ!$ zE_7GTnsm}k^Lw<`w01_dYOtv6~Q($twUYY9$ z;th}(eP%2sK3Gi++<%g{7EPS5IoK1n1!wT~3MRJ&7SO-Ce!<3R%vg*%EU` zq-;fB415g?+hU}+YURpd=oFb+ntdMH1rC>}#CilV{b+T5O;cO3638$@1GuBXBkb!2 z4#`;HLPhAmq&R@vG;p=*NI<(MSEnNtJZ{;pURwj(ZFCVdx)T)YG4RZi={eROSnR06iwu z(A`-Hi!5R42=5N)TNx-6L#j7URqL>N^J>R!V-hdj&2{qo07Q|NFME|;)2X`#=*$`) z#yYT{kMAPkZBa9(K=aE|qvb>5BO@b~?K?X76fcs|L63oV$y!_!#(ibK>=J3b%dR4*Z)a>e1028s=55`cy|AB*@= zB%MYeAuugd4N3~F*;?fyIJ{_!c~uJVePpSG>kIcjrr9hg4Yz?;8EtfwzhZWR708d! z{A837wr6I#a|(J^G9gNt?#)U5Q3Rq=*@CG0z_KxIV<huziL%mLQB%{pUT9 zhaB?hu)Fb7h)Wp*3{lLZ`}mu>btgdY08j` z(<~&=C1L80k3!%>=f!VuZ0M2!U3>=mK~quJIT)`R;K<~rSQXI&EEs^H;ZPT%ULJFY zQ}>r254_GZX5VJEF>$SxQBbg4$Zh~z!y`ecQ-^*p{TqPM!VBcZovi<;D(p-zFCy@4Rj9wl5Ha9fB#_fbR+CJ4>YE)bNqW%FhO-iLmE z&5*J(f#ce<5se8qd;SJJ8b&hFaQFkzruBg2=1U%6lnG)4JwYKDis-azGDnVFfk>~4 zwGc*Tz&|6Vtk| zYH2lGvQ(-}1Df_*-X~kM9%i_%{=l`dG{|t~k90!$SWs@E;8#JMHtF>I%INUv1`90O zm}RC$1O<>ijVNKTU}*uFr>*!CZ>O1W7gzaQ(8`QK#2^^ksFC2B2?|1nBDN`nN2c4X z4Jt&nr6)F)zzQC(ZvW(TFAmYI^;hOYk!AQT}b&?{A9gc@TU z#Qi{eH5?pXI3^w3F%O`DZLLGa?i=k*c>P{(xbFR=xa0oWTvxj1=@e#{X4R!y!-w=R z-4HHH-bA0u+b@^7x!%#<{V>Six^v$W`*C6C>6AlC;nbu{e%aMo7WFQdW=)>NOI@LP z4lI`0A9H?9P1Y-jf8#d06?1|e+MUV~y36TBOMGDnlRPXV`cIGSd zqhcWsB*O=TDp=0X8#Wqk z-o00a`(1feRr~p~51wD{NYWDD<$TK8I%n$bU`k_pCvdCx^!Vp0!R*HOlUGRp_T(#f z|F^MZp#utoWptX$x4Z#*&kHMay1{EJi2dSb^=+8``R(nV${@iK|36{?Us{X;%FD{g z5Ikn8((lsHd=cpYPATLYJBUBPXoF-J{QA5Zbh7f|C zbbj*v0?|+iBZ(&OQ0O3BNX!!$ZW3HVSBUvy)H3G6K z-L0km%G1#M2rBpIb+p_iovU!<^JkaWHBaY;8OI%ZGPqQn=hv)Xyn1I?#GH>)PjAVl3fsB|Pd$;x=zw%Y5jSgP?<2jIR6WFyrT($-Lj>)KCj0{z}fDmha1k-*k17aX(0@ zv7}o@QUpyy^)D2mgPdpty$89K%-xfn1~393i@4Vs!>v+!(D~45ZL5RJV_ig)? zc7!D6SF#pel(s)sUv_6i=?K^E0`FU%d8@2fW(Ju^Eys-(C;yoI{xfIA5yD2kAsYQZ zum2Dy{`P;B6IYo1t1@;(02Egc6=NlnWa|H0b@Km_l=*-2!(TYLk>SJKChlXBgqR6H z{h|M?Rpr>cIYP9{i4ZbRplD%KkkFnMz16boJYUAihUZOnFBJxNp02RD6dD_gzuV1S z@6*X*jC<;;Mt#!O{8@kT>A8SxH071J>jJf=HQiJ4Cw68(iWmyC;mqZ+`&tgThJn0Z z!QMgmC|Dtg^&JeTSds*Wyxd`&Aao^k#(r3jF)z_l>55(g10I#|))P91u#)N5D-y++ zgW%QT*}L}?7zGt|b@hNThGmE}Yh3iPLs42*HR&bF`PviCx_Gel&P96p7Hhrkm=2Yd z>;ZhtXz5bd7pTuXNr-#C}p%@szHL&H=nV5+4nd9U8&MK z3@5{5BIXSOUCzP35WMo!b^&cN7YXsBSQ(iIJQFYGhX|>d{e3pfyy1??+70~vJ#)^> zCx;ke&pR8XRa3O%|18o~Mrvh~sXynwsyHh38n<~rOmUh;Zuj?l9G5M~w#-i`UMA_J z{vS&g1T;zrKEM$Jr!}jB`|ST?1jqOVF%^nFc#fAHVi)wN!Uzv8g{#WVzfH z<$`lr$1MI@1(wO?pc z*~+V-nNmF4ElhK9a)~$alb*>8qbDp~1|(3)FyGU7Q0anT(I-s_5v$x7bbtnVa}F-@ z_PpEbBi{ej5P6Ql;Juz`2xO4T*0!G5 zEZaGtO|nS;JV89sFkO&?$Ho?qFf;*-f-9l+yL96CCCW<~PvT~ZxOMB6a&tAJgO0hN zc+}YmI{g_i63}!qs6~WMg~<{yx(d8l82sJi?Ba3=t4nT*`S4_){ix<}lsggr(VdZ1 z2faX69sHR+hTIEW;CQMGlOY4iU`fB(ErEv0$6vsVy@)p_kQf{MuagNAu2~lCs+dLk zIAQw?;vgF3cr;)YX5p(=0jlagc<{i+#eC^MXUFdLi%|Qh4Vc#i`5A9e-p88KWO!UL zULzygqIEr1sWDNbej3gSe?lr?<>aUsc+^)L>+d(D4P-UzDnaT4)x4LY2=|X2yl!NM z7;NBYuk~@aD?z(SfewQ__n1tlV`<{Rc9Bk$+$KU~j9+r?uMhd-J>I_EcOM2ln+Bjn z!9H`W2##oRx2q`=ee0FqemW)Y^7B=ho1}74m{pY4l1zj|ltP#L>G6`|CjhEcLfvNl zORlD>CaJ&Pt|=M!p|@uF)T+1XdY%DXQtfF89UUJvSRGnZCL2?1weE6ur2KvM0r0dA z=sQ(E2mZ{jIeKI9DT3Z5DQX1{pS+HFeyFdK7ll^90~i&&Y)q* z*jBN3PMw7vV&qLg9e)+>EdhcKZHB`Q$jeLK`C*=NAqhq zAJ!+r!D#8=q9H(bdCWPy&V8!CgWNyDH3ULEhj%BO^dz7`i4%H(T#^9^15&4?)Z))x za>q}`h&H?j@dyAmNvBkD%MOSQ0`uT84^wC#<0kappsxqAt0CZ zDzMv=u9HYNWUvMU;l#d9=8=I`sbSUU^SWC$5 zM&5wI7|!U*(t4$c1DBfX))yRetuW>9E>w%ERQ;5BzxU{*ntxofcJcLfA2^eAOEVYT zCR+~-H%uBXr1d^F5?EC791)95c4v@sGhWiFxBYdEVQkp362bb0l#<8f-W*nmE4bxIsmtfod^4*UI%#=Qv|6tN4Cn-GXf1LetXxPb>gi^}Qp2bmv3 zrL@RWgU=y|9Vw@!lH6p4U5g`133@=nz@c6b<1!6$l}_=`uj`zh#5^8f*CetAZlxi@ z4GBFc-Vv}VA&3%Syd$*!+{}0iJlRBbAeswC@)96{5Npodw;-#LIWix;l7)kB`}Xa= z98#K?d50X`4k~XW(dfvWB;)o+fCe%EfO>`OMGQQIyMc*420e`iY7x2ji%2M1LECkm zPErY@=PmSbX^tjHWCxH{YT%{K+n@7m{W5ESE&B|{j@<1)L^Sf5xQOBU4lhDYU_gkb7>3f}8mZJ3o-@@d)7OXO}Z;?IJ*9Akbmhl`k($V4krT@2QYWJ8Aq zXgEl$mN#8*(7!oZGSY*^+OHOf@5@hwgrprL!%~-t?x|28$1+7SoT}w6tgE57dUF zEwHm|{wyvF47kQENAumoS%LgVB@)k4;bd{8a%^M}w4E`(Zp2(%x7!|yX?Il2%PdRd z_A#_oVLlxgx$I>7bg4jBn^tD@*1vS}HhZJ@%azhr>kO&50oa%kfrj$KcVHAFfssRs~S8|NXl93X1GcJ z%XawcEuwVeK8hC}$>_B)T*OV`bf0=cv>aae;|X-|RFjLBy!XHSmb&s|lZKCKQ|l+< z_=F-JJ!*w|NlsO~a@@6`aJLxvi_THa&BWv?gpNn`y%B^rDDdbuS~COJCKYZud-bx% zvjk<0BcDaHJZl9giWjFYjdm5Er8Z2z=ZI_TtKJ^D(l@BPIk!?JG4Xu7ROs-tlB@Sh z=Qu(`H_){7-roJ&+&;ppD|2CFwAWRy_o7@uORju_p}Qpu{bnzlI>WOC)Nloyjl^2HWd9XVA3TL($gS zc|Nh+0RsaCqk@Is|B}Xqd*Bci@Ua=ynYz%11a$HviIE(3CV6{Fq*@yn&QyW7PbZ`w zD;kC3R)H-7+ATvL=`ft!0Qi?|e0YOI$yih8MJr9>*alUkcPzVAa*F;evU3y9F?!40a#8`(s?OVmp z!A!n_{wlps)00C_4=Bf*uTYwP+Fo(|!&6b`z|A!0ix0EplRKP)1qX< zAE&bWY(IGU#M`%TlaMa zZ(5jOEV1UoC*)6bA=MOJ3p3-8w{ z>D(ezFg{QO(jY7rf-w=U(fq|js*SNfed?63{jf5*&j_Ma9mpdKmJjBQ@y~$T-I^JW zWpldgSy&Wi^3#$NJaPu!3cf!siCY0m#o_66aF4MYILZ!%L=)8=M;S89mz#Rf(J#(8 z;nIqu!iy4&;vic?i>FPT?}J00dj5BB>EkG(@<69XN+NYp(Ai09L1M6lW_%tqybhEfra7$+R1H~u-uNjEY);Wxi-3Rz=s%ST9&>K{A)Jr z8=`%w8w2=|ad{=dvIyanwp8ACsQ(3RfDH*!&IJumJ$tebyR*OQOIf7;#fIdVSLvnKdg zOXWL%xH>cs~l&=u(h>{Jg4pqDN@R zd~qV^NDEh_0b-K{e2gk6yuA-yG`W_EOsXL15LgH=XVpztT3bE9Xdca7!oZ!_rJ9D! zze^C0Bf92hK=5Ng?95pvnE#LL%Ss&wIA55(pA|h(x$0=7Y%QHgO^GD0q-! z(Mpmw5?9}ZhNl@e6a^;$#Ph;?h4|S}o&j@^1!gIg$^#q!tHuEocuDV`h6Z!(r9BiY zE{bN6OBTFH&fSdZiHW*jcVU{gXD5;ScMfq8#tpk~{(rRh-BDFu+x8$T8Vj1lLf3e# zU>6hw4v|E26x1jPf`~?tj#8D5F_9!H=mA9O1{LW@6_65%g^tp@MtYZaq#fQ|2fSsB z-+TAo_Zx4FSK=SJH}RbFec#^u+k34!=bCGoL^4L0P%83IBjHua%CY0m$^8x4RCh9j zKTHco4opMnX0ci5hPRl}=Hpu`lNCo>7G!XOGl5V4 z`pK20N8TAC;HP3B&66x{Af!8caSq3I4nR$o%n8{}f+uJiC^y7D$E%b@3TrMUiR_OO zfm-(G$51*q#f1VD6_$T~?INN#b!ZQE;v- z?DSZ^6$sYXR5XWp-uuR>$wej5`?NzvRDt68fSX74tv9#k!5wb6m*P25+3|Dse$Yfc z1TCK|D8)Vcei0n6@aKjBxUg{0?z!MpP_uW!&la#sBoaYWym@{&*kD*0J=Wlgd!b4R zFzAt3@WfhUtR4WwgK)L#?5@h#$*kk?5Qh^mM6z4bsgpDqL}W8k1u_l`4Pe$3v@@JfH;r^1_y??^Di6 z9SWHcs17o#Q!TdZ`gLS`W~Hlx?UD0$pMpU5^^j0nC$#yHt#iAE+DOO1n9?C(+xJiH zZH-HJ70SPJy=|D%)9-cN-?+eAQbzw26A``Mfn`OS-0y$O`)oPt5taukErx7f2MQ2} zOr73ziPHRYPeLtMDV1%uKD+Mm;oC(43U{S^H|IWk_VuK=5{f&Qy*$jc6_q{4afvnV zsMKrg=4K2v_i=pIo>LOvZKd^S>#Mw*+m%BzM-HBxWY*SqzyYcp>md;`9});dWk&9; zML~*@aNWq?GJk>aHb$W{W|;(0dZ7}4RC&(Od5jjjazh~?##V9& zA%!OL3?LI4IKb6U_e~IwMY^#>$qjQ9aN!Z z;MgNBG}!MGm_485Z{*pETu==)ufYA_n-Hn~KvkIadX=Zbuef(A_j7o6eJ2(65uOO) zC)G&;c9%Kxd_Kwd-|m8VFOtMLh~?P#fGCgy%)(A2-s%+ZL7Y_v?G#xC0qgOG;{Xst z^S9hUSFLTGCn!87H)RqDK;}nK9=M*@AgZZwFk|rb0em2~$3$A_Q7Cu ztr4rM2YON7={)LLilVV^8u$E?v|;j_jyunRdQ(*;foSk?Be09kTD*~EiN>Y#H;*ks z)fU+-ARc^;Hy1I%TEe|RcJd^M0E8jhLdbalcmhe}U_`qM>e1CIl@;~tbkh>Sp^`*8 z66!(1OptfpN6~d8s(Q(`4m3!YdN(=bqTuvP{EQa_{`3`q>hu*Tl++{c)DU%wNPrTA z)vH$9gI;g-q5;sZPPd33m(BL zVvsdxwE{cpv*C(A2BqF!TDG-r#C0^f=QMs{jR6eubf|y;C(7 z%4=X3OD0MT+D@pFN#P5=>?{_lXP~e6f`z|wJatw%9c5#@KNq!{3ho@GZ3;o*7pqnw z(c1)>KXc1UK8X{1kLf!4Fg8Uz!Xx)XLI`D-h0C>qC@75p6 zSAGc2x(<>E)=_Qg~BS zjG)8aO*L*JBcfVy=J-4uUmy{b;_?-z%STRqio)8RJGqsj?dcLPR7cz|rKdaM0WZFJ ztUo;*7!#q7$}?hZB4rlT6`yQ;4Od+)=dqhHu5nD!rIU}E0I3j=$X0R|wYzFbj(pn{_ zgDa}bD$=I!qi>53XU~t!vleU zCJi)qDz2{#$}C0tv;?jLKq?I%#=3tQ9)RN5nfl+mmO3tdtoOGE>YGeKeKAg^y8uUV zoT@$%iPy>H6}TOAKfRoASD<+eWRpwaVUIlA2U=6&V~D>2`;a^ec#q8hD8H+_6l;o& zlg6~?&2%B;3el|s^5V{;gRkzfyvWIjszpATH_yv^d|9-FqJt5vdy5FzeXIkO9r(9&(4U2RCz4e%Vl-8CJrZ#vy~&Y^e)=jvEP&Sgi*8(Vpg z!*RRzu7Pv@O{Tl6NP;2r0G^-}!!H9FEy*>Z?M&`FzCZIWoSszRR8&stGDjFBkLMhyd!pX(8SzZP-~;Odtf7!s^w6RUTR?C}4VbXRGSRORd1A zev?-r3rTt0a6~`CG*ie%d8Uc`*@!VfVL+Tqg~dtLpmxBnt%HLB)#;pF@UhxEUL4n? zj1g7IRBB6WHY$1*{@L%nWMCdOy!?mi$ zAMcHZ;WsoyAQMCUA&CJpp-A|95ec$KMP&#CM=p@A&(^3OM(P!<3)jXSH0+Nbw?VQ` zrHkMxsOGB;qF<{2#RYw?@0&e+g_c!r2ls)sBUqHmV4;Wl7TQ)a3_&W;My~3>Twzt~ ztKN;5AqtU41ZI#5o{$kyy(G%SR54m!urrYr`}i8_i>Gu+WHY}+>?s5DpmYmOtU$tl zepo!cKC>@-3jZT-ivKwL!xQ`$1(tvQGOdn}VfLS+@#kpJ2>cUfGJn3X|A%)ZVei|w zA5zc@7$grJtPo<6n+)KS{ScJcRGkH`1W&H}uxx5ZDGW;JsZK!o(3XJw8bCgdDII0d^0eACm@!`A8ZT0S*Flu>mLn z{D7~JC6myp%O`W@#6?dyg~1D%#g4Xc=s9s=v}o&W zRJ-7d7p#pYjqY2mK{3sZxm>m0<8NFn8yzp6?-kf~g+kFWi5r%6V-gGNIDLn_P@izu zz`a-S!1;SC<>j^6RD=Yija;Va)^XR=o~iZif8d(VBf>}ezkWdoJO6`R(@IDaIQGFG{ z?POU*x3BPyH^T*iI!|E7pkmwo-s@n6x-c9vAcAIPC6-Lj`fX1>c>yZEKoK|1dJHko?#pRDUHeGX5H106Hpmr<)v|j*Rbp+)c7CU;m#N z8Cz5<^0A0v2cJL+(sry?ItEByO-T;tFVQ|{U9CVHbj74E0O#&|dUnpKED<_n zl9M#@O)oq?4x`rh4G?^PxExS9Fqt@@`DO|Bc=Euf{pH+~_j~Px7Ee#wc_GzcerK3- zA={FZPKUMwg#CSZRv(6AVT`#Ws3S7pCru7gV4^{*b7oF|SAQGYLHgo_15|NdYbh!M zS*Wtoi`WK`08J{YJElL!$33np6e1uXFocE$Pp7}tq1REb2Q7J_g^GXs4$?%q3Es1`X-%L&)*KVfvD082up* zzzjpy5tdX_e?HUCRhdKOB2@Z`%TSRrYDHLu0dhy#>M(621_LYuF#tYb%RuKJqA|co zlKV;2@{f14!s`xq(Vj>$^ae^m`}0Zr<|Skf1g^D=+9ZNkYKx4`%!|1D@#68yw~*zN z;FJWHnUh>caXG86NH&hoML?*2cIfcO&#uYq=d02}7yBAkz9W7#I2L=6sxL z{dnnlA(Py(b5yrVcA7&dwqB3k5WucQpj{)H1#B(&`IF=&2A7J8D3PVp7s+N|R4pwn ziT+1!9EH2qpob+xJ=9eiBmHIHBM&=h{HR`(=q{2YQy;ZWC!ZJ%_xd$!qP(dHY_gGwRuh3)8Web245@EXZlXf;SNn zAs?2MK+tg>jOUMHu!DpfF^k*h&b)^T{gGBzZtM74A=j75wH7)KQ?D=Y8@Y`ZIqx|s zZ+O2EG9=|PYbrt#UBl0VD&4-AX~g@xUlvVShOOH(RrM4y=O2CGC%bZqQyMX7A;idq z7XBs(bGOP-bkM2YY3=JJbCCKByf3=Rlzn&ZH{LqP9#xxurk~Dc&3f^rpm^f3PE!+;{;|f% z%#x|`@P6IJKZ>Rm`_FzWrsuWjs5nS+I+*FCirYwhz>RIV&9Hvkx(FOC3^ z!)71_$Zu8Rq&`7Q*h0mrcehh3L9op{rCt^o)=MbX{XHgzQ?k_9W@rv!|Hsd3`+q*< z^abP}7py&bs8zOn8Sb5K31`5z^KY{2Y)aLH6)v7Hf|qMqS(!d6d{WF81o%b3a?t^y}44``PLne8gU+`a4qrNS{S6Z*1cvOosXDF<)rzwh0A8HznNS(W6Hbj(IMgTGvyv z2mraML`5k2`2pU9f_%;@*C&`RDL^w(D)!fKw!^XJb|S)@o< ztFyDSY>iQ<4farxP~Ke~{zhX4sat}@?W#_vo)I-q{5HAXuC@!Wqg-FMfHk&f!>b#U zA3ndx`*@TP`C5EWoF(7~X2Pm7GVLE(uB)^}OeO z7t3hklQu|=q6R-;kb{w7wtBjbpOJ9t`%MAYl0zHf0i1k>mAV(q8&>jW>BCFy0{2CL zwzp#T91rg9PMj~Pq<|0TiinC1^iFbn%O!YFrJK;*XEWPe2Zv%^6{)@g?s^f5Q&frM z9u1`*&Z|+EtI4sfNq=npnvS3IZb|8frJ^BT_izrCOYpAeCKMjQd!6ziT?)d(=%Y}r z8q1R2a;F~a;Cy~TvBQP0c;Ei;6DA={^$r_)Updk$vF{xT-w_xY9-fPHBKVMV$I;Y* zqTLBO3wNuZ`D*Hdzn&E;f$k+2<8m7W%!8PiO)n%I&Ft!JE2&%@xog4XMB}6ZmcFo} zgUv$uwvZ>VSc0J2+S-%1O0xISTLTmAVi5fU?T1|D5uBV$u0HF(q+-6f{EoFj7r&#; z214W}sJqR3woZ-YPc=I@^OOclRKjCpixKx{z5Wous5MJaqZgyBqN0VSs%0+k!&=Mm z#vcllmqE~>2EEC#^cd7IwIeNp=&nN5i}#_pO<1lm_%VDxeXl9v>4~z+N?&o_q38Am zexVnu$R0ZX0eF?i*wtg0?ttrpsH)V?*a@-OdSqG``E1#GPYdXqzX0OB33UVXi+d2%9a(wEjI)DiaR zII#`IH9L0fz@#*JA3d16J}lt%Uw&c7*pd>K6&6x6_C{6kFY$=bo}lBfu$+}Xf+inn zt+*An<|(=sY3&cjaY`A=JfGV9#f^rgLVQy(Db{fPY=K!!5#qmXh!V}>bJw7H;gDT} zeXGg!seM5HND^O00Xi*8@8W$uagT;jN#u6e`aHq3Nr^RD7b_;TKkz?xdMbviP`|pc z1hq7$VS<2dvk(vEomxO4YB?7-#c^tnpNiP!|F>*OJlIe zD@{|=cXV`=HdZP*JEmjqgKa?{o*zXh4DmwQNUGd(UZ@oka&~SBZWxYH2iejmpX|DR z{rVl)PGT?vpCBt_vHkq~9t_d1z%%7G6f&|erZ%O|4=X66RwK2&5?=>GRe;2i>R$@{ zWTa5+k%#wWJGhG{Xv!$eba8?Q*&VpnZ}r)4kh+Dpd1Q}P zcl!gYX~rg~_4Wh;vdAq{C#h-Zv)OHoRD{Nnic|5W-beC3p$?C=l&y+7bOr;$6Hg2T%TGlfI*qEBZKI;qiNJW};S=@yE)^nG>ha%Cz{ zcwM=2FH$itak2zs z``($8$QzjQRm!nH?!V8*`Nd31N|I{}xqK|u0-iE*tpV1kwP(+VY!NSHG1fb+fUd;S zgQ&Y!-IU%He>Q;UfDke=x5V_V$L^k&;M}dBEz#6Z?@rcfPD6h4;L)S4?qXKoY=X8A z(FlW;440wt!7!#8yAB%EJ95@%6AF0i=kS6VgCY*dG^`g?0{qj_V6xGd6(o?vZd=^q!f-eMsZEgh|dC=UvdqX8c`Hj#T ze8Yy1+o}7ex5QmRTUShk@E&~Q4}2N3T_(pGTWPcq{rL$j+;u9+6t;i288m3J*w|mo zC^`&kS!|?lD4UkW)CeTnELgB$q~A9ypis6}x^a@rVV<8r3dJT*Xp=O~0JEbmb->D$ z`3*M2WA+v>{GuF%6t^-CF%_r63U3{AoLO;cK|4pI84@??gFhFEMUO{4s$ z&U)-Pinie%w%2#o;8oe_|#LdmMugj)X_q6vpeElh&C>qgEo4I>SK*^{2jA&|(0Hqyna* zUsNeN(=!=hvE-xi#cN2=8LsJhBQUO~OeX#58QP{9#@f@rGZ$ll4}XyA2#-HH&&GZBv;#H25rjdnA%?5&9@Tc6-sT zRV=GQnMxdM`dI3`ZIRL{7JGNk<1;_DiXm*^j<+(yl9TQ3YaW~Wfu%ES_#;>9S5Au#mjOZct$D`s($zw=tHLyGyD?` zE#KEjO@xf$8!Zej+@ul>XqbR@&JWDzMX)7LAJ6#zP4oU?9{A@6cxl*QvxWb3M*ZhV z{@)%+Bh7AJN)V#)*d)Q^PynZZ)n4B272+_n zt^6YBk_5yA&46QEa8`PeIt?A0C~9??=+tW^XyZcWK%kG(@IMpP45af0(dguiK@)%& zgB|5kAUCXe0Wf7IyY0+C^!c1~dMCmtWMq#9Zlj)0GRhngm z#AhSt@jn*>ZO{0OhQzI9t#a&M=%Y$83K~I@KwsGU0KwH>Z1CAHaq-P12Hj-B(=(_p z4o2Gl?l>ez5)N&5Z56iC_m%TkD!b0iS5l1wgQNBWA;c|&Y7Exw`OD*8zu35&3xIw} z5HCxi!50cgRtKZ$1MyBqLAxx!W8cfnR6@{GxL>js;Cgcf?;K0q8=09kGtw5%V}MjA zJTfx>>t(uSHcmjYSZq+LGWBC4k{i>52ji0@@4*%(Qeh|B1W_gqbHoafgPGh~vK;mnG+(P_Gf<~#Fd_ZwD$XhmXHZR)MdKe6(f z_-K+L*p^pRR8G26(3F1vBW3{B1pNS|ak7l$aWW*CY^0L`1|2 zYpWGG$nhR0d$eOt}Z7IKt~5*|C*dAjkkjA5^-cv|9QmWgL}TKuJP;bWs6t-s@Xys!ffgxm4V zVyFzJqxh4QYArj*>wxKYB0;)eoX}Mvn*VV$5$3`@-i~0kEI?#(Z`=f|;3#q*p~jE4 zz|s!(r$h!cUVL}mN2wC*L0X+QZ)sF~<91R25l?CvQE2J4=fM%Yx@Qxj$x!8<$0XMWplQfsM7o4eBsxM8H zhZ>wx{6pe@RwBuZS^q1u-B(D4F#09?b(4-Ktv#jtxFf>^4Z0l)mi#$Tv@HMi^ZKiF z6R7Fqew#l3&(ryjAF2?I`Da;~KV!)M9WmslE>sv7qM1hkl3E1-ZI)osef=%c)&rJ} z9yX%&#rO5xl3BVJ>TTu5`*H>lJ}JR8`XEeawgDI&&(9h^;Gr~Xw3wFx8kNs%+e0{# z(|~`YDkY=9k6SmpjvRRIDH)8CiU$A|Mheflcu9`G5iFPBMI#~0`O|J7L<&QcfWV=U zwKfo^J^|046cc-Ztyn#JN~iJ5ry=t$PEK$J(iv8;;ZTBFW$AHVZBfLLZbOaQMf z-}-Cn3*MGwL}@fJUjP_O!K)2+R-XHD0LT-aXI>1V0IWTEU|xyz%(fYDD*{}B0#RTn zDSwZ~B=pPY?c0Vjd=Kkw2Lv6Oevo38G1EPTp?I<#*t(C_sJLIrCHok1Dg zjED#~xw@=8T0XA4vT`j8GPJ&%CnFy`SVO#!zpQA{vo0Nrn#`J2eT&h7a@F?M)o7(_ zo3!uJ(D%-M(DW|%t#wuKg6)X19x6RGXUsWy&nP=3;Naa(ZRS?HKWPO4e5aCC0B zOhuFIlm@?ZJAaxRhHWj2qCmhju{MQ&8%^wW+jI(Jt%~a+QrZS~Xi3p#?ZkD6Vp!}h zun~od612#a6L3?6buUC49Y(JBg}O&iN5;^^4~~p3$yMK7b!yojY~0dLpXKv&2Y!)~ zITQ`3uL-y}E>Kr$;{@xOk($cPTZ~j>0l=*^|7O()Z#ktLgTz2uH*E*nRal`b${m0< ziiBMOI<`iwNh>%phol!gOk>>x;7jTeieH%yBRFYtXO5pHN?aOuj?k&-xM85ryvrAgim_( zt26k^VV07)(_bU+XQaiqkM{G&M4M8S6UH z8Q|EHO01G>!^L;hSqF|$c|iRRI~C88JyAYx-z%xH!H0-;m!8n_aBxIECPMsCqVzm4 zmiNONA+9I##D(X=hD}cficFv9Ruse^u0sWk85l7sU28a(pG7=%pg)Dr`OPK4HN1SH zruAgCWE~WLPPnzl@cmlNqRJ$*lzKa3GqVB+^@z@4pcX zz0Sl}Lulf~Kza8eP&WyPOjQGRZ6#EAuc*1V9=G2YNkECbtNE!MjqYF$_Z9jCXVx{A zPt>6?1;6%n`d9Y7{)FI(sG3lxb*v4n4R9{d3LU~fjT{PUL@@XUq1R<27~%89cEyqV z$>s~0s7&og$gMey4w8A;T9PY@g`y^v#;S{tvDJ}f9j3&w^gXz^Fsr7U`|uy_>MUR6 zVPKejsWCwOk{W_xz0sD3y;OY!k_{~c?CP{od>B3e{akLR2=rZ|C+yT|j1WV{=L6M8 z93{;*<2VYUoVWwQv5atH$$XI7MGcM3(DE^ve8S-nz?=u<`(!oPFnY>&OU1HhhXH>l z${!AH!CnXD*Lx}sYYijsX|5=P76B0BNbuxH@KVS8PeTGg3K$}JXR&oGQddKoYAT=d zY^jbu;6>sNp%ffI>XG_#einBq)|$=_QVIZ%C+hx-Sb-bru8rxShlr?bc^K-kA4GZS zdnB?g7%U<{X+7W^QS2N~y0qYE5+}pe=KZr}*uUjc(FBNYd6lw2{z&&ZSAVEUwm}6+ zTssL-DG_iT$=5rkHHLk?l@6nmj@>?F??f3Z7{-NI&P$#1e@X92lZwq8HA$|s${%l9 z%Vhb>MmBs>3-|j2n^NxyhY4tZ4`+_EXe+>CqwXu}d?wV%l*4#2z?oT8RP*hBIGjn( z9o1j=z~92}kW0T8iwzPxYM^qqtZI1!huhHW!bz_~5+#RZ%71vbk=jh7kX+=%-XJ7) z5CF^8$N5+Yx_LX4pE%$)BdI!RF#$P;HF6t$WGU6(UELTDjQc+3hvtOzD@nd3L@=Rh%^r%hfp?OVyI9)*mNZwSd|s?HX2#x8 zE6C!5N4Vq_TVNxGVBhb^m>$E!WQ;??Qn)O$??)1(0A8WJ&S&i`t)1E(nLBZD1>|Wg zr4N_G_$&4vsN%q;hR0T6uFs|YA)+nHFQR>y)&O`|H8QRI1~>raX=l5t9!W*%L02D> z))7JC1c?8N4V4D&Jg~+QP)J7+ao_gX!6?U;3GBqAfLTnh+bB&f5ooieK`zDE(XuvG zoCJgaxNbZ@vj{pD4W+XNoxaY_Z|CV5X@hF+HGuOYi;Y9jGTKl;R*WPuSA-;kHm1~V z(;NR|SwizI9qO4P2ZaEUwh+hJq#jx?sMVNM=G<$lH>M561*ss2&MV}ODtBshJNFX% zjcF^*a-9r7h(^;CtqYd8B4c`QR%^_H1OmOw_PgNqZv~lGfGft=N&ZUX-hkEHmBDGC z_g-@}0DG-I-4pIj9?(?{&;anjgm2**+d)&qlR+smBe*eQu)B6Awy^3?UW^U4C*-|| z>M^;kYgc{0y%O()`REX}C9g=}7xe%;2mzrCXyE-|qZ7bskmLe&a(QSE;f<|a2JW$* zQW|c@LRa@Vrqo#-=s_aSn~p0BVCv8PWM0(n@;VMcEK(&=vvk7ba9~!9m?~fW`|a55 zM{BIZm;i^4aO{boz=?YHFTxqBhJW{T?mFWG)nL@1DPFN?Mz|QzFDV7iXNMHNWxXEM z(9zK$3B(4dV4rIjW_7*)+fCii0gKpQf`kJ}enM4oPVEQuu)l*g$=U{2%?IzG9EqAQ zvg0B99=)3y5W?5l^x()kVZl668tcUJ_6T`KU&OyZIosYsgqTmQCW;+U`ALyJwkYgmCb=A`%p-?t|jlUTix=RC~UDd!! zA{0L@nQ>i`sf6QK$Hdgs8Uiy}XJs@e0&aqLUz0)$CilJPNO`P_51j-o(%JcNC53^t zPdMNDPtPJy`D+BKP+Mu=$SpnOk2Z&RmU$HsgZYfLU~T$$aE0}4Hd*1`(R zJ{jlE3D9)28pIQ&XY4RjrfwrH6Qj+<;-Lt{&*L1jZ5e`U%d%l-?w}59gVed`O9o)dTf;LY>~;TkWL1 z0Q{-|-&=ch&h+Q*vBJN{4sx9}b!{~=$Lf1q{K0*j^co5s-nh}Y(Ge;WtKS#z(}ygE zg3$i!0DuvZxRr;uWbVZ73LDwo*jTjMqu2QAF1IWDb|3IKSvolhd=h%U>8?TF${*q` zA$*b&)3Nhx0^rrYia8lCv~s-5km(N{)=uZ|>OmOQ+%tDUT!CNLg8bo9 z5cRL$@qJ!-WHO-?ZrznVZ-dlK$|T) z=q#!ST{q^8?svPg;2RYc6(Uj@?O?e}-(#_C#!+oRDI7Xgm;^qlh}W@A{5{*TBRuS^ zySUv;C{F^x>u0qKaeQ#+BV0~aU@?uOY3^jK_O3_REI_uaZe>h*~)mw4B zYKZ4xbya{qeqN-^qWAS?CI2@O>Al^kI>wJhj@MwtdNB~2sop=5i$)j~?VT#tpM{(j z*oref0F!MGs`7}Aj{g}Cxd-he;qXT@cf>=@*kiTc?r+B!uBSBwrB%627Xk5aBia## zw4!{W2!;J#2rSNG+urygMkxRSm~pV~s;GdsLSE4nm$NV*%fMGB0nPgqpu`y|3sdqz zx~ge>Bt(0mT+dmTlcv=9-9AEb4<+2#G!a?#IEiH8sK&LKp4 zTOinX@KES~IS%^wkiRT9?Gx{#-OfU?j2`|4(IuQrPDUM`TdlDe!Wgf$hYkW*rISPw zYTWA6?&7x`3lMzYfPFx7T4zlD))!)4l)|IxrvR>ekX(DyQe#;mj+RwyA(bE8o(AYv zNePG@Cx9eEi5av+(>QYqe#T$8j_=#+ zA$A8owuWA6vMfAH|BsuUR+6%h0&Ll6CbW&DUf6o(IfYQiaqN?Fl7cRZ_pSSW6I|vR zn?F9`Q!SMsy=F4QnNz=$7CF`?$&ttc)gBS&Q7lQsO|7NDT$`d@@2>f{Jl$F{O4?0Q zHgUTfxx6i!@@AZTNao~8&bleB?N@|yu~nVL!AvI3LhZL78XE=9SG&KQ5j78|8#Zcx zmkHzvu~zksdWZS?zSS6ORjfK(rhaVrXMJ9N+_yM2d`jl~uY-gC&2>vtaP#kzf+E49 VCaUT4s_21PUmyG`X3web{|#l48!i9< literal 0 HcmV?d00001 diff --git a/data/processed/lab030/lab030_no_image_duration.png b/data/processed/lab030/lab030_no_image_duration.png new file mode 100644 index 0000000000000000000000000000000000000000..9c399c536eb30f59df832c14d4f89809a1c1636f GIT binary patch literal 94867 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 aPe7uF${)qN=>aCtsN+ZBK+r?B_x=kEN{=D{ literal 0 HcmV?d00001 diff --git a/data/processed/lab030/lab030_report.txt b/data/processed/lab030/lab030_report.txt new file mode 100644 index 0000000..3b82593 --- /dev/null +++ b/data/processed/lab030/lab030_report.txt @@ -0,0 +1,87 @@ +Lab030. Пакетное избыточное кодирование стираний + +Исходный профиль и неизменный внутренний транспорт +- Видео: data\raw\lab026_rover_source.mp4 +- 63 реальных пар BASE/ROI, 3 fps; BASE 240x135 grayscale JPEG Q23, ROI 320x180 grayscale JPEG Q33. +- Внутренний Lab028 packet не изменён: payload 512 байт, 32-byte header, packet CRC32 и object CRC32. + +GF(256) и блочный код +- Примитивный полином: 0x11D (x^8+x^4+x^3+x^2+1). +- Матрица Вандермонда n×k умножается на обратную верхнюю k×k матрицу и становится систематической. +- Любые k доступных строк систематической генераторной матрицы восстанавливают k исходных символов. +- Нулевое дополнение используется только в математике; восстановленный внутренний пакет обрезается по payload_length Lab028 и проходит собственный CRC. + +Внешний пакет FEC +- struct: !4sBBHIHHHHHHII +- Размер: 32 байта, network byte order, padding отсутствует. +- Layout: magic[4]@0, version:u8@4, flags:u8@5, header_size:u16@6, block_id:u32@8, symbol_index:u16@12, k:u16@14, r:u16@16, symbol_size:u16@18, data_length:u16@20, reserved16:u16@22, reserved32:u32@24, outer_crc32:u32@28. +- flags bit0: parity. CRC32 вычисляется по заголовку с нулевым outer_crc32 и данным внешнего символа. + +Формирование блоков и передача +- Последовательный поток внутренних пакетов BASE→ROI делится на k=8; блок может пересекать границу кадра. +- Сначала передаются systematic symbols, затем parity symbols этого блока; перемежение отсутствует. +- Последний блок содержит 6 исходных пакетов. Для него r_last=max(1, ceil(k_last*r/8)): режимы 8+1, 8+2, 8+4 получают соответственно 1, 2 и 3 parity. +- Режим Без FEC передаёт исходные Lab028 packets без внешней обёртки; остальные режимы используют внешний заголовок. +- FIFO учитывает время генерации кадра, все внешние пакеты, фактический размер и скорость 300 кбит/с. Очередь не сбрасывается на границах кадров. + +Скорость, избыточность и очередь +mode | source packets | parity packets | last block k+r | JPEG kbit/s | inner kbit/s | outer kbit/s | overhead | queue mean/max | timeline s +----:|---------------:|---------------:|---------------:|------------:|-------------:|-------------:|---------:|---------------:|----------: +Без FEC | 862 | 0 | none | 157.770 | 168.396 | 168.396 | 6.310% | 13.717/15 | 20.869680 +8+1 | 862 | 108 | 6+1 | 157.770 | 168.396 | 202.987 | 22.276% | 15.452/18 | 20.928560 +8+2 | 862 | 216 | 6+2 | 157.770 | 168.396 | 226.951 | 30.483% | 17.210/21 | 20.974640 +8+4 | 862 | 431 | 6+3 | 157.770 | 168.396 | 274.659 | 42.558% | 20.859/26 | 21.051440 + +Временная модель +- Экспоненциальные Good/Bad интервалы Lab029B, Bad≈2%, mean Bad 10/50/200/1000 мс, 200 повторов, fixed seeds 300300...300303. +- Пакет теряется при любом пересечении его передачи с Bad. +- FEC исправляет стирания; CRC обнаруживает повреждения, но битовые ошибки отдельно не добавляются. + +Функциональные проверки +- PASS gf256_arithmetic: inverse, division, and distributivity passed +- PASS fec_without_loss: systematic 8+4 block is byte-exact without loss +- PASS recover_any_r_erasures: all 549 exact-r erasure combinations recovered +- PASS r_plus_one_not_guaranteed: 8+2 correctly rejected seven available symbols +- PASS restored_inner_packet_and_crc: restored Lab028 packets are byte-exact and CRC-valid +- PASS outer_crc_detection: outer payload bit flip rejected by outer CRC32 +- PASS zero_bad_100_percent: all modes restored all 63 frames without Bad +- PASS fixed_seed_reproducibility: identical seed produced identical result fields +- PASS atomic_incomplete_composite: missing ROI fragment prevented atomic publication +- PASS queue_counts_parity: 431 parity packets included in FIFO timing and queue metrics + +Результаты Monte Carlo +Bad ms | mode | Bad actual | lost src/parity | recovered pkt | blocks recovered/failed | block recovery | composite | BASE-only/ROI-only | no image mean/p95/max s | delay mean/p95/max s | video kbit/s +------:|-----:|-----------:|----------------:|--------------:|------------------------:|---------------:|----------:|------------------:|-------------------------:|----------------------:|------------: +10 | Без FEC | 2.024% | 8130/0 | 0 | 0/0 | 0.000% | 66.960% | 2341/1207 | 0.814/1.346/3.008 | 0.185/0.203/0.210 | 105.091 +10 | 8+1 | 2.038% | 8457/1121 | 2390 | 2390/2725 | 46.725% | 78.873% | 1471/776 | 0.767/1.317/2.360 | 0.231/0.364/0.451 | 123.422 +10 | 8+2 | 2.055% | 8451/2229 | 5560 | 4070/1028 | 79.835% | 91.286% | 600/295 | 0.731/1.017/1.798 | 0.260/0.395/0.466 | 142.607 +10 | 8+4 | 1.990% | 8364/4311 | 7797 | 4860/144 | 97.122% | 98.698% | 84/36 | 0.710/1.017/1.069 | 0.308/0.410/0.496 | 153.620 +50 | Без FEC | 1.914% | 4062/0 | 0 | 0/0 | 0.000% | 91.452% | 529/296 | 0.693/0.998/1.687 | 0.185/0.203/0.210 | 143.553 +50 | 8+1 | 1.929% | 4255/562 | 325 | 325/1216 | 21.090% | 91.762% | 542/263 | 0.709/1.004/1.994 | 0.223/0.245/0.451 | 143.615 +50 | 8+2 | 1.995% | 4326/1104 | 971 | 658/905 | 42.099% | 93.333% | 423/214 | 0.713/1.010/1.632 | 0.248/0.275/0.465 | 145.767 +50 | 8+4 | 2.035% | 4506/2275 | 2062 | 979/520 | 65.310% | 95.532% | 261/141 | 0.749/1.057/1.406 | 0.298/0.339/0.495 | 148.638 +200 | Без FEC | 2.117% | 3877/0 | 0 | 0/0 | 0.000% | 96.071% | 146/83 | 0.786/1.325/2.333 | 0.185/0.203/0.210 | 150.881 +200 | 8+1 | 2.169% | 3983/513 | 74 | 74/734 | 9.158% | 95.865% | 162/91 | 0.810/1.332/2.334 | 0.221/0.244/0.448 | 150.129 +200 | 8+2 | 1.945% | 3573/908 | 144 | 101/602 | 14.367% | 96.302% | 149/80 | 0.837/1.339/2.334 | 0.246/0.275/0.467 | 150.483 +200 | 8+4 | 1.940% | 3550/1777 | 375 | 160/522 | 23.460% | 96.310% | 153/90 | 0.900/1.348/2.334 | 0.296/0.337/0.466 | 149.944 +1000 | Без FEC | 1.722% | 3014/0 | 0 | 0/0 | 0.000% | 97.976% | 27/10 | 1.403/3.050/4.327 | 0.185/0.203/0.210 | 153.809 +1000 | 8+1 | 1.720% | 3003/374 | 13 | 13/423 | 2.982% | 97.921% | 33/13 | 1.437/3.040/4.311 | 0.221/0.244/0.250 | 153.287 +1000 | 8+2 | 1.763% | 3079/781 | 25 | 16/427 | 3.612% | 97.833% | 39/15 | 1.466/3.048/4.295 | 0.246/0.275/0.450 | 152.807 +1000 | 8+4 | 1.719% | 3004/1509 | 64 | 27/400 | 6.323% | 97.817% | 47/21 | 1.533/3.095/4.275 | 0.296/0.337/0.465 | 152.233 + +Допущения и ограничения +- Не реализованы перемежение, ARQ, повторные передачи, команды управления, телеметрия и реальный SDR. +- Любое частичное пересечение Bad уничтожает весь внешний или базовый внутренний пакет. +- Принятые systematic packets немедленно поступают reassembler; восстановленные стирания становятся доступны при получении k символов блока. +- Publication delay измеряется от frame_id/3 до атомарной выдачи BASE+ROI. +- Queue length измеряется в моменты генерации пакетов и включает ожидающие и обслуживаемый пакет. +- Окончательный режим FEC автоматически не выбирается. + +Артефакты +- CSV: data\processed\lab030\lab030_results.csv +- Composite success: data\processed\lab030\lab030_composite_success.png +- No-image duration: data\processed\lab030\lab030_no_image_duration.png +- Stream rate/overhead: data\processed\lab030\lab030_stream_rate_overhead.png +- Delay/queue: data\processed\lab030\lab030_delay_queue.png +- Mode comparison: data\processed\lab030\lab030_mode_comparison.png +- JPEG, внутренние/внешние packets и бинарные дампы не сохранялись. diff --git a/data/processed/lab030/lab030_results.csv b/data/processed/lab030/lab030_results.csv new file mode 100644 index 0000000..d2d7490 --- /dev/null +++ b/data/processed/lab030/lab030_results.csv @@ -0,0 +1,17 @@ +mode,source_block_size,nominal_parity_count,mean_bad_duration_ms,mean_good_duration_ms,target_bad_time_fraction,actual_bad_time_fraction,monte_carlo_repetitions,seed,source_jpeg_bitrate_kbps,inner_packet_stream_bitrate_kbps,outer_fec_stream_bitrate_kbps,service_and_parity_percent,control_stream_bitrate_kbps,schedule_duration_seconds,mean_queue_length_packets,max_queue_length_packets,mean_publication_delay_seconds,p95_publication_delay_seconds,max_publication_delay_seconds,transmitted_source_packets,transmitted_parity_packets,lost_source_packets,lost_parity_packets,recovered_source_packets,fec_recovered_blocks,fec_unrecoverable_blocks,fec_affected_block_recovery_rate,base_objects_completed,roi_objects_completed,atomic_composite_frames_completed,composite_success_rate,base_only_frames,roi_only_frames,incomplete_frames,mean_no_new_image_duration_seconds,p95_no_new_image_duration_seconds,max_no_new_image_duration_seconds,mean_consecutive_incomplete_frames,p95_consecutive_incomplete_frames,max_consecutive_incomplete_frames,effective_delivered_video_bitrate_kbps +none,8,0,10,490,0.02,0.0202372337783,200,300300,157.76975923,168.396019262,168.396019262,6.3102798265,300,20.86968,13.716937355,15,0.184972089605,0.203013333333,0.20968,172400,0,8130,0,0,0,0,0,10778,9644,8437,0.669603174603,2341,1207,4163,0.813657881797,1.34557333333,3.0084,1.47624113475,3,8,105.090548585 +8+1,8,1,10,490,0.02,0.0203834086527,200,300300,157.76975923,168.396019262,202.986837881,22.2758673043,300,20.92856,15.4515463918,18,0.2311155162,0.364053333333,0.451386666667,172400,21600,8457,1121,2390,2390,2725,0.467253176931,11409,10714,9938,0.78873015873,1471,776,2662,0.766680350008,1.31661333333,2.35997333333,1.31847449232,3,6,123.421642005 +8+2,8,2,10,490,0.02,0.0205493425986,200,300300,157.76975923,168.396019262,226.951396469,30.4830189704,300,20.97464,17.2096474954,21,0.260180715238,0.394773333333,0.4656,172400,43200,8451,2229,5560,4070,1028,0.798352295018,12102,11797,11502,0.912857142857,600,295,1098,0.730752592593,1.01705733333,1.7976,1.19607843137,2,4,142.607264773 +8+4,8,4,10,490,0.02,0.0199022658407,200,300300,157.76975923,168.396019262,274.658619583,42.55787076,300,21.05144,20.8592420727,26,0.308434444087,0.410133333333,0.49632,172400,86200,8364,4311,7797,4860,144,0.971223021583,12520,12472,12436,0.986984126984,84,36,164,0.709739906103,1.01696933333,1.06861333333,1.15492957746,2,2,153.619731477 +none,8,0,50,2450,0.02,0.0191374257321,200,300301,157.76975923,168.396019262,168.396019262,6.3102798265,300,20.86968,13.716937355,15,0.185003224855,0.203013333333,0.20968,172400,0,4062,0,0,0,0,0,12052,11819,11523,0.914523809524,529,296,1077,0.69345654043,0.998314666667,1.68717333333,1.10235414534,2,4,143.552817293 +8+1,8,1,50,2450,0.02,0.0192899572498,200,300301,157.76975923,168.396019262,202.986837881,22.2758673043,300,20.92856,15.4515463918,18,0.222813291818,0.244506666667,0.451386666667,172400,21600,4255,562,325,325,1216,0.210902011681,12104,11825,11562,0.917619047619,542,263,1038,0.709203642987,1.00418666667,1.99370666667,1.13442622951,2,5,143.614717878 +8+2,8,2,50,2450,0.02,0.0199477213011,200,300301,157.76975923,168.396019262,226.951396469,30.4830189704,300,20.97464,17.2096474954,21,0.248295249433,0.275226666667,0.465306666667,172400,43200,4326,1104,971,658,905,0.420985284709,12183,11974,11760,0.933333333333,423,214,840,0.712576776557,1.009596,1.63154666667,1.15384615385,2,4,145.767170259 +8+4,8,4,50,2450,0.02,0.0203533945389,200,300301,157.76975923,168.396019262,274.658619583,42.55787076,300,21.05144,20.8592420727,26,0.298285623771,0.338693333333,0.49544,172400,86200,4506,2275,2062,979,520,0.653102068045,12298,12178,12037,0.955317460317,261,141,563,0.749229398664,1.05712,1.40586666667,1.25389755011,2,3,148.638096016 +none,8,0,200,9800,0.02,0.0211716551168,200,300302,157.76975923,168.396019262,168.396019262,6.3102798265,300,20.86968,13.716937355,15,0.18509811593,0.203013333333,0.20968,172400,0,3877,0,0,0,0,0,12251,12188,12105,0.960714285714,146,83,495,0.786258898226,1.325184,2.33330666667,1.38655462185,3,6,150.881316819 +8+1,8,1,200,9800,0.02,0.0216871677039,200,300302,157.76975923,168.396019262,202.986837881,22.2758673043,300,20.92856,15.4515463918,18,0.221480990148,0.244346666667,0.448133333333,172400,21600,3983,513,74,74,734,0.0915841584158,12241,12170,12079,0.958650793651,162,91,521,0.809597474466,1.332496,2.33416,1.45125348189,3,6,150.12864908 +8+2,8,2,200,9800,0.02,0.0194531290427,200,300302,157.76975923,168.396019262,226.951396469,30.4830189704,300,20.97464,17.2096474954,21,0.246329619252,0.275066666667,0.466746666667,172400,43200,3573,908,144,101,602,0.143669985775,12283,12214,12134,0.963015873016,149,80,466,0.837464218579,1.33874666667,2.33416,1.52786885246,3,6,150.482540821 +8+4,8,4,200,9800,0.02,0.0194004010436,200,300302,157.76975923,168.396019262,274.658619583,42.55787076,300,21.05144,20.8592420727,26,0.295920402143,0.336666666667,0.465946666667,172400,86200,3550,1777,375,160,522,0.234604105572,12288,12225,12135,0.963095238095,153,90,465,0.899563467643,1.34797333333,2.33416,1.7032967033,3,6,149.943889824 +none,8,0,1000,49000,0.02,0.0172219900037,200,300303,157.76975923,168.396019262,168.396019262,6.3102798265,300,20.86968,13.716937355,15,0.185021764277,0.203013333333,0.20968,172400,0,3014,0,0,0,0,0,12372,12355,12345,0.979761904762,27,10,255,1.40302564103,3.049944,4.32696,3.26923076923,8.15,12,153.808757968 +8+1,8,1,1000,49000,0.02,0.0172016717987,200,300303,157.76975923,168.396019262,202.986837881,22.2758673043,300,20.92856,15.4515463918,18,0.221316092289,0.244346666667,0.250373333333,172400,21600,3003,374,13,13,423,0.0298165137615,12371,12351,12338,0.979206349206,33,13,262,1.43732205128,3.039692,4.31074666667,3.35897435897,8.15,12,153.287364252 +8+2,8,2,1000,49000,0.02,0.0176312789901,200,300303,157.76975923,168.396019262,226.951396469,30.4830189704,300,20.97464,17.2096474954,21,0.24594955031,0.275066666667,0.449946666667,172400,43200,3079,781,25,16,427,0.0361173814898,12366,12342,12327,0.978333333333,39,15,273,1.46630616034,3.04793866667,4.29538666667,3.45569620253,8.1,12,152.806923027 +8+4,8,4,1000,49000,0.02,0.0171897343344,200,300303,157.76975923,168.396019262,274.658619583,42.55787076,300,21.05144,20.8592420727,26,0.295510529817,0.336506666667,0.464693333333,172400,86200,3004,1509,64,27,400,0.0632318501171,12372,12346,12325,0.978174603175,47,21,275,1.53289614035,3.09500666667,4.27541333333,3.61842105263,8.25,12,152.233086193 diff --git a/data/processed/lab030/lab030_stream_rate_overhead.png b/data/processed/lab030/lab030_stream_rate_overhead.png new file mode 100644 index 0000000000000000000000000000000000000000..95a409f0ae0a40303834cfa4a0f9b978457a7a11 GIT binary patch literal 63109 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�hNvI@Wuu4Ly7-1N}?E+B`7IMBeBF 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 tuple[ + tuple[int, ...], + tuple[int, ...], +]: + exponent = [0] * (GF_ORDER * 2) + logarithm = [0] * GF_FIELD_SIZE + value = 1 + for index in range(GF_ORDER): + exponent[index] = value + logarithm[value] = index + value <<= 1 + if value & GF_FIELD_SIZE: + value ^= GF_PRIMITIVE_POLYNOMIAL + for index in range(GF_ORDER, GF_ORDER * 2): + exponent[index] = exponent[index - GF_ORDER] + return tuple(exponent), tuple(logarithm) + + +GF_EXP, GF_LOG = _build_gf_tables() + + +def gf_add(left: int, right: int) -> int: + """Addition/subtraction in GF(256).""" + + return left ^ right + + +def gf_mul(left: int, right: int) -> int: + """Multiplication in GF(256).""" + + if left == 0 or right == 0: + return 0 + return GF_EXP[GF_LOG[left] + GF_LOG[right]] + + +def gf_div(dividend: int, divisor: int) -> int: + """Division in GF(256).""" + + if divisor == 0: + raise ZeroDivisionError("GF(256) division by zero") + if dividend == 0: + return 0 + return GF_EXP[ + (GF_LOG[dividend] - GF_LOG[divisor]) % GF_ORDER + ] + + +def gf_inverse(value: int) -> int: + """Multiplicative inverse in GF(256).""" + + if value == 0: + raise ZeroDivisionError("zero has no GF(256) inverse") + return GF_EXP[GF_ORDER - GF_LOG[value]] + + +def gf_pow(value: int, exponent: int) -> int: + """Non-negative integer power in GF(256).""" + + if exponent < 0: + raise ValueError("negative GF exponent is unsupported") + if exponent == 0: + return 1 + if value == 0: + return 0 + return GF_EXP[(GF_LOG[value] * exponent) % GF_ORDER] + + +GF_MUL_TRANSLATIONS = tuple( + bytes(gf_mul(coefficient, value) for value in range(256)) + for coefficient in range(256) +) + + +def matrix_multiply( + left: tuple[tuple[int, ...], ...], + right: tuple[tuple[int, ...], ...], +) -> tuple[tuple[int, ...], ...]: + """Multiply two small matrices over GF(256).""" + + if not left or not right: + raise ValueError("matrices must not be empty") + inner_size = len(left[0]) + if inner_size != len(right): + raise ValueError("matrix dimensions do not match") + column_count = len(right[0]) + result = [] + for row in left: + if len(row) != inner_size: + raise ValueError("left matrix is ragged") + result_row = [] + for column_index in range(column_count): + value = 0 + for inner_index in range(inner_size): + value ^= gf_mul( + row[inner_index], + right[inner_index][column_index], + ) + result_row.append(value) + result.append(tuple(result_row)) + return tuple(result) + + +def matrix_inverse( + matrix: tuple[tuple[int, ...], ...], +) -> tuple[tuple[int, ...], ...]: + """Invert a square matrix using GF(256) Gauss-Jordan elimination.""" + + size = len(matrix) + if size == 0 or any(len(row) != size for row in matrix): + raise ValueError("matrix must be non-empty and square") + augmented = [ + list(row) + + [1 if row_index == column_index else 0 + for column_index in range(size)] + for row_index, row in enumerate(matrix) + ] + + for pivot_column in range(size): + pivot_row = next( + ( + row_index + for row_index in range(pivot_column, size) + if augmented[row_index][pivot_column] != 0 + ), + None, + ) + if pivot_row is None: + raise MatrixSingularError("GF(256) matrix is singular") + if pivot_row != pivot_column: + augmented[pivot_column], augmented[pivot_row] = ( + augmented[pivot_row], + augmented[pivot_column], + ) + + pivot_inverse = gf_inverse( + augmented[pivot_column][pivot_column] + ) + augmented[pivot_column] = [ + gf_mul(value, pivot_inverse) + for value in augmented[pivot_column] + ] + + for row_index in range(size): + if row_index == pivot_column: + continue + factor = augmented[row_index][pivot_column] + if factor == 0: + continue + augmented[row_index] = [ + value ^ gf_mul(factor, pivot_value) + for value, pivot_value in zip( + augmented[row_index], + augmented[pivot_column], + ) + ] + + return tuple( + tuple(row[size:]) for row in augmented + ) + + +@lru_cache(maxsize=None) +def systematic_generator_matrix( + source_count: int, + parity_count: int, +) -> tuple[tuple[int, ...], ...]: + """Return an n×k systematic Vandermonde generator matrix.""" + + if not 1 <= source_count <= MAX_BLOCK_SYMBOLS: + raise ValueError("source_count is outside 1...255") + if not 0 <= parity_count <= ( + MAX_BLOCK_SYMBOLS - source_count + ): + raise ValueError("source_count + parity_count exceeds 255") + total_count = source_count + parity_count + vandermonde = tuple( + tuple( + gf_pow(row_index + 1, column_index) + for column_index in range(source_count) + ) + for row_index in range(total_count) + ) + top_inverse = matrix_inverse( + vandermonde[:source_count] + ) + generator = matrix_multiply(vandermonde, top_inverse) + identity = tuple( + tuple( + 1 if row_index == column_index else 0 + for column_index in range(source_count) + ) + for row_index in range(source_count) + ) + if generator[:source_count] != identity: + raise RuntimeError("generator matrix is not systematic") + return generator + + +def _linear_combine( + coefficients: tuple[int, ...], + symbols: tuple[bytes, ...], + symbol_size: int, +) -> bytes: + """Combine equal-size byte strings over GF(256), using C-level helpers.""" + + accumulator = 0 + for coefficient, symbol in zip(coefficients, symbols): + if coefficient == 0: + continue + translated = symbol.translate( + GF_MUL_TRANSLATIONS[coefficient] + ) + accumulator ^= int.from_bytes(translated, "little") + return accumulator.to_bytes(symbol_size, "little") + + +def encode_parity_symbols( + source_symbols: tuple[bytes, ...], + parity_count: int, +) -> tuple[bytes, ...]: + """Encode zero-padded source symbols into parity symbols.""" + + if not source_symbols: + raise ValueError("source symbol list is empty") + symbol_size = len(source_symbols[0]) + if symbol_size == 0: + raise ValueError("symbol size is zero") + if any(len(symbol) != symbol_size for symbol in source_symbols): + raise ValueError("source symbols must have equal size") + generator = systematic_generator_matrix( + len(source_symbols), parity_count + ) + return tuple( + _linear_combine(row, source_symbols, symbol_size) + for row in generator[len(source_symbols):] + ) + + +def outer_crc32(data: bytes) -> int: + return zlib.crc32(data) & 0xFFFFFFFF + + +def _validate_outer_symbol(symbol: OuterSymbol) -> None: + total_count = symbol.source_count + symbol.parity_count + if not 0 <= symbol.block_id <= 0xFFFFFFFF: + raise FECError("block_id is outside uint32") + if not 1 <= symbol.source_count <= MAX_BLOCK_SYMBOLS: + raise FECError("source_count is outside 1...255") + if not 0 <= symbol.parity_count <= ( + MAX_BLOCK_SYMBOLS - symbol.source_count + ): + raise FECError("invalid parity_count") + if not 0 <= symbol.symbol_index < total_count: + raise FECError("symbol_index is outside the block") + if not 1 <= symbol.symbol_size <= MAX_SYMBOL_SIZE: + raise FECError("symbol_size is outside uint16") + if not 1 <= len(symbol.data) <= symbol.symbol_size: + raise FECError("data length is outside symbol_size") + expected_parity = symbol.symbol_index >= symbol.source_count + if symbol.is_parity != expected_parity: + raise FECError("parity flag conflicts with symbol_index") + if symbol.is_parity and len(symbol.data) != symbol.symbol_size: + raise FECError("parity data must equal symbol_size") + + +def _pack_outer_header( + symbol: OuterSymbol, + crc_value: int, +) -> bytes: + return struct.pack( + OUTER_HEADER_FORMAT, + OUTER_MAGIC, + OUTER_VERSION, + OUTER_FLAG_PARITY if symbol.is_parity else 0, + OUTER_HEADER_SIZE, + symbol.block_id, + symbol.symbol_index, + symbol.source_count, + symbol.parity_count, + symbol.symbol_size, + len(symbol.data), + 0, + 0, + crc_value, + ) + + +def encode_outer_symbol(symbol: OuterSymbol) -> bytes: + """Serialize one source/parity symbol and calculate outer CRC32.""" + + if not isinstance(symbol, OuterSymbol): + raise TypeError("symbol must be OuterSymbol") + _validate_outer_symbol(symbol) + header_without_crc = _pack_outer_header(symbol, 0) + crc_value = outer_crc32(header_without_crc + symbol.data) + return _pack_outer_header(symbol, crc_value) + symbol.data + + +def decode_outer_symbol(wire_packet: bytes) -> OuterSymbol: + """Deserialize and validate one outer FEC packet.""" + + if not isinstance(wire_packet, (bytes, bytearray)): + raise TypeError("wire_packet must be bytes or bytearray") + wire_packet = bytes(wire_packet) + if len(wire_packet) < OUTER_HEADER_SIZE + 1: + raise FECError("outer packet is too short") + ( + magic, + version, + flags, + header_size, + block_id, + symbol_index, + source_count, + parity_count, + symbol_size, + data_length, + reserved16, + reserved32, + received_crc, + ) = struct.unpack( + OUTER_HEADER_FORMAT, + wire_packet[:OUTER_HEADER_SIZE], + ) + if magic != OUTER_MAGIC: + raise FECError("invalid outer magic") + if version != OUTER_VERSION: + raise FECError("unsupported outer version") + if flags & ~OUTER_FLAG_PARITY: + raise FECError("unsupported outer flags") + if header_size != OUTER_HEADER_SIZE: + raise FECError("invalid outer header size") + if reserved16 != 0 or reserved32 != 0: + raise FECError("reserved outer fields must be zero") + if len(wire_packet) != OUTER_HEADER_SIZE + data_length: + raise FECError("outer data_length does not match packet length") + + symbol = OuterSymbol( + block_id=block_id, + symbol_index=symbol_index, + source_count=source_count, + parity_count=parity_count, + symbol_size=symbol_size, + data=wire_packet[OUTER_HEADER_SIZE:], + is_parity=bool(flags & OUTER_FLAG_PARITY), + outer_crc32=received_crc, + ) + _validate_outer_symbol(symbol) + calculated_crc = outer_crc32( + _pack_outer_header(symbol, 0) + symbol.data + ) + if calculated_crc != received_crc: + raise OuterPacketCRCError( + "outer CRC mismatch: " + f"received 0x{received_crc:08X}, " + f"calculated 0x{calculated_crc:08X}" + ) + return symbol + + +def encode_fec_block( + inner_packets: tuple[bytes, ...], + block_id: int, + parity_count: int, +) -> tuple[bytes, ...]: + """Wrap systematic Lab028 packets and append parity packets.""" + + if not inner_packets: + raise ValueError("inner packet block is empty") + if len(inner_packets) + parity_count > MAX_BLOCK_SYMBOLS: + raise ValueError("FEC block has more than 255 symbols") + validated_packets = [] + for packet in inner_packets: + packet_bytes = bytes(packet) + decode_inner_packet(packet_bytes) + validated_packets.append(packet_bytes) + symbol_size = max(len(packet) for packet in validated_packets) + if symbol_size > MAX_SYMBOL_SIZE: + raise ValueError("inner packet is too large for outer symbol_size") + padded_sources = tuple( + packet + bytes(symbol_size - len(packet)) + for packet in validated_packets + ) + parity_symbols = encode_parity_symbols( + padded_sources, parity_count + ) + source_count = len(validated_packets) + outer_packets = [ + encode_outer_symbol( + OuterSymbol( + block_id=block_id, + symbol_index=index, + source_count=source_count, + parity_count=parity_count, + symbol_size=symbol_size, + data=packet, + is_parity=False, + ) + ) + for index, packet in enumerate(validated_packets) + ] + outer_packets.extend( + encode_outer_symbol( + OuterSymbol( + block_id=block_id, + symbol_index=source_count + parity_index, + source_count=source_count, + parity_count=parity_count, + symbol_size=symbol_size, + data=parity, + is_parity=True, + ) + ) + for parity_index, parity in enumerate(parity_symbols) + ) + return tuple(outer_packets) + + +def _padded_symbol(symbol: OuterSymbol) -> bytes: + return symbol.data + bytes(symbol.symbol_size - len(symbol.data)) + + +def trim_recovered_inner_packet(padded_packet: bytes) -> bytes: + """Trim GF padding using the recovered Lab028 header and validate CRC.""" + + if len(padded_packet) < INNER_HEADER_SIZE: + raise FECError("recovered symbol is shorter than Lab028 header") + unpacked = struct.unpack( + INNER_HEADER_FORMAT, + padded_packet[:INNER_HEADER_SIZE], + ) + magic = unpacked[0] + version = unpacked[1] + payload_length = unpacked[7] + if magic != INNER_MAGIC or version != INNER_VERSION: + raise FECError("recovered Lab028 magic/version is invalid") + packet_length = INNER_HEADER_SIZE + payload_length + if packet_length > len(padded_packet): + raise FECError("recovered Lab028 length exceeds symbol_size") + inner_packet = padded_packet[:packet_length] + decode_inner_packet(inner_packet) + return inner_packet + + +def decode_fec_block( + wire_symbols: tuple[bytes, ...], +) -> DecodedFECBlock: + """Recover all source Lab028 packets from any k valid outer symbols.""" + + if not wire_symbols: + raise InsufficientSymbolsError("no outer symbols received") + symbols_by_index: dict[int, OuterSymbol] = {} + metadata = None + for wire_symbol in wire_symbols: + symbol = decode_outer_symbol(wire_symbol) + current_metadata = ( + symbol.block_id, + symbol.source_count, + symbol.parity_count, + symbol.symbol_size, + ) + if metadata is None: + metadata = current_metadata + elif current_metadata != metadata: + raise FECError("outer symbols belong to different blocks") + existing = symbols_by_index.get(symbol.symbol_index) + if existing is not None: + if existing != symbol: + raise FECError("conflicting duplicate outer symbol") + continue + symbols_by_index[symbol.symbol_index] = symbol + + assert metadata is not None + block_id, source_count, parity_count, symbol_size = metadata + if len(symbols_by_index) < source_count: + raise InsufficientSymbolsError( + f"need {source_count} symbols, got {len(symbols_by_index)}" + ) + + selected_indices = tuple(sorted(symbols_by_index)[:source_count]) + generator = systematic_generator_matrix( + source_count, parity_count + ) + decode_matrix = matrix_inverse( + tuple(generator[index] for index in selected_indices) + ) + selected_symbols = tuple( + _padded_symbol(symbols_by_index[index]) + for index in selected_indices + ) + + source_packets = [] + recovered_indices = [] + for source_index in range(source_count): + received_source = symbols_by_index.get(source_index) + if received_source is not None: + inner_packet = received_source.data + decode_inner_packet(inner_packet) + else: + padded_packet = _linear_combine( + decode_matrix[source_index], + selected_symbols, + symbol_size, + ) + inner_packet = trim_recovered_inner_packet(padded_packet) + recovered_indices.append(source_index) + source_packets.append(inner_packet) + return DecodedFECBlock( + block_id=block_id, + source_packets=tuple(source_packets), + recovered_indices=tuple(recovered_indices), + ) diff --git a/tests/lab030_packet_erasure_fec.py b/tests/lab030_packet_erasure_fec.py new file mode 100644 index 0000000..e57ff8e --- /dev/null +++ b/tests/lab030_packet_erasure_fec.py @@ -0,0 +1,1711 @@ +""" +Lab030. Systematic packet-erasure FEC for the synchronous video stream. + +Real Lab028 packets with 512-byte payload are grouped consecutively in +blocks of k=8. Modes without FEC and with r=1,2,4 parity packets are compared +over the time-based Lab029B channel at 300 kbit/s. Blocks may cross composite +frame boundaries. Systematic packets precede parity packets; no interleaving, +ARQ, or retransmission is used. +""" + +from __future__ import annotations + +from bisect import bisect_right +import csv +from dataclasses import asdict, dataclass +from itertools import combinations +from pathlib import Path +from typing import Callable + +import cv2 +import matplotlib +import numpy as np + +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +from protocol.packet_erasure_fec import ( + GF_PRIMITIVE_POLYNOMIAL, + OUTER_HEADER_FORMAT, + OUTER_HEADER_SIZE, + DecodedFECBlock, + InsufficientSymbolsError, + OuterPacketCRCError, + decode_fec_block, + decode_outer_symbol, + encode_fec_block, + gf_add, + gf_div, + gf_inverse, + gf_mul, +) +from protocol.video_packet import ( + CompositeReassembler, + ObjectType, + decode_packet as decode_inner_packet, +) +from tests.lab028_video_packetization import ( + COMPOSITE_FPS, + SOURCE_VIDEO_PATH, + EncodedComposite, + VideoMetadata, + load_video_profile, +) +from tests.lab029_packet_channel_simulation import ( + PreparedProfile, + prepare_profiles, +) +from tests.lab029b_time_based_burst_simulation import ( + BAD_TIME_FRACTION, + CONTROL_STREAM_BITRATE_BPS, + CONTROL_STREAM_BITRATE_KBPS, + MEAN_BAD_DURATIONS_SECONDS, + TimeInterval, + generate_bad_intervals, + percentile, + positive_runs, +) + + +OUTPUT_DIRECTORY = Path("data/processed/lab030") +CSV_PATH = OUTPUT_DIRECTORY / "lab030_results.csv" +REPORT_PATH = OUTPUT_DIRECTORY / "lab030_report.txt" +COMPOSITE_SUCCESS_PLOT_PATH = ( + OUTPUT_DIRECTORY / "lab030_composite_success.png" +) +NO_IMAGE_PLOT_PATH = OUTPUT_DIRECTORY / "lab030_no_image_duration.png" +STREAM_RATE_PLOT_PATH = ( + OUTPUT_DIRECTORY / "lab030_stream_rate_overhead.png" +) +DELAY_QUEUE_PLOT_PATH = ( + OUTPUT_DIRECTORY / "lab030_delay_queue.png" +) +MODE_COMPARISON_PLOT_PATH = ( + OUTPUT_DIRECTORY / "lab030_mode_comparison.png" +) + +INNER_PAYLOAD_SIZE = 512 +SOURCE_BLOCK_SIZE = 8 +MONTE_CARLO_REPETITIONS = 200 +MASTER_SEED = 300_300 +SEED_BASE = MASTER_SEED +TIME_EPSILON_SECONDS = 1e-12 + + +@dataclass(frozen=True) +class FECMode: + name: str + parity_count: int + label: str + + +FEC_MODES = ( + FECMode("none", 0, "Без FEC"), + FECMode("8+1", 1, "8+1"), + FECMode("8+2", 2, "8+2"), + FECMode("8+4", 4, "8+4"), +) + +CSV_FIELDS = [ + "mode", + "source_block_size", + "nominal_parity_count", + "mean_bad_duration_ms", + "mean_good_duration_ms", + "target_bad_time_fraction", + "actual_bad_time_fraction", + "monte_carlo_repetitions", + "seed", + "source_jpeg_bitrate_kbps", + "inner_packet_stream_bitrate_kbps", + "outer_fec_stream_bitrate_kbps", + "service_and_parity_percent", + "control_stream_bitrate_kbps", + "schedule_duration_seconds", + "mean_queue_length_packets", + "max_queue_length_packets", + "mean_publication_delay_seconds", + "p95_publication_delay_seconds", + "max_publication_delay_seconds", + "transmitted_source_packets", + "transmitted_parity_packets", + "lost_source_packets", + "lost_parity_packets", + "recovered_source_packets", + "fec_recovered_blocks", + "fec_unrecoverable_blocks", + "fec_affected_block_recovery_rate", + "base_objects_completed", + "roi_objects_completed", + "atomic_composite_frames_completed", + "composite_success_rate", + "base_only_frames", + "roi_only_frames", + "incomplete_frames", + "mean_no_new_image_duration_seconds", + "p95_no_new_image_duration_seconds", + "max_no_new_image_duration_seconds", + "mean_consecutive_incomplete_frames", + "p95_consecutive_incomplete_frames", + "max_consecutive_incomplete_frames", + "effective_delivered_video_bitrate_kbps", +] + + +@dataclass(frozen=True) +class SourcePacket: + global_index: int + composite_frame_id: int + generation_time_seconds: float + inner_packet: bytes + + +@dataclass(frozen=True) +class FECBlockPlan: + block_id: int + source_global_indices: tuple[int, ...] + source_count: int + parity_count: int + symbol_size: int + + +@dataclass(frozen=True) +class TransmissionUnit: + sequence_index: int + generation_time_seconds: float + wire_packet: bytes + is_parity: bool + block_id: int + symbol_index: int + source_global_index: int | None + + +@dataclass(frozen=True) +class ScheduledUnit: + unit: TransmissionUnit + start_seconds: float + end_seconds: float + + +@dataclass(frozen=True) +class ModeSchedule: + mode: FECMode + source_packets: tuple[SourcePacket, ...] + blocks: tuple[FECBlockPlan, ...] + units: tuple[ScheduledUnit, ...] + source_duration_seconds: float + duration_seconds: float + total_jpeg_bytes: int + total_inner_bytes: int + total_transmitted_bytes: int + mean_queue_length_packets: float + max_queue_length_packets: int + + +@dataclass +class BlockReceiveState: + plan: FECBlockPlan + received_outer_packets: list[bytes] + delivered_source_indices: set[int] + lost_source_indices: set[int] + decoded: bool = False + recovery_failed: bool = False + recovered_source_packets: int = 0 + + +@dataclass(frozen=True) +class RepetitionResult: + lost_source_packets: int + lost_parity_packets: int + recovered_source_packets: int + fec_recovered_blocks: int + fec_unrecoverable_blocks: int + base_objects_completed: int + roi_objects_completed: int + atomic_composite_frames_completed: int + base_only_frames: int + roi_only_frames: int + incomplete_frames: int + delivered_jpeg_bytes: int + publication_delays: tuple[float, ...] + no_new_image_durations: tuple[float, ...] + incomplete_frame_runs: tuple[int, ...] + bad_time_seconds: float + + +@dataclass(frozen=True) +class SimulationResult: + mode: str + source_block_size: int + nominal_parity_count: int + mean_bad_duration_ms: float + mean_good_duration_ms: float + target_bad_time_fraction: float + actual_bad_time_fraction: float + monte_carlo_repetitions: int + seed: int + source_jpeg_bitrate_kbps: float + inner_packet_stream_bitrate_kbps: float + outer_fec_stream_bitrate_kbps: float + service_and_parity_percent: float + control_stream_bitrate_kbps: float + schedule_duration_seconds: float + mean_queue_length_packets: float + max_queue_length_packets: int + mean_publication_delay_seconds: float + p95_publication_delay_seconds: float + max_publication_delay_seconds: float + transmitted_source_packets: int + transmitted_parity_packets: int + lost_source_packets: int + lost_parity_packets: int + recovered_source_packets: int + fec_recovered_blocks: int + fec_unrecoverable_blocks: int + fec_affected_block_recovery_rate: float + base_objects_completed: int + roi_objects_completed: int + atomic_composite_frames_completed: int + composite_success_rate: float + base_only_frames: int + roi_only_frames: int + incomplete_frames: int + mean_no_new_image_duration_seconds: float + p95_no_new_image_duration_seconds: float + max_no_new_image_duration_seconds: float + mean_consecutive_incomplete_frames: float + p95_consecutive_incomplete_frames: float + max_consecutive_incomplete_frames: int + effective_delivered_video_bitrate_kbps: float + + +@dataclass(frozen=True) +class FunctionalTestResult: + name: str + passed: bool + detail: str + + +def parity_for_last_block( + source_count: int, + nominal_parity_count: int, +) -> int: + """Preserve the nominal parity ratio in a final partial block.""" + + if nominal_parity_count == 0: + return 0 + return max( + 1, + int( + np.ceil( + source_count + * nominal_parity_count + / SOURCE_BLOCK_SIZE + ) + ), + ) + + +def prepare_source_packets( + profile: PreparedProfile, +) -> tuple[SourcePacket, ...]: + return tuple( + SourcePacket( + global_index=index, + composite_frame_id=prepared.composite_frame_id, + generation_time_seconds=( + prepared.composite_frame_id / COMPOSITE_FPS + ), + inner_packet=prepared.wire_packet, + ) + for index, prepared in enumerate(profile.packets) + ) + + +def build_mode_units( + source_packets: tuple[SourcePacket, ...], + mode: FECMode, +) -> tuple[ + tuple[TransmissionUnit, ...], + tuple[FECBlockPlan, ...], +]: + """Build sequential systematic/parity transmission units.""" + + if mode.parity_count == 0: + units = tuple( + TransmissionUnit( + sequence_index=index, + generation_time_seconds=packet.generation_time_seconds, + wire_packet=packet.inner_packet, + is_parity=False, + block_id=index // SOURCE_BLOCK_SIZE, + symbol_index=index % SOURCE_BLOCK_SIZE, + source_global_index=index, + ) + for index, packet in enumerate(source_packets) + ) + return units, () + + units = [] + blocks = [] + sequence_index = 0 + for block_id, start in enumerate( + range(0, len(source_packets), SOURCE_BLOCK_SIZE) + ): + block_sources = source_packets[ + start:start + SOURCE_BLOCK_SIZE + ] + source_count = len(block_sources) + parity_count = ( + mode.parity_count + if source_count == SOURCE_BLOCK_SIZE + else parity_for_last_block( + source_count, mode.parity_count + ) + ) + inner_packets = tuple( + packet.inner_packet for packet in block_sources + ) + outer_packets = encode_fec_block( + inner_packets, block_id, parity_count + ) + parsed_outer = [ + decode_outer_symbol(packet) for packet in outer_packets + ] + generation_complete = max( + packet.generation_time_seconds + for packet in block_sources + ) + blocks.append( + FECBlockPlan( + block_id=block_id, + source_global_indices=tuple( + packet.global_index for packet in block_sources + ), + source_count=source_count, + parity_count=parity_count, + symbol_size=parsed_outer[0].symbol_size, + ) + ) + for local_index, (wire_packet, parsed) in enumerate( + zip(outer_packets, parsed_outer) + ): + is_parity = parsed.is_parity + units.append( + TransmissionUnit( + sequence_index=sequence_index, + generation_time_seconds=( + generation_complete + if is_parity + else block_sources[ + local_index + ].generation_time_seconds + ), + wire_packet=wire_packet, + is_parity=is_parity, + block_id=block_id, + symbol_index=parsed.symbol_index, + source_global_index=( + None + if is_parity + else block_sources[ + local_index + ].global_index + ), + ) + ) + sequence_index += 1 + return tuple(units), tuple(blocks) + + +def schedule_units( + units: tuple[TransmissionUnit, ...], +) -> tuple[ + tuple[ScheduledUnit, ...], + float, + float, + int, +]: + """Run the transmitter as one FIFO queue at 300 kbit/s.""" + + scheduled = [] + cursor = 0.0 + for unit in units: + start = max(cursor, unit.generation_time_seconds) + end = ( + start + + len(unit.wire_packet) + * 8.0 + / CONTROL_STREAM_BITRATE_BPS + ) + scheduled.append(ScheduledUnit(unit, start, end)) + cursor = end + + queue_depth_samples = [] + for arriving in units: + generation_time = arriving.generation_time_seconds + queue_depth_samples.append( + sum( + 1 + for scheduled_unit in scheduled + if ( + scheduled_unit.unit.generation_time_seconds + <= generation_time + TIME_EPSILON_SECONDS + and scheduled_unit.end_seconds + > generation_time + TIME_EPSILON_SECONDS + ) + ) + ) + return ( + tuple(scheduled), + scheduled[-1].end_seconds, + float(np.mean(queue_depth_samples)), + max(queue_depth_samples), + ) + + +def build_mode_schedules( + metadata: VideoMetadata, + composites: list[EncodedComposite], + profile: PreparedProfile, +) -> dict[str, ModeSchedule]: + source_packets = prepare_source_packets(profile) + total_jpeg_bytes = sum( + len(composite.base_jpeg) + len(composite.roi_jpeg) + for composite in composites + ) + total_inner_bytes = sum( + len(packet.inner_packet) for packet in source_packets + ) + schedules = {} + for mode in FEC_MODES: + units, blocks = build_mode_units(source_packets, mode) + scheduled, duration, mean_queue, max_queue = schedule_units( + units + ) + schedules[mode.name] = ModeSchedule( + mode=mode, + source_packets=source_packets, + blocks=blocks, + units=scheduled, + source_duration_seconds=metadata.duration_seconds, + duration_seconds=duration, + total_jpeg_bytes=total_jpeg_bytes, + total_inner_bytes=total_inner_bytes, + total_transmitted_bytes=sum( + len(unit.unit.wire_packet) for unit in scheduled + ), + mean_queue_length_packets=mean_queue, + max_queue_length_packets=max_queue, + ) + return schedules + + +def overlap_loss_flags( + schedule: ModeSchedule, + intervals: tuple[TimeInterval, ...], +) -> np.ndarray: + flags = np.zeros(len(schedule.units), dtype=np.bool_) + interval_index = 0 + for unit_index, scheduled in enumerate(schedule.units): + while ( + interval_index < len(intervals) + and intervals[interval_index].end_seconds + <= scheduled.start_seconds + TIME_EPSILON_SECONDS + ): + interval_index += 1 + if interval_index >= len(intervals): + break + interval = intervals[interval_index] + if ( + interval.start_seconds + < scheduled.end_seconds - TIME_EPSILON_SECONDS + and interval.end_seconds + > scheduled.start_seconds + TIME_EPSILON_SECONDS + ): + flags[unit_index] = True + return flags + + +def frame_outage_metrics( + frame_count: int, + completion_times: dict[int, float], + schedule_end: float, +) -> tuple[ + tuple[float, ...], + tuple[int, ...], + tuple[float, ...], +]: + complete = [ + frame_id in completion_times for frame_id in range(frame_count) + ] + incomplete_runs = positive_runs([not flag for flag in complete]) + no_image = [] + index = 0 + while index < frame_count: + if complete[index]: + index += 1 + continue + run_start = index + while index < frame_count and not complete[index]: + index += 1 + start_time = ( + completion_times[run_start - 1] + if run_start > 0 + else 0.0 + ) + end_time = ( + completion_times[index] + if index < frame_count + else schedule_end + ) + no_image.append(max(0.0, end_time - start_time)) + publication_delays = tuple( + completion_time - frame_id / COMPOSITE_FPS + for frame_id, completion_time in completion_times.items() + ) + return tuple(no_image), incomplete_runs, publication_delays + + +def simulate_baseline( + schedule: ModeSchedule, + loss_flags: np.ndarray, + frame_count: int, +) -> RepetitionResult: + receiver = CompositeReassembler() + completion_times = {} + lost_source = 0 + delivered_jpeg_bytes = 0 + for lost, scheduled in zip(loss_flags, schedule.units): + if bool(lost): + lost_source += 1 + continue + completed = receiver.ingest(scheduled.unit.wire_packet) + if completed is not None: + completion_times[completed.composite_frame_id] = ( + scheduled.end_seconds + ) + delivered_jpeg_bytes += ( + len(completed.base_jpeg) + len(completed.roi_jpeg) + ) + return finish_repetition( + schedule, + receiver, + completion_times, + frame_count, + lost_source, + 0, + 0, + 0, + 0, + delivered_jpeg_bytes, + ) + + +def deliver_inner_packet( + receiver: CompositeReassembler, + inner_packet: bytes, + delivery_time: float, + completion_times: dict[int, float], +) -> int: + completed = receiver.ingest(inner_packet) + if completed is None: + return 0 + completion_times[completed.composite_frame_id] = delivery_time + return len(completed.base_jpeg) + len(completed.roi_jpeg) + + +def simulate_fec( + schedule: ModeSchedule, + loss_flags: np.ndarray, + frame_count: int, +) -> RepetitionResult: + receiver = CompositeReassembler() + completion_times = {} + plans = {plan.block_id: plan for plan in schedule.blocks} + states = { + block_id: BlockReceiveState( + plan=plan, + received_outer_packets=[], + delivered_source_indices=set(), + lost_source_indices=set(), + ) + for block_id, plan in plans.items() + } + lost_source = 0 + lost_parity = 0 + delivered_jpeg_bytes = 0 + + for lost, scheduled in zip(loss_flags, schedule.units): + unit = scheduled.unit + state = states[unit.block_id] + if bool(lost): + if unit.is_parity: + lost_parity += 1 + else: + lost_source += 1 + assert unit.source_global_index is not None + state.lost_source_indices.add( + unit.source_global_index + ) + continue + + state.received_outer_packets.append(unit.wire_packet) + parsed = decode_outer_symbol(unit.wire_packet) + if not parsed.is_parity: + global_index = state.plan.source_global_indices[ + parsed.symbol_index + ] + if global_index not in state.delivered_source_indices: + state.delivered_source_indices.add(global_index) + delivered_jpeg_bytes += deliver_inner_packet( + receiver, + parsed.data, + scheduled.end_seconds, + completion_times, + ) + + if ( + not state.decoded + and len(state.received_outer_packets) + >= state.plan.source_count + ): + decoded = decode_fec_block( + tuple(state.received_outer_packets) + ) + state.decoded = True + for local_index in decoded.recovered_indices: + global_index = state.plan.source_global_indices[ + local_index + ] + if global_index in state.delivered_source_indices: + continue + state.delivered_source_indices.add(global_index) + state.recovered_source_packets += 1 + delivered_jpeg_bytes += deliver_inner_packet( + receiver, + decoded.source_packets[local_index], + scheduled.end_seconds, + completion_times, + ) + + recovered_packets = sum( + state.recovered_source_packets for state in states.values() + ) + recovered_blocks = sum( + 1 + for state in states.values() + if ( + state.lost_source_indices + and state.lost_source_indices + <= state.delivered_source_indices + ) + ) + failed_blocks = sum( + 1 + for state in states.values() + if ( + state.lost_source_indices + and not ( + state.lost_source_indices + <= state.delivered_source_indices + ) + ) + ) + return finish_repetition( + schedule, + receiver, + completion_times, + frame_count, + lost_source, + lost_parity, + recovered_packets, + recovered_blocks, + failed_blocks, + delivered_jpeg_bytes, + ) + + +def finish_repetition( + schedule: ModeSchedule, + receiver: CompositeReassembler, + completion_times: dict[int, float], + frame_count: int, + lost_source: int, + lost_parity: int, + recovered_packets: int, + recovered_blocks: int, + failed_blocks: int, + delivered_jpeg_bytes: int, +) -> RepetitionResult: + base_completed = 0 + roi_completed = 0 + base_only = 0 + roi_only = 0 + for frame_id in range(frame_count): + atomic = frame_id in completion_times + base = ( + atomic + or receiver.object_is_complete(frame_id, ObjectType.BASE) + ) + roi = ( + atomic + or receiver.object_is_complete(frame_id, ObjectType.ROI) + ) + base_completed += int(base) + roi_completed += int(roi) + base_only += int(base and not roi) + roi_only += int(roi and not base) + no_image, incomplete_runs, delays = frame_outage_metrics( + frame_count, completion_times, schedule.duration_seconds + ) + return RepetitionResult( + lost_source_packets=lost_source, + lost_parity_packets=lost_parity, + recovered_source_packets=recovered_packets, + fec_recovered_blocks=recovered_blocks, + fec_unrecoverable_blocks=failed_blocks, + base_objects_completed=base_completed, + roi_objects_completed=roi_completed, + atomic_composite_frames_completed=len(completion_times), + base_only_frames=base_only, + roi_only_frames=roi_only, + incomplete_frames=frame_count - len(completion_times), + delivered_jpeg_bytes=delivered_jpeg_bytes, + publication_delays=delays, + no_new_image_durations=no_image, + incomplete_frame_runs=incomplete_runs, + bad_time_seconds=0.0, + ) + + +def simulate_condition( + schedule: ModeSchedule, + frame_count: int, + mean_bad_duration_seconds: float, + seed: int, + repetitions: int, +) -> SimulationResult: + rng = np.random.default_rng(seed) + repetition_results = [] + bad_time_seconds = 0.0 + for _ in range(repetitions): + intervals = generate_bad_intervals( + schedule.duration_seconds, + mean_bad_duration_seconds, + rng, + ) + bad_time_seconds += sum( + interval.duration_seconds for interval in intervals + ) + loss_flags = overlap_loss_flags(schedule, intervals) + repetition_results.append( + simulate_baseline(schedule, loss_flags, frame_count) + if schedule.mode.parity_count == 0 + else simulate_fec(schedule, loss_flags, frame_count) + ) + + def total(field: str) -> int: + return sum( + int(getattr(result, field)) + for result in repetition_results + ) + + def flattened(field: str) -> list[float]: + return [ + float(value) + for result in repetition_results + for value in getattr(result, field) + ] + + publication_delays = flattened("publication_delays") + no_image = flattened("no_new_image_durations") + incomplete_runs = flattened("incomplete_frame_runs") + recovered_blocks = total("fec_recovered_blocks") + failed_blocks = total("fec_unrecoverable_blocks") + affected_blocks = recovered_blocks + failed_blocks + total_frames = frame_count * repetitions + source_packets_per_pass = len(schedule.source_packets) + parity_packets_per_pass = sum( + 1 for unit in schedule.units if unit.unit.is_parity + ) + source_jpeg_rate = ( + schedule.total_jpeg_bytes + * 8.0 + / schedule.source_duration_seconds + / 1000.0 + ) + inner_rate = ( + schedule.total_inner_bytes + * 8.0 + / schedule.source_duration_seconds + / 1000.0 + ) + outer_rate = ( + schedule.total_transmitted_bytes + * 8.0 + / schedule.source_duration_seconds + / 1000.0 + ) + delivered_bytes = total("delivered_jpeg_bytes") + return SimulationResult( + mode=schedule.mode.name, + source_block_size=SOURCE_BLOCK_SIZE, + nominal_parity_count=schedule.mode.parity_count, + mean_bad_duration_ms=mean_bad_duration_seconds * 1000.0, + mean_good_duration_ms=( + mean_bad_duration_seconds + * (1.0 - BAD_TIME_FRACTION) + / BAD_TIME_FRACTION + * 1000.0 + ), + target_bad_time_fraction=BAD_TIME_FRACTION, + actual_bad_time_fraction=( + bad_time_seconds + / (schedule.duration_seconds * repetitions) + ), + monte_carlo_repetitions=repetitions, + seed=seed, + source_jpeg_bitrate_kbps=source_jpeg_rate, + inner_packet_stream_bitrate_kbps=inner_rate, + outer_fec_stream_bitrate_kbps=outer_rate, + service_and_parity_percent=( + ( + schedule.total_transmitted_bytes + - schedule.total_jpeg_bytes + ) + / schedule.total_transmitted_bytes + * 100.0 + ), + control_stream_bitrate_kbps=CONTROL_STREAM_BITRATE_KBPS, + schedule_duration_seconds=schedule.duration_seconds, + mean_queue_length_packets=( + schedule.mean_queue_length_packets + ), + max_queue_length_packets=schedule.max_queue_length_packets, + mean_publication_delay_seconds=( + float(np.mean(publication_delays)) + if publication_delays + else 0.0 + ), + p95_publication_delay_seconds=percentile( + publication_delays, 95 + ), + max_publication_delay_seconds=( + max(publication_delays) if publication_delays else 0.0 + ), + transmitted_source_packets=( + source_packets_per_pass * repetitions + ), + transmitted_parity_packets=( + parity_packets_per_pass * repetitions + ), + lost_source_packets=total("lost_source_packets"), + lost_parity_packets=total("lost_parity_packets"), + recovered_source_packets=total("recovered_source_packets"), + fec_recovered_blocks=recovered_blocks, + fec_unrecoverable_blocks=failed_blocks, + fec_affected_block_recovery_rate=( + recovered_blocks / affected_blocks + if affected_blocks + else 0.0 + ), + base_objects_completed=total("base_objects_completed"), + roi_objects_completed=total("roi_objects_completed"), + atomic_composite_frames_completed=total( + "atomic_composite_frames_completed" + ), + composite_success_rate=( + total("atomic_composite_frames_completed") / total_frames + ), + base_only_frames=total("base_only_frames"), + roi_only_frames=total("roi_only_frames"), + incomplete_frames=total("incomplete_frames"), + mean_no_new_image_duration_seconds=( + float(np.mean(no_image)) if no_image else 0.0 + ), + p95_no_new_image_duration_seconds=percentile(no_image, 95), + max_no_new_image_duration_seconds=( + max(no_image) if no_image else 0.0 + ), + mean_consecutive_incomplete_frames=( + float(np.mean(incomplete_runs)) + if incomplete_runs + else 0.0 + ), + p95_consecutive_incomplete_frames=percentile( + incomplete_runs, 95 + ), + max_consecutive_incomplete_frames=( + int(max(incomplete_runs)) if incomplete_runs else 0 + ), + effective_delivered_video_bitrate_kbps=( + delivered_bytes + * 8.0 + / (schedule.duration_seconds * repetitions) + / 1000.0 + ), + ) + + +def run_monte_carlo( + schedules: dict[str, ModeSchedule], + frame_count: int, +) -> list[SimulationResult]: + results = [] + for duration_index, duration in enumerate( + MEAN_BAD_DURATIONS_SECONDS + ): + seed = SEED_BASE + duration_index + for mode in FEC_MODES: + results.append( + simulate_condition( + schedules[mode.name], + frame_count, + duration, + seed, + MONTE_CARLO_REPETITIONS, + ) + ) + return results + + +def result_lookup( + results: list[SimulationResult], + mean_bad_duration_ms: float, +) -> dict[str, SimulationResult]: + return { + result.mode: result + for result in results + if result.mean_bad_duration_ms == mean_bad_duration_ms + } + + +def run_functional_tests( + composites: list[EncodedComposite], + schedules: dict[str, ModeSchedule], + results: list[SimulationResult], +) -> list[FunctionalTestResult]: + tests: list[tuple[str, Callable[[], str]]] = [] + sample_inner = tuple( + packet.inner_packet + for packet in schedules["none"].source_packets[:8] + ) + + def gf_arithmetic() -> str: + for value in range(1, 256): + inverse = gf_inverse(value) + if gf_mul(value, inverse) != 1: + raise AssertionError(f"inverse failed for {value}") + if gf_div(value, value) != 1: + raise AssertionError(f"division failed for {value}") + for left in range(0, 256, 17): + for right in range(0, 256, 19): + for third in range(0, 256, 31): + if gf_mul(left, gf_add(right, third)) != gf_add( + gf_mul(left, right), gf_mul(left, third) + ): + raise AssertionError("distributivity failed") + return "inverse, division, and distributivity passed" + + def encode_decode_without_loss() -> str: + outer = encode_fec_block(sample_inner, 1, 4) + decoded = decode_fec_block(outer) + if decoded.source_packets != sample_inner: + raise AssertionError("lossless FEC round trip changed bytes") + return "systematic 8+4 block is byte-exact without loss" + + def recover_any_r_losses() -> str: + checked = 0 + for parity_count in (1, 2, 4): + outer = encode_fec_block( + sample_inner, parity_count, parity_count + ) + for missing in combinations( + range(len(outer)), parity_count + ): + available = tuple( + packet + for index, packet in enumerate(outer) + if index not in missing + ) + decoded = decode_fec_block(available) + if decoded.source_packets != sample_inner: + raise AssertionError( + f"failed r={parity_count}, missing={missing}" + ) + checked += 1 + return f"all {checked} exact-r erasure combinations recovered" + + def r_plus_one_is_not_guaranteed() -> str: + outer = encode_fec_block(sample_inner, 7, 2) + available = outer[3:] + try: + decode_fec_block(available) + except InsufficientSymbolsError: + return "8+2 correctly rejected seven available symbols" + raise AssertionError("r+1 erasures unexpectedly guaranteed") + + def recovered_inner_is_exact_and_crc_valid() -> str: + outer = encode_fec_block(sample_inner, 9, 4) + available = tuple( + packet + for index, packet in enumerate(outer) + if index not in {0, 2, 5, 9} + ) + decoded = decode_fec_block(available) + for original, restored in zip( + sample_inner, decoded.source_packets + ): + if restored != original: + raise AssertionError("restored inner bytes differ") + decode_inner_packet(restored) + return "restored Lab028 packets are byte-exact and CRC-valid" + + def outer_crc_detects_corruption() -> str: + outer = bytearray( + encode_fec_block(sample_inner, 10, 2)[0] + ) + outer[-1] ^= 0x01 + try: + decode_outer_symbol(bytes(outer)) + except OuterPacketCRCError: + return "outer payload bit flip rejected by outer CRC32" + raise AssertionError("outer CRC did not reject corruption") + + def zero_bad_restores_all_frames() -> str: + frame_count = len(composites) + for mode in FEC_MODES: + schedule = schedules[mode.name] + loss_flags = np.zeros( + len(schedule.units), dtype=np.bool_ + ) + repetition = ( + simulate_baseline(schedule, loss_flags, frame_count) + if mode.parity_count == 0 + else simulate_fec(schedule, loss_flags, frame_count) + ) + if ( + repetition.atomic_composite_frames_completed + != frame_count + ): + raise AssertionError( + f"zero-Bad failed for {mode.name}" + ) + return "all modes restored all 63 frames without Bad" + + def fixed_seed_is_reproducible() -> str: + first = simulate_condition( + schedules["8+2"], len(composites), 0.05, 399_399, 3 + ) + second = simulate_condition( + schedules["8+2"], len(composites), 0.05, 399_399, 3 + ) + if first != second: + raise AssertionError("same seed changed aggregate results") + return "identical seed produced identical result fields" + + def incomplete_composite_is_not_published() -> str: + receiver = CompositeReassembler() + first_frame = [ + packet.inner_packet + for packet in schedules["none"].source_packets + if packet.composite_frame_id == 0 + ] + published = 0 + for packet in first_frame[:-1]: + published += int(receiver.ingest(packet) is not None) + if published: + raise AssertionError("incomplete composite was published") + return "missing ROI fragment prevented atomic publication" + + def queue_includes_parity() -> str: + baseline = schedules["none"] + protected = schedules["8+4"] + parity_units = sum( + unit.unit.is_parity for unit in protected.units + ) + if parity_units <= 0: + raise AssertionError("8+4 schedule has no parity") + if len(protected.units) != ( + len(baseline.source_packets) + parity_units + ): + raise AssertionError("parity is absent from FIFO units") + if ( + protected.total_transmitted_bytes + <= baseline.total_transmitted_bytes + ): + raise AssertionError("parity did not increase wire bytes") + if protected.duration_seconds < baseline.duration_seconds: + raise AssertionError("parity shortened transmitter schedule") + return ( + f"{parity_units} parity packets included in FIFO timing " + "and queue metrics" + ) + + tests.extend( + [ + ("gf256_arithmetic", gf_arithmetic), + ("fec_without_loss", encode_decode_without_loss), + ("recover_any_r_erasures", recover_any_r_losses), + ("r_plus_one_not_guaranteed", r_plus_one_is_not_guaranteed), + ( + "restored_inner_packet_and_crc", + recovered_inner_is_exact_and_crc_valid, + ), + ("outer_crc_detection", outer_crc_detects_corruption), + ("zero_bad_100_percent", zero_bad_restores_all_frames), + ("fixed_seed_reproducibility", fixed_seed_is_reproducible), + ( + "atomic_incomplete_composite", + incomplete_composite_is_not_published, + ), + ("queue_counts_parity", queue_includes_parity), + ] + ) + test_results = [] + for name, test in tests: + try: + detail = test() + except Exception as error: + test_results.append( + FunctionalTestResult(name, False, str(error)) + ) + else: + test_results.append( + FunctionalTestResult(name, True, detail) + ) + failed = [test for test in test_results if not test.passed] + if failed: + raise RuntimeError( + "Lab030 functional checks failed: " + + "; ".join( + f"{test.name}: {test.detail}" for test in failed + ) + ) + return test_results + + +def validate_results(results: list[SimulationResult]) -> None: + if len(results) != 16: + raise RuntimeError(f"expected 16 rows, got {len(results)}") + keys = { + (result.mode, result.mean_bad_duration_ms) + for result in results + } + if len(keys) != 16: + raise RuntimeError("Lab030 result rows are not unique") + if any( + not 0.0 <= result.composite_success_rate <= 1.0 + for result in results + ): + raise RuntimeError("composite success is outside 0...1") + + +def save_csv(results: list[SimulationResult]) -> None: + OUTPUT_DIRECTORY.mkdir(parents=True, exist_ok=True) + with CSV_PATH.open("w", encoding="utf-8", newline="") as csv_file: + writer = csv.DictWriter(csv_file, fieldnames=CSV_FIELDS) + writer.writeheader() + for result in results: + raw = asdict(result) + writer.writerow( + { + field: ( + f"{raw[field]:.12g}" + if isinstance(raw[field], float) + else raw[field] + ) + for field in CSV_FIELDS + } + ) + + +def save_line_plot( + results: list[SimulationResult], + getter: Callable[[SimulationResult], float], + ylabel: str, + title: str, + path: Path, +) -> None: + x_values = [ + duration * 1000.0 + for duration in MEAN_BAD_DURATIONS_SECONDS + ] + figure, axis = plt.subplots(figsize=(9, 5.5)) + for mode in FEC_MODES: + values = [ + getter(result_lookup(results, duration_ms)[mode.name]) + for duration_ms in x_values + ] + axis.plot( + x_values, + values, + marker="o", + linewidth=2, + label=mode.label, + ) + axis.set_xscale("log") + axis.set_xticks(x_values) + axis.set_xticklabels([f"{value:g}" for value in x_values]) + axis.set_xlabel("Средняя длительность Bad, мс") + axis.set_ylabel(ylabel) + axis.set_title(title) + axis.grid(True, which="both", alpha=0.3) + axis.legend() + figure.tight_layout() + figure.savefig(path, dpi=160) + plt.close(figure) + + +def save_plots(results: list[SimulationResult]) -> None: + save_line_plot( + results, + lambda result: result.composite_success_rate * 100.0, + "Полностью восстановленные составные кадры, %", + "Lab030. Эффективность пакетного FEC", + COMPOSITE_SUCCESS_PLOT_PATH, + ) + save_line_plot( + results, + lambda result: result.p95_no_new_image_duration_seconds, + "P95 отсутствия нового изображения, с", + "Lab030. Прерывания видеопотока", + NO_IMAGE_PLOT_PATH, + ) + + representative = result_lookup(results, 200.0) + x = np.arange(len(FEC_MODES)) + rates = [ + representative[mode.name].outer_fec_stream_bitrate_kbps + for mode in FEC_MODES + ] + overhead = [ + representative[mode.name].service_and_parity_percent + for mode in FEC_MODES + ] + figure, rate_axis = plt.subplots(figsize=(9, 5.5)) + overhead_axis = rate_axis.twinx() + rate_bars = rate_axis.bar( + x - 0.18, rates, 0.36, + color="tab:blue", label="Wire rate", + ) + overhead_bars = overhead_axis.bar( + x + 0.18, overhead, 0.36, + color="tab:orange", label="Service + parity", + ) + rate_axis.axhline( + CONTROL_STREAM_BITRATE_KBPS, + color="tab:red", + linestyle="--", + label="300 kbit/s", + ) + rate_axis.set_xticks(x) + rate_axis.set_xticklabels([mode.label for mode in FEC_MODES]) + rate_axis.set_ylabel("Предлагаемая скорость, кбит/с") + overhead_axis.set_ylabel("Служебные и parity-данные, %") + rate_axis.set_title("Lab030. Скорость и избыточность") + rate_axis.grid(True, axis="y", alpha=0.3) + rate_axis.legend( + [rate_bars, overhead_bars, rate_axis.lines[0]], + ["Wire rate", "Service + parity", "300 kbit/s"], + loc="best", + ) + figure.tight_layout() + figure.savefig(STREAM_RATE_PLOT_PATH, dpi=160) + plt.close(figure) + + delays = [ + representative[mode.name].p95_publication_delay_seconds + for mode in FEC_MODES + ] + queues = [ + representative[mode.name].max_queue_length_packets + for mode in FEC_MODES + ] + figure, delay_axis = plt.subplots(figsize=(9, 5.5)) + queue_axis = delay_axis.twinx() + delay_bars = delay_axis.bar( + x - 0.18, delays, 0.36, + color="tab:blue", label="P95 delay", + ) + queue_bars = queue_axis.bar( + x + 0.18, queues, 0.36, + color="tab:orange", label="Max queue", + ) + delay_axis.set_xticks(x) + delay_axis.set_xticklabels([mode.label for mode in FEC_MODES]) + delay_axis.set_ylabel("P95 задержки публикации, с") + queue_axis.set_ylabel("Максимальная очередь, пакетов") + delay_axis.set_title( + "Lab030. Задержка и очередь при Bad 200 мс" + ) + delay_axis.grid(True, axis="y", alpha=0.3) + delay_axis.legend( + [delay_bars, queue_bars], + ["P95 publication delay", "Max queue"], + loc="best", + ) + figure.tight_layout() + figure.savefig(DELAY_QUEUE_PLOT_PATH, dpi=160) + plt.close(figure) + + success = [ + representative[mode.name].composite_success_rate * 100.0 + for mode in FEC_MODES + ] + recovery = [ + representative[ + mode.name + ].fec_affected_block_recovery_rate + * 100.0 + for mode in FEC_MODES + ] + figure, axis = plt.subplots(figsize=(9, 5.5)) + axis.bar( + x - 0.18, success, 0.36, label="Composite success" + ) + axis.bar( + x + 0.18, recovery, 0.36, label="Affected FEC blocks recovered" + ) + axis.set_xticks(x) + axis.set_xticklabels([mode.label for mode in FEC_MODES]) + axis.set_ylabel("Доля, %") + axis.set_title("Lab030. Сравнение режимов при Bad 200 мс") + axis.grid(True, axis="y", alpha=0.3) + axis.legend() + figure.tight_layout() + figure.savefig(MODE_COMPARISON_PLOT_PATH, dpi=160) + plt.close(figure) + + +def mode_rate_table( + schedules: dict[str, ModeSchedule], +) -> list[str]: + lines = [ + ( + "mode | source packets | parity packets | last block k+r | " + "JPEG kbit/s | inner kbit/s | outer kbit/s | overhead | " + "queue mean/max | timeline s" + ), + ( + "----:|---------------:|---------------:|---------------:|" + "------------:|-------------:|-------------:|---------:|" + "---------------:|----------:" + ), + ] + for mode in FEC_MODES: + schedule = schedules[mode.name] + parity_packets = sum( + unit.unit.is_parity for unit in schedule.units + ) + last_block = ( + f"{schedule.blocks[-1].source_count}+" + f"{schedule.blocks[-1].parity_count}" + if schedule.blocks + else "none" + ) + jpeg_rate = ( + schedule.total_jpeg_bytes + * 8 + / schedule.source_duration_seconds + / 1000 + ) + inner_rate = ( + schedule.total_inner_bytes + * 8 + / schedule.source_duration_seconds + / 1000 + ) + outer_rate = ( + schedule.total_transmitted_bytes + * 8 + / schedule.source_duration_seconds + / 1000 + ) + overhead = ( + ( + schedule.total_transmitted_bytes + - schedule.total_jpeg_bytes + ) + / schedule.total_transmitted_bytes + * 100 + ) + lines.append( + f"{mode.label} | {len(schedule.source_packets)} | " + f"{parity_packets} | {last_block} | " + f"{jpeg_rate:.3f} | {inner_rate:.3f} | " + f"{outer_rate:.3f} | {overhead:.3f}% | " + f"{schedule.mean_queue_length_packets:.3f}/" + f"{schedule.max_queue_length_packets} | " + f"{schedule.duration_seconds:.6f}" + ) + return lines + + +def result_table(results: list[SimulationResult]) -> list[str]: + lines = [ + ( + "Bad ms | mode | Bad actual | lost src/parity | recovered pkt | " + "blocks recovered/failed | block recovery | composite | " + "BASE-only/ROI-only | no image mean/p95/max s | " + "delay mean/p95/max s | video kbit/s" + ), + ( + "------:|-----:|-----------:|----------------:|--------------:|" + "------------------------:|---------------:|----------:|" + "------------------:|-------------------------:|" + "----------------------:|------------:" + ), + ] + for duration in MEAN_BAD_DURATIONS_SECONDS: + by_mode = result_lookup(results, duration * 1000.0) + for mode in FEC_MODES: + result = by_mode[mode.name] + lines.append( + f"{duration * 1000.0:.0f} | {mode.label} | " + f"{result.actual_bad_time_fraction * 100:.3f}% | " + f"{result.lost_source_packets}/" + f"{result.lost_parity_packets} | " + f"{result.recovered_source_packets} | " + f"{result.fec_recovered_blocks}/" + f"{result.fec_unrecoverable_blocks} | " + f"{result.fec_affected_block_recovery_rate * 100:.3f}% | " + f"{result.composite_success_rate * 100:.3f}% | " + f"{result.base_only_frames}/{result.roi_only_frames} | " + f"{result.mean_no_new_image_duration_seconds:.3f}/" + f"{result.p95_no_new_image_duration_seconds:.3f}/" + f"{result.max_no_new_image_duration_seconds:.3f} | " + f"{result.mean_publication_delay_seconds:.3f}/" + f"{result.p95_publication_delay_seconds:.3f}/" + f"{result.max_publication_delay_seconds:.3f} | " + f"{result.effective_delivered_video_bitrate_kbps:.3f}" + ) + return lines + + +def write_report( + metadata: VideoMetadata, + composites: list[EncodedComposite], + schedules: dict[str, ModeSchedule], + results: list[SimulationResult], + tests: list[FunctionalTestResult], +) -> None: + lines = [ + "Lab030. Пакетное избыточное кодирование стираний", + "", + "Исходный профиль и неизменный внутренний транспорт", + f"- Видео: {SOURCE_VIDEO_PATH}", + ( + f"- {len(composites)} реальных пар BASE/ROI, 3 fps; " + "BASE 240x135 grayscale JPEG Q23, " + "ROI 320x180 grayscale JPEG Q33." + ), + ( + "- Внутренний Lab028 packet не изменён: payload 512 байт, " + "32-byte header, packet CRC32 и object CRC32." + ), + "", + "GF(256) и блочный код", + ( + f"- Примитивный полином: 0x{GF_PRIMITIVE_POLYNOMIAL:X} " + "(x^8+x^4+x^3+x^2+1)." + ), + ( + "- Матрица Вандермонда n×k умножается на обратную верхнюю " + "k×k матрицу и становится систематической." + ), + ( + "- Любые k доступных строк систематической генераторной " + "матрицы восстанавливают k исходных символов." + ), + ( + "- Нулевое дополнение используется только в математике; " + "восстановленный внутренний пакет обрезается по payload_length " + "Lab028 и проходит собственный CRC." + ), + "", + "Внешний пакет FEC", + f"- struct: {OUTER_HEADER_FORMAT}", + ( + f"- Размер: {OUTER_HEADER_SIZE} байта, network byte order, " + "padding отсутствует." + ), + ( + "- Layout: magic[4]@0, version:u8@4, flags:u8@5, " + "header_size:u16@6, block_id:u32@8, symbol_index:u16@12, " + "k:u16@14, r:u16@16, symbol_size:u16@18, " + "data_length:u16@20, reserved16:u16@22, " + "reserved32:u32@24, outer_crc32:u32@28." + ), + ( + "- flags bit0: parity. CRC32 вычисляется по заголовку с " + "нулевым outer_crc32 и данным внешнего символа." + ), + "", + "Формирование блоков и передача", + ( + "- Последовательный поток внутренних пакетов BASE→ROI делится " + "на k=8; блок может пересекать границу кадра." + ), + ( + "- Сначала передаются systematic symbols, затем parity symbols " + "этого блока; перемежение отсутствует." + ), + ( + "- Последний блок содержит 6 исходных пакетов. Для него " + "r_last=max(1, ceil(k_last*r/8)): режимы 8+1, 8+2, 8+4 " + "получают соответственно 1, 2 и 3 parity." + ), + ( + "- Режим Без FEC передаёт исходные Lab028 packets без внешней " + "обёртки; остальные режимы используют внешний заголовок." + ), + ( + "- FIFO учитывает время генерации кадра, все внешние пакеты, " + "фактический размер и скорость 300 кбит/с. Очередь не " + "сбрасывается на границах кадров." + ), + "", + "Скорость, избыточность и очередь", + *mode_rate_table(schedules), + "", + "Временная модель", + ( + "- Экспоненциальные Good/Bad интервалы Lab029B, Bad≈2%, " + "mean Bad 10/50/200/1000 мс, 200 повторов, fixed seeds " + f"{SEED_BASE}...{SEED_BASE + 3}." + ), + ( + "- Пакет теряется при любом пересечении его передачи с Bad." + ), + ( + "- FEC исправляет стирания; CRC обнаруживает повреждения, но " + "битовые ошибки отдельно не добавляются." + ), + "", + "Функциональные проверки", + ] + lines.extend( + f"- {'PASS' if test.passed else 'FAIL'} {test.name}: {test.detail}" + for test in tests + ) + lines.extend( + [ + "", + "Результаты Monte Carlo", + *result_table(results), + "", + "Допущения и ограничения", + ( + "- Не реализованы перемежение, ARQ, повторные передачи, " + "команды управления, телеметрия и реальный SDR." + ), + ( + "- Любое частичное пересечение Bad уничтожает весь внешний " + "или базовый внутренний пакет." + ), + ( + "- Принятые systematic packets немедленно поступают " + "reassembler; восстановленные стирания становятся доступны " + "при получении k символов блока." + ), + ( + "- Publication delay измеряется от frame_id/3 до атомарной " + "выдачи BASE+ROI." + ), + ( + "- Queue length измеряется в моменты генерации пакетов и " + "включает ожидающие и обслуживаемый пакет." + ), + ( + "- Окончательный режим FEC автоматически не выбирается." + ), + "", + "Артефакты", + f"- CSV: {CSV_PATH}", + f"- Composite success: {COMPOSITE_SUCCESS_PLOT_PATH}", + f"- No-image duration: {NO_IMAGE_PLOT_PATH}", + f"- Stream rate/overhead: {STREAM_RATE_PLOT_PATH}", + f"- Delay/queue: {DELAY_QUEUE_PLOT_PATH}", + f"- Mode comparison: {MODE_COMPARISON_PLOT_PATH}", + ( + "- JPEG, внутренние/внешние packets и бинарные дампы " + "не сохранялись." + ), + "", + ] + ) + REPORT_PATH.write_text("\n".join(lines), encoding="utf-8") + + +def validate_outputs() -> None: + for path in ( + CSV_PATH, + REPORT_PATH, + COMPOSITE_SUCCESS_PLOT_PATH, + NO_IMAGE_PLOT_PATH, + STREAM_RATE_PLOT_PATH, + DELAY_QUEUE_PLOT_PATH, + MODE_COMPARISON_PLOT_PATH, + ): + if not path.exists() or path.stat().st_size <= 0: + raise RuntimeError(f"missing or empty output: {path}") + + +def main() -> None: + print("Lab030: loading real 512-byte-payload Lab028 stream...") + metadata, composites = load_video_profile(SOURCE_VIDEO_PATH) + profile = prepare_profiles(composites)[INNER_PAYLOAD_SIZE] + schedules = build_mode_schedules( + metadata, composites, profile + ) + for mode in FEC_MODES: + schedule = schedules[mode.name] + print( + f" {mode.label}: units={len(schedule.units)}, " + f"offered=" + f"{schedule.total_transmitted_bytes * 8 / metadata.duration_seconds / 1000:.3f} " + f"kbit/s, timeline={schedule.duration_seconds:.6f} s" + ) + + print( + f"Running 16 conditions, " + f"{MONTE_CARLO_REPETITIONS} repetitions each..." + ) + results = run_monte_carlo(schedules, len(composites)) + validate_results(results) + + print("Running Lab030 functional checks...") + tests = run_functional_tests( + composites, schedules, results + ) + for test in tests: + print(f" PASS {test.name}: {test.detail}") + + OUTPUT_DIRECTORY.mkdir(parents=True, exist_ok=True) + save_csv(results) + save_plots(results) + write_report( + metadata, composites, schedules, results, tests + ) + validate_outputs() + + print("Representative Bad=200 ms results:") + representative = result_lookup(results, 200.0) + for mode in FEC_MODES: + result = representative[mode.name] + print( + f" {mode.label}: composite=" + f"{result.composite_success_rate:.6f}, " + f"blocks={result.fec_recovered_blocks}/" + f"{result.fec_unrecoverable_blocks}, " + f"delay_p95={result.p95_publication_delay_seconds:.6f} s" + ) + print(f"CSV: {CSV_PATH}") + print(f"Report: {REPORT_PATH}") + print("Lab030 completed successfully.") + + +if __name__ == "__main__": + main()