global: part X + 1
@@ -47,9 +47,5 @@ flamegraph.svg
|
||||
# Expand
|
||||
expand.rs
|
||||
|
||||
# Benchmarks
|
||||
[0-9]/
|
||||
/benches
|
||||
|
||||
# AI
|
||||
.claude
|
||||
|
||||
@@ -32,9 +32,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "1.1.4"
|
||||
version = "1.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
|
||||
checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
@@ -651,6 +651,7 @@ name = "brk_query"
|
||||
version = "0.3.6"
|
||||
dependencies = [
|
||||
"bitcoin",
|
||||
"brk_cohort",
|
||||
"brk_computer",
|
||||
"brk_error",
|
||||
"brk_indexer",
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
*/[0-9]*/
|
||||
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 283 KiB |
|
After Width: | Height: | Size: 161 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 143 KiB |
|
After Width: | Height: | Size: 159 KiB |
|
After Width: | Height: | Size: 707 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 255 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 269 KiB |
|
After Width: | Height: | Size: 155 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 326 KiB |
|
After Width: | Height: | Size: 158 KiB |
@@ -0,0 +1,44 @@
|
||||
<svg width="2000" height="1000" viewBox="0 0 2000 1000" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="0" y="0" width="2000" height="1000" opacity="1" fill="#121218" stroke="none"/>
|
||||
<text x="1005" y="25" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="24.193548387096776" opacity="1" fill="#E6E6F0">
|
||||
brk_computer — Disk Usage
|
||||
</text>
|
||||
<text x="967" y="980" dy="-0.5ex" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
Time (s)
|
||||
</text>
|
||||
<text x="1960" y="492" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0" transform="rotate(90, 1960, 492)">
|
||||
Disk Usage (bytes)
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="50,930 1884,930 "/>
|
||||
<text x="50" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
0
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="50,930 50,935 "/>
|
||||
<text x="407" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
2
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="407,930 407,935 "/>
|
||||
<text x="765" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
4
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="765,930 765,935 "/>
|
||||
<text x="1123" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
6
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1123,930 1123,935 "/>
|
||||
<text x="1481" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
8
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1481,930 1481,935 "/>
|
||||
<text x="1839" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
10
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1839,930 1839,935 "/>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,54 1885,929 "/>
|
||||
<rect x="55" y="59" width="98" height="36" opacity="0.98" fill="#121218" stroke="none"/>
|
||||
<rect x="55" y="59" width="98" height="36" opacity="1" fill="none" stroke="#121218"/>
|
||||
<text x="95" y="69" dy="0.76em" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.9" fill="#E6E6F0">
|
||||
3110s
|
||||
</text>
|
||||
<polyline fill="none" opacity="1" stroke="#FF6384" stroke-width="1" points="65,77 85,77 "/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
@@ -0,0 +1,97 @@
|
||||
<svg width="2000" height="1000" viewBox="0 0 2000 1000" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="0" y="0" width="2000" height="1000" opacity="1" fill="#121218" stroke="none"/>
|
||||
<text x="1005" y="25" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="24.193548387096776" opacity="1" fill="#E6E6F0">
|
||||
brk_computer — I/O Read
|
||||
</text>
|
||||
<text x="967" y="980" dy="-0.5ex" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
Time (min)
|
||||
</text>
|
||||
<text x="1960" y="492" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0" transform="rotate(90, 1960, 492)">
|
||||
Bytes Read (GiB)
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="50,930 1884,930 "/>
|
||||
<text x="50" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
0
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="50,930 50,935 "/>
|
||||
<text x="227" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
5
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="227,930 227,935 "/>
|
||||
<text x="404" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
10
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="404,930 404,935 "/>
|
||||
<text x="581" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
15
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="581,930 581,935 "/>
|
||||
<text x="759" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
20
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="759,930 759,935 "/>
|
||||
<text x="936" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
25
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="936,930 936,935 "/>
|
||||
<text x="1113" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
30
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1113,930 1113,935 "/>
|
||||
<text x="1290" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
35
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1290,930 1290,935 "/>
|
||||
<text x="1468" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
40
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1468,930 1468,935 "/>
|
||||
<text x="1645" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
45
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1645,930 1645,935 "/>
|
||||
<text x="1822" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
50
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1822,930 1822,935 "/>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,54 1885,929 "/>
|
||||
<text x="1895" y="929" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
0
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,929 1890,929 "/>
|
||||
<text x="1895" y="806" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
20
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,806 1890,806 "/>
|
||||
<text x="1895" y="682" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
40
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,682 1890,682 "/>
|
||||
<text x="1895" y="559" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
60
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,559 1890,559 "/>
|
||||
<text x="1895" y="435" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
80
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,435 1890,435 "/>
|
||||
<text x="1895" y="311" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
100
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,311 1890,311 "/>
|
||||
<text x="1895" y="188" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
120
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,188 1890,188 "/>
|
||||
<text x="1895" y="64" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
140
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,64 1890,64 "/>
|
||||
<polyline fill="none" opacity="1" stroke="#FF6384" stroke-width="1" points="50,926 53,923 57,923 61,923 64,923 68,922 72,922 76,921 79,921 83,920 87,919 91,918 94,917 98,916 102,915 105,915 109,914 113,913 117,912 120,911 124,910 128,909 132,908 135,907 139,906 143,906 147,904 150,903 154,902 158,901 162,900 165,899 169,897 173,896 177,895 180,894 184,892 188,891 192,890 195,888 199,888 203,886 207,885 210,884 214,883 218,881 222,880 225,879 229,878 233,876 237,875 240,874 244,873 248,872 252,870 256,869 260,868 264,867 268,866 271,864 275,864 279,864 283,862 287,861 291,860 295,858 299,858 302,856 306,855 310,854 314,853 318,852 322,851 326,849 330,848 333,847 337,846 341,846 345,844 349,843 353,841 357,840 361,840 365,839 368,838 372,837 376,835 380,834 384,834 388,833 392,832 396,831 399,830 403,828 407,828 411,827 415,826 419,825 423,824 427,822 431,821 434,821 438,819 442,818 446,817 450,815 454,814 458,813 462,812 465,812 469,812 473,811 477,810 481,809 485,808 489,807 493,806 497,805 500,804 504,802 508,802 512,798 516,797 520,796 524,794 528,793 531,793 535,791 539,790 543,789 547,788 551,787 555,786 559,785 563,784 566,782 570,781 574,780 578,780 582,780 586,780 590,778 594,777 597,775 601,774 605,773 609,772 613,771 617,769 621,768 625,767 629,765 632,765 636,764 640,762 644,761 648,760 652,758 656,757 660,756 664,755 667,754 671,752 675,751 679,750 683,749 687,741 691,740 695,739 698,737 702,736 706,735 710,734 714,733 718,731 722,730 726,729 730,727 733,726 737,725 741,722 745,721 749,719 753,718 757,717 761,716 765,714 768,714 772,712 776,711 780,709 784,708 788,707 792,705 796,704 799,703 803,702 807,701 811,699 815,698 819,697 823,695 827,694 831,693 834,692 838,690 842,689 846,688 850,687 854,685 858,684 862,683 866,681 869,680 873,678 877,677 881,675 885,674 889,672 893,672 897,661 900,659 904,658 908,657 912,655 916,653 920,652 924,651 928,649 931,648 935,645 939,644 943,643 947,641 951,640 955,638 959,637 963,636 966,635 970,633 974,632 978,631 982,630 986,629 990,627 994,626 998,625 1001,623 1005,622 1009,620 1013,619 1017,617 1021,616 1025,615 1029,614 1033,607 1036,606 1040,604 1044,603 1048,602 1052,600 1056,599 1060,598 1064,596 1067,595 1071,593 1075,592 1079,591 1083,590 1087,588 1091,587 1095,585 1099,585 1103,583 1106,582 1110,580 1114,579 1118,578 1122,576 1126,576 1130,574 1134,573 1137,571 1141,570 1145,568 1149,567 1153,565 1157,565 1161,563 1165,562 1169,560 1172,559 1176,557 1180,556 1184,554 1188,553 1192,552 1196,551 1200,549 1204,548 1207,546 1211,545 1215,543 1219,542 1223,541 1227,540 1231,538 1235,536 1239,535 1242,534 1246,532 1250,531 1254,530 1258,528 1262,527 1266,525 1270,524 1274,522 1277,520 1281,518 1285,510 1289,502 1293,494 1297,481 1301,470 1305,462 1308,449 1312,440 1316,417 1320,405 1324,400 1328,396 1332,393 1336,391 1340,388 1343,385 1347,383 1351,379 1355,378 1359,378 1363,378 1367,377 1371,375 1375,373 1378,370 1382,368 1386,366 1390,364 1394,362 1398,359 1402,357 1406,355 1410,353 1413,351 1417,348 1421,346 1425,343 1429,341 1433,339 1437,336 1441,334 1445,332 1449,330 1452,328 1456,326 1460,324 1464,322 1468,321 1472,319 1476,317 1480,315 1483,313 1487,311 1491,309 1495,307 1498,305 1502,303 1506,301 1510,300 1514,298 1517,296 1521,294 1525,292 1529,289 1533,287 1536,285 1540,283 1544,281 1548,279 1551,277 1555,275 1559,273 1563,270 1567,268 1570,266 1574,265 1578,263 1582,261 1586,259 1589,256 1593,254 1597,252 1601,250 1604,247 1608,246 1612,243 1616,240 1619,238 1623,236 1627,234 1631,232 1635,230 1638,228 1642,227 1646,226 1650,224 1653,222 1657,220 1661,218 1665,216 1668,214 1672,213 1676,211 1680,210 1684,208 1687,206 1691,204 1695,202 1699,200 1702,199 1706,197 1710,195 1714,193 1718,192 1721,190 1725,189 1729,187 1733,185 1736,182 1740,181 1744,179 1748,176 1752,174 1756,172 1759,170 1763,168 1767,167 1771,165 1775,163 1778,161 1782,160 1786,158 1790,156 1794,154 1798,152 1802,150 1806,148 1810,146 1813,144 1817,142 1821,140 1825,138 1829,136 1833,134 "/>
|
||||
<rect x="55" y="59" width="98" height="36" opacity="0.98" fill="#121218" stroke="none"/>
|
||||
<rect x="55" y="59" width="98" height="36" opacity="1" fill="none" stroke="#121218"/>
|
||||
<text x="95" y="69" dy="0.76em" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.9" fill="#E6E6F0">
|
||||
3110s
|
||||
</text>
|
||||
<polyline fill="none" opacity="1" stroke="#FF6384" stroke-width="1" points="65,77 85,77 "/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.8 KiB |
@@ -0,0 +1,89 @@
|
||||
<svg width="2000" height="1000" viewBox="0 0 2000 1000" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="0" y="0" width="2000" height="1000" opacity="1" fill="#121218" stroke="none"/>
|
||||
<text x="1005" y="25" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="24.193548387096776" opacity="1" fill="#E6E6F0">
|
||||
brk_computer — I/O Write
|
||||
</text>
|
||||
<text x="967" y="980" dy="-0.5ex" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
Time (min)
|
||||
</text>
|
||||
<text x="1960" y="492" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0" transform="rotate(90, 1960, 492)">
|
||||
Bytes Written (GiB)
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="50,930 1884,930 "/>
|
||||
<text x="50" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
0
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="50,930 50,935 "/>
|
||||
<text x="227" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
5
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="227,930 227,935 "/>
|
||||
<text x="404" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
10
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="404,930 404,935 "/>
|
||||
<text x="581" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
15
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="581,930 581,935 "/>
|
||||
<text x="759" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
20
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="759,930 759,935 "/>
|
||||
<text x="936" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
25
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="936,930 936,935 "/>
|
||||
<text x="1113" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
30
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1113,930 1113,935 "/>
|
||||
<text x="1290" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
35
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1290,930 1290,935 "/>
|
||||
<text x="1468" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
40
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1468,930 1468,935 "/>
|
||||
<text x="1645" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
45
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1645,930 1645,935 "/>
|
||||
<text x="1822" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
50
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1822,930 1822,935 "/>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,54 1885,929 "/>
|
||||
<text x="1895" y="929" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
0
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,929 1890,929 "/>
|
||||
<text x="1895" y="774" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
100
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,774 1890,774 "/>
|
||||
<text x="1895" y="619" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
200
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,619 1890,619 "/>
|
||||
<text x="1895" y="464" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
300
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,464 1890,464 "/>
|
||||
<text x="1895" y="308" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
400
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,308 1890,308 "/>
|
||||
<text x="1895" y="153" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
500
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,153 1890,153 "/>
|
||||
<polyline fill="none" opacity="1" stroke="#FF6384" stroke-width="1" points="50,929 53,929 57,928 61,928 64,927 68,927 72,926 76,926 79,925 83,925 87,924 91,924 94,923 98,923 102,922 105,921 109,919 113,919 117,918 120,918 124,917 128,916 132,916 135,914 139,914 143,913 147,913 150,911 154,911 158,909 162,909 165,909 169,907 173,907 177,905 180,905 184,905 188,902 192,902 195,902 199,899 203,899 207,899 210,899 214,896 218,896 222,896 225,896 229,893 233,893 237,893 240,893 244,888 248,888 252,888 256,888 260,883 264,883 268,883 271,883 275,879 279,879 283,879 287,879 291,879 295,879 299,874 302,874 306,874 310,874 314,874 318,868 322,868 326,868 330,868 333,868 337,868 341,862 345,862 349,862 353,862 357,862 361,862 365,855 368,855 372,855 376,855 380,855 384,855 388,846 392,846 396,846 399,846 403,846 407,846 411,838 415,838 419,838 423,838 427,838 431,838 434,838 438,829 442,829 446,829 450,829 454,829 458,829 462,829 465,829 469,819 473,819 477,819 481,819 485,819 489,819 493,810 497,810 500,810 504,810 508,810 512,799 516,799 520,799 524,799 528,799 531,792 535,790 539,790 543,790 547,790 551,790 555,780 559,780 563,780 566,780 570,780 574,780 578,771 582,771 586,771 590,771 594,771 597,771 601,771 605,771 609,761 613,761 617,761 621,761 625,761 629,761 632,761 636,750 640,750 644,750 648,750 652,750 656,750 660,744 664,739 667,739 671,739 675,739 679,739 683,739 687,739 691,721 695,721 698,721 702,721 706,721 710,721 714,721 718,709 722,709 726,709 730,709 733,709 737,709 741,704 745,696 749,696 753,696 757,696 761,696 765,696 768,696 772,683 776,683 780,683 784,683 788,683 792,683 796,683 799,669 803,669 807,669 811,669 815,669 819,669 823,669 827,669 831,655 834,655 838,655 842,655 846,655 850,655 854,655 858,655 862,640 866,640 869,640 873,640 877,640 881,640 885,640 889,640 893,640 897,632 900,627 904,627 908,627 912,627 916,627 920,627 924,627 928,627 931,627 935,619 939,609 943,609 947,609 951,609 955,609 959,609 963,609 966,609 970,594 974,588 978,588 982,588 986,588 990,588 994,588 998,588 1001,571 1005,571 1009,571 1013,571 1017,571 1021,571 1025,571 1029,571 1033,553 1036,553 1040,553 1044,553 1048,553 1052,553 1056,553 1060,553 1064,536 1067,536 1071,536 1075,536 1079,536 1083,536 1087,536 1091,536 1095,530 1099,518 1103,518 1106,518 1110,518 1114,518 1118,518 1122,518 1126,518 1130,501 1134,501 1137,501 1141,501 1145,501 1149,501 1153,501 1157,501 1161,484 1165,484 1169,484 1172,484 1176,484 1180,484 1184,484 1188,484 1192,467 1196,467 1200,467 1204,467 1207,467 1211,467 1215,467 1219,467 1223,448 1227,448 1231,448 1235,448 1239,448 1242,448 1246,448 1250,448 1254,436 1258,430 1262,430 1266,430 1270,430 1274,430 1277,430 1281,430 1285,430 1289,430 1293,430 1297,430 1301,428 1305,418 1308,418 1312,405 1316,397 1320,397 1324,397 1328,397 1332,397 1336,397 1340,397 1343,397 1347,397 1351,396 1355,385 1359,379 1363,379 1367,379 1371,379 1375,379 1378,379 1382,379 1386,379 1390,379 1394,379 1398,367 1402,360 1406,360 1410,360 1413,360 1417,360 1421,360 1425,360 1429,360 1433,345 1437,341 1441,341 1445,341 1449,341 1452,341 1456,341 1460,341 1464,341 1468,330 1472,322 1476,322 1480,322 1483,322 1487,322 1491,322 1495,322 1498,322 1502,322 1506,309 1510,302 1514,302 1517,302 1521,302 1525,302 1529,302 1533,302 1536,302 1540,291 1544,284 1548,284 1551,284 1555,284 1559,284 1563,284 1567,284 1570,284 1574,269 1578,266 1582,266 1586,266 1589,266 1593,266 1597,266 1601,266 1604,266 1608,247 1612,247 1616,247 1619,247 1623,247 1627,247 1631,247 1635,247 1638,247 1642,247 1646,234 1650,227 1653,227 1657,227 1661,227 1665,227 1668,227 1672,227 1676,227 1680,227 1684,208 1687,208 1691,208 1695,208 1699,208 1702,208 1706,208 1710,208 1714,200 1718,190 1721,190 1725,190 1729,190 1733,190 1736,190 1740,190 1744,190 1748,177 1752,171 1756,171 1759,171 1763,171 1767,171 1771,171 1775,171 1778,171 1782,153 1786,153 1790,153 1794,153 1798,152 1802,152 1806,152 1810,152 1813,134 1817,134 1821,134 1825,134 1829,134 1833,134 "/>
|
||||
<rect x="55" y="59" width="98" height="36" opacity="0.98" fill="#121218" stroke="none"/>
|
||||
<rect x="55" y="59" width="98" height="36" opacity="1" fill="none" stroke="#121218"/>
|
||||
<text x="95" y="69" dy="0.76em" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.9" fill="#E6E6F0">
|
||||
3110s
|
||||
</text>
|
||||
<polyline fill="none" opacity="1" stroke="#FF6384" stroke-width="1" points="65,77 85,77 "/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.4 KiB |
@@ -0,0 +1,333 @@
|
||||
<svg width="2000" height="1000" viewBox="0 0 2000 1000" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="0" y="0" width="2000" height="1000" opacity="1" fill="#121218" stroke="none"/>
|
||||
<text x="1005" y="25" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="24.193548387096776" opacity="1" fill="#E6E6F0">
|
||||
brk_computer — Memory
|
||||
</text>
|
||||
<text x="967" y="980" dy="-0.5ex" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
Time (min)
|
||||
</text>
|
||||
<text x="1960" y="492" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0" transform="rotate(90, 1960, 492)">
|
||||
Memory (GiB)
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="50,930 1884,930 "/>
|
||||
<text x="50" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
0
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="50,930 50,935 "/>
|
||||
<text x="227" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
5
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="227,930 227,935 "/>
|
||||
<text x="404" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
10
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="404,930 404,935 "/>
|
||||
<text x="581" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
15
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="581,930 581,935 "/>
|
||||
<text x="759" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
20
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="759,930 759,935 "/>
|
||||
<text x="936" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
25
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="936,930 936,935 "/>
|
||||
<text x="1113" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
30
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1113,930 1113,935 "/>
|
||||
<text x="1290" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
35
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1290,930 1290,935 "/>
|
||||
<text x="1468" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
40
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1468,930 1468,935 "/>
|
||||
<text x="1645" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
45
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1645,930 1645,935 "/>
|
||||
<text x="1822" y="940" dy="0.76em" text-anchor="middle" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
50
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1822,930 1822,935 "/>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,54 1885,929 "/>
|
||||
<text x="1895" y="929" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
0
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,929 1890,929 "/>
|
||||
<text x="1895" y="810" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
1
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,810 1890,810 "/>
|
||||
<text x="1895" y="691" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
2
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,691 1890,691 "/>
|
||||
<text x="1895" y="572" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
3
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,572 1890,572 "/>
|
||||
<text x="1895" y="453" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
4
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,453 1890,453 "/>
|
||||
<text x="1895" y="334" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
5
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,334 1890,334 "/>
|
||||
<text x="1895" y="214" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
6
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,214 1890,214 "/>
|
||||
<text x="1895" y="95" dy="0.5ex" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.7" fill="#E6E6F0">
|
||||
7
|
||||
</text>
|
||||
<polyline fill="none" opacity="0.3" stroke="#E6E6F0" stroke-width="1" points="1885,95 1890,95 "/>
|
||||
<polyline fill="none" opacity="1" stroke="#FF6384" stroke-width="1" points="50,887 53,823 57,821 61,819 64,814 68,798 72,805 76,804 79,794 83,786 87,786 91,784 94,778 98,791 102,786 105,792 109,789 113,762 117,763 120,728 124,761 128,787 132,756 135,784 139,755 143,767 147,727 150,782 154,740 158,760 162,716 165,685 169,747 173,720 177,763 180,719 184,688 188,767 192,723 195,690 199,767 203,728 207,692 210,665 214,748 218,713 222,649 225,658 229,730 233,703 237,646 240,673 244,744 248,695 252,636 256,629 260,761 264,692 268,656 271,624 275,735 279,735 283,714 287,641 291,627 295,566 299,714 302,661 306,630 310,510 314,564 318,724 322,651 326,614 330,561 333,499 337,550 341,663 345,611 349,575 353,461 357,461 361,511 365,653 368,602 372,566 376,451 380,451 384,505 388,653 392,586 396,546 399,493 403,432 407,485 411,712 415,638 419,556 423,537 427,475 431,370 434,395 438,641 442,550 446,459 450,451 454,390 458,375 462,284 465,339 469,683 473,624 477,557 481,535 485,520 489,588 493,640 497,595 500,561 504,504 508,541 512,649 516,601 520,563 524,505 528,498 531,617 535,615 539,588 543,534 547,473 551,519 555,615 559,547 563,501 566,478 570,409 574,452 578,621 582,621 586,621 590,552 594,506 597,484 601,414 605,455 609,652 613,602 617,533 621,533 625,436 629,436 632,547 636,569 640,518 644,461 648,438 652,363 656,363 660,618 664,654 667,605 671,551 675,538 679,454 683,492 687,592 691,687 695,625 698,579 702,528 706,497 710,443 714,496 718,679 722,618 726,566 730,535 733,451 737,429 741,625 745,632 749,585 753,531 757,478 761,434 765,434 768,595 772,658 776,598 780,567 784,486 788,449 792,441 796,441 799,676 803,603 807,551 811,524 815,435 819,427 823,427 827,423 831,666 834,582 838,519 842,490 846,421 850,421 854,376 858,226 862,671 866,574 869,511 873,489 877,408 881,408 885,363 889,224 893,483 897,576 900,664 904,628 908,551 912,494 916,444 920,413 924,322 928,307 931,245 935,542 939,623 943,554 947,494 951,442 955,411 959,395 963,373 966,266 970,529 974,495 978,449 982,404 986,366 990,297 994,243 998,439 1001,657 1005,587 1009,521 1013,499 1017,407 1021,376 1025,372 1029,399 1033,659 1036,597 1040,547 1044,506 1048,430 1052,399 1056,380 1060,430 1064,579 1067,517 1071,483 1075,441 1079,407 1083,350 1087,304 1091,304 1095,572 1099,540 1103,475 1106,433 1110,399 1114,376 1118,295 1122,295 1126,346 1130,573 1134,498 1137,478 1141,413 1145,413 1149,336 1153,298 1157,366 1161,581 1165,586 1169,530 1172,478 1176,448 1180,413 1184,386 1188,588 1192,569 1196,506 1200,462 1204,424 1207,378 1211,363 1215,327 1219,259 1223,562 1227,506 1231,459 1235,402 1239,357 1242,331 1246,327 1250,356 1254,576 1258,531 1262,463 1266,421 1270,371 1274,356 1277,304 1281,304 1285,531 1289,531 1293,530 1297,530 1301,530 1305,530 1308,530 1312,578 1316,649 1320,588 1324,546 1328,504 1332,464 1336,433 1340,365 1343,349 1347,313 1351,558 1355,558 1359,643 1363,643 1367,624 1371,552 1375,513 1378,448 1382,443 1386,391 1390,329 1394,329 1398,574 1402,608 1406,544 1410,506 1413,441 1417,426 1421,408 1425,306 1429,283 1433,563 1437,600 1441,552 1445,474 1449,474 1452,448 1456,386 1460,375 1464,397 1468,558 1472,527 1476,478 1480,427 1483,406 1487,364 1491,356 1495,290 1498,263 1502,248 1506,540 1510,631 1514,566 1517,539 1521,506 1525,487 1529,445 1533,430 1536,430 1540,563 1544,541 1548,493 1551,435 1555,423 1559,384 1563,384 1567,365 1570,337 1574,642 1578,600 1582,542 1586,510 1589,438 1593,456 1597,444 1601,439 1604,400 1608,635 1612,583 1616,518 1619,499 1623,455 1627,443 1631,387 1635,383 1638,300 1642,490 1646,538 1650,618 1653,578 1657,520 1661,511 1665,467 1668,453 1672,404 1676,398 1680,487 1684,632 1687,577 1691,539 1695,499 1699,459 1702,459 1706,441 1710,383 1714,566 1718,611 1721,571 1725,536 1729,500 1733,466 1736,449 1740,430 1744,365 1748,561 1752,622 1756,572 1759,523 1763,502 1767,470 1771,461 1775,395 1778,505 1782,630 1786,578 1790,523 1794,496 1798,465 1802,456 1806,395 1810,549 1813,628 1817,581 1821,545 1825,509 1829,465 1833,461 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="50,882 53,823 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="57,821 61,819 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="64,809 68,796 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="72,796 76,796 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="79,789 83,781 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="87,781 91,780 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="94,772 98,762 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="102,762 105,761 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="109,761 113,755 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="117,724 120,717 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="124,715 128,715 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="132,715 135,715 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="139,715 143,715 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="147,715 150,709 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="154,709 158,678 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="162,678 165,654 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="169,654 173,654 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="177,654 180,654 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="184,654 188,654 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="192,654 195,654 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="199,634 203,634 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="207,634 210,634 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="214,632 218,632 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="222,632 225,612 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="229,612 233,612 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="237,612 240,610 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="244,610 248,610 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="252,610 256,610 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="260,597 264,597 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="268,597 271,594 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="275,590 279,590 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="283,590 287,590 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="291,590 295,504 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="299,504 302,504 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="306,504 310,449 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="314,449 318,449 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="322,449 326,449 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="330,449 333,438 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="337,438 341,438 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="345,438 349,438 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="353,399 357,399 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="361,399 365,399 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="368,399 372,399 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="376,390 380,390 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="384,390 388,390 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="392,390 396,390 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="399,390 403,370 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="407,370 411,370 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="415,370 419,370 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="423,370 427,370 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="431,295 434,282 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="438,282 442,282 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="446,282 450,282 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="454,282 458,282 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="462,194 465,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="469,194 473,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="477,194 481,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="485,194 489,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="493,194 497,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="500,194 504,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="508,194 512,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="516,194 520,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="524,194 528,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="531,194 535,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="539,194 543,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="547,194 551,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="555,194 559,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="563,194 566,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="570,194 574,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="578,194 582,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="586,194 590,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="594,194 597,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="601,194 605,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="609,194 613,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="617,194 621,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="625,194 629,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="632,194 636,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="640,194 644,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="648,194 652,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="656,194 660,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="664,194 667,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="671,194 675,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="679,194 683,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="687,194 691,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="695,194 698,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="702,194 706,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="710,194 714,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="718,194 722,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="726,194 730,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="733,194 737,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="741,194 745,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="749,194 753,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="757,194 761,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="765,194 768,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="772,194 776,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="780,194 784,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="788,194 792,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="796,194 799,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="803,194 807,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="811,194 815,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="819,194 823,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="827,194 831,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="834,194 838,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="842,194 846,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="850,194 854,194 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="858,180 862,180 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="866,180 869,180 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="873,180 877,180 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="881,180 885,180 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="889,163 893,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="897,134 900,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="904,134 908,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="912,134 916,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="920,134 924,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="928,134 931,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="935,134 939,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="943,134 947,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="951,134 955,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="959,134 963,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="966,134 970,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="974,134 978,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="982,134 986,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="990,134 994,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="998,134 1001,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1005,134 1009,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1013,134 1017,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1021,134 1025,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1029,134 1033,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1036,134 1040,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1044,134 1048,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1052,134 1056,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1060,134 1064,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1067,134 1071,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1075,134 1079,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1083,134 1087,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1091,134 1095,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1099,134 1103,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1106,134 1110,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1114,134 1118,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1122,134 1126,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1130,134 1134,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1137,134 1141,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1145,134 1149,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1153,134 1157,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1161,134 1165,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1169,134 1172,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1176,134 1180,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1184,134 1188,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1192,134 1196,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1200,134 1204,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1207,134 1211,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1215,134 1219,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1223,134 1227,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1231,134 1235,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1239,134 1242,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1246,134 1250,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1254,134 1258,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1262,134 1266,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1270,134 1274,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1277,134 1281,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1285,134 1289,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1293,134 1297,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1301,134 1305,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1308,134 1312,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1316,134 1320,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1324,134 1328,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1332,134 1336,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1340,134 1343,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1347,134 1351,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1355,134 1359,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1363,134 1367,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1371,134 1375,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1378,134 1382,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1386,134 1390,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1394,134 1398,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1402,134 1406,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1410,134 1413,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1417,134 1421,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1425,134 1429,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1433,134 1437,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1441,134 1445,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1449,134 1452,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1456,134 1460,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1464,134 1468,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1472,134 1476,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1480,134 1483,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1487,134 1491,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1495,134 1498,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1502,134 1506,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1510,134 1514,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1517,134 1521,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1525,134 1529,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1533,134 1536,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1540,134 1544,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1548,134 1551,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1555,134 1559,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1563,134 1567,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1570,134 1574,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1578,134 1582,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1586,134 1589,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1593,134 1597,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1601,134 1604,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1608,134 1612,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1616,134 1619,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1623,134 1627,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1631,134 1635,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1638,134 1642,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1646,134 1650,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1653,134 1657,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1661,134 1665,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1668,134 1672,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1676,134 1680,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1684,134 1687,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1691,134 1695,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1699,134 1702,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1706,134 1710,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1714,134 1718,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1721,134 1725,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1729,134 1733,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1736,134 1740,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1744,134 1748,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1752,134 1756,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1759,134 1763,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1767,134 1771,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1775,134 1778,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1782,134 1786,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1790,134 1794,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1798,134 1802,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1806,134 1810,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1813,134 1817,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1821,134 1825,134 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="1829,134 1833,134 "/>
|
||||
<rect x="55" y="59" width="195" height="61" opacity="0.98" fill="#121218" stroke="none"/>
|
||||
<rect x="55" y="59" width="195" height="61" opacity="1" fill="none" stroke="#121218"/>
|
||||
<text x="95" y="69" dy="0.76em" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.9" fill="#E6E6F0">
|
||||
3110s (current)
|
||||
</text>
|
||||
<text x="95" y="94" dy="0.76em" text-anchor="start" font-family="monospace" font-size="16.129032258064516" opacity="0.9" fill="#E6E6F0">
|
||||
3110s (peak)
|
||||
</text>
|
||||
<polyline fill="none" opacity="1" stroke="#FF6384" stroke-width="1" points="65,77 85,77 "/>
|
||||
<polyline fill="none" opacity="0.5" stroke="#FF6384" stroke-width="2" points="65,102 75,102 85,102 "/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 736 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 305 KiB |
|
After Width: | Height: | Size: 223 KiB |
@@ -1830,6 +1830,32 @@ impl _1m1w1y24hPercentPpmRatioPattern {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct _1m1y2y3m4y6m8yPattern {
|
||||
pub _1m: SupplyPattern,
|
||||
pub _1y: SupplyPattern,
|
||||
pub _2y: SupplyPattern,
|
||||
pub _3m: SupplyPattern,
|
||||
pub _4y: SupplyPattern,
|
||||
pub _6m: SupplyPattern,
|
||||
pub _8y: SupplyPattern,
|
||||
}
|
||||
|
||||
impl _1m1y2y3m4y6m8yPattern {
|
||||
/// Create a new pattern node with accumulated series name.
|
||||
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
|
||||
Self {
|
||||
_1m: SupplyPattern::new(client.clone(), _m(&acc, "1m_supply_in_loss_share")),
|
||||
_1y: SupplyPattern::new(client.clone(), _m(&acc, "1y_supply_in_loss_share")),
|
||||
_2y: SupplyPattern::new(client.clone(), _m(&acc, "2y_supply_in_loss_share")),
|
||||
_3m: SupplyPattern::new(client.clone(), _m(&acc, "3m_supply_in_loss_share")),
|
||||
_4y: SupplyPattern::new(client.clone(), _m(&acc, "4y_supply_in_loss_share")),
|
||||
_6m: SupplyPattern::new(client.clone(), _m(&acc, "6m_supply_in_loss_share")),
|
||||
_8y: SupplyPattern::new(client.clone(), _m(&acc, "8y_supply_in_loss_share")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct ActiveInputOutputSpendablePattern {
|
||||
pub active_reused_addr_count: _1m1w1y24hBlockPattern,
|
||||
@@ -1868,27 +1894,27 @@ impl CapLossMvrvNetPriceProfitSoprPattern {
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct CoindaysLivelinessRatioSupplyVaultednessPattern {
|
||||
pub struct CoindaysDormancySupplyWakefulnessPattern {
|
||||
pub coindays_consumed: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
pub coindays_created: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
pub coindays_stored: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
pub liveliness: SeriesPattern1<StoredF64>,
|
||||
pub ratio: SeriesPattern1<StoredF64>,
|
||||
pub supply: ActiveVaultedPattern,
|
||||
pub vaultedness: SeriesPattern1<StoredF64>,
|
||||
pub dormancy: SeriesPattern1<StoredF64>,
|
||||
pub supply: AwakeDormantPattern,
|
||||
pub wakefulness: SeriesPattern1<StoredF64>,
|
||||
pub wakefulness_to_dormancy: SeriesPattern1<StoredF64>,
|
||||
}
|
||||
|
||||
impl CoindaysLivelinessRatioSupplyVaultednessPattern {
|
||||
impl CoindaysDormancySupplyWakefulnessPattern {
|
||||
/// Create a new pattern node with accumulated series name.
|
||||
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
|
||||
Self {
|
||||
coindays_consumed: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "coindays_consumed")),
|
||||
coindays_created: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "coindays_created")),
|
||||
coindays_stored: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "coindays_stored")),
|
||||
liveliness: SeriesPattern1::new(client.clone(), _m(&acc, "liveliness")),
|
||||
ratio: SeriesPattern1::new(client.clone(), _m(&acc, "activity_to_vaultedness")),
|
||||
supply: ActiveVaultedPattern::new(client.clone(), acc.clone()),
|
||||
vaultedness: SeriesPattern1::new(client.clone(), _m(&acc, "vaultedness")),
|
||||
dormancy: SeriesPattern1::new(client.clone(), _m(&acc, "dormancy")),
|
||||
supply: AwakeDormantPattern::new(client.clone(), acc.clone()),
|
||||
wakefulness: SeriesPattern1::new(client.clone(), _m(&acc, "wakefulness")),
|
||||
wakefulness_to_dormancy: SeriesPattern1::new(client.clone(), _m(&acc, "wakefulness_to_dormancy")),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2437,6 +2463,28 @@ impl PhsReboundThsPattern {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct RankTailThresholdPattern {
|
||||
pub rank: SeriesPattern1<StoredU8>,
|
||||
pub tail: PercentPpmRatioPattern2,
|
||||
pub threshold_pct0_025: SeriesPattern1<Dollars>,
|
||||
pub threshold_pct0_05: SeriesPattern1<Dollars>,
|
||||
pub threshold_pct0_1: SeriesPattern1<Dollars>,
|
||||
}
|
||||
|
||||
impl RankTailThresholdPattern {
|
||||
/// Create a new pattern node with accumulated series name.
|
||||
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
|
||||
Self {
|
||||
rank: SeriesPattern1::new(client.clone(), _m(&acc, "rank")),
|
||||
tail: PercentPpmRatioPattern2::new(client.clone(), _m(&acc, "tail")),
|
||||
threshold_pct0_025: SeriesPattern1::new(client.clone(), _m(&acc, "threshold")),
|
||||
threshold_pct0_05: SeriesPattern1::new(client.clone(), _m(&acc, "threshold_pct0_05")),
|
||||
threshold_pct0_1: SeriesPattern1::new(client.clone(), _m(&acc, "threshold_pct0_1")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct _1m1w1y24hPattern4 {
|
||||
pub _1m: BtcCentsSatsUsdPattern,
|
||||
@@ -2717,6 +2765,14 @@ impl BtcCentsSatsUsdPattern3 {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct CapHorizonPriceSupplyPattern {
|
||||
pub cap: CentsUsdPattern3,
|
||||
pub horizon: _1m1y2y3m4y6m8yPattern,
|
||||
pub price: CentsPpmRatioSatsUsdPattern,
|
||||
pub supply: ImmobileMobilePattern2,
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct CentsDeltaToUsdPattern {
|
||||
pub cents: SeriesPattern1<Cents>,
|
||||
@@ -2967,6 +3023,13 @@ impl CapLossProfitPattern {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct CapPriceSupplyPattern {
|
||||
pub cap: CentsUsdPattern3,
|
||||
pub price: CentsPpmRatioSatsUsdPattern,
|
||||
pub supply: BtcCentsInSatsUsdPattern,
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct CentsSatsUsdPattern3 {
|
||||
pub cents: SeriesPattern2<Cents>,
|
||||
@@ -3226,24 +3289,6 @@ impl PpmPriceRatioPattern {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct RankTailThresholdPattern {
|
||||
pub rank: SeriesPattern1<StoredI8>,
|
||||
pub tail: PercentPpmRatioPattern2,
|
||||
pub threshold: SeriesPattern1<Dollars>,
|
||||
}
|
||||
|
||||
impl RankTailThresholdPattern {
|
||||
/// Create a new pattern node with accumulated series name.
|
||||
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
|
||||
Self {
|
||||
rank: SeriesPattern1::new(client.clone(), _m(&acc, "rank")),
|
||||
tail: PercentPpmRatioPattern2::new(client.clone(), _m(&acc, "tail")),
|
||||
threshold: SeriesPattern1::new(client.clone(), _m(&acc, "threshold")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct RatioTransferValuePattern {
|
||||
pub ratio: _1m1w1y24hPattern<StoredF64>,
|
||||
@@ -3346,22 +3391,6 @@ impl AbsoluteRatePattern3 {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct ActiveVaultedPattern {
|
||||
pub active: BtcCentsSatsUsdPattern,
|
||||
pub vaulted: BtcCentsSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl ActiveVaultedPattern {
|
||||
/// Create a new pattern node with accumulated series name.
|
||||
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
|
||||
Self {
|
||||
active: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "active_supply")),
|
||||
vaulted: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "vaulted_supply")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct AddrUtxoPattern {
|
||||
pub addr: BtcCentsSatsUsdPattern,
|
||||
@@ -3410,6 +3439,28 @@ impl AllSthPattern {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct AwakeDormantPattern {
|
||||
pub awake: BtcCentsSatsUsdPattern,
|
||||
pub dormant: BtcCentsSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl AwakeDormantPattern {
|
||||
/// Create a new pattern node with accumulated series name.
|
||||
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
|
||||
Self {
|
||||
awake: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "awake_supply")),
|
||||
dormant: BtcCentsSatsUsdPattern::new(client.clone(), _m(&acc, "dormant_supply")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct AwakeDormantPattern2 {
|
||||
pub awake: CapPriceSupplyPattern,
|
||||
pub dormant: SupplyPattern2,
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct BaseSumPattern {
|
||||
pub base: SeriesPattern18<Dollars>,
|
||||
@@ -3586,6 +3637,12 @@ impl FundedTotalPattern {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct ImmobileMobilePattern2 {
|
||||
pub immobile: BtcCentsSatsUsdPattern,
|
||||
pub mobile: BtcCentsInSatsUsdPattern,
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct ImmobileMobilePattern {
|
||||
pub immobile: BtcCentsSatsUsdPattern,
|
||||
@@ -3836,6 +3893,20 @@ impl SharePattern2 {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct SupplyPattern2 {
|
||||
pub supply: BtcCentsSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SupplyPattern2 {
|
||||
/// Create a new pattern node with accumulated series name.
|
||||
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
|
||||
Self {
|
||||
supply: BtcCentsSatsUsdPattern::new(client.clone(), acc.clone()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct SupplyPattern {
|
||||
pub supply: InPattern3,
|
||||
@@ -4580,6 +4651,7 @@ impl SeriesTree_Transactions_Volume {
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Inputs {
|
||||
pub raw: SeriesTree_Inputs_Raw,
|
||||
pub value: SeriesPattern20<Sats>,
|
||||
pub count: CumulativeRollingSumPattern,
|
||||
pub per_sec: _1m1w1y24hPattern<StoredF32>,
|
||||
pub by_type: SeriesTree_Inputs_ByType,
|
||||
@@ -4589,6 +4661,7 @@ impl SeriesTree_Inputs {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
raw: SeriesTree_Inputs_Raw::new(client.clone(), format!("{base_path}_raw")),
|
||||
value: SeriesPattern20::new(client.clone(), "value".to_string()),
|
||||
count: CumulativeRollingSumPattern::new(client.clone(), "input_count".to_string()),
|
||||
per_sec: _1m1w1y24hPattern::new(client.clone(), "inputs_per_sec".to_string()),
|
||||
by_type: SeriesTree_Inputs_ByType::new(client.clone(), format!("{base_path}_by_type")),
|
||||
@@ -4601,7 +4674,6 @@ pub struct SeriesTree_Inputs_Raw {
|
||||
pub first_txin_index: SeriesPattern18<TxInIndex>,
|
||||
pub outpoint: SeriesPattern20<OutPoint>,
|
||||
pub txout_index: SeriesPattern20<TxOutIndex>,
|
||||
pub value: SeriesPattern20<Sats>,
|
||||
pub tx_index: SeriesPattern20<TxIndex>,
|
||||
pub output_type: SeriesPattern20<OutputType>,
|
||||
pub type_index: SeriesPattern20<TypeIndex>,
|
||||
@@ -4613,7 +4685,6 @@ impl SeriesTree_Inputs_Raw {
|
||||
first_txin_index: SeriesPattern18::new(client.clone(), "first_txin_index".to_string()),
|
||||
outpoint: SeriesPattern20::new(client.clone(), "outpoint".to_string()),
|
||||
txout_index: SeriesPattern20::new(client.clone(), "txout_index".to_string()),
|
||||
value: SeriesPattern20::new(client.clone(), "value".to_string()),
|
||||
tx_index: SeriesPattern20::new(client.clone(), "tx_index".to_string()),
|
||||
output_type: SeriesPattern20::new(client.clone(), "output_type".to_string()),
|
||||
type_index: SeriesPattern20::new(client.clone(), "type_index".to_string()),
|
||||
@@ -4774,7 +4845,6 @@ pub struct SeriesTree_Outputs_Raw {
|
||||
pub value: SeriesPattern21<Sats>,
|
||||
pub output_type: SeriesPattern21<OutputType>,
|
||||
pub type_index: SeriesPattern21<TypeIndex>,
|
||||
pub tx_index: SeriesPattern21<TxIndex>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Outputs_Raw {
|
||||
@@ -4784,7 +4854,6 @@ impl SeriesTree_Outputs_Raw {
|
||||
value: SeriesPattern21::new(client.clone(), "value".to_string()),
|
||||
output_type: SeriesPattern21::new(client.clone(), "output_type".to_string()),
|
||||
type_index: SeriesPattern21::new(client.clone(), "type_index".to_string()),
|
||||
tx_index: SeriesPattern21::new(client.clone(), "tx_index".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5867,6 +5936,10 @@ impl SeriesTree_Frameworks {
|
||||
pub struct SeriesTree_Frameworks_Cointime {
|
||||
pub activity: SeriesTree_Frameworks_Cointime_Activity,
|
||||
pub age_range: SeriesTree_Frameworks_Cointime_AgeRange,
|
||||
pub awake: SeriesTree_Frameworks_Cointime_Awake,
|
||||
pub dormant: SupplyPattern2,
|
||||
pub sth: SeriesTree_Frameworks_Cointime_Sth,
|
||||
pub lth: SeriesTree_Frameworks_Cointime_Lth,
|
||||
pub supply: SeriesTree_Frameworks_Cointime_Supply,
|
||||
pub value: SeriesTree_Frameworks_Cointime_Value,
|
||||
pub cap: SeriesTree_Frameworks_Cointime_Cap,
|
||||
@@ -5880,6 +5953,10 @@ impl SeriesTree_Frameworks_Cointime {
|
||||
Self {
|
||||
activity: SeriesTree_Frameworks_Cointime_Activity::new(client.clone(), format!("{base_path}_activity")),
|
||||
age_range: SeriesTree_Frameworks_Cointime_AgeRange::new(client.clone(), format!("{base_path}_age_range")),
|
||||
awake: SeriesTree_Frameworks_Cointime_Awake::new(client.clone(), format!("{base_path}_awake")),
|
||||
dormant: SupplyPattern2::new(client.clone(), "dormant_supply".to_string()),
|
||||
sth: SeriesTree_Frameworks_Cointime_Sth::new(client.clone(), format!("{base_path}_sth")),
|
||||
lth: SeriesTree_Frameworks_Cointime_Lth::new(client.clone(), format!("{base_path}_lth")),
|
||||
supply: SeriesTree_Frameworks_Cointime_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
value: SeriesTree_Frameworks_Cointime_Value::new(client.clone(), format!("{base_path}_value")),
|
||||
cap: SeriesTree_Frameworks_Cointime_Cap::new(client.clone(), format!("{base_path}_cap")),
|
||||
@@ -5913,57 +5990,201 @@ impl SeriesTree_Frameworks_Cointime_Activity {
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_AgeRange {
|
||||
pub under_1h: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _1h_to_1d: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _1d_to_1w: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _1w_to_1m: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _1m_to_2m: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _2m_to_3m: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _3m_to_4m: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _4m_to_5m: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _5m_to_6m: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _6m_to_9m: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _9m_to_1y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _1y_to_18m: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _18m_to_2y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _2y_to_3y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _3y_to_4y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _4y_to_5y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _5y_to_6y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _6y_to_7y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _7y_to_8y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _8y_to_10y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _10y_to_12y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _12y_to_15y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub over_15y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub under_1h: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _1h_to_1d: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _1d_to_1w: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _1w_to_1m: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _1m_to_2m: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _2m_to_3m: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _3m_to_4m: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _4m_to_5m: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _5m_to_6m: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _6m_to_9m: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _9m_to_1y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _1y_to_18m: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _18m_to_2y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _2y_to_3y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _3y_to_4y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _4y_to_5y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _5y_to_6y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _6y_to_7y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _7y_to_8y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _8y_to_10y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _10y_to_12y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub _12y_to_15y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
pub over_15y: CoindaysDormancySupplyWakefulnessPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime_AgeRange {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
under_1h: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_under_1h_old".to_string()),
|
||||
_1h_to_1d: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_1h_to_1d_old".to_string()),
|
||||
_1d_to_1w: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_1d_to_1w_old".to_string()),
|
||||
_1w_to_1m: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_1w_to_1m_old".to_string()),
|
||||
_1m_to_2m: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_1m_to_2m_old".to_string()),
|
||||
_2m_to_3m: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_2m_to_3m_old".to_string()),
|
||||
_3m_to_4m: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_3m_to_4m_old".to_string()),
|
||||
_4m_to_5m: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_4m_to_5m_old".to_string()),
|
||||
_5m_to_6m: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_5m_to_6m_old".to_string()),
|
||||
_6m_to_9m: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_6m_to_9m_old".to_string()),
|
||||
_9m_to_1y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_9m_to_1y_old".to_string()),
|
||||
_1y_to_18m: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_1y_to_18m_old".to_string()),
|
||||
_18m_to_2y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_18m_to_2y_old".to_string()),
|
||||
_2y_to_3y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_2y_to_3y_old".to_string()),
|
||||
_3y_to_4y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_3y_to_4y_old".to_string()),
|
||||
_4y_to_5y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_4y_to_5y_old".to_string()),
|
||||
_5y_to_6y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_5y_to_6y_old".to_string()),
|
||||
_6y_to_7y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_6y_to_7y_old".to_string()),
|
||||
_7y_to_8y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_7y_to_8y_old".to_string()),
|
||||
_8y_to_10y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_8y_to_10y_old".to_string()),
|
||||
_10y_to_12y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_10y_to_12y_old".to_string()),
|
||||
_12y_to_15y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_12y_to_15y_old".to_string()),
|
||||
over_15y: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_over_15y_old".to_string()),
|
||||
under_1h: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_under_1h_old".to_string()),
|
||||
_1h_to_1d: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_1h_to_1d_old".to_string()),
|
||||
_1d_to_1w: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_1d_to_1w_old".to_string()),
|
||||
_1w_to_1m: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_1w_to_1m_old".to_string()),
|
||||
_1m_to_2m: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_1m_to_2m_old".to_string()),
|
||||
_2m_to_3m: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_2m_to_3m_old".to_string()),
|
||||
_3m_to_4m: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_3m_to_4m_old".to_string()),
|
||||
_4m_to_5m: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_4m_to_5m_old".to_string()),
|
||||
_5m_to_6m: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_5m_to_6m_old".to_string()),
|
||||
_6m_to_9m: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_6m_to_9m_old".to_string()),
|
||||
_9m_to_1y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_9m_to_1y_old".to_string()),
|
||||
_1y_to_18m: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_1y_to_18m_old".to_string()),
|
||||
_18m_to_2y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_18m_to_2y_old".to_string()),
|
||||
_2y_to_3y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_2y_to_3y_old".to_string()),
|
||||
_3y_to_4y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_3y_to_4y_old".to_string()),
|
||||
_4y_to_5y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_4y_to_5y_old".to_string()),
|
||||
_5y_to_6y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_5y_to_6y_old".to_string()),
|
||||
_6y_to_7y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_6y_to_7y_old".to_string()),
|
||||
_7y_to_8y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_7y_to_8y_old".to_string()),
|
||||
_8y_to_10y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_8y_to_10y_old".to_string()),
|
||||
_10y_to_12y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_10y_to_12y_old".to_string()),
|
||||
_12y_to_15y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_12y_to_15y_old".to_string()),
|
||||
over_15y: CoindaysDormancySupplyWakefulnessPattern::new(client.clone(), "utxos_over_15y_old".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_Awake {
|
||||
pub supply: SeriesTree_Frameworks_Cointime_Awake_Supply,
|
||||
pub cap: CentsUsdPattern3,
|
||||
pub price: CentsPpmRatioSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime_Awake {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
supply: SeriesTree_Frameworks_Cointime_Awake_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
cap: CentsUsdPattern3::new(client.clone(), "awake_cap".to_string()),
|
||||
price: CentsPpmRatioSatsUsdPattern::new(client.clone(), "awake_price".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_Awake_Supply {
|
||||
pub btc: SeriesPattern1<Bitcoin>,
|
||||
pub sats: SeriesPattern1<Sats>,
|
||||
pub usd: SeriesPattern1<Dollars>,
|
||||
pub cents: SeriesPattern1<Cents>,
|
||||
pub in_loss: SharePattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime_Awake_Supply {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
btc: SeriesPattern1::new(client.clone(), "awake_supply".to_string()),
|
||||
sats: SeriesPattern1::new(client.clone(), "awake_supply_sats".to_string()),
|
||||
usd: SeriesPattern1::new(client.clone(), "awake_supply_usd".to_string()),
|
||||
cents: SeriesPattern1::new(client.clone(), "awake_supply_cents".to_string()),
|
||||
in_loss: SharePattern2::new(client.clone(), "awake_supply_in_loss_share".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_Sth {
|
||||
pub awake: SeriesTree_Frameworks_Cointime_Sth_Awake,
|
||||
pub dormant: SupplyPattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime_Sth {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
awake: SeriesTree_Frameworks_Cointime_Sth_Awake::new(client.clone(), format!("{base_path}_awake")),
|
||||
dormant: SupplyPattern2::new(client.clone(), "sth_dormant_supply".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_Sth_Awake {
|
||||
pub supply: SeriesTree_Frameworks_Cointime_Sth_Awake_Supply,
|
||||
pub cap: CentsUsdPattern3,
|
||||
pub price: CentsPpmRatioSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime_Sth_Awake {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
supply: SeriesTree_Frameworks_Cointime_Sth_Awake_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
cap: CentsUsdPattern3::new(client.clone(), "sth_awake_cap".to_string()),
|
||||
price: CentsPpmRatioSatsUsdPattern::new(client.clone(), "sth_awake_price".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_Sth_Awake_Supply {
|
||||
pub btc: SeriesPattern1<Bitcoin>,
|
||||
pub sats: SeriesPattern1<Sats>,
|
||||
pub usd: SeriesPattern1<Dollars>,
|
||||
pub cents: SeriesPattern1<Cents>,
|
||||
pub in_loss: SharePattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime_Sth_Awake_Supply {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
btc: SeriesPattern1::new(client.clone(), "sth_awake_supply".to_string()),
|
||||
sats: SeriesPattern1::new(client.clone(), "sth_awake_supply_sats".to_string()),
|
||||
usd: SeriesPattern1::new(client.clone(), "sth_awake_supply_usd".to_string()),
|
||||
cents: SeriesPattern1::new(client.clone(), "sth_awake_supply_cents".to_string()),
|
||||
in_loss: SharePattern2::new(client.clone(), "sth_awake_supply_in_loss_share".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_Lth {
|
||||
pub awake: SeriesTree_Frameworks_Cointime_Lth_Awake,
|
||||
pub dormant: SupplyPattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime_Lth {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
awake: SeriesTree_Frameworks_Cointime_Lth_Awake::new(client.clone(), format!("{base_path}_awake")),
|
||||
dormant: SupplyPattern2::new(client.clone(), "lth_dormant_supply".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_Lth_Awake {
|
||||
pub supply: SeriesTree_Frameworks_Cointime_Lth_Awake_Supply,
|
||||
pub cap: CentsUsdPattern3,
|
||||
pub price: CentsPpmRatioSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime_Lth_Awake {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
supply: SeriesTree_Frameworks_Cointime_Lth_Awake_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
cap: CentsUsdPattern3::new(client.clone(), "lth_awake_cap".to_string()),
|
||||
price: CentsPpmRatioSatsUsdPattern::new(client.clone(), "lth_awake_price".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_Lth_Awake_Supply {
|
||||
pub btc: SeriesPattern1<Bitcoin>,
|
||||
pub sats: SeriesPattern1<Sats>,
|
||||
pub usd: SeriesPattern1<Dollars>,
|
||||
pub cents: SeriesPattern1<Cents>,
|
||||
pub in_loss: SharePattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime_Lth_Awake_Supply {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
btc: SeriesPattern1::new(client.clone(), "lth_awake_supply".to_string()),
|
||||
sats: SeriesPattern1::new(client.clone(), "lth_awake_supply_sats".to_string()),
|
||||
usd: SeriesPattern1::new(client.clone(), "lth_awake_supply_usd".to_string()),
|
||||
cents: SeriesPattern1::new(client.clone(), "lth_awake_supply_cents".to_string()),
|
||||
in_loss: SharePattern2::new(client.clone(), "lth_awake_supply_in_loss_share".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6103,9 +6324,11 @@ impl SeriesTree_Frameworks_Cointime_ReserveRisk {
|
||||
pub struct SeriesTree_Frameworks_Coinflow {
|
||||
pub age_range: SeriesTree_Frameworks_Coinflow_AgeRange,
|
||||
pub supply: SeriesTree_Frameworks_Coinflow_Supply,
|
||||
pub horizon: SeriesTree_Frameworks_Coinflow_Horizon,
|
||||
pub horizon: _1m1y2y3m4y6m8yPattern,
|
||||
pub cap: CentsUsdPattern3,
|
||||
pub price: CentsPpmRatioSatsUsdPattern,
|
||||
pub sth: SeriesTree_Frameworks_Coinflow_Sth,
|
||||
pub lth: SeriesTree_Frameworks_Coinflow_Lth,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Coinflow {
|
||||
@@ -6113,9 +6336,11 @@ impl SeriesTree_Frameworks_Coinflow {
|
||||
Self {
|
||||
age_range: SeriesTree_Frameworks_Coinflow_AgeRange::new(client.clone(), format!("{base_path}_age_range")),
|
||||
supply: SeriesTree_Frameworks_Coinflow_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
horizon: SeriesTree_Frameworks_Coinflow_Horizon::new(client.clone(), format!("{base_path}_horizon")),
|
||||
horizon: _1m1y2y3m4y6m8yPattern::new(client.clone(), "coinflow".to_string()),
|
||||
cap: CentsUsdPattern3::new(client.clone(), "coinflow_cap".to_string()),
|
||||
price: CentsPpmRatioSatsUsdPattern::new(client.clone(), "coinflow_price".to_string()),
|
||||
sth: SeriesTree_Frameworks_Coinflow_Sth::new(client.clone(), format!("{base_path}_sth")),
|
||||
lth: SeriesTree_Frameworks_Coinflow_Lth::new(client.clone(), format!("{base_path}_lth")),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6214,26 +6439,111 @@ impl SeriesTree_Frameworks_Coinflow_Supply_Mobile {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Horizon {
|
||||
pub _8y: SupplyPattern,
|
||||
pub _4y: SupplyPattern,
|
||||
pub _2y: SupplyPattern,
|
||||
pub _1y: SupplyPattern,
|
||||
pub _6m: SupplyPattern,
|
||||
pub _3m: SupplyPattern,
|
||||
pub _1m: SupplyPattern,
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Sth {
|
||||
pub supply: SeriesTree_Frameworks_Coinflow_Sth_Supply,
|
||||
pub horizon: _1m1y2y3m4y6m8yPattern,
|
||||
pub cap: CentsUsdPattern3,
|
||||
pub price: CentsPpmRatioSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Coinflow_Horizon {
|
||||
impl SeriesTree_Frameworks_Coinflow_Sth {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
_8y: SupplyPattern::new(client.clone(), "coinflow_8y_supply_in_loss_share".to_string()),
|
||||
_4y: SupplyPattern::new(client.clone(), "coinflow_4y_supply_in_loss_share".to_string()),
|
||||
_2y: SupplyPattern::new(client.clone(), "coinflow_2y_supply_in_loss_share".to_string()),
|
||||
_1y: SupplyPattern::new(client.clone(), "coinflow_1y_supply_in_loss_share".to_string()),
|
||||
_6m: SupplyPattern::new(client.clone(), "coinflow_6m_supply_in_loss_share".to_string()),
|
||||
_3m: SupplyPattern::new(client.clone(), "coinflow_3m_supply_in_loss_share".to_string()),
|
||||
_1m: SupplyPattern::new(client.clone(), "coinflow_1m_supply_in_loss_share".to_string()),
|
||||
supply: SeriesTree_Frameworks_Coinflow_Sth_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
horizon: _1m1y2y3m4y6m8yPattern::new(client.clone(), "sth_coinflow".to_string()),
|
||||
cap: CentsUsdPattern3::new(client.clone(), "sth_coinflow_cap".to_string()),
|
||||
price: CentsPpmRatioSatsUsdPattern::new(client.clone(), "sth_coinflow_price".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Sth_Supply {
|
||||
pub mobile: SeriesTree_Frameworks_Coinflow_Sth_Supply_Mobile,
|
||||
pub immobile: BtcCentsSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Coinflow_Sth_Supply {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
mobile: SeriesTree_Frameworks_Coinflow_Sth_Supply_Mobile::new(client.clone(), format!("{base_path}_mobile")),
|
||||
immobile: BtcCentsSatsUsdPattern::new(client.clone(), "sth_immobile_supply".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Sth_Supply_Mobile {
|
||||
pub btc: SeriesPattern1<Bitcoin>,
|
||||
pub sats: SeriesPattern1<Sats>,
|
||||
pub usd: SeriesPattern1<Dollars>,
|
||||
pub cents: SeriesPattern1<Cents>,
|
||||
pub in_loss: SharePattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Coinflow_Sth_Supply_Mobile {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
btc: SeriesPattern1::new(client.clone(), "sth_mobile_supply".to_string()),
|
||||
sats: SeriesPattern1::new(client.clone(), "sth_mobile_supply_sats".to_string()),
|
||||
usd: SeriesPattern1::new(client.clone(), "sth_mobile_supply_usd".to_string()),
|
||||
cents: SeriesPattern1::new(client.clone(), "sth_mobile_supply_cents".to_string()),
|
||||
in_loss: SharePattern2::new(client.clone(), "sth_coinflow_supply_in_loss_share".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Lth {
|
||||
pub supply: SeriesTree_Frameworks_Coinflow_Lth_Supply,
|
||||
pub horizon: _1m1y2y3m4y6m8yPattern,
|
||||
pub cap: CentsUsdPattern3,
|
||||
pub price: CentsPpmRatioSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Coinflow_Lth {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
supply: SeriesTree_Frameworks_Coinflow_Lth_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
horizon: _1m1y2y3m4y6m8yPattern::new(client.clone(), "lth_coinflow".to_string()),
|
||||
cap: CentsUsdPattern3::new(client.clone(), "lth_coinflow_cap".to_string()),
|
||||
price: CentsPpmRatioSatsUsdPattern::new(client.clone(), "lth_coinflow_price".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Lth_Supply {
|
||||
pub mobile: SeriesTree_Frameworks_Coinflow_Lth_Supply_Mobile,
|
||||
pub immobile: BtcCentsSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Coinflow_Lth_Supply {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
mobile: SeriesTree_Frameworks_Coinflow_Lth_Supply_Mobile::new(client.clone(), format!("{base_path}_mobile")),
|
||||
immobile: BtcCentsSatsUsdPattern::new(client.clone(), "lth_immobile_supply".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Lth_Supply_Mobile {
|
||||
pub btc: SeriesPattern1<Bitcoin>,
|
||||
pub sats: SeriesPattern1<Sats>,
|
||||
pub usd: SeriesPattern1<Dollars>,
|
||||
pub cents: SeriesPattern1<Cents>,
|
||||
pub in_loss: SharePattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Coinflow_Lth_Supply_Mobile {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
btc: SeriesPattern1::new(client.clone(), "lth_mobile_supply".to_string()),
|
||||
sats: SeriesPattern1::new(client.clone(), "lth_mobile_supply_sats".to_string()),
|
||||
usd: SeriesPattern1::new(client.clone(), "lth_mobile_supply_usd".to_string()),
|
||||
cents: SeriesPattern1::new(client.clone(), "lth_mobile_supply_cents".to_string()),
|
||||
in_loss: SharePattern2::new(client.clone(), "lth_coinflow_supply_in_loss_share".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6288,6 +6598,8 @@ impl SeriesTree_Models_Bedrock {
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_CapitalSentiment {
|
||||
pub is_long: SeriesPattern1<StoredBool>,
|
||||
pub is_short: SeriesPattern1<StoredBool>,
|
||||
pub phase: SeriesPattern1<CapitalSentimentPhase>,
|
||||
pub score: SeriesPattern1<StoredI8>,
|
||||
}
|
||||
@@ -6295,6 +6607,8 @@ pub struct SeriesTree_Models_CapitalSentiment {
|
||||
impl SeriesTree_Models_CapitalSentiment {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
is_long: SeriesPattern1::new(client.clone(), "capital_sentiment_is_long".to_string()),
|
||||
is_short: SeriesPattern1::new(client.clone(), "capital_sentiment_is_short".to_string()),
|
||||
phase: SeriesPattern1::new(client.clone(), "capital_sentiment_phase".to_string()),
|
||||
score: SeriesPattern1::new(client.clone(), "capital_sentiment_score".to_string()),
|
||||
}
|
||||
@@ -6386,15 +6700,19 @@ impl SeriesTree_Models_RarityMeter_Extremes {
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss {
|
||||
pub threshold: SeriesPattern1<Bitcoin>,
|
||||
pub threshold_pct0_1: SeriesPattern1<Bitcoin>,
|
||||
pub threshold_pct0_05: SeriesPattern1<Bitcoin>,
|
||||
pub threshold_pct0_025: SeriesPattern1<Bitcoin>,
|
||||
pub tail: PercentPpmRatioPattern2,
|
||||
pub rank: SeriesPattern1<StoredI8>,
|
||||
pub rank: SeriesPattern1<StoredU8>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
threshold: SeriesPattern1::new(client.clone(), "rarity_meter_coins_in_loss_threshold".to_string()),
|
||||
threshold_pct0_1: SeriesPattern1::new(client.clone(), "rarity_meter_coins_in_loss_threshold_pct0_1".to_string()),
|
||||
threshold_pct0_05: SeriesPattern1::new(client.clone(), "rarity_meter_coins_in_loss_threshold_pct0_05".to_string()),
|
||||
threshold_pct0_025: SeriesPattern1::new(client.clone(), "rarity_meter_coins_in_loss_threshold".to_string()),
|
||||
tail: PercentPpmRatioPattern2::new(client.clone(), "rarity_meter_coins_in_loss_tail".to_string()),
|
||||
rank: SeriesPattern1::new(client.clone(), "rarity_meter_coins_in_loss_rank".to_string()),
|
||||
}
|
||||
@@ -6403,15 +6721,19 @@ impl SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss {
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion {
|
||||
pub threshold: SeriesPattern1<StoredF32>,
|
||||
pub threshold_pct0_1: SeriesPattern1<StoredF32>,
|
||||
pub threshold_pct0_05: SeriesPattern1<StoredF32>,
|
||||
pub threshold_pct0_025: SeriesPattern1<StoredF32>,
|
||||
pub tail: PercentPpmRatioPattern2,
|
||||
pub rank: SeriesPattern1<StoredI8>,
|
||||
pub rank: SeriesPattern1<StoredU8>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
threshold: SeriesPattern1::new(client.clone(), "rarity_meter_seller_exhaustion_threshold".to_string()),
|
||||
threshold_pct0_1: SeriesPattern1::new(client.clone(), "rarity_meter_seller_exhaustion_threshold_pct0_1".to_string()),
|
||||
threshold_pct0_05: SeriesPattern1::new(client.clone(), "rarity_meter_seller_exhaustion_threshold_pct0_05".to_string()),
|
||||
threshold_pct0_025: SeriesPattern1::new(client.clone(), "rarity_meter_seller_exhaustion_threshold".to_string()),
|
||||
tail: PercentPpmRatioPattern2::new(client.clone(), "rarity_meter_seller_exhaustion_tail".to_string()),
|
||||
rank: SeriesPattern1::new(client.clone(), "rarity_meter_seller_exhaustion_rank".to_string()),
|
||||
}
|
||||
@@ -9718,23 +10040,28 @@ impl BrkClient {
|
||||
|
||||
/// Available URPD dates
|
||||
///
|
||||
/// Dates for which a URPD snapshot is available for the cohort. One entry per UTC day, sorted ascending.
|
||||
/// Dates for which a URPD snapshot is available for the cohort and selected `weight`. One entry per UTC day, sorted ascending.
|
||||
///
|
||||
/// Endpoint: `GET /api/urpd/{cohort}/dates`
|
||||
pub fn list_urpd_dates(&self, cohort: Cohort) -> Result<Vec<Date>> {
|
||||
self.base.get_json(&format!("/api/urpd/{cohort}/dates"))
|
||||
pub fn list_urpd_dates(&self, cohort: Cohort, weight: Option<UrpdWeight>) -> Result<Vec<Date>> {
|
||||
let mut query = Vec::new();
|
||||
if let Some(v) = weight { query.push(format!("weight={}", v)); }
|
||||
let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) };
|
||||
let path = format!("/api/urpd/{cohort}/dates{}", query_str);
|
||||
self.base.get_json(&path)
|
||||
}
|
||||
|
||||
/// Latest URPD
|
||||
///
|
||||
/// URPD for the most recent available date in the cohort. The response's `date` field echoes which date was served.
|
||||
///
|
||||
/// See the URPD tag description for the response shape and `agg` options.
|
||||
/// See the URPD tag description for the response shape, `agg`, and `weight` options.
|
||||
///
|
||||
/// Endpoint: `GET /api/urpd/{cohort}`
|
||||
pub fn get_urpd(&self, cohort: Cohort, agg: Option<UrpdAggregation>) -> Result<Urpd> {
|
||||
pub fn get_urpd(&self, cohort: Cohort, agg: Option<UrpdAggregation>, weight: Option<UrpdWeight>) -> Result<Urpd> {
|
||||
let mut query = Vec::new();
|
||||
if let Some(v) = agg { query.push(format!("agg={}", v)); }
|
||||
if let Some(v) = weight { query.push(format!("weight={}", v)); }
|
||||
let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) };
|
||||
let path = format!("/api/urpd/{cohort}{}", query_str);
|
||||
self.base.get_json(&path)
|
||||
@@ -9742,14 +10069,15 @@ impl BrkClient {
|
||||
|
||||
/// URPD at date
|
||||
///
|
||||
/// URPD for a (cohort, date) pair. Returns `{ cohort, date, aggregation, close, total_supply, buckets }` where each bucket is `{ price_floor, supply, realized_cap, unrealized_pnl }`.
|
||||
/// URPD for a (cohort, date) pair. Returns `{ cohort, date, weight, aggregation, close, total_supply, buckets }` where each bucket is `{ price_floor, supply, realized_cap, unrealized_pnl }`.
|
||||
///
|
||||
/// See the URPD tag description for unit conventions and `agg` options.
|
||||
/// See the URPD tag description for unit conventions, `agg`, and `weight` options.
|
||||
///
|
||||
/// Endpoint: `GET /api/urpd/{cohort}/{date}`
|
||||
pub fn get_urpd_at(&self, cohort: Cohort, date: &str, agg: Option<UrpdAggregation>) -> Result<Urpd> {
|
||||
pub fn get_urpd_at(&self, cohort: Cohort, date: &str, agg: Option<UrpdAggregation>, weight: Option<UrpdWeight>) -> Result<Urpd> {
|
||||
let mut query = Vec::new();
|
||||
if let Some(v) = agg { query.push(format!("agg={}", v)); }
|
||||
if let Some(v) = weight { query.push(format!("weight={}", v)); }
|
||||
let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) };
|
||||
let path = format!("/api/urpd/{cohort}/{date}{}", query_str);
|
||||
self.base.get_json(&path)
|
||||
|
||||
@@ -17,6 +17,18 @@ pub struct ByType<T> {
|
||||
}
|
||||
|
||||
impl<T> ByType<T> {
|
||||
pub fn new<F>(mut create: F) -> Self
|
||||
where
|
||||
F: FnMut(Filter, &'static str) -> T,
|
||||
{
|
||||
Self {
|
||||
spendable: SpendableType::new(&mut create),
|
||||
unspendable: UnspendableType {
|
||||
op_return: create(Filter::Type(OutputType::OpReturn), OP_RETURN),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
pub fn try_new<F, E>(mut create: F) -> Result<Self, E>
|
||||
where
|
||||
F: FnMut(Filter, &'static str) -> Result<T, E>,
|
||||
|
||||
@@ -2,10 +2,17 @@ use brk_traversable::Traversable;
|
||||
use rayon::prelude::*;
|
||||
|
||||
use crate::{
|
||||
AgeRange, AmountRange, ByEntry, ByEpoch, ByTerm, Class, Filter, OverAge, OverAmount,
|
||||
SpendableType, UnderAge, UnderAmount,
|
||||
AgeRange, AmountRange, ByEntry, ByEpoch, ByTerm, Class, CohortName, Filter, OverAge,
|
||||
OverAmount, SpendableType, TERM_NAMES, UnderAge, UnderAmount,
|
||||
};
|
||||
|
||||
/// Canonical name for the aggregate cohort containing every UTXO.
|
||||
pub const UTXO_ALL_NAME: CohortName = CohortName::new("all", "All", "All UTXOs");
|
||||
|
||||
/// Canonical names for the aggregate UTXO cohorts.
|
||||
pub const UTXO_AGGREGATE_NAMES: [CohortName; 3] =
|
||||
[UTXO_ALL_NAME, TERM_NAMES.short, TERM_NAMES.long];
|
||||
|
||||
#[derive(Default, Clone, Traversable)]
|
||||
pub struct UTXOGroups<T> {
|
||||
pub all: T,
|
||||
|
||||
@@ -4,24 +4,17 @@ use brk_error::Result;
|
||||
use brk_indexer::Indexer;
|
||||
use vecdb::Exit;
|
||||
|
||||
use crate::indexes;
|
||||
|
||||
use super::Vecs;
|
||||
|
||||
impl Vecs {
|
||||
pub(crate) fn compute(
|
||||
&mut self,
|
||||
indexer: &Indexer,
|
||||
indexes: &indexes::Vecs,
|
||||
exit: &Exit,
|
||||
) -> Result<()> {
|
||||
pub(crate) fn compute(&mut self, indexer: &Indexer, exit: &Exit) -> Result<()> {
|
||||
self.db.sync_bg_tasks()?;
|
||||
|
||||
// lookback depends on indexes.timestamp.monotonic
|
||||
self.lookback.compute(indexer, indexes, exit)?;
|
||||
// Cached lookbacks depend on the monotonic timestamp vec, which may
|
||||
// have changed without changing its final length after a reorg.
|
||||
self.lookback.clear_caches();
|
||||
|
||||
// Interval and size are independent. Size depends on lookback, which
|
||||
// was already computed above.
|
||||
// Interval and size are independent.
|
||||
let Vecs {
|
||||
lookback,
|
||||
interval,
|
||||
|
||||
@@ -6,7 +6,7 @@ use crate::{
|
||||
indexes,
|
||||
internal::{
|
||||
BlockCountTarget1m, BlockCountTarget1w, BlockCountTarget1y, BlockCountTarget24h,
|
||||
ConstantVecs, LazyPerBlockCumulativeRolling, WindowStartVec, Windows,
|
||||
CachedWindowStartVec, ConstantVecs, LazyPerBlockCumulativeRolling, Windows,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -19,7 +19,7 @@ impl Vecs {
|
||||
version: Version,
|
||||
indexer: &Indexer,
|
||||
indexes: &indexes::Vecs,
|
||||
cached_starts: &Windows<&WindowStartVec>,
|
||||
cached_starts: &Windows<&CachedWindowStartVec>,
|
||||
) -> Self {
|
||||
Self {
|
||||
target: Windows {
|
||||
|
||||
@@ -23,7 +23,10 @@ impl Vecs {
|
||||
let db = open_db(parent_path, super::DB_NAME, 1_000_000)?;
|
||||
let version = parent_version;
|
||||
|
||||
let lookback = LookbackVecs::forced_import(&db, version)?;
|
||||
let lookback = LookbackVecs::new(
|
||||
version,
|
||||
indexes.timestamp.monotonic.read_only_cached_boxed_clone(),
|
||||
);
|
||||
let cached_starts = lookback.cached_window_starts();
|
||||
let count = CountVecs::new(version, indexer, indexes, &cached_starts);
|
||||
let interval = IntervalVecs::forced_import(&db, version, indexes, &cached_starts)?;
|
||||
|
||||
@@ -5,7 +5,7 @@ use vecdb::Database;
|
||||
use super::Vecs;
|
||||
use crate::{
|
||||
indexes,
|
||||
internal::{PerBlockCumulativeAverage, WindowStartVec, Windows},
|
||||
internal::{CachedWindowStartVec, PerBlockCumulativeAverage, Windows},
|
||||
};
|
||||
|
||||
impl Vecs {
|
||||
@@ -13,7 +13,7 @@ impl Vecs {
|
||||
db: &Database,
|
||||
version: Version,
|
||||
indexes: &indexes::Vecs,
|
||||
cached_starts: &Windows<&WindowStartVec>,
|
||||
cached_starts: &Windows<&CachedWindowStartVec>,
|
||||
) -> Result<Self> {
|
||||
let interval = PerBlockCumulativeAverage::forced_import(
|
||||
db,
|
||||
|
||||
@@ -1,158 +1,138 @@
|
||||
use brk_error::Result;
|
||||
use brk_indexer::Indexer;
|
||||
mod cached_window_start;
|
||||
mod window_start;
|
||||
|
||||
use brk_traversable::Traversable;
|
||||
use brk_types::{Height, Timestamp, Version};
|
||||
use vecdb::{
|
||||
AnyVec, CachedVec, Cursor, Database, EagerVec, Exit, ImportableVec, PcoVec, ReadableVec, Rw,
|
||||
StorageMode, VecIndex,
|
||||
};
|
||||
use vecdb::CachedBoxedVec;
|
||||
|
||||
use crate::{
|
||||
indexes,
|
||||
internal::{WindowStartVec, WindowStarts, Windows},
|
||||
};
|
||||
use crate::internal::{WindowStarts, Windows};
|
||||
|
||||
#[derive(Traversable)]
|
||||
pub struct Vecs<M: StorageMode = Rw> {
|
||||
pub _1h: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _24h: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 1d
|
||||
pub _3d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _1w: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 7d
|
||||
pub _8d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _9d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _12d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _13d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _2w: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 14d
|
||||
pub _21d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _26d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _1m: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 30d
|
||||
pub _34d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _55d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _2m: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 60d
|
||||
pub _9w: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 63d
|
||||
pub _12w: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 84d
|
||||
pub _89d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _3m: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 90d
|
||||
pub _14w: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 98d
|
||||
pub _111d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _144d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _6m: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 180d
|
||||
pub _26w: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 182d
|
||||
pub _200d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _9m: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 270d
|
||||
pub _350d: M::Stored<EagerVec<PcoVec<Height, Height>>>,
|
||||
pub _12m: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 360d
|
||||
pub _1y: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 365d
|
||||
pub _14m: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 420d
|
||||
pub _2y: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 730d
|
||||
pub _26m: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 780d
|
||||
pub _3y: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 1095d
|
||||
pub _200w: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 1400d
|
||||
pub _4y: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 1460d
|
||||
pub _5y: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 1825d
|
||||
pub _6y: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 2190d
|
||||
pub _8y: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 2920d
|
||||
pub _9y: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 3285d
|
||||
pub _10y: CachedVec<M::Stored<EagerVec<PcoVec<Height, Height>>>>, // 3650d
|
||||
pub _12y: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 4380d
|
||||
pub _14y: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 5110d
|
||||
pub _26y: M::Stored<EagerVec<PcoVec<Height, Height>>>, // 9490d
|
||||
pub use cached_window_start::CachedWindowStartVec;
|
||||
pub use window_start::LazyWindowStartVec;
|
||||
|
||||
#[derive(Clone, Traversable)]
|
||||
pub struct Vecs {
|
||||
pub _1h: LazyWindowStartVec,
|
||||
pub _24h: CachedWindowStartVec,
|
||||
pub _3d: LazyWindowStartVec,
|
||||
pub _1w: CachedWindowStartVec,
|
||||
pub _8d: LazyWindowStartVec,
|
||||
pub _9d: LazyWindowStartVec,
|
||||
pub _12d: LazyWindowStartVec,
|
||||
pub _13d: LazyWindowStartVec,
|
||||
pub _2w: LazyWindowStartVec,
|
||||
pub _21d: LazyWindowStartVec,
|
||||
pub _26d: LazyWindowStartVec,
|
||||
pub _1m: CachedWindowStartVec,
|
||||
pub _34d: LazyWindowStartVec,
|
||||
pub _55d: LazyWindowStartVec,
|
||||
pub _2m: LazyWindowStartVec,
|
||||
pub _9w: LazyWindowStartVec,
|
||||
pub _12w: LazyWindowStartVec,
|
||||
pub _89d: LazyWindowStartVec,
|
||||
pub _3m: CachedWindowStartVec,
|
||||
pub _14w: LazyWindowStartVec,
|
||||
pub _111d: LazyWindowStartVec,
|
||||
pub _144d: LazyWindowStartVec,
|
||||
pub _6m: CachedWindowStartVec,
|
||||
pub _26w: LazyWindowStartVec,
|
||||
pub _200d: LazyWindowStartVec,
|
||||
pub _9m: LazyWindowStartVec,
|
||||
pub _350d: LazyWindowStartVec,
|
||||
pub _12m: LazyWindowStartVec,
|
||||
pub _1y: CachedWindowStartVec,
|
||||
pub _14m: LazyWindowStartVec,
|
||||
pub _2y: CachedWindowStartVec,
|
||||
pub _26m: LazyWindowStartVec,
|
||||
pub _3y: CachedWindowStartVec,
|
||||
pub _200w: LazyWindowStartVec,
|
||||
pub _4y: CachedWindowStartVec,
|
||||
pub _5y: CachedWindowStartVec,
|
||||
pub _6y: CachedWindowStartVec,
|
||||
pub _8y: CachedWindowStartVec,
|
||||
pub _9y: LazyWindowStartVec,
|
||||
pub _10y: CachedWindowStartVec,
|
||||
pub _12y: LazyWindowStartVec,
|
||||
pub _14y: LazyWindowStartVec,
|
||||
pub _26y: LazyWindowStartVec,
|
||||
}
|
||||
|
||||
impl Vecs {
|
||||
pub(crate) fn forced_import(db: &Database, version: Version) -> Result<Self> {
|
||||
let _1h = ImportableVec::forced_import(db, "height_1h_ago", version)?;
|
||||
let _24h = ImportableVec::forced_import(db, "height_24h_ago", version)?;
|
||||
let _3d = ImportableVec::forced_import(db, "height_3d_ago", version)?;
|
||||
let _1w = ImportableVec::forced_import(db, "height_1w_ago", version)?;
|
||||
let _8d = ImportableVec::forced_import(db, "height_8d_ago", version)?;
|
||||
let _9d = ImportableVec::forced_import(db, "height_9d_ago", version)?;
|
||||
let _12d = ImportableVec::forced_import(db, "height_12d_ago", version)?;
|
||||
let _13d = ImportableVec::forced_import(db, "height_13d_ago", version)?;
|
||||
let _2w = ImportableVec::forced_import(db, "height_2w_ago", version)?;
|
||||
let _21d = ImportableVec::forced_import(db, "height_21d_ago", version)?;
|
||||
let _26d = ImportableVec::forced_import(db, "height_26d_ago", version)?;
|
||||
let _1m = ImportableVec::forced_import(db, "height_1m_ago", version)?;
|
||||
let _34d = ImportableVec::forced_import(db, "height_34d_ago", version)?;
|
||||
let _55d = ImportableVec::forced_import(db, "height_55d_ago", version)?;
|
||||
let _2m = ImportableVec::forced_import(db, "height_2m_ago", version)?;
|
||||
let _9w = ImportableVec::forced_import(db, "height_9w_ago", version)?;
|
||||
let _12w = ImportableVec::forced_import(db, "height_12w_ago", version)?;
|
||||
let _89d = ImportableVec::forced_import(db, "height_89d_ago", version)?;
|
||||
let _3m = ImportableVec::forced_import(db, "height_3m_ago", version)?;
|
||||
let _14w = ImportableVec::forced_import(db, "height_14w_ago", version)?;
|
||||
let _111d = ImportableVec::forced_import(db, "height_111d_ago", version)?;
|
||||
let _144d = ImportableVec::forced_import(db, "height_144d_ago", version)?;
|
||||
let _6m = ImportableVec::forced_import(db, "height_6m_ago", version)?;
|
||||
let _26w = ImportableVec::forced_import(db, "height_26w_ago", version)?;
|
||||
let _200d = ImportableVec::forced_import(db, "height_200d_ago", version)?;
|
||||
let _9m = ImportableVec::forced_import(db, "height_9m_ago", version)?;
|
||||
let _350d = ImportableVec::forced_import(db, "height_350d_ago", version)?;
|
||||
let _12m = ImportableVec::forced_import(db, "height_12m_ago", version)?;
|
||||
let _1y = ImportableVec::forced_import(db, "height_1y_ago", version)?;
|
||||
let _14m = ImportableVec::forced_import(db, "height_14m_ago", version)?;
|
||||
let _2y = ImportableVec::forced_import(db, "height_2y_ago", version)?;
|
||||
let _26m = ImportableVec::forced_import(db, "height_26m_ago", version)?;
|
||||
let _3y = ImportableVec::forced_import(db, "height_3y_ago", version)?;
|
||||
let _200w = ImportableVec::forced_import(db, "height_200w_ago", version)?;
|
||||
let _4y = ImportableVec::forced_import(db, "height_4y_ago", version)?;
|
||||
let _5y = ImportableVec::forced_import(db, "height_5y_ago", version)?;
|
||||
let _6y = ImportableVec::forced_import(db, "height_6y_ago", version)?;
|
||||
let _8y = ImportableVec::forced_import(db, "height_8y_ago", version)?;
|
||||
let _9y = ImportableVec::forced_import(db, "height_9y_ago", version)?;
|
||||
let _10y = ImportableVec::forced_import(db, "height_10y_ago", version)?;
|
||||
let _12y = ImportableVec::forced_import(db, "height_12y_ago", version)?;
|
||||
let _14y = ImportableVec::forced_import(db, "height_14y_ago", version)?;
|
||||
let _26y = ImportableVec::forced_import(db, "height_26y_ago", version)?;
|
||||
pub(crate) fn new(version: Version, timestamps: CachedBoxedVec<Height, Timestamp>) -> Self {
|
||||
macro_rules! hours {
|
||||
($suffix:literal, $hours:literal) => {
|
||||
LazyWindowStartVec::hours(
|
||||
concat!("height_", $suffix, "_ago"),
|
||||
version,
|
||||
$hours,
|
||||
timestamps.clone(),
|
||||
)
|
||||
};
|
||||
}
|
||||
macro_rules! days {
|
||||
($suffix:literal, $days:expr) => {
|
||||
LazyWindowStartVec::days(
|
||||
concat!("height_", $suffix, "_ago"),
|
||||
version,
|
||||
$days,
|
||||
timestamps.clone(),
|
||||
)
|
||||
};
|
||||
}
|
||||
macro_rules! cached_days {
|
||||
($suffix:literal, $days:expr) => {
|
||||
CachedWindowStartVec::new(days!($suffix, $days))
|
||||
};
|
||||
}
|
||||
|
||||
Ok(Self {
|
||||
_1h,
|
||||
_24h: CachedVec::wrap(_24h),
|
||||
_3d,
|
||||
_1w: CachedVec::wrap(_1w),
|
||||
_8d,
|
||||
_9d,
|
||||
_12d,
|
||||
_13d,
|
||||
_2w,
|
||||
_21d,
|
||||
_26d,
|
||||
_1m: CachedVec::wrap(_1m),
|
||||
_34d,
|
||||
_55d,
|
||||
_2m,
|
||||
_9w,
|
||||
_12w,
|
||||
_89d,
|
||||
_3m: CachedVec::wrap(_3m),
|
||||
_14w,
|
||||
_111d,
|
||||
_144d,
|
||||
_6m: CachedVec::wrap(_6m),
|
||||
_26w,
|
||||
_200d,
|
||||
_9m,
|
||||
_350d,
|
||||
_12m,
|
||||
_1y: CachedVec::wrap(_1y),
|
||||
_14m,
|
||||
_2y: CachedVec::wrap(_2y),
|
||||
_26m,
|
||||
_3y: CachedVec::wrap(_3y),
|
||||
_200w,
|
||||
_4y: CachedVec::wrap(_4y),
|
||||
_5y: CachedVec::wrap(_5y),
|
||||
_6y: CachedVec::wrap(_6y),
|
||||
_8y: CachedVec::wrap(_8y),
|
||||
_9y,
|
||||
_10y: CachedVec::wrap(_10y),
|
||||
_12y,
|
||||
_14y,
|
||||
_26y,
|
||||
})
|
||||
Self {
|
||||
_1h: hours!("1h", 1),
|
||||
_24h: cached_days!("24h", 1),
|
||||
_3d: days!("3d", 3),
|
||||
_1w: cached_days!("1w", 7),
|
||||
_8d: days!("8d", 8),
|
||||
_9d: days!("9d", 9),
|
||||
_12d: days!("12d", 12),
|
||||
_13d: days!("13d", 13),
|
||||
_2w: days!("2w", 14),
|
||||
_21d: days!("21d", 21),
|
||||
_26d: days!("26d", 26),
|
||||
_1m: cached_days!("1m", 30),
|
||||
_34d: days!("34d", 34),
|
||||
_55d: days!("55d", 55),
|
||||
_2m: days!("2m", 60),
|
||||
_9w: days!("9w", 9 * 7),
|
||||
_12w: days!("12w", 12 * 7),
|
||||
_89d: days!("89d", 89),
|
||||
_3m: cached_days!("3m", 90),
|
||||
_14w: days!("14w", 14 * 7),
|
||||
_111d: days!("111d", 111),
|
||||
_144d: days!("144d", 144),
|
||||
_6m: cached_days!("6m", 180),
|
||||
_26w: days!("26w", 26 * 7),
|
||||
_200d: days!("200d", 200),
|
||||
_9m: days!("9m", 270),
|
||||
_350d: days!("350d", 350),
|
||||
_12m: days!("12m", 360),
|
||||
_1y: cached_days!("1y", 365),
|
||||
_14m: days!("14m", 420),
|
||||
_2y: cached_days!("2y", 2 * 365),
|
||||
_26m: days!("26m", 780),
|
||||
_3y: cached_days!("3y", 3 * 365),
|
||||
_200w: days!("200w", 200 * 7),
|
||||
_4y: cached_days!("4y", 4 * 365),
|
||||
_5y: cached_days!("5y", 5 * 365),
|
||||
_6y: cached_days!("6y", 6 * 365),
|
||||
_8y: cached_days!("8y", 8 * 365),
|
||||
_9y: days!("9y", 9 * 365),
|
||||
_10y: cached_days!("10y", 10 * 365),
|
||||
_12y: days!("12y", 12 * 365),
|
||||
_14y: days!("14y", 14 * 365),
|
||||
_26y: days!("26y", 26 * 365),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn cached_window_starts(&self) -> Windows<&WindowStartVec> {
|
||||
pub fn cached_window_starts(&self) -> Windows<&CachedWindowStartVec> {
|
||||
Windows {
|
||||
_24h: &self._24h,
|
||||
_1w: &self._1w,
|
||||
@@ -162,19 +142,19 @@ impl Vecs {
|
||||
}
|
||||
|
||||
pub fn window_starts(&self) -> WindowStarts<'_> {
|
||||
WindowStarts {
|
||||
_24h: &self._24h.inner,
|
||||
_1w: &self._1w.inner,
|
||||
_1m: &self._1m.inner,
|
||||
_1y: &self._1y.inner,
|
||||
}
|
||||
WindowStarts(Windows {
|
||||
_24h: self._24h.lazy(),
|
||||
_1w: self._1w.lazy(),
|
||||
_1m: self._1m.lazy(),
|
||||
_1y: self._1y.lazy(),
|
||||
})
|
||||
}
|
||||
|
||||
pub fn start_vec(&self, days: usize) -> &EagerVec<PcoVec<Height, Height>> {
|
||||
pub fn start_vec(&self, days: usize) -> &LazyWindowStartVec {
|
||||
match days {
|
||||
1 => &self._24h.inner,
|
||||
1 => self._24h.lazy(),
|
||||
3 => &self._3d,
|
||||
7 => &self._1w.inner,
|
||||
7 => self._1w.lazy(),
|
||||
8 => &self._8d,
|
||||
9 => &self._9d,
|
||||
12 => &self._12d,
|
||||
@@ -182,35 +162,35 @@ impl Vecs {
|
||||
14 => &self._2w,
|
||||
21 => &self._21d,
|
||||
26 => &self._26d,
|
||||
30 => &self._1m.inner,
|
||||
30 => self._1m.lazy(),
|
||||
34 => &self._34d,
|
||||
55 => &self._55d,
|
||||
60 => &self._2m,
|
||||
63 => &self._9w,
|
||||
84 => &self._12w,
|
||||
89 => &self._89d,
|
||||
90 => &self._3m.inner,
|
||||
90 => self._3m.lazy(),
|
||||
98 => &self._14w,
|
||||
111 => &self._111d,
|
||||
144 => &self._144d,
|
||||
180 => &self._6m.inner,
|
||||
180 => self._6m.lazy(),
|
||||
182 => &self._26w,
|
||||
200 => &self._200d,
|
||||
270 => &self._9m,
|
||||
350 => &self._350d,
|
||||
360 => &self._12m,
|
||||
365 => &self._1y.inner,
|
||||
365 => self._1y.lazy(),
|
||||
420 => &self._14m,
|
||||
730 => &self._2y.inner,
|
||||
730 => self._2y.lazy(),
|
||||
780 => &self._26m,
|
||||
1095 => &self._3y.inner,
|
||||
1095 => self._3y.lazy(),
|
||||
1400 => &self._200w,
|
||||
1460 => &self._4y.inner,
|
||||
1825 => &self._5y.inner,
|
||||
2190 => &self._6y.inner,
|
||||
2920 => &self._8y.inner,
|
||||
1460 => self._4y.lazy(),
|
||||
1825 => self._5y.lazy(),
|
||||
2190 => self._6y.lazy(),
|
||||
2920 => self._8y.lazy(),
|
||||
3285 => &self._9y,
|
||||
3650 => &self._10y.inner,
|
||||
3650 => self._10y.lazy(),
|
||||
4380 => &self._12y,
|
||||
5110 => &self._14y,
|
||||
9490 => &self._26y,
|
||||
@@ -218,7 +198,7 @@ impl Vecs {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn cached_start_vec(&self, days: usize) -> &WindowStartVec {
|
||||
pub fn cached_start_vec(&self, days: usize) -> &CachedWindowStartVec {
|
||||
match days {
|
||||
1 => &self._24h,
|
||||
7 => &self._1w,
|
||||
@@ -237,128 +217,19 @@ impl Vecs {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn compute(
|
||||
&mut self,
|
||||
indexer: &Indexer,
|
||||
indexes: &indexes::Vecs,
|
||||
exit: &Exit,
|
||||
) -> Result<()> {
|
||||
let starting_height = indexer.safe_lengths().height;
|
||||
self.compute_rolling_start_hours(indexes, starting_height, exit, 1, |s| &mut s._1h)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 1, |s| &mut s._24h.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 3, |s| &mut s._3d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 7, |s| &mut s._1w.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 8, |s| &mut s._8d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 9, |s| &mut s._9d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 12, |s| &mut s._12d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 13, |s| &mut s._13d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 14, |s| &mut s._2w)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 21, |s| &mut s._21d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 26, |s| &mut s._26d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 30, |s| &mut s._1m.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 34, |s| &mut s._34d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 55, |s| &mut s._55d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 60, |s| &mut s._2m)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 63, |s| &mut s._9w)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 84, |s| &mut s._12w)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 89, |s| &mut s._89d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 90, |s| &mut s._3m.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 98, |s| &mut s._14w)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 111, |s| &mut s._111d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 144, |s| &mut s._144d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 180, |s| &mut s._6m.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 182, |s| &mut s._26w)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 200, |s| &mut s._200d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 270, |s| &mut s._9m)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 350, |s| &mut s._350d)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 360, |s| &mut s._12m)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 365, |s| &mut s._1y.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 420, |s| &mut s._14m)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 730, |s| &mut s._2y.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 780, |s| &mut s._26m)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 1095, |s| &mut s._3y.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 1400, |s| &mut s._200w)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 1460, |s| &mut s._4y.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 1825, |s| &mut s._5y.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 2190, |s| &mut s._6y.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 2920, |s| &mut s._8y.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 3285, |s| &mut s._9y)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 3650, |s| &mut s._10y.inner)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 4380, |s| &mut s._12y)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 5110, |s| &mut s._14y)?;
|
||||
self.compute_rolling_start(indexes, starting_height, exit, 9490, |s| &mut s._26y)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn compute_rolling_start<F>(
|
||||
&mut self,
|
||||
indexes: &indexes::Vecs,
|
||||
starting_height: Height,
|
||||
exit: &Exit,
|
||||
days: usize,
|
||||
get_field: F,
|
||||
) -> Result<()>
|
||||
where
|
||||
F: FnOnce(&mut Self) -> &mut EagerVec<PcoVec<Height, Height>>,
|
||||
{
|
||||
self.compute_rolling_start_inner(indexes, starting_height, exit, get_field, |t, prev_ts| {
|
||||
t.difference_in_days_between(prev_ts) >= days
|
||||
})
|
||||
}
|
||||
|
||||
fn compute_rolling_start_hours<F>(
|
||||
&mut self,
|
||||
indexes: &indexes::Vecs,
|
||||
starting_height: Height,
|
||||
exit: &Exit,
|
||||
hours: usize,
|
||||
get_field: F,
|
||||
) -> Result<()>
|
||||
where
|
||||
F: FnOnce(&mut Self) -> &mut EagerVec<PcoVec<Height, Height>>,
|
||||
{
|
||||
self.compute_rolling_start_inner(indexes, starting_height, exit, get_field, |t, prev_ts| {
|
||||
t.difference_in_hours_between(prev_ts) >= hours
|
||||
})
|
||||
}
|
||||
|
||||
fn compute_rolling_start_inner<F, D>(
|
||||
&mut self,
|
||||
indexes: &indexes::Vecs,
|
||||
starting_height: Height,
|
||||
exit: &Exit,
|
||||
get_field: F,
|
||||
expired: D,
|
||||
) -> Result<()>
|
||||
where
|
||||
F: FnOnce(&mut Self) -> &mut EagerVec<PcoVec<Height, Height>>,
|
||||
D: Fn(Timestamp, Timestamp) -> bool,
|
||||
{
|
||||
let field = get_field(self);
|
||||
let resume_from = field.len().min(starting_height.to_usize());
|
||||
let mut prev = if resume_from > 0 {
|
||||
field.collect_one_at(resume_from - 1).unwrap()
|
||||
} else {
|
||||
Height::ZERO
|
||||
};
|
||||
let mut cursor = Cursor::new(&indexes.timestamp.monotonic);
|
||||
cursor.advance(prev.to_usize());
|
||||
let mut prev_ts = cursor.next().unwrap();
|
||||
Ok(field.compute_transform(
|
||||
starting_height,
|
||||
&indexes.timestamp.monotonic,
|
||||
|(h, t, ..)| {
|
||||
while expired(t, prev_ts) {
|
||||
prev.increment();
|
||||
prev_ts = cursor.next().unwrap();
|
||||
if prev > h {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
(h, prev)
|
||||
},
|
||||
exit,
|
||||
)?)
|
||||
pub(crate) fn clear_caches(&self) {
|
||||
self._24h.clear();
|
||||
self._1w.clear();
|
||||
self._1m.clear();
|
||||
self._3m.clear();
|
||||
self._6m.clear();
|
||||
self._1y.clear();
|
||||
self._2y.clear();
|
||||
self._3y.clear();
|
||||
self._4y.clear();
|
||||
self._5y.clear();
|
||||
self._6y.clear();
|
||||
self._8y.clear();
|
||||
self._10y.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use brk_traversable::Traversable;
|
||||
use brk_types::{Height, Version};
|
||||
use vecdb::{
|
||||
AnyVec, CachedBoxedVec, CachedReadableVec, CachedVec, ReadOnlyClone, ReadableVec, TypedVec,
|
||||
};
|
||||
|
||||
use super::LazyWindowStartVec;
|
||||
|
||||
/// A pinned, process-lifetime cache for a heavily reused window-start vector.
|
||||
#[derive(Clone, Traversable)]
|
||||
#[traversable(transparent)]
|
||||
pub struct CachedWindowStartVec(CachedVec<LazyWindowStartVec>);
|
||||
|
||||
impl CachedWindowStartVec {
|
||||
pub(super) fn new(inner: LazyWindowStartVec) -> Self {
|
||||
Self(CachedVec::wrap(inner))
|
||||
}
|
||||
|
||||
pub fn lazy(&self) -> &LazyWindowStartVec {
|
||||
&self.0.inner
|
||||
}
|
||||
|
||||
pub fn version(&self) -> Version {
|
||||
self.0.version()
|
||||
}
|
||||
|
||||
pub fn read_only_cached_boxed_clone(&self) -> CachedBoxedVec<Height, Height> {
|
||||
self.0.cached_boxed_clone()
|
||||
}
|
||||
|
||||
pub fn cached(&self) -> Arc<[Height]> {
|
||||
self.0.cached()
|
||||
}
|
||||
|
||||
pub fn clear(&self) {
|
||||
self.0.clear();
|
||||
}
|
||||
}
|
||||
|
||||
impl AnyVec for CachedWindowStartVec {
|
||||
fn version(&self) -> Version {
|
||||
self.0.version()
|
||||
}
|
||||
|
||||
fn name(&self) -> &str {
|
||||
self.0.name()
|
||||
}
|
||||
|
||||
fn len(&self) -> usize {
|
||||
self.0.len()
|
||||
}
|
||||
|
||||
fn index_type_to_string(&self) -> &'static str {
|
||||
self.0.index_type_to_string()
|
||||
}
|
||||
|
||||
fn region_names(&self) -> Vec<String> {
|
||||
self.0.region_names()
|
||||
}
|
||||
|
||||
fn value_type_to_size_of(&self) -> usize {
|
||||
self.0.value_type_to_size_of()
|
||||
}
|
||||
|
||||
fn value_type_to_string(&self) -> &'static str {
|
||||
self.0.value_type_to_string()
|
||||
}
|
||||
}
|
||||
|
||||
impl TypedVec for CachedWindowStartVec {
|
||||
type I = Height;
|
||||
type T = Height;
|
||||
}
|
||||
|
||||
impl ReadableVec<Height, Height> for CachedWindowStartVec {
|
||||
fn read_into_at(&self, from: usize, to: usize, buf: &mut Vec<Height>) {
|
||||
self.0.read_into_at(from, to, buf);
|
||||
}
|
||||
|
||||
fn for_each_range_dyn_at(&self, from: usize, to: usize, each: &mut dyn FnMut(Height)) {
|
||||
self.0.for_each_range_dyn_at(from, to, each);
|
||||
}
|
||||
|
||||
fn fold_range_at<B, F: FnMut(B, Height) -> B>(
|
||||
&self,
|
||||
from: usize,
|
||||
to: usize,
|
||||
init: B,
|
||||
fold: F,
|
||||
) -> B {
|
||||
self.0.fold_range_at(from, to, init, fold)
|
||||
}
|
||||
|
||||
fn try_fold_range_at<B, E, F: FnMut(B, Height) -> Result<B, E>>(
|
||||
&self,
|
||||
from: usize,
|
||||
to: usize,
|
||||
init: B,
|
||||
fold: F,
|
||||
) -> Result<B, E> {
|
||||
self.0.try_fold_range_at(from, to, init, fold)
|
||||
}
|
||||
|
||||
fn collect_one_at(&self, index: usize) -> Option<Height> {
|
||||
self.0.collect_one_at(index)
|
||||
}
|
||||
|
||||
fn read_sorted_into_at(&self, indices: &[usize], out: &mut Vec<Height>) {
|
||||
self.0.read_sorted_into_at(indices, out);
|
||||
}
|
||||
}
|
||||
|
||||
impl ReadOnlyClone for CachedWindowStartVec {
|
||||
type ReadOnly = Self;
|
||||
|
||||
fn read_only_clone(&self) -> Self {
|
||||
self.clone()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,438 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use brk_traversable::{Traversable, TreeNode, make_leaf};
|
||||
use brk_types::{Height, Timestamp, Version};
|
||||
use vecdb::{
|
||||
AnyExportableVec, AnyVec, CachedBoxedVec, PrintableIndex, ReadOnlyClone, ReadableVec, TypedVec,
|
||||
short_type_name,
|
||||
};
|
||||
|
||||
const HOUR_SECONDS: u64 = 60 * 60;
|
||||
const DAY_SECONDS: u64 = 24 * HOUR_SECONDS;
|
||||
|
||||
/// A storage-free window-start vector backed by one pinned monotonic timestamp
|
||||
/// cache.
|
||||
///
|
||||
/// Range and sorted reads find the first window start once, then advance it
|
||||
/// monotonically as current heights advance.
|
||||
#[derive(Clone)]
|
||||
pub struct LazyWindowStartVec {
|
||||
name: Arc<str>,
|
||||
version: Version,
|
||||
duration_seconds: u64,
|
||||
timestamps: CachedBoxedVec<Height, Timestamp>,
|
||||
}
|
||||
|
||||
impl LazyWindowStartVec {
|
||||
pub(super) fn hours(
|
||||
name: &str,
|
||||
version: Version,
|
||||
hours: u64,
|
||||
timestamps: CachedBoxedVec<Height, Timestamp>,
|
||||
) -> Self {
|
||||
Self::new(name, version, hours * HOUR_SECONDS, timestamps)
|
||||
}
|
||||
|
||||
pub(super) fn days(
|
||||
name: &str,
|
||||
version: Version,
|
||||
days: u64,
|
||||
timestamps: CachedBoxedVec<Height, Timestamp>,
|
||||
) -> Self {
|
||||
Self::new(name, version, days * DAY_SECONDS, timestamps)
|
||||
}
|
||||
|
||||
fn new(
|
||||
name: &str,
|
||||
version: Version,
|
||||
duration_seconds: u64,
|
||||
timestamps: CachedBoxedVec<Height, Timestamp>,
|
||||
) -> Self {
|
||||
Self {
|
||||
name: Arc::from(name),
|
||||
version,
|
||||
duration_seconds,
|
||||
timestamps,
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn is_expired(&self, current: Timestamp, older: Timestamp) -> bool {
|
||||
u64::from(current).saturating_sub(u64::from(older)) >= self.duration_seconds
|
||||
}
|
||||
|
||||
fn start_at(&self, timestamps: &[Timestamp], index: usize) -> usize {
|
||||
let current = timestamps[index];
|
||||
timestamps[..=index].partition_point(|&older| self.is_expired(current, older))
|
||||
}
|
||||
|
||||
fn try_for_each_value<E>(
|
||||
&self,
|
||||
from: usize,
|
||||
to: usize,
|
||||
mut each: impl FnMut(Height) -> Result<(), E>,
|
||||
) -> Result<(), E> {
|
||||
let timestamps = self.timestamps.cached();
|
||||
let to = to.min(timestamps.len());
|
||||
if from >= to {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let mut start = self.start_at(×tamps, from);
|
||||
for current in from..to {
|
||||
while start < current && self.is_expired(timestamps[current], timestamps[start]) {
|
||||
start += 1;
|
||||
}
|
||||
each(Height::from(start))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn for_each_value(&self, from: usize, to: usize, mut each: impl FnMut(Height)) {
|
||||
let result = self.try_for_each_value(from, to, |value| {
|
||||
each(value);
|
||||
Ok::<_, std::convert::Infallible>(())
|
||||
});
|
||||
match result {
|
||||
Ok(()) => {}
|
||||
Err(error) => match error {},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl AnyVec for LazyWindowStartVec {
|
||||
fn version(&self) -> Version {
|
||||
self.version + self.timestamps.version()
|
||||
}
|
||||
|
||||
fn name(&self) -> &str {
|
||||
&self.name
|
||||
}
|
||||
|
||||
fn len(&self) -> usize {
|
||||
self.timestamps.len()
|
||||
}
|
||||
|
||||
fn index_type_to_string(&self) -> &'static str {
|
||||
<Height as PrintableIndex>::to_string()
|
||||
}
|
||||
|
||||
fn region_names(&self) -> Vec<String> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
fn value_type_to_size_of(&self) -> usize {
|
||||
size_of::<Height>()
|
||||
}
|
||||
|
||||
fn value_type_to_string(&self) -> &'static str {
|
||||
short_type_name::<Height>()
|
||||
}
|
||||
}
|
||||
|
||||
impl TypedVec for LazyWindowStartVec {
|
||||
type I = Height;
|
||||
type T = Height;
|
||||
}
|
||||
|
||||
impl ReadableVec<Height, Height> for LazyWindowStartVec {
|
||||
fn read_into_at(&self, from: usize, to: usize, buf: &mut Vec<Height>) {
|
||||
buf.reserve(to.min(self.len()).saturating_sub(from));
|
||||
self.for_each_value(from, to, |value| buf.push(value));
|
||||
}
|
||||
|
||||
fn for_each_range_dyn_at(&self, from: usize, to: usize, each: &mut dyn FnMut(Height)) {
|
||||
self.for_each_value(from, to, each);
|
||||
}
|
||||
|
||||
fn fold_range_at<B, F: FnMut(B, Height) -> B>(
|
||||
&self,
|
||||
from: usize,
|
||||
to: usize,
|
||||
init: B,
|
||||
mut fold: F,
|
||||
) -> B {
|
||||
let mut acc = Some(init);
|
||||
self.for_each_value(from, to, |value| {
|
||||
acc = Some(fold(acc.take().unwrap(), value));
|
||||
});
|
||||
acc.unwrap()
|
||||
}
|
||||
|
||||
fn try_fold_range_at<B, E, F: FnMut(B, Height) -> Result<B, E>>(
|
||||
&self,
|
||||
from: usize,
|
||||
to: usize,
|
||||
init: B,
|
||||
mut fold: F,
|
||||
) -> Result<B, E> {
|
||||
let mut acc = Some(init);
|
||||
self.try_for_each_value(from, to, |value| {
|
||||
acc = Some(fold(acc.take().unwrap(), value)?);
|
||||
Ok(())
|
||||
})?;
|
||||
Ok(acc.unwrap())
|
||||
}
|
||||
|
||||
fn collect_one_at(&self, index: usize) -> Option<Height> {
|
||||
let timestamps = self.timestamps.cached();
|
||||
(index < timestamps.len()).then(|| Height::from(self.start_at(×tamps, index)))
|
||||
}
|
||||
|
||||
fn read_sorted_into_at(&self, indices: &[usize], out: &mut Vec<Height>) {
|
||||
let Some(&first) = indices.first() else {
|
||||
return;
|
||||
};
|
||||
let timestamps = self.timestamps.cached();
|
||||
if first >= timestamps.len() {
|
||||
return;
|
||||
}
|
||||
|
||||
let mut start = self.start_at(×tamps, first);
|
||||
out.reserve(indices.len());
|
||||
for ¤t in indices {
|
||||
if current >= timestamps.len() {
|
||||
break;
|
||||
}
|
||||
while start < current && self.is_expired(timestamps[current], timestamps[start]) {
|
||||
start += 1;
|
||||
}
|
||||
out.push(Height::from(start));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ReadOnlyClone for LazyWindowStartVec {
|
||||
type ReadOnly = Self;
|
||||
|
||||
fn read_only_clone(&self) -> Self {
|
||||
self.clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl Traversable for LazyWindowStartVec {
|
||||
fn iter_any_exportable(&self) -> impl Iterator<Item = &dyn AnyExportableVec> {
|
||||
std::iter::once(self as &dyn AnyExportableVec)
|
||||
}
|
||||
|
||||
fn to_tree_node(&self) -> TreeNode {
|
||||
make_leaf::<Height, Height, _>(self)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use parking_lot::RwLock;
|
||||
use vecdb::{CachedReadableVec, CachedVec, ReadableVec};
|
||||
|
||||
use super::*;
|
||||
use crate::blocks::lookback::CachedWindowStartVec;
|
||||
|
||||
#[derive(Clone)]
|
||||
struct TimestampVec(Arc<RwLock<Vec<Timestamp>>>);
|
||||
|
||||
impl TimestampVec {
|
||||
fn new(values: impl IntoIterator<Item = u32>) -> Self {
|
||||
Self(Arc::new(RwLock::new(
|
||||
values.into_iter().map(Timestamp::from).collect(),
|
||||
)))
|
||||
}
|
||||
|
||||
fn replace(&self, index: usize, value: u32) {
|
||||
self.0.write()[index] = Timestamp::from(value);
|
||||
}
|
||||
}
|
||||
|
||||
impl AnyVec for TimestampVec {
|
||||
fn version(&self) -> Version {
|
||||
Version::ONE
|
||||
}
|
||||
|
||||
fn name(&self) -> &str {
|
||||
"timestamps"
|
||||
}
|
||||
|
||||
fn len(&self) -> usize {
|
||||
self.0.read().len()
|
||||
}
|
||||
|
||||
fn index_type_to_string(&self) -> &'static str {
|
||||
<Height as PrintableIndex>::to_string()
|
||||
}
|
||||
|
||||
fn region_names(&self) -> Vec<String> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
fn value_type_to_size_of(&self) -> usize {
|
||||
size_of::<Timestamp>()
|
||||
}
|
||||
|
||||
fn value_type_to_string(&self) -> &'static str {
|
||||
short_type_name::<Timestamp>()
|
||||
}
|
||||
}
|
||||
|
||||
impl TypedVec for TimestampVec {
|
||||
type I = Height;
|
||||
type T = Timestamp;
|
||||
}
|
||||
|
||||
impl ReadableVec<Height, Timestamp> for TimestampVec {
|
||||
fn read_into_at(&self, from: usize, to: usize, buf: &mut Vec<Timestamp>) {
|
||||
let values = self.0.read();
|
||||
let to = to.min(values.len());
|
||||
if from < to {
|
||||
buf.extend_from_slice(&values[from..to]);
|
||||
}
|
||||
}
|
||||
|
||||
fn for_each_range_dyn_at(&self, from: usize, to: usize, each: &mut dyn FnMut(Timestamp)) {
|
||||
let values = self.0.read();
|
||||
for &value in &values[from.min(values.len())..to.min(values.len())] {
|
||||
each(value);
|
||||
}
|
||||
}
|
||||
|
||||
fn fold_range_at<B, F: FnMut(B, Timestamp) -> B>(
|
||||
&self,
|
||||
from: usize,
|
||||
to: usize,
|
||||
init: B,
|
||||
fold: F,
|
||||
) -> B {
|
||||
let values = self.0.read();
|
||||
values[from.min(values.len())..to.min(values.len())]
|
||||
.iter()
|
||||
.copied()
|
||||
.fold(init, fold)
|
||||
}
|
||||
|
||||
fn try_fold_range_at<B, E, F: FnMut(B, Timestamp) -> Result<B, E>>(
|
||||
&self,
|
||||
from: usize,
|
||||
to: usize,
|
||||
init: B,
|
||||
fold: F,
|
||||
) -> Result<B, E> {
|
||||
let values = self.0.read();
|
||||
values[from.min(values.len())..to.min(values.len())]
|
||||
.iter()
|
||||
.copied()
|
||||
.try_fold(init, fold)
|
||||
}
|
||||
}
|
||||
|
||||
fn timestamp_fixture() -> (TimestampVec, CachedVec<TimestampVec>) {
|
||||
let timestamps = TimestampVec::new([
|
||||
0,
|
||||
12 * HOUR_SECONDS as u32,
|
||||
DAY_SECONDS as u32,
|
||||
(DAY_SECONDS + 12 * HOUR_SECONDS) as u32,
|
||||
(2 * DAY_SECONDS) as u32,
|
||||
]);
|
||||
let cached = CachedVec::wrap(timestamps.clone());
|
||||
(timestamps, cached)
|
||||
}
|
||||
|
||||
fn lazy_window(
|
||||
cached_timestamps: &CachedVec<TimestampVec>,
|
||||
duration_seconds: u64,
|
||||
) -> LazyWindowStartVec {
|
||||
LazyWindowStartVec::new(
|
||||
"lookback",
|
||||
Version::ONE,
|
||||
duration_seconds,
|
||||
cached_timestamps.cached_boxed_clone(),
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn exact_window_boundary_is_excluded() {
|
||||
let (_, cached_timestamps) = timestamp_fixture();
|
||||
let day = lazy_window(&cached_timestamps, DAY_SECONDS);
|
||||
let hour = lazy_window(&cached_timestamps, HOUR_SECONDS);
|
||||
|
||||
assert_eq!(day.collect(), [0_usize, 0, 1, 2, 3].map(Height::from));
|
||||
assert_eq!(hour.collect(), [0_usize, 1, 2, 3, 4].map(Height::from));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn range_random_and_sorted_reads_match() {
|
||||
let (_, cached_timestamps) = timestamp_fixture();
|
||||
let window = CachedWindowStartVec::new(lazy_window(&cached_timestamps, DAY_SECONDS));
|
||||
|
||||
assert_eq!(
|
||||
window.collect_range_at(1, 4),
|
||||
[0_usize, 1, 2].map(Height::from)
|
||||
);
|
||||
assert_eq!(window.collect_one_at(4), Some(Height::from(3_usize)));
|
||||
assert_eq!(
|
||||
window.read_sorted_at(&[0, 2, 4]),
|
||||
[0_usize, 1, 3].map(Height::from)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn explicit_clears_refresh_same_length_reorgs() {
|
||||
let (timestamps, cached_timestamps) = timestamp_fixture();
|
||||
let window = CachedWindowStartVec::new(lazy_window(&cached_timestamps, DAY_SECONDS));
|
||||
|
||||
assert_eq!(window.collect_one_at(4), Some(Height::from(3_usize)));
|
||||
timestamps.replace(4, (DAY_SECONDS + 18 * HOUR_SECONDS) as u32);
|
||||
|
||||
assert_eq!(window.collect_one_at(4), Some(Height::from(3_usize)));
|
||||
cached_timestamps.clear();
|
||||
window.clear();
|
||||
assert_eq!(window.collect_one_at(4), Some(Height::from(2_usize)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn range_linear_results_match_the_previous_forward_algorithm() {
|
||||
let mut timestamp = 1_230_000_000_u32;
|
||||
let values: Vec<u32> = (0..2_000)
|
||||
.map(|i| {
|
||||
let current = timestamp;
|
||||
timestamp += 60 + ((i * 997) % 7_200) as u32;
|
||||
current
|
||||
})
|
||||
.collect();
|
||||
let timestamps = TimestampVec::new(values.iter().copied());
|
||||
let cached = CachedVec::wrap(timestamps);
|
||||
|
||||
for duration_seconds in [
|
||||
HOUR_SECONDS,
|
||||
DAY_SECONDS,
|
||||
7 * DAY_SECONDS,
|
||||
365 * DAY_SECONDS,
|
||||
] {
|
||||
let lookback = lazy_window(&cached, duration_seconds);
|
||||
|
||||
let expected: Vec<Height> = {
|
||||
let mut start = 0;
|
||||
values
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(current, ¤t_timestamp)| {
|
||||
while start < current
|
||||
&& u64::from(current_timestamp).saturating_sub(u64::from(values[start]))
|
||||
>= duration_seconds
|
||||
{
|
||||
start += 1;
|
||||
}
|
||||
Height::from(start)
|
||||
})
|
||||
.collect()
|
||||
};
|
||||
|
||||
assert_eq!(lookback.collect(), expected);
|
||||
assert_eq!(lookback.collect_range_at(317, 1_713), expected[317..1_713]);
|
||||
|
||||
let indices = [0, 17, 318, 999, 1_712, 1_999];
|
||||
assert_eq!(
|
||||
lookback.read_sorted_at(&indices),
|
||||
indices.map(|index| expected[index])
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||