feat(SAC_LSTM_Bot): embedded plain-English reading guides in graphs

This commit is contained in:
2026-08-23 10:11:44 +02:00
parent 002a568c7e
commit 03a1853e57
3 changed files with 334 additions and 275 deletions
+270 -252
View File
@@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="838" viewBox="0 0 1200 838" font-family="sans-serif">
<rect width="1200" height="838" fill="white"/>
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="962" viewBox="0 0 1200 962" font-family="sans-serif">
<rect width="1200" height="962" fill="white"/>
<text x="600" y="22" text-anchor="middle" font-size="17" font-weight="bold">SAC-LSTM campaign: eval win rate vs opponents (Run 3 live, Run 1 archived)</text>
<line x1="64" y1="78.0" x2="1176" y2="78.0" stroke="#dddddd"/>
<line x1="64" y1="140.0" x2="1176" y2="140.0" stroke="#dddddd"/>
@@ -11,20 +11,22 @@
<text x="70" y="62" font-size="11" fill="#555">win % per test match — thick line = trend</text>
<line x1="64" y1="388" x2="1176" y2="388" stroke="black"/>
<line x1="64" y1="388" x2="64" y2="78" stroke="black"/>
<line x1="1047.7" y1="388" x2="1047.7" y2="392" stroke="black"/>
<text x="1047.7" y="405" text-anchor="middle" font-size="11">10</text>
<line x1="905.1" y1="388" x2="905.1" y2="392" stroke="black"/>
<text x="905.1" y="405" text-anchor="middle" font-size="11">20</text>
<line x1="762.6" y1="388" x2="762.6" y2="392" stroke="black"/>
<text x="762.6" y="405" text-anchor="middle" font-size="11">30</text>
<line x1="620.0" y1="388" x2="620.0" y2="392" stroke="black"/>
<text x="620.0" y="405" text-anchor="middle" font-size="11">40</text>
<line x1="477.4" y1="388" x2="477.4" y2="392" stroke="black"/>
<text x="477.4" y="405" text-anchor="middle" font-size="11">50</text>
<line x1="334.9" y1="388" x2="334.9" y2="392" stroke="black"/>
<text x="334.9" y="405" text-anchor="middle" font-size="11">60</text>
<line x1="192.3" y1="388" x2="192.3" y2="392" stroke="black"/>
<text x="192.3" y="405" text-anchor="middle" font-size="11">70</text>
<line x1="1052.4" y1="388" x2="1052.4" y2="392" stroke="black"/>
<text x="1052.4" y="405" text-anchor="middle" font-size="11">10</text>
<line x1="915.2" y1="388" x2="915.2" y2="392" stroke="black"/>
<text x="915.2" y="405" text-anchor="middle" font-size="11">20</text>
<line x1="777.9" y1="388" x2="777.9" y2="392" stroke="black"/>
<text x="777.9" y="405" text-anchor="middle" font-size="11">30</text>
<line x1="640.6" y1="388" x2="640.6" y2="392" stroke="black"/>
<text x="640.6" y="405" text-anchor="middle" font-size="11">40</text>
<line x1="503.3" y1="388" x2="503.3" y2="392" stroke="black"/>
<text x="503.3" y="405" text-anchor="middle" font-size="11">50</text>
<line x1="366.0" y1="388" x2="366.0" y2="392" stroke="black"/>
<text x="366.0" y="405" text-anchor="middle" font-size="11">60</text>
<line x1="228.7" y1="388" x2="228.7" y2="392" stroke="black"/>
<text x="228.7" y="405" text-anchor="middle" font-size="11">70</text>
<line x1="91.5" y1="388" x2="91.5" y2="392" stroke="black"/>
<text x="91.5" y="405" text-anchor="middle" font-size="11">80</text>
<line x1="60" y1="388.0" x2="64" y2="388.0" stroke="black"/>
<text x="57" y="392.0" text-anchor="end" font-size="11">0</text>
<line x1="60" y1="326.0" x2="64" y2="326.0" stroke="black"/>
@@ -40,250 +42,258 @@
<text x="620" y="421" text-anchor="middle" font-size="12">eval number</text>
<text x="16" y="233" text-anchor="middle" font-size="12" transform="rotate(-90 16 233)">win rate (%)</text>
<circle cx="1176.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1161.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1147.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1133.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1119.0" cy="171.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1104.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1090.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1076.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1061.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1047.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1033.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1019.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1004.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="990.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="976.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="962.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="947.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="933.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="919.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="905.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="890.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="876.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="862.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="848.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="833.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="819.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="805.3" cy="109.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="791.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="776.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="762.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="748.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="734.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="719.8" cy="109.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="705.5" cy="109.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="691.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="677.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="662.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="648.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="634.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="620.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="605.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="591.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="577.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="563.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="548.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="534.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="520.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="505.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="491.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="477.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="463.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="448.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1162.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1148.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1134.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1121.1" cy="171.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1107.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1093.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1079.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1066.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1052.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1038.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1025.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="1011.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="997.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="983.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="970.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="956.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="942.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="928.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="915.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="901.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="887.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="874.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="860.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="846.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="832.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="819.1" cy="109.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="805.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="791.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="777.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="764.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="750.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="736.7" cy="109.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="723.0" cy="109.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="709.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="695.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="681.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="668.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="654.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="640.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="626.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="613.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="599.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="585.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="572.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="558.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="544.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="530.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="517.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="503.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="489.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="475.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="462.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="448.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="434.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="420.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="406.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="391.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="377.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="363.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="349.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="334.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="320.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="306.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="292.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="277.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="263.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="249.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="235.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="220.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="206.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="192.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="178.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="163.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="149.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="135.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="121.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="106.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="92.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="78.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="420.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="407.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="393.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="379.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="366.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="352.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="338.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="324.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="311.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="297.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="283.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="269.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="256.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="242.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="228.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="215.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="201.3" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="187.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="173.8" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="160.1" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="146.4" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="132.6" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="118.9" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="105.2" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="91.5" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="77.7" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<circle cx="64.0" cy="78.0" r="2" fill="#d62728" opacity="0.25"/>
<polyline points="1176.0,78.0 1161.7,78.0 1147.5,78.0 1133.2,78.0 1119.0,96.6 1104.7,93.5 1090.5,91.3 1076.2,89.6 1061.9,88.3 1047.7,87.3 1033.4,87.3 1019.2,87.3 1004.9,87.3 990.7,87.3 976.4,78.0 962.2,78.0 947.9,78.0 933.6,78.0 919.4,78.0 905.1,78.0 890.9,78.0 876.6,78.0 862.4,78.0 848.1,78.0 833.8,78.0 819.6,78.0 805.3,81.1 791.1,81.1 776.8,81.1 762.6,81.1 748.3,81.1 734.1,81.1 719.8,84.2 705.5,87.3 691.3,87.3 677.0,87.3 662.8,84.2 648.5,84.2 634.3,84.2 620.0,84.2 605.7,84.2 591.5,84.2 577.2,81.1 563.0,78.0 548.7,78.0 534.5,78.0 520.2,78.0 505.9,78.0 491.7,78.0 477.4,78.0 463.2,78.0 448.9,78.0 434.7,78.0 420.4,78.0 406.2,78.0 391.9,78.0 377.6,78.0 363.4,78.0 349.1,78.0 334.9,78.0 320.6,78.0 306.4,78.0 292.1,78.0 277.8,78.0 263.6,78.0 249.3,78.0 235.1,78.0 220.8,78.0 206.6,78.0 192.3,78.0 178.1,78.0 163.8,78.0 149.5,78.0 135.3,78.0 121.0,78.0 106.8,78.0 92.5,78.0 78.3,78.0 64.0,78.0" fill="none" stroke="#d62728" stroke-width="3.5" opacity="1.0"/>
<polyline points="1176.0,78.0 1162.3,78.0 1148.5,78.0 1134.8,78.0 1121.1,96.6 1107.4,93.5 1093.6,91.3 1079.9,89.6 1066.2,88.3 1052.4,87.3 1038.7,87.3 1025.0,87.3 1011.3,87.3 997.5,87.3 983.8,78.0 970.1,78.0 956.3,78.0 942.6,78.0 928.9,78.0 915.2,78.0 901.4,78.0 887.7,78.0 874.0,78.0 860.2,78.0 846.5,78.0 832.8,78.0 819.1,81.1 805.3,81.1 791.6,81.1 777.9,81.1 764.1,81.1 750.4,81.1 736.7,84.2 723.0,87.3 709.2,87.3 695.5,87.3 681.8,84.2 668.0,84.2 654.3,84.2 640.6,84.2 626.9,84.2 613.1,84.2 599.4,81.1 585.7,78.0 572.0,78.0 558.2,78.0 544.5,78.0 530.8,78.0 517.0,78.0 503.3,78.0 489.6,78.0 475.9,78.0 462.1,78.0 448.4,78.0 434.7,78.0 420.9,78.0 407.2,78.0 393.5,78.0 379.8,78.0 366.0,78.0 352.3,78.0 338.6,78.0 324.8,78.0 311.1,78.0 297.4,78.0 283.7,78.0 269.9,78.0 256.2,78.0 242.5,78.0 228.7,78.0 215.0,78.0 201.3,78.0 187.6,78.0 173.8,78.0 160.1,78.0 146.4,78.0 132.6,78.0 118.9,78.0 105.2,78.0 91.5,78.0 77.7,78.0 64.0,78.0" fill="none" stroke="#d62728" stroke-width="3.5" opacity="1.0"/>
<circle cx="1176.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1161.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1147.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1133.2" cy="357.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1119.0" cy="202.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1104.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1090.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1076.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1061.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1047.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1033.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1019.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1004.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="990.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="976.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="962.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="947.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="933.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="919.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="905.1" cy="264.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="890.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="876.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="862.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="848.1" cy="388.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="833.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="819.6" cy="140.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="805.3" cy="140.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="791.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="776.8" cy="388.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="762.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="748.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="734.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="719.8" cy="171.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="705.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="691.3" cy="140.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="677.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="662.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="648.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="634.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="620.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="605.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="591.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="577.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="563.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="548.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="534.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="520.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="505.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="491.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="477.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="463.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="448.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1162.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1148.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1134.8" cy="357.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1121.1" cy="202.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1107.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1093.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1079.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1066.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1052.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1038.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1025.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="1011.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="997.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="983.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="970.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="956.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="942.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="928.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="915.2" cy="264.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="901.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="887.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="874.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="860.2" cy="388.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="846.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="832.8" cy="140.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="819.1" cy="140.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="805.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="791.6" cy="388.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="777.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="764.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="750.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="736.7" cy="171.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="723.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="709.2" cy="140.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="695.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="681.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="668.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="654.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="640.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="626.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="613.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="599.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="585.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="572.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="558.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="544.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="530.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="517.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="503.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="489.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="475.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="462.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="448.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="434.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="420.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="406.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="391.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="377.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="363.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="349.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="334.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="320.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="306.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="292.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="277.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="263.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="249.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="235.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="220.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="206.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="192.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="178.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="163.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="149.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="135.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="121.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="106.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="92.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="78.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="64.0" cy="171.0" r="2" fill="#1f77b4" opacity="0.25"/>
<polyline points="1176.0,78.0 1161.7,78.0 1147.5,78.0 1133.2,147.8 1119.0,158.6 1104.7,145.2 1090.5,135.6 1076.2,128.4 1061.9,122.8 1047.7,118.3 1033.4,118.3 1019.2,118.3 1004.9,118.3 990.7,90.4 976.4,78.0 962.2,78.0 947.9,78.0 933.6,78.0 919.4,78.0 905.1,96.6 890.9,96.6 876.6,96.6 862.4,96.6 848.1,127.6 833.8,127.6 819.6,133.8 805.3,140.0 791.1,140.0 776.8,171.0 762.6,152.4 748.3,152.4 734.1,152.4 719.8,161.7 705.5,130.7 691.3,136.9 677.0,130.7 662.8,124.5 648.5,124.5 634.3,93.5 620.0,93.5 605.7,93.5 591.5,93.5 577.2,84.2 563.0,84.2 548.7,78.0 534.5,78.0 520.2,78.0 505.9,78.0 491.7,78.0 477.4,78.0 463.2,78.0 448.9,78.0 434.7,78.0 420.4,78.0 406.2,78.0 391.9,78.0 377.6,78.0 363.4,78.0 349.1,78.0 334.9,78.0 320.6,78.0 306.4,78.0 292.1,78.0 277.8,78.0 263.6,78.0 249.3,78.0 235.1,78.0 220.8,78.0 206.6,78.0 192.3,78.0 178.1,78.0 163.8,78.0 149.5,78.0 135.3,78.0 121.0,78.0 106.8,78.0 92.5,78.0 78.3,78.0 64.0,87.3" fill="none" stroke="#1f77b4" stroke-width="3.5" opacity="1.0"/>
<circle cx="420.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="407.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="393.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="379.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="366.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="352.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="338.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="324.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="311.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="297.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="283.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="269.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="256.2" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="242.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="228.7" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="215.0" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="201.3" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="187.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="173.8" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="160.1" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="146.4" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="132.6" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="118.9" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="105.2" cy="171.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="91.5" cy="78.0" r="2" fill="#1f77b4" opacity="0.25"/>
<circle cx="77.7" cy="140.0" r="2" fill="#1f77b4" opacity="0.25"/>
<polyline points="1176.0,78.0 1162.3,78.0 1148.5,78.0 1134.8,147.8 1121.1,158.6 1107.4,145.2 1093.6,135.6 1079.9,128.4 1066.2,122.8 1052.4,118.3 1038.7,118.3 1025.0,118.3 1011.3,118.3 997.5,90.4 983.8,78.0 970.1,78.0 956.3,78.0 942.6,78.0 928.9,78.0 915.2,96.6 901.4,96.6 887.7,96.6 874.0,96.6 860.2,127.6 846.5,127.6 832.8,133.8 819.1,140.0 805.3,140.0 791.6,171.0 777.9,152.4 764.1,152.4 750.4,152.4 736.7,161.7 723.0,130.7 709.2,136.9 695.5,130.7 681.8,124.5 668.0,124.5 654.3,93.5 640.6,93.5 626.9,93.5 613.1,93.5 599.4,84.2 585.7,84.2 572.0,78.0 558.2,78.0 544.5,78.0 530.8,78.0 517.0,78.0 503.3,78.0 489.6,78.0 475.9,78.0 462.1,78.0 448.4,78.0 434.7,78.0 420.9,78.0 407.2,78.0 393.5,78.0 379.8,78.0 366.0,78.0 352.3,78.0 338.6,78.0 324.8,78.0 311.1,78.0 297.4,78.0 283.7,78.0 269.9,78.0 256.2,78.0 242.5,78.0 228.7,78.0 215.0,78.0 201.3,78.0 187.6,78.0 173.8,78.0 160.1,78.0 146.4,78.0 132.6,78.0 118.9,78.0 105.2,87.3 91.5,87.3 77.7,93.5" fill="none" stroke="#1f77b4" stroke-width="3.5" opacity="1.0"/>
<circle cx="1176.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1161.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1147.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1133.2" cy="140.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1119.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1104.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1090.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1076.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1061.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1047.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1033.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1019.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1004.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="990.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="976.4" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="962.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="947.9" cy="326.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="933.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="919.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="905.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="890.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="876.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="862.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="848.1" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="833.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="819.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="805.3" cy="264.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="791.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="776.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="762.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="748.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="734.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="719.8" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="705.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="691.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="677.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="662.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="648.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="634.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="620.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="605.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="591.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="577.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="563.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="548.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="534.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="520.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="505.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="491.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="477.4" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="463.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="448.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1162.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1148.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1134.8" cy="140.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1121.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1107.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1093.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1079.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1066.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1052.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1038.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1025.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="1011.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="997.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="983.8" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="970.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="956.3" cy="326.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="942.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="928.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="915.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="901.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="887.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="874.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="860.2" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="846.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="832.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="819.1" cy="264.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="805.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="791.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="777.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="764.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="750.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="736.7" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="723.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="709.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="695.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="681.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="668.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="654.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="640.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="626.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="613.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="599.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="585.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="572.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="558.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="544.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="530.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="517.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="503.3" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="489.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="475.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="462.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="448.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="434.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="420.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="406.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="391.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="377.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="363.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="349.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="334.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="320.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="306.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="292.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="277.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="263.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="249.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="235.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="220.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="206.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="192.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="178.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="163.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="149.5" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="135.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="121.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="106.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="92.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="78.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<polyline points="1176.0,78.0 1161.7,78.0 1147.5,78.0 1133.2,93.5 1119.0,90.4 1104.7,88.3 1090.5,86.9 1076.2,85.8 1061.9,84.9 1047.7,84.2 1033.4,84.2 1019.2,84.2 1004.9,84.2 990.7,78.0 976.4,81.1 962.2,81.1 947.9,105.9 933.6,105.9 919.4,105.9 905.1,105.9 890.9,105.9 876.6,105.9 862.4,105.9 848.1,109.0 833.8,105.9 819.6,105.9 805.3,99.7 791.1,99.7 776.8,99.7 762.6,99.7 748.3,99.7 734.1,99.7 719.8,102.8 705.5,99.7 691.3,99.7 677.0,99.7 662.8,81.1 648.5,81.1 634.3,81.1 620.0,81.1 605.7,81.1 591.5,81.1 577.2,78.0 563.0,78.0 548.7,78.0 534.5,78.0 520.2,78.0 505.9,78.0 491.7,78.0 477.4,81.1 463.2,81.1 448.9,81.1 434.7,81.1 420.4,81.1 406.2,81.1 391.9,81.1 377.6,81.1 363.4,81.1 349.1,81.1 334.9,78.0 320.6,78.0 306.4,78.0 292.1,78.0 277.8,78.0 263.6,78.0 249.3,78.0 235.1,78.0 220.8,78.0 206.6,78.0 192.3,78.0 178.1,78.0 163.8,78.0 149.5,81.1 135.3,81.1 121.0,81.1 106.8,81.1 92.5,81.1 78.3,81.1" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<circle cx="420.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="407.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="393.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="379.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="366.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="352.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="338.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="324.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="311.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="297.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="283.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="269.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="256.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="242.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="228.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="215.0" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="201.3" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="187.6" cy="109.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="173.8" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="160.1" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="146.4" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="132.6" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="118.9" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="105.2" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="91.5" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<circle cx="77.7" cy="78.0" r="2" fill="#2ca02c" opacity="0.25"/>
<polyline points="1176.0,78.0 1162.3,78.0 1148.5,78.0 1134.8,93.5 1121.1,90.4 1107.4,88.3 1093.6,86.9 1079.9,85.8 1066.2,84.9 1052.4,84.2 1038.7,84.2 1025.0,84.2 1011.3,84.2 997.5,78.0 983.8,81.1 970.1,81.1 956.3,105.9 942.6,105.9 928.9,105.9 915.2,105.9 901.4,105.9 887.7,105.9 874.0,105.9 860.2,109.0 846.5,105.9 832.8,105.9 819.1,99.7 805.3,99.7 791.6,99.7 777.9,99.7 764.1,99.7 750.4,99.7 736.7,102.8 723.0,99.7 709.2,99.7 695.5,99.7 681.8,81.1 668.0,81.1 654.3,81.1 640.6,81.1 626.9,81.1 613.1,81.1 599.4,78.0 585.7,78.0 572.0,78.0 558.2,78.0 544.5,78.0 530.8,78.0 517.0,78.0 503.3,81.1 489.6,81.1 475.9,81.1 462.1,81.1 448.4,81.1 434.7,81.1 420.9,81.1 407.2,81.1 393.5,81.1 379.8,81.1 366.0,78.0 352.3,78.0 338.6,78.0 324.8,78.0 311.1,78.0 297.4,78.0 283.7,78.0 269.9,78.0 256.2,78.0 242.5,78.0 228.7,78.0 215.0,78.0 201.3,78.0 187.6,81.1 173.8,81.1 160.1,81.1 146.4,81.1 132.6,81.1 118.9,81.1 105.2,81.1 91.5,81.1 77.7,81.1" fill="none" stroke="#2ca02c" stroke-width="3.5" opacity="1.0"/>
<line x1="76" y1="92" x2="104" y2="92" stroke="#d62728" stroke-width="3"/>
<text x="110" y="96" font-size="12">Corners — 79 evals</text>
<text x="110" y="96" font-size="12">Corners — 82 evals</text>
<line x1="76" y1="110" x2="104" y2="110" stroke="#1f77b4" stroke-width="3"/>
<text x="110" y="114" font-size="12">Crazy — 79 evals</text>
<text x="110" y="114" font-size="12">Crazy — 81 evals</text>
<line x1="76" y1="128" x2="104" y2="128" stroke="#2ca02c" stroke-width="3"/>
<text x="110" y="132" font-size="12">Target — 78 evals</text>
<text x="110" y="132" font-size="12">Target — 81 evals</text>
<line x1="64" y1="472.0" x2="1176" y2="472.0" stroke="#dddddd"/>
<line x1="64" y1="534.0" x2="1176" y2="534.0" stroke="#dddddd"/>
<line x1="64" y1="596.0" x2="1176" y2="596.0" stroke="#dddddd"/>
@@ -320,9 +330,17 @@
<text x="620" y="815" text-anchor="middle" font-size="12">fraction of run (start → end)</text>
<text x="16" y="627" text-anchor="middle" font-size="12" transform="rotate(-90 16 627)">win rate (%)</text>
<polyline points="77.9,473.9 105.7,476.7 133.5,484.2 161.3,508.6 189.1,499.2 216.9,494.5 244.7,495.5 272.5,492.3 300.3,505.9 328.1,489.4 355.9,491.4 383.7,514.6 411.5,495.2 439.3,492.3 467.1,503.0 494.9,491.4 522.7,497.2 550.5,502.0 578.3,504.0 606.1,495.2 633.9,507.8 661.7,510.8 689.5,494.3 717.3,481.7 745.1,511.7 772.9,501.1 800.7,502.0 828.5,492.3 856.3,489.4 884.1,500.1 911.9,477.8 939.7,492.3 967.5,491.4 995.3,519.5 1023.1,502.0 1050.9,490.4 1078.7,487.5 1106.5,490.4 1134.3,490.4 1162.1,496.2" fill="none" stroke="#999999" stroke-width="1.5" opacity="1.0"/>
<polyline points="78.1,472.0 92.2,472.0 106.2,472.0 120.3,472.0 134.4,490.6 148.5,487.5 162.5,485.3 176.6,483.6 190.7,482.3 204.8,481.3 218.8,481.3 232.9,481.3 247.0,481.3 261.1,481.3 275.1,472.0 289.2,472.0 303.3,472.0 317.4,472.0 331.4,472.0 345.5,472.0 359.6,472.0 373.7,472.0 387.7,472.0 401.8,472.0 415.9,472.0 430.0,472.0 444.1,475.1 458.1,475.1 472.2,475.1 486.3,475.1 500.4,475.1 514.4,475.1 528.5,478.2 542.6,481.3 556.7,481.3 570.7,481.3 584.8,478.2 598.9,478.2 613.0,478.2 627.0,478.2 641.1,478.2 655.2,478.2 669.3,475.1 683.3,472.0 697.4,472.0 711.5,472.0 725.6,472.0 739.6,472.0 753.7,472.0 767.8,472.0 781.9,472.0 795.9,472.0 810.0,472.0 824.1,472.0 838.2,472.0 852.3,472.0 866.3,472.0 880.4,472.0 894.5,472.0 908.6,472.0 922.6,472.0 936.7,472.0 950.8,472.0 964.9,472.0 978.9,472.0 993.0,472.0 1007.1,472.0 1021.2,472.0 1035.2,472.0 1049.3,472.0 1063.4,472.0 1077.5,472.0 1091.5,472.0 1105.6,472.0 1119.7,472.0 1133.8,472.0 1147.8,472.0 1161.9,472.0 1176.0,472.0" fill="none" stroke="#d62728" stroke-width="3.5" opacity="1.0"/>
<polyline points="77.6,472.0 91.1,472.0 104.7,472.0 118.2,472.0 131.8,490.6 145.4,487.5 158.9,485.3 172.5,483.6 186.0,482.3 199.6,481.3 213.2,481.3 226.7,481.3 240.3,481.3 253.9,481.3 267.4,472.0 281.0,472.0 294.5,472.0 308.1,472.0 321.7,472.0 335.2,472.0 348.8,472.0 362.3,472.0 375.9,472.0 389.5,472.0 403.0,472.0 416.6,472.0 430.1,475.1 443.7,475.1 457.3,475.1 470.8,475.1 484.4,475.1 498.0,475.1 511.5,478.2 525.1,481.3 538.6,481.3 552.2,481.3 565.8,478.2 579.3,478.2 592.9,478.2 606.4,478.2 620.0,478.2 633.6,478.2 647.1,475.1 660.7,472.0 674.2,472.0 687.8,472.0 701.4,472.0 714.9,472.0 728.5,472.0 742.0,472.0 755.6,472.0 769.2,472.0 782.7,472.0 796.3,472.0 809.9,472.0 823.4,472.0 837.0,472.0 850.5,472.0 864.1,472.0 877.7,472.0 891.2,472.0 904.8,472.0 918.3,472.0 931.9,472.0 945.5,472.0 959.0,472.0 972.6,472.0 986.1,472.0 999.7,472.0 1013.3,472.0 1026.8,472.0 1040.4,472.0 1054.0,472.0 1067.5,472.0 1081.1,472.0 1094.6,472.0 1108.2,472.0 1121.8,472.0 1135.3,472.0 1148.9,472.0 1162.4,472.0 1176.0,472.0" fill="none" stroke="#d62728" stroke-width="3.5" opacity="1.0"/>
<line x1="76" y1="486" x2="104" y2="486" stroke="#999999" stroke-width="3"/>
<text x="110" y="490" font-size="12">Run 1 (old) — 1287 evals in 40 buckets</text>
<line x1="76" y1="504" x2="104" y2="504" stroke="#d62728" stroke-width="3"/>
<text x="110" y="508" font-size="12">Run 3 trend (rolling-10)</text>
<rect x="0" y="838" width="1200" height="124" fill="#f2f2f2"/>
<text x="16" y="859" font-size="15" font-weight="bold">How to read</text>
<text x="1184" y="858" text-anchor="end" font-size="11" fill="#666">Regenerate anytime: python3 tools/plot_progress.py</text>
<text x="16" y="879" font-size="13">One small dot = one test match. 0 means lost all ten fights.</text>
<text x="16" y="896" font-size="13">A thick line shows the recent trend. Up = learning.</text>
<text x="16" y="913" font-size="13">Watch the three colors. Red = Corners. Blue = Crazy. Green = Target.</text>
<text x="16" y="930" font-size="13">Gray line = old run. Red line = new run. Same enemy.</text>
<text x="16" y="947" font-size="13">If red ends higher than gray, the new training worked.</text>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 27 KiB

+26 -18
View File
@@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="825" viewBox="0 0 1000 825" font-family="sans-serif">
<rect width="1000" height="825" fill="white"/>
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="949" viewBox="0 0 1000 949" font-family="sans-serif">
<rect width="1000" height="949" fill="white"/>
<text x="500" y="22" text-anchor="middle" font-size="17" font-weight="bold">SAC-LSTM training losses (x = metric line number)</text>
<text x="76" y="56" font-size="13" font-weight="bold">critic_loss (log scale)</text>
<line x1="70" y1="250" x2="980" y2="250" stroke="black"/>
@@ -7,13 +7,13 @@
<line x1="70.0" y1="250" x2="70.0" y2="254" stroke="black"/>
<text x="70.0" y="267" text-anchor="middle" font-size="11">1</text>
<line x1="297.5" y1="250" x2="297.5" y2="254" stroke="black"/>
<text x="297.5" y="267" text-anchor="middle" font-size="11">41</text>
<text x="297.5" y="267" text-anchor="middle" font-size="11">42</text>
<line x1="525.0" y1="250" x2="525.0" y2="254" stroke="black"/>
<text x="525.0" y="267" text-anchor="middle" font-size="11">81</text>
<text x="525.0" y="267" text-anchor="middle" font-size="11">84</text>
<line x1="752.5" y1="250" x2="752.5" y2="254" stroke="black"/>
<text x="752.5" y="267" text-anchor="middle" font-size="11">121</text>
<text x="752.5" y="267" text-anchor="middle" font-size="11">126</text>
<line x1="980.0" y1="250" x2="980.0" y2="254" stroke="black"/>
<text x="980.0" y="267" text-anchor="middle" font-size="11">161</text>
<text x="980.0" y="267" text-anchor="middle" font-size="11">167</text>
<line x1="66" y1="250.0" x2="70" y2="250.0" stroke="black"/>
<text x="63" y="254.0" text-anchor="end" font-size="11">0.1</text>
<line x1="66" y1="197.5" x2="70" y2="197.5" stroke="black"/>
@@ -26,20 +26,20 @@
<text x="63" y="44.0" text-anchor="end" font-size="11">1e+17</text>
<text x="525" y="283" text-anchor="middle" font-size="12"></text>
<text x="16" y="145" text-anchor="middle" font-size="12" transform="rotate(-90 16 145)">critic_loss</text>
<polyline points="70.0,67.6 75.7,66.5 81.4,67.9 87.1,70.0 92.8,72.6 98.4,74.1 104.1,73.1 109.8,71.4 115.5,240.6 121.2,65.5 126.9,55.6 132.6,61.7 138.2,67.4 143.9,71.4 149.6,74.2 155.3,74.9 161.0,75.7 166.7,75.9 172.4,76.9 178.1,76.5 183.8,75.5 189.4,74.8 195.1,185.2 200.8,70.5 206.5,68.6 212.2,67.4 217.9,202.4 223.6,60.3 229.2,60.4 234.9,59.0 240.6,59.7 246.3,58.6 252.0,56.8 257.7,55.7 263.4,56.0 269.1,55.9 274.8,50.4 280.4,50.9 286.1,53.5 291.8,48.3 297.5,45.7 303.2,240.6 308.9,240.6 314.6,56.2 320.2,59.1 325.9,63.5 331.6,65.0 337.3,240.6 343.0,68.4 348.7,70.5 354.4,185.8 360.1,71.7 365.8,72.8 371.4,69.0 377.1,62.6 382.8,56.9 388.5,63.6 394.2,240.6 399.9,240.6 405.6,73.5 411.2,74.7 416.9,73.7 422.6,73.7 428.3,240.6 434.0,73.7 439.7,74.6 445.4,72.8 451.1,70.5 456.8,72.5 462.4,70.7 468.1,73.1 473.8,69.5 479.5,67.9 485.2,67.1 490.9,64.0 496.6,53.5 502.2,184.6 507.9,63.5 513.6,114.6 519.3,161.5 525.0,197.0 530.7,204.7 536.4,205.0 542.1,205.3 547.8,205.5 553.4,205.6 559.1,205.7 564.8,205.6 570.5,206.0 576.2,206.2 581.9,206.4 587.6,206.5 593.2,206.8 598.9,207.0 604.6,240.5 610.3,240.5 616.0,240.5 621.7,240.5 627.4,207.8 633.1,208.1 638.8,208.2 644.4,208.4 650.1,208.6 655.8,208.8 661.5,209.0 667.2,209.2 672.9,209.4 678.6,209.7 684.2,209.9 689.9,210.3 695.6,210.5 701.3,210.7 707.0,210.9 712.7,211.1 718.4,211.3 724.1,211.5 729.8,211.7 735.4,212.0 741.1,240.5 746.8,212.3 752.5,212.5 758.2,212.6 763.9,212.8 769.6,213.0 775.2,213.3 780.9,213.4 786.6,213.5 792.3,213.7 798.0,213.8 803.7,214.0 809.4,213.9 815.1,214.3 820.8,214.5 826.4,240.4 832.1,214.8 837.8,214.9 843.5,215.1 849.2,240.4 854.9,215.4 860.6,215.6 866.2,215.7 871.9,215.9 877.6,216.0 883.3,216.2 889.0,216.4 894.7,216.6 900.4,240.4 906.1,216.9 911.8,240.4 917.4,217.3 923.1,217.4 928.8,217.6 934.5,217.7 940.2,217.9 945.9,218.0 951.6,218.1 957.2,218.2 962.9,218.4 968.6,218.6 974.3,218.7 980.0,218.7" fill="none" stroke="#1f77b4" stroke-width="1.6" opacity="1.0"/>
<polyline points="70.0,67.6 75.5,66.5 81.0,67.9 86.4,70.0 91.9,72.6 97.4,74.1 102.9,73.1 108.4,71.4 113.9,240.6 119.3,65.5 124.8,55.6 130.3,61.7 135.8,67.4 141.3,71.4 146.7,74.2 152.2,74.9 157.7,75.7 163.2,75.9 168.7,76.9 174.2,76.5 179.6,75.5 185.1,74.8 190.6,185.2 196.1,70.5 201.6,68.6 207.0,67.4 212.5,202.4 218.0,60.3 223.5,60.4 229.0,59.0 234.5,59.7 239.9,58.6 245.4,56.8 250.9,55.7 256.4,56.0 261.9,55.9 267.3,50.4 272.8,50.9 278.3,53.5 283.8,48.3 289.3,45.7 294.8,240.6 300.2,240.6 305.7,56.2 311.2,59.1 316.7,63.5 322.2,65.0 327.7,240.6 333.1,68.4 338.6,70.5 344.1,185.8 349.6,71.7 355.1,72.8 360.5,69.0 366.0,62.6 371.5,56.9 377.0,63.6 382.5,240.6 388.0,240.6 393.4,73.5 398.9,74.7 404.4,73.7 409.9,73.7 415.4,240.6 420.8,73.7 426.3,74.6 431.8,72.8 437.3,70.5 442.8,72.5 448.3,70.7 453.7,73.1 459.2,69.5 464.7,67.9 470.2,67.1 475.7,64.0 481.1,53.5 486.6,184.6 492.1,63.5 497.6,114.6 503.1,161.5 508.6,197.0 514.0,204.7 519.5,205.0 525.0,205.3 530.5,205.5 536.0,205.6 541.4,205.7 546.9,205.6 552.4,206.0 557.9,206.2 563.4,206.4 568.9,206.5 574.3,206.8 579.8,207.0 585.3,240.5 590.8,240.5 596.3,240.5 601.7,240.5 607.2,207.8 612.7,208.1 618.2,208.2 623.7,208.4 629.2,208.6 634.6,208.8 640.1,209.0 645.6,209.2 651.1,209.4 656.6,209.7 662.0,209.9 667.5,210.3 673.0,210.5 678.5,210.7 684.0,210.9 689.5,211.1 694.9,211.3 700.4,211.5 705.9,211.7 711.4,212.0 716.9,240.5 722.3,212.3 727.8,212.5 733.3,212.6 738.8,212.8 744.3,213.0 749.8,213.3 755.2,213.4 760.7,213.5 766.2,213.7 771.7,213.8 777.2,214.0 782.7,213.9 788.1,214.3 793.6,214.5 799.1,240.4 804.6,214.8 810.1,214.9 815.5,215.1 821.0,240.4 826.5,215.4 832.0,215.6 837.5,215.7 843.0,215.9 848.4,216.0 853.9,216.2 859.4,216.4 864.9,216.6 870.4,240.4 875.8,216.9 881.3,240.4 886.8,217.3 892.3,217.4 897.8,217.6 903.3,217.7 908.7,217.9 914.2,218.0 919.7,218.1 925.2,218.2 930.7,218.4 936.1,218.6 941.6,218.7 947.1,218.7 952.6,219.0 958.1,219.2 963.6,240.4 969.0,219.5 974.5,219.8 980.0,219.9" fill="none" stroke="#1f77b4" stroke-width="1.6" opacity="1.0"/>
<text x="76" y="321" font-size="13" font-weight="bold">actor_loss |abs| (log scale)</text>
<line x1="70" y1="515" x2="980" y2="515" stroke="black"/>
<line x1="70" y1="515" x2="70" y2="305" stroke="black"/>
<line x1="70.0" y1="515" x2="70.0" y2="519" stroke="black"/>
<text x="70.0" y="532" text-anchor="middle" font-size="11">1</text>
<line x1="297.5" y1="515" x2="297.5" y2="519" stroke="black"/>
<text x="297.5" y="532" text-anchor="middle" font-size="11">41</text>
<text x="297.5" y="532" text-anchor="middle" font-size="11">42</text>
<line x1="525.0" y1="515" x2="525.0" y2="519" stroke="black"/>
<text x="525.0" y="532" text-anchor="middle" font-size="11">81</text>
<text x="525.0" y="532" text-anchor="middle" font-size="11">84</text>
<line x1="752.5" y1="515" x2="752.5" y2="519" stroke="black"/>
<text x="752.5" y="532" text-anchor="middle" font-size="11">121</text>
<text x="752.5" y="532" text-anchor="middle" font-size="11">126</text>
<line x1="980.0" y1="515" x2="980.0" y2="519" stroke="black"/>
<text x="980.0" y="532" text-anchor="middle" font-size="11">161</text>
<text x="980.0" y="532" text-anchor="middle" font-size="11">167</text>
<line x1="66" y1="515.0" x2="70" y2="515.0" stroke="black"/>
<text x="63" y="519.0" text-anchor="end" font-size="11">1</text>
<line x1="66" y1="462.5" x2="70" y2="462.5" stroke="black"/>
@@ -52,20 +52,20 @@
<text x="63" y="309.0" text-anchor="end" font-size="11">1e+08</text>
<text x="525" y="548" text-anchor="middle" font-size="12"></text>
<text x="16" y="410" text-anchor="middle" font-size="12" transform="rotate(-90 16 410)">|actor_loss|</text>
<polyline points="70.0,318.4 75.7,322.7 81.4,324.6 87.1,326.9 92.8,329.8 98.4,331.2 104.1,330.3 109.8,328.8 115.5,325.3 121.2,322.8 126.9,316.5 132.6,312.8 138.2,322.7 143.9,327.9 149.6,331.0 155.3,333.1 161.0,334.0 166.7,334.4 172.4,335.4 178.1,336.1 183.8,335.9 189.4,335.7 195.1,335.2 200.8,335.1 206.5,334.0 212.2,333.6 217.9,332.0 223.6,331.8 229.2,329.1 234.9,327.7 240.6,326.5 246.3,326.0 252.0,326.2 257.7,326.6 263.4,324.9 269.1,324.7 274.8,326.1 280.4,326.5 286.1,324.9 291.8,327.1 297.5,327.8 303.2,329.0 308.9,332.0 314.6,334.4 320.2,335.4 325.9,336.9 331.6,337.8 337.3,339.3 343.0,340.2 348.7,341.4 354.4,342.3 360.1,343.1 365.8,343.8 371.4,343.4 377.1,343.2 382.8,342.6 388.5,341.5 394.2,339.9 399.9,337.9 405.6,337.0 411.2,336.0 416.9,335.3 422.6,335.2 428.3,335.9 434.0,336.8 439.7,335.9 445.4,336.7 451.1,337.7 456.8,336.8 462.4,337.1 468.1,336.0 473.8,337.4 479.5,337.8 485.2,337.6 490.9,338.0 496.6,339.6 502.2,342.1 507.9,342.4 513.6,375.3 519.3,428.6 525.0,468.6 530.7,477.3 536.4,477.6 542.1,478.0 547.8,478.1 553.4,478.3 559.1,478.4 564.8,478.6 570.5,478.7 576.2,479.0 581.9,479.2 587.6,479.3 593.2,479.7 598.9,479.9 604.6,480.0 610.3,480.2 616.0,480.3 621.7,480.6 627.4,480.8 633.1,481.1 638.8,481.2 644.4,481.4 650.1,481.7 655.8,481.9 661.5,482.1 667.2,482.4 672.9,482.6 678.6,482.9 684.2,483.1 689.9,483.6 695.6,483.8 701.3,484.1 707.0,484.3 712.7,484.5 718.4,484.7 724.1,485.0 729.8,485.2 735.4,485.4 741.1,485.7 746.8,485.9 752.5,486.0 758.2,486.2 763.9,486.4 769.6,486.6 775.2,486.9 780.9,487.1 786.6,487.2 792.3,487.4 798.0,487.6 803.7,487.8 809.4,487.9 815.1,488.1 820.8,488.3 826.4,488.5 832.1,488.6 837.8,488.8 843.5,489.0 849.2,489.2 854.9,489.4 860.6,489.5 866.2,489.7 871.9,489.9 877.6,490.0 883.3,490.2 889.0,490.4 894.7,490.6 900.4,490.8 906.1,491.0 911.8,491.2 917.4,491.4 923.1,491.6 928.8,491.8 934.5,491.9 940.2,492.1 945.9,492.2 951.6,492.4 957.2,492.5 962.9,492.7 968.6,492.9 974.3,493.1 980.0,493.2" fill="none" stroke="#1f77b4" stroke-width="1.6" opacity="1.0"/>
<polyline points="70.0,318.4 75.5,322.7 81.0,324.6 86.4,326.9 91.9,329.8 97.4,331.2 102.9,330.3 108.4,328.8 113.9,325.3 119.3,322.8 124.8,316.5 130.3,312.8 135.8,322.7 141.3,327.9 146.7,331.0 152.2,333.1 157.7,334.0 163.2,334.4 168.7,335.4 174.2,336.1 179.6,335.9 185.1,335.7 190.6,335.2 196.1,335.1 201.6,334.0 207.0,333.6 212.5,332.0 218.0,331.8 223.5,329.1 229.0,327.7 234.5,326.5 239.9,326.0 245.4,326.2 250.9,326.6 256.4,324.9 261.9,324.7 267.3,326.1 272.8,326.5 278.3,324.9 283.8,327.1 289.3,327.8 294.8,329.0 300.2,332.0 305.7,334.4 311.2,335.4 316.7,336.9 322.2,337.8 327.7,339.3 333.1,340.2 338.6,341.4 344.1,342.3 349.6,343.1 355.1,343.8 360.5,343.4 366.0,343.2 371.5,342.6 377.0,341.5 382.5,339.9 388.0,337.9 393.4,337.0 398.9,336.0 404.4,335.3 409.9,335.2 415.4,335.9 420.8,336.8 426.3,335.9 431.8,336.7 437.3,337.7 442.8,336.8 448.3,337.1 453.7,336.0 459.2,337.4 464.7,337.8 470.2,337.6 475.7,338.0 481.1,339.6 486.6,342.1 492.1,342.4 497.6,375.3 503.1,428.6 508.6,468.6 514.0,477.3 519.5,477.6 525.0,478.0 530.5,478.1 536.0,478.3 541.4,478.4 546.9,478.6 552.4,478.7 557.9,479.0 563.4,479.2 568.9,479.3 574.3,479.7 579.8,479.9 585.3,480.0 590.8,480.2 596.3,480.3 601.7,480.6 607.2,480.8 612.7,481.1 618.2,481.2 623.7,481.4 629.2,481.7 634.6,481.9 640.1,482.1 645.6,482.4 651.1,482.6 656.6,482.9 662.0,483.1 667.5,483.6 673.0,483.8 678.5,484.1 684.0,484.3 689.5,484.5 694.9,484.7 700.4,485.0 705.9,485.2 711.4,485.4 716.9,485.7 722.3,485.9 727.8,486.0 733.3,486.2 738.8,486.4 744.3,486.6 749.8,486.9 755.2,487.1 760.7,487.2 766.2,487.4 771.7,487.6 777.2,487.8 782.7,487.9 788.1,488.1 793.6,488.3 799.1,488.5 804.6,488.6 810.1,488.8 815.5,489.0 821.0,489.2 826.5,489.4 832.0,489.5 837.5,489.7 843.0,489.9 848.4,490.0 853.9,490.2 859.4,490.4 864.9,490.6 870.4,490.8 875.8,491.0 881.3,491.2 886.8,491.4 892.3,491.6 897.8,491.8 903.3,491.9 908.7,492.1 914.2,492.2 919.7,492.4 925.2,492.5 930.7,492.7 936.1,492.9 941.6,493.1 947.1,493.2 952.6,493.4 958.1,493.6 963.6,493.8 969.0,494.1 974.5,494.2 980.0,494.4" fill="none" stroke="#1f77b4" stroke-width="1.6" opacity="1.0"/>
<text x="76" y="586" font-size="13" font-weight="bold">alpha (temperature)</text>
<line x1="70" y1="780" x2="980" y2="780" stroke="black"/>
<line x1="70" y1="780" x2="70" y2="570" stroke="black"/>
<line x1="70.0" y1="780" x2="70.0" y2="784" stroke="black"/>
<text x="70.0" y="797" text-anchor="middle" font-size="11">1</text>
<line x1="297.5" y1="780" x2="297.5" y2="784" stroke="black"/>
<text x="297.5" y="797" text-anchor="middle" font-size="11">41</text>
<text x="297.5" y="797" text-anchor="middle" font-size="11">42</text>
<line x1="525.0" y1="780" x2="525.0" y2="784" stroke="black"/>
<text x="525.0" y="797" text-anchor="middle" font-size="11">81</text>
<text x="525.0" y="797" text-anchor="middle" font-size="11">84</text>
<line x1="752.5" y1="780" x2="752.5" y2="784" stroke="black"/>
<text x="752.5" y="797" text-anchor="middle" font-size="11">121</text>
<text x="752.5" y="797" text-anchor="middle" font-size="11">126</text>
<line x1="980.0" y1="780" x2="980.0" y2="784" stroke="black"/>
<text x="980.0" y="797" text-anchor="middle" font-size="11">161</text>
<text x="980.0" y="797" text-anchor="middle" font-size="11">167</text>
<line x1="66" y1="780.0" x2="70" y2="780.0" stroke="black"/>
<text x="63" y="784.0" text-anchor="end" font-size="11">0</text>
<line x1="66" y1="727.5" x2="70" y2="727.5" stroke="black"/>
@@ -78,6 +78,14 @@
<text x="63" y="574.0" text-anchor="end" font-size="11">1.01</text>
<text x="525" y="813" text-anchor="middle" font-size="12"></text>
<text x="16" y="675" text-anchor="middle" font-size="12" transform="rotate(-90 16 675)">alpha</text>
<polyline points="70.0,778.3 75.7,778.1 81.4,778.0 87.1,777.8 92.8,777.5 98.4,777.1 104.1,777.0 109.8,776.8 115.5,776.6 121.2,776.5 126.9,776.2 132.6,775.8 138.2,775.7 143.9,776.0 149.6,776.2 155.3,776.5 161.0,776.7 166.7,777.0 172.4,777.3 178.1,777.5 183.8,777.8 189.4,778.0 195.1,778.3 200.8,778.5 206.5,778.8 212.2,778.9 217.9,779.3 223.6,779.4 229.2,779.2 234.9,779.1 240.6,778.9 246.3,778.8 252.0,778.6 257.7,778.4 263.4,778.2 269.1,778.0 274.8,777.6 280.4,777.4 286.1,777.1 291.8,776.9 297.5,776.6 303.2,776.4 308.9,776.3 314.6,776.5 320.2,776.6 325.9,776.8 331.6,776.9 337.3,777.1 343.0,777.3 348.7,777.5 354.4,777.8 360.1,778.0 365.8,778.2 371.4,778.4 377.1,778.8 382.8,779.1 388.5,779.3 394.2,779.8 399.9,780.0 405.6,779.8 411.2,779.6 416.9,779.4 422.6,779.1 428.3,778.9 434.0,778.4 439.7,778.2 445.4,777.9 451.1,777.7 456.8,777.4 462.4,777.3 468.1,777.1 473.8,776.8 479.5,776.6 485.2,776.5 490.9,776.5 496.6,776.7 502.2,777.2 507.9,777.4 513.6,777.5 519.3,777.3 525.0,777.0 530.7,776.9 536.4,776.6 542.1,776.2 547.8,776.1 553.4,776.0 559.1,775.9 564.8,775.6 570.5,775.5 576.2,775.3 581.9,775.0 587.6,774.8 593.2,774.5 598.9,774.2 604.6,774.1 610.3,774.0 616.0,773.8 621.7,773.6 627.4,773.4 633.1,773.1 638.8,773.0 644.4,772.7 650.1,772.5 655.8,772.3 661.5,772.0 667.2,771.8 672.9,771.5 678.6,771.3 684.2,771.0 689.9,770.6 695.6,770.4 701.3,770.1 707.0,770.0 712.7,769.7 718.4,769.5 724.1,769.3 729.8,769.1 735.4,768.8 741.1,768.6 746.8,768.4 752.5,768.2 758.2,768.1 763.9,767.8 769.6,767.6 775.2,767.2 780.9,766.9 786.6,766.7 792.3,766.5 798.0,766.3 803.7,766.0 809.4,765.8 815.1,765.6 820.8,765.3 826.4,765.1 832.1,764.9 837.8,764.7 843.5,764.3 849.2,764.1 854.9,763.9 860.6,763.8 866.2,763.5 871.9,763.3 877.6,763.1 883.3,762.8 889.0,762.6 894.7,762.4 900.4,762.1 906.1,761.9 911.8,761.7 917.4,761.4 923.1,761.2 928.8,761.0 934.5,760.8 940.2,760.6 945.9,760.5 951.6,760.3 957.2,760.1 962.9,759.9 968.6,759.7 974.3,759.4 980.0,759.2" fill="none" stroke="#1f77b4" stroke-width="1.6" opacity="1.0"/>
<text x="525" y="817" text-anchor="middle" font-size="12">metric line number (161 rows)</text>
<polyline points="70.0,778.3 75.5,778.1 81.0,778.0 86.4,777.8 91.9,777.5 97.4,777.1 102.9,777.0 108.4,776.8 113.9,776.6 119.3,776.5 124.8,776.2 130.3,775.8 135.8,775.7 141.3,776.0 146.7,776.2 152.2,776.5 157.7,776.7 163.2,777.0 168.7,777.3 174.2,777.5 179.6,777.8 185.1,778.0 190.6,778.3 196.1,778.5 201.6,778.8 207.0,778.9 212.5,779.3 218.0,779.4 223.5,779.2 229.0,779.1 234.5,778.9 239.9,778.8 245.4,778.6 250.9,778.4 256.4,778.2 261.9,778.0 267.3,777.6 272.8,777.4 278.3,777.1 283.8,776.9 289.3,776.6 294.8,776.4 300.2,776.3 305.7,776.5 311.2,776.6 316.7,776.8 322.2,776.9 327.7,777.1 333.1,777.3 338.6,777.5 344.1,777.8 349.6,778.0 355.1,778.2 360.5,778.4 366.0,778.8 371.5,779.1 377.0,779.3 382.5,779.8 388.0,780.0 393.4,779.8 398.9,779.6 404.4,779.4 409.9,779.1 415.4,778.9 420.8,778.4 426.3,778.2 431.8,777.9 437.3,777.7 442.8,777.4 448.3,777.3 453.7,777.1 459.2,776.8 464.7,776.6 470.2,776.5 475.7,776.5 481.1,776.7 486.6,777.2 492.1,777.4 497.6,777.5 503.1,777.3 508.6,777.0 514.0,776.9 519.5,776.6 525.0,776.2 530.5,776.1 536.0,776.0 541.4,775.9 546.9,775.6 552.4,775.5 557.9,775.3 563.4,775.0 568.9,774.8 574.3,774.5 579.8,774.2 585.3,774.1 590.8,774.0 596.3,773.8 601.7,773.6 607.2,773.4 612.7,773.1 618.2,773.0 623.7,772.7 629.2,772.5 634.6,772.3 640.1,772.0 645.6,771.8 651.1,771.5 656.6,771.3 662.0,771.0 667.5,770.6 673.0,770.4 678.5,770.1 684.0,770.0 689.5,769.7 694.9,769.5 700.4,769.3 705.9,769.1 711.4,768.8 716.9,768.6 722.3,768.4 727.8,768.2 733.3,768.1 738.8,767.8 744.3,767.6 749.8,767.2 755.2,766.9 760.7,766.7 766.2,766.5 771.7,766.3 777.2,766.0 782.7,765.8 788.1,765.6 793.6,765.3 799.1,765.1 804.6,764.9 810.1,764.7 815.5,764.3 821.0,764.1 826.5,763.9 832.0,763.8 837.5,763.5 843.0,763.3 848.4,763.1 853.9,762.8 859.4,762.6 864.9,762.4 870.4,762.1 875.8,761.9 881.3,761.7 886.8,761.4 892.3,761.2 897.8,761.0 903.3,760.8 908.7,760.6 914.2,760.5 919.7,760.3 925.2,760.1 930.7,759.9 936.1,759.7 941.6,759.4 947.1,759.2 952.6,759.0 958.1,758.8 963.6,758.5 969.0,758.1 974.5,757.9 980.0,757.7" fill="none" stroke="#1f77b4" stroke-width="1.6" opacity="1.0"/>
<text x="525" y="817" text-anchor="middle" font-size="12">metric line number (167 rows)</text>
<rect x="0" y="825" width="1000" height="124" fill="#f2f2f2"/>
<text x="16" y="846" font-size="15" font-weight="bold">How to read</text>
<text x="984" y="845" text-anchor="end" font-size="11" fill="#666">Regenerate anytime: python3 tools/plot_progress.py</text>
<text x="16" y="866" font-size="13">These are internal error numbers. They are not game scores.</text>
<text x="16" y="883" font-size="13">Critic and actor panels: big spikes are normal early.</text>
<text x="16" y="900" font-size="13">Steady growth forever is bad.</text>
<text x="16" y="917" font-size="13">Alpha near 1 = bot still experimenting.</text>
<text x="16" y="934" font-size="13">If alpha falls too fast, the bot freezes its habits.</text>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

+38 -5
View File
@@ -29,6 +29,21 @@ BUCKETS = 40 # v1 downsampling for the Run1-vs-Run3 panel
COLORS = {"Corners": "#d62728", "Crazy": "#1f77b4", "Target": "#2ca02c"}
V1_COLOR = "#999999"
W, M_L, M_R, M_T, M_B = 1000, 70, 20, 40, 45 # graph 2 geometry (unchanged)
GUIDE_H = 124 # bottom band holding the plain-English "How to read" panel
WINRATE_GUIDE = [
"One small dot = one test match. 0 means lost all ten fights.",
"A thick line shows the recent trend. Up = learning.",
"Watch the three colors. Red = Corners. Blue = Crazy. Green = Target.",
"Gray line = old run. Red line = new run. Same enemy.",
"If red ends higher than gray, the new training worked.",
]
LOSSES_GUIDE = [
"These are internal error numbers. They are not game scores.",
"Critic and actor panels: big spikes are normal early.",
"Steady growth forever is bad.",
"Alpha near 1 = bot still experimenting.",
"If alpha falls too fast, the bot freezes its habits.",
]
def parse_eval_series(path):
@@ -186,6 +201,19 @@ def map_fn(p0, p1, vmin, vmax, log=False):
return f
def guide_block(w, h, lines):
"""Plain-English "How to read" band at the bottom of the canvas."""
y = h - GUIDE_H
s = f'<rect x="0" y="{y}" width="{w}" height="{GUIDE_H}" fill="#f2f2f2"/>\n'
s += (f'<text x="16" y="{y + 21}" font-size="15" font-weight="bold">'
f"How to read</text>\n"
f'<text x="{w - 16}" y="{y + 20}" text-anchor="end" font-size="11" '
f'fill="#666">Regenerate anytime: python3 tools/plot_progress.py</text>\n')
for i, ln in enumerate(lines):
s += f'<text x="16" y="{y + 41 + i * 17}" font-size="13">{esc(ln)}</text>\n'
return s
# ---------- graph 1: eval win rates ----------
def graph_eval(series_v2, series_v1, out):
@@ -195,7 +223,7 @@ def graph_eval(series_v2, series_v1, out):
# panel geometry (local: graph 2 keeps the module-level constants)
CW, ML, MR = 1200, 64, 24
TOP, PH, GAP, MB = 78, 310, 84, 56
H = TOP + PH + GAP + PH + MB # 838 >= 800
H = TOP + PH + GAP + PH + MB + GUIDE_H
x0, x1 = ML, CW - MR
s = svg_open(CW, H, "SAC-LSTM campaign: eval win rate vs opponents (Run 3 live, Run 1 archived)")
@@ -256,6 +284,7 @@ def graph_eval(series_v2, series_v1, out):
items_b.append((COLORS["Corners"], f"Run 3 trend (rolling-{TREND_WINDOW})"))
s += legend(items_b, x0 + 12, y1b + 14)
s += guide_block(CW, H, WINRATE_GUIDE)
s += "</svg>\n"
return 1 if write_svg(out, s) else 0
@@ -287,7 +316,7 @@ def graph_losses(rows, out):
return 0
PH, GAP = 210, 55
H = M_T + 3 * PH + 2 * GAP + M_B
H = M_T + 3 * PH + 2 * GAP + M_B + GUIDE_H
x0, x1 = M_L, W - M_R
n = len(rows)
s = svg_open(W, H, "SAC-LSTM training losses (x = metric line number)")
@@ -335,8 +364,10 @@ def graph_losses(rows, out):
panel(M_T + PH + GAP, actor, "actor_loss |abs| (log scale)", True, "|actor_loss|")
panel(M_T + 2 * (PH + GAP), alpha, "alpha (temperature)", False, "alpha",
fixed_range=(0, max(1.0, max(alpha))))
s += (f'<text x="{x0 + (x1 - x0) // 2}" y="{H - 8}" text-anchor="middle" '
f'font-size="12">metric line number ({n} rows)</text>\n</svg>\n')
s += (f'<text x="{x0 + (x1 - x0) // 2}" y="{H - GUIDE_H - 8}" text-anchor="middle" '
f'font-size="12">metric line number ({n} rows)</text>\n')
s += guide_block(W, H, LOSSES_GUIDE)
s += "</svg>\n"
return 1 if write_svg(out, s) else 0
@@ -368,8 +399,10 @@ def selftest():
ok = graph_losses(rows, td / "g2.svg") and graph_eval(ser, {"Corners": [0, 10]}, td / "g1.svg")
assert ok and (td / "g1.svg").stat().st_size > 500
g1 = (td / "g1.svg").read_text()
g2 = (td / "g2.svg").read_text()
ET.fromstring(g1) # whole doc must parse -> closing tag present
ET.fromstring((td / "g2.svg").read_text())
ET.fromstring(g2)
assert "How to read" in g1 and "How to read" in g2, "reading guide missing"
assert 'width="1200"' in g1, "canvas must be >=1200 wide"
assert g1.count("<circle") == sum(len(v) for v in ser.values()) # one dot per raw eval
n_trend = sum(1 for v in ser.values() if len(v) >= 2) + 2 # trends + v1 buckets + v3 trend