diff --git a/README.md b/README.md index 4b31d61..a93e0ec 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,5 @@ It is the hope that each peice of work ends up finding a more permanent place wi ## Participation 1. Create a subdirectory called your username 2. Put your work in it -3. Share it \ No newline at end of file +3. Best if you add additional READMEs to your subdirectories to help keep track of what is what. +4. Share it \ No newline at end of file diff --git a/corpetty/committee_sim/Digraph.gv b/corpetty/committee_sim/Digraph.gv new file mode 100644 index 0000000..4a3cccc --- /dev/null +++ b/corpetty/committee_sim/Digraph.gv @@ -0,0 +1,42 @@ +digraph { + node [color=lightgray fillcolor=lightgray fontcolor=black shape=record style="filled, rounded"] + 140696396190672 [label="| 0|"] + 140696396190672:l -> 140696396192688:v + 140696396190672:r -> 140696396191392:v + 140696396192688 [label="| 1|"] + 140696396192688:l -> 140696396192352:v + 140696396192688:r -> 140696396193120:v + 140696396191392 [label="| 2|"] + 140696396191392:l -> 140696396191920:v + 140696396191392:r -> 140696396192640:v + 140696396192352 [label="| 3|"] + 140696396192352:l -> 140696396191968:v + 140696396192352:r -> 140696396192976:v + 140696396193120 [label="| 4|"] + 140696396193120:l -> 140696396193552:v + 140696396193120:r -> 140696396193264:v + 140696396191920 [label="| 5|"] + 140696396191920:l -> 140696396189952:v + 140696396191920:r -> 140696395938496:v + 140696396192640 [label="| 6|"] + 140696396192640:l -> 140696395938208:v + 140696396192640:r -> 140696395937200:v + 140696396191968 [label="| 7|"] + 140696396191968:l -> 140696395938640:v + 140696396191968:r -> 140696395937008:v + 140696396192976 [label="| 8|"] + 140696396192976:l -> 140696395938544:v + 140696396192976:r -> 140696395937584:v + 140696396193552 [label="| 9|"] + 140696396193552:l -> 140696395938592:v + 140696396193264 [label="| 10|"] + 140696396189952 [label="| 11|"] + 140696395938496 [label="| 12|"] + 140696395938208 [label="| 13|"] + 140696395937200 [label="| 14|"] + 140696395938640 [label="| 15|"] + 140696395937008 [label="| 16|"] + 140696395938544 [label="| 17|"] + 140696395937584 [label="| 18|"] + 140696395938592 [label="| 19|"] +} diff --git a/corpetty/committee_sim/Digraph.gv.pdf b/corpetty/committee_sim/Digraph.gv.pdf new file mode 100644 index 0000000..716316e Binary files /dev/null and b/corpetty/committee_sim/Digraph.gv.pdf differ diff --git a/corpetty/committee_sim/committee-simulations.ipynb b/corpetty/committee_sim/committee-simulations.ipynb index 51c5be2..8b949cd 100644 --- a/corpetty/committee_sim/committee-simulations.ipynb +++ b/corpetty/committee_sim/committee-simulations.ipynb @@ -8,7 +8,13 @@ "outputs": [], "source": [ "import random\n", - "import pandas as pd" + "import pandas as pd\n", + "from binarytree import Node, build\n", + "import numpy as np\n", + "import scipy as sp\n", + "import chart_studio.plotly as py\n", + "import plotly.graph_objects as go\n", + "from ipywidgets import widgets" ] }, { @@ -53,7 +59,7 @@ "metadata": {}, "outputs": [], "source": [ - "num_nodes = 1000\n", + "num_nodes = 1550\n", "committee_size = 50\n", "num_committees = num_nodes / committee_size\n", "byzantine_coeff = 0.15\n", @@ -61,6 +67,14 @@ "block_size = 1 # MB" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e6f86e6-c4a9-4cea-8448-05fcefdb81b5", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "id": "e1238929-cbe8-4f80-90c0-5823c6a5ddf6", @@ -80,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 3, "id": "0bec3377-a302-4bbd-bcfc-3e9c40af51bb", "metadata": { "tags": [] @@ -100,7 +114,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 4, "id": "e5917cca-9c2b-423d-b930-6fddfcdea47e", "metadata": {}, "outputs": [ @@ -127,48 +141,67 @@ " \n", " committee_ind\n", " committee_members\n", + " isChild\n", + " isParent\n", " \n", " \n", " \n", " \n", " 0\n", " 0\n", - " [506, 929, 199, 437, 427, 686, 861, 597, 81, 5...\n", + " [91, 776, 453, 1297, 479, 1398, 108, 286, 323,...\n", + " False\n", + " True\n", " \n", " \n", " 1\n", " 1\n", - " [677, 491, 334, 209, 41, 121, 697, 943, 504, 6...\n", + " [402, 900, 1244, 334, 1286, 658, 1442, 529, 29...\n", + " True\n", + " True\n", " \n", " \n", " 2\n", " 2\n", - " [439, 996, 238, 574, 388, 12, 956, 330, 386, 3...\n", + " [1478, 1250, 533, 474, 868, 940, 599, 677, 135...\n", + " True\n", + " True\n", " \n", " \n", " 3\n", " 3\n", - " [817, 370, 626, 151, 562, 539, 797, 270, 791, ...\n", + " [855, 1454, 109, 1282, 1133, 1482, 1508, 1174,...\n", + " True\n", + " True\n", " \n", " \n", " 4\n", " 4\n", - " [288, 693, 282, 348, 777, 671, 545, 222, 477, ...\n", + " [996, 1536, 897, 903, 552, 902, 789, 1201, 125...\n", + " True\n", + " True\n", " \n", " \n", "\n", "" ], "text/plain": [ - " committee_ind committee_members\n", - "0 0 [506, 929, 199, 437, 427, 686, 861, 597, 81, 5...\n", - "1 1 [677, 491, 334, 209, 41, 121, 697, 943, 504, 6...\n", - "2 2 [439, 996, 238, 574, 388, 12, 956, 330, 386, 3...\n", - "3 3 [817, 370, 626, 151, 562, 539, 797, 270, 791, ...\n", - "4 4 [288, 693, 282, 348, 777, 671, 545, 222, 477, ..." + " committee_ind committee_members isChild \\\n", + "0 0 [91, 776, 453, 1297, 479, 1398, 108, 286, 323,... False \n", + "1 1 [402, 900, 1244, 334, 1286, 658, 1442, 529, 29... True \n", + "2 2 [1478, 1250, 533, 474, 868, 940, 599, 677, 135... True \n", + "3 3 [855, 1454, 109, 1282, 1133, 1482, 1508, 1174,... True \n", + "4 4 [996, 1536, 897, 903, 552, 902, 789, 1201, 125... True \n", + "\n", + " isParent \n", + "0 True \n", + "1 True \n", + "2 True \n", + "3 True \n", + "4 True " ] }, - "execution_count": 29, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -179,12 +212,14 @@ " [{\"committee_ind\": ind, \n", " \"committee_members\": committee}\n", " for ind, committee in enumerate(committee_list)])\n", + "committee_df[\"isChild\"] = [row['committee_ind'] != 0 for ind, row in committee_df.iterrows()]\n", + "committee_df[\"isParent\"] = [row['committee_ind'] != num_committees -1 for ind, row in committee_df.iterrows()]\n", "committee_df.head()" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 5, "id": "903154d0-9cc0-4e96-9c07-6fba378eb063", "metadata": {}, "outputs": [ @@ -211,6 +246,17 @@ "50\n", "50\n", "50\n", + "50\n", + "50\n", + "50\n", + "50\n", + "50\n", + "50\n", + "50\n", + "50\n", + "50\n", + "50\n", + "50\n", "50\n" ] } @@ -229,6 +275,592 @@ "## Form Overlay Tree Structure" ] }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7f302667-e6c4-4f9b-8db7-d631e782401f", + "metadata": {}, + "outputs": [], + "source": [ + "committee_list = [int(value) for value in committee_df['committee_ind'].values]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "6c921de0-eb56-4906-aad9-91dbf54826d7", + "metadata": {}, + "outputs": [], + "source": [ + "overlay = build(committee_list)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1fcec2f7-7c33-497a-ac6b-8c91aa2a3369", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", + "\n", + "\n", + "139882925622752\n", + "\n", + " \n", + "\n", + "0\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925623088\n", + "\n", + " \n", + "\n", + "1\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622752:l->139882925623088:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139882925622848\n", + "\n", + " \n", + "\n", + "2\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622752:r->139882925622848:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139882925622080\n", + "\n", + " \n", + "\n", + "3\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925623088:l->139882925622080:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139882925623136\n", + "\n", + " \n", + "\n", + "4\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925623088:r->139882925623136:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139882925623856\n", + "\n", + " \n", + "\n", + "5\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622848:l->139882925623856:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139882925622416\n", + "\n", + " \n", + "\n", + "6\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622848:r->139882925622416:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139882925622128\n", + "\n", + " \n", + "\n", + "7\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622080:l->139882925622128:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139882925624048\n", + "\n", + " \n", + "\n", + "8\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622080:r->139882925624048:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403056240\n", + "\n", + " \n", + "\n", + "9\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925623136:l->139881403056240:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403056384\n", + "\n", + " \n", + "\n", + "10\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925623136:r->139881403056384:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403056432\n", + "\n", + " \n", + "\n", + "11\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925623856:l->139881403056432:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403056576\n", + "\n", + " \n", + "\n", + "12\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925623856:r->139881403056576:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403056720\n", + "\n", + " \n", + "\n", + "13\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622416:l->139881403056720:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403056768\n", + "\n", + " \n", + "\n", + "14\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622416:r->139881403056768:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403056864\n", + "\n", + " \n", + "\n", + "15\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622128:l->139881403056864:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403056960\n", + "\n", + " \n", + "\n", + "16\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925622128:r->139881403056960:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057056\n", + "\n", + " \n", + "\n", + "17\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925624048:l->139881403057056:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057152\n", + "\n", + " \n", + "\n", + "18\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139882925624048:r->139881403057152:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057248\n", + "\n", + " \n", + "\n", + "19\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056240:l->139881403057248:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057344\n", + "\n", + " \n", + "\n", + "20\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056240:r->139881403057344:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057392\n", + "\n", + " \n", + "\n", + "21\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056384:l->139881403057392:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057584\n", + "\n", + " \n", + "\n", + "22\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056384:r->139881403057584:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057632\n", + "\n", + " \n", + "\n", + "23\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056432:l->139881403057632:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057728\n", + "\n", + " \n", + "\n", + "24\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056432:r->139881403057728:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057824\n", + "\n", + " \n", + "\n", + "25\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056576:l->139881403057824:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403057968\n", + "\n", + " \n", + "\n", + "26\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056576:r->139881403057968:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403058016\n", + "\n", + " \n", + "\n", + "27\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056720:l->139881403058016:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403058112\n", + "\n", + " \n", + "\n", + "28\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056720:r->139881403058112:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403058208\n", + "\n", + " \n", + "\n", + "29\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056768:l->139881403058208:v\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "139881403058304\n", + "\n", + " \n", + "\n", + "30\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "139881403056768:r->139881403058304:v\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "overlay.graphviz()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "731343bb-19dd-4478-8e22-3f08701dc16d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[Node(0)],\n", + " [Node(1), Node(2)],\n", + " [Node(3), Node(4), Node(5), Node(6)],\n", + " [Node(7), Node(8), Node(9), Node(10), Node(11), Node(12), Node(13), Node(14)],\n", + " [Node(15),\n", + " Node(16),\n", + " Node(17),\n", + " Node(18),\n", + " Node(19),\n", + " Node(20),\n", + " Node(21),\n", + " Node(22),\n", + " Node(23),\n", + " Node(24),\n", + " Node(25),\n", + " Node(26),\n", + " Node(27),\n", + " Node(28),\n", + " Node(29),\n", + " Node(30)]]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "overlay.levels" + ] + }, { "cell_type": "markdown", "id": "b10a466b-f2d5-4a8f-9572-b2ca2ada520d", @@ -239,8 +871,1322 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "68de5fdc-0900-4e95-b2d0-57e5c98cb30c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
parentchildren
0231[1486, 170]
1400[47, 474]
21533[1286, 99]
31015[529, 1292]
434[711, 1250]
\n", + "
" + ], + "text/plain": [ + " parent children\n", + "0 231 [1486, 170]\n", + "1 400 [47, 474]\n", + "2 1533 [1286, 99]\n", + "3 1015 [529, 1292]\n", + "4 34 [711, 1250]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parent_child_map = []\n", + "for node in overlay:\n", + " # Is this node a Parent?\n", + " if committee_df.iloc[node.value,3]:\n", + " rand_parent_list = list(committee_df.iloc[node.value,:][\"committee_members\"])\n", + " random.shuffle(rand_parent_list)\n", + " if node.left != None:\n", + " rand_left_list = list(committee_df.iloc[node.left.value,:][\"committee_members\"])\n", + " random.shuffle(rand_left_list)\n", + " if node.right != None:\n", + " rand_right_list = list(committee_df.iloc[node.right.value,:][\"committee_members\"])\n", + " random.shuffle(rand_right_list)\n", + " for p,c1,c2 in zip(rand_parent_list, rand_left_list, rand_right_list):\n", + " parent_child_map.append({\"parent\": p, \"children\": [c1, c2]})\n", + "parent_child_df = pd.DataFrame(parent_child_map)\n", + "parent_child_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "b57ded81-a0b1-4d78-88c6-3df71414e076", + "metadata": {}, + "outputs": [], + "source": [ + "def get_committee_ind(node_ind):\n", + " for ind, committee in committee_df.iterrows():\n", + " if node_ind in committee[\"committee_members\"]:\n", + " return ind" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "60d8aea0-d541-4ef6-a891-b6474137b63d", + "metadata": {}, + "outputs": [], + "source": [ + "parent_child_df[\"committee_ind\"] = parent_child_df[\"parent\"].apply(get_committee_ind)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "7946d8d4-89e9-406f-ac5e-f4f20c2eedc0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
parentchildrencommittee_ind
0231[1486, 170]0
1400[47, 474]0
21533[1286, 99]0
31015[529, 1292]0
434[711, 1250]0
............
1545384[1009, 528]29
15461157[305, 1245]29
1547647[1487, 985]29
1548844[1404, 1068]29
1549174[188, 1004]29
\n", + "

1550 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " parent children committee_ind\n", + "0 231 [1486, 170] 0\n", + "1 400 [47, 474] 0\n", + "2 1533 [1286, 99] 0\n", + "3 1015 [529, 1292] 0\n", + "4 34 [711, 1250] 0\n", + "... ... ... ...\n", + "1545 384 [1009, 528] 29\n", + "1546 1157 [305, 1245] 29\n", + "1547 647 [1487, 985] 29\n", + "1548 844 [1404, 1068] 29\n", + "1549 174 [188, 1004] 29\n", + "\n", + "[1550 rows x 3 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parent_child_df" + ] + }, + { + "cell_type": "markdown", + "id": "3a053d80-08b5-402f-a399-229ebe10841c", + "metadata": {}, + "source": [ + "## Erasure Code a Block" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "e04e6c6a-ed75-44fe-b8f4-e1d09a17fad7", + "metadata": {}, + "outputs": [], + "source": [ + "# Currently these are made up, research reasonable values\n", + "num_slices = 100 \n", + "num_codes = 100\n", + "total_chunks = num_slices + num_codes\n", + "size_per_chunk = block_size / (num_codes + num_slices) # MB\n", + "redundancy_factor = 1.5\n", + "num_blocks_per_committee_member = redundancy_factor * total_chunks / committee_size\n", + "min_num_messages_to_reconstruct = num_slices - num_blocks_per_committee_member" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "6559a129-93a9-4149-8b53-6d86c2f25ea4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6.0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_blocks_per_committee_member" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c058bf64-ad73-408d-9817-d414fa5bb2d9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.005" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "size_per_chunk" + ] + }, + { + "cell_type": "markdown", + "id": "bd6752ea-0f14-4476-aa6b-59486ee4bbc5", + "metadata": {}, + "source": [ + "## Dashboard" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "51637024-7900-47ff-8494-af7d9b7b19a4", + "metadata": {}, + "outputs": [], + "source": [ + "num_nodes = widgets.IntSlider(\n", + " value = 1550,\n", + " min = 100,\n", + " max = 100000,\n", + " step = 50,\n", + " description = \"Number of Nodes:\",\n", + " continuos_update=True\n", + ")\n", + "\n", + "committee_size = widgets.IntSlider(\n", + " value = 50,\n", + " min = 20,\n", + " max = 500,\n", + " step = 5,\n", + " description = \"Size of a Committee:\",\n", + " continuos_update=True\n", + ")\n", + "\n", + "byzantine_perc = widgets.IntSlider(\n", + " value = 0.15,\n", + " min = 0,\n", + " max = 1,\n", + " step = .01,\n", + " description = \"Byzantine Percentage:\",\n", + " continuos_update=True\n", + ")\n", + "\n", + "block_size = widgets.IntSlider(\n", + " value = 1,\n", + " min = 1,\n", + " max = 100,\n", + " step = 1,\n", + " description = \"Block Size:\",\n", + " continuos_update=True\n", + ")\n", + "\n", + "container = widgets.HBox(children=[num_nodes, committee_size, byzantine_perc, block_size])" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "36ed9c95-cc81-489b-84c8-be211b3e0770", + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "type object 'DOMWidget' has no attribute '_ipython_display_'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/IPython/core/formatters.py:921\u001b[0m, in \u001b[0;36mIPythonDisplayFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 919\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n\u001b[1;32m 920\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 921\u001b[0m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 922\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "File \u001b[0;32m~/.local/lib/python3.8/site-packages/plotly/basewidget.py:741\u001b[0m, in \u001b[0;36mBaseFigureWidget._ipython_display_\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 737\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 738\u001b[0m \u001b[38;5;124;03mHandle rich display of figures in ipython contexts\u001b[39;00m\n\u001b[1;32m 739\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 740\u001b[0m \u001b[38;5;66;03m# Override BaseFigure's display to make sure we display the widget version\u001b[39;00m\n\u001b[0;32m--> 741\u001b[0m \u001b[43mwidgets\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mDOMWidget\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_ipython_display_\u001b[49m(\u001b[38;5;28mself\u001b[39m)\n", + "\u001b[0;31mAttributeError\u001b[0m: type object 'DOMWidget' has no attribute '_ipython_display_'" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [], + "layout": { + "annotations": [ + { + "text": "sample text", + "x": 2, + "y": 5 + } + ], + "autosize": true, + "barmode": "overlay", + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "LogosBFT Dashboard" + }, + "xaxis": { + "autorange": true, + "range": [ + -1, + 6 + ] + }, + "yaxis": { + "autorange": true, + "range": [ + -1, + 4 + ] + } + } + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzEAAAFoCAYAAABniHWWAAAAAXNSR0IArs4c6QAAIABJREFUeF7t3V2Ibed93/F1dHTkIyuqLDmVbbWuE7ulSoiLaHDiiyaYutBiE9IaImJyEaMghN1Q/IKN5BCMCYmEhezQCwtV2E1Ki40uTEuwSi5cgq+UmIBKIPGNQ9yA/NL4rZJ9jvV2yh5rzmyN9sx6/s/zW7O1NZ9zU5z+n//e89nb4/metfacM5cuXbo0+UOAAAECBAgQIECAAIEdETgjYnbklfI0CRAgQIAAAQIECBDYExAx3ggECBAgQIAAAQIECOyUgIjZqZfLkyVAgAABAgQIECBAQMR4DxAgQIAAAQIECBAgsFMCImanXi5PlgABAgQIECBAgAABEeM9QIAAAQIECBAgQIDATgmImJ16uTxZAgQIECBAgAABAgREjPcAAQIECBAgQIAAAQI7JSBidurl8mQJECBAgAABAgQIEBAx3gMECBAgQIAAAQIECOyUgIjZqZfLkyVAgAABAgQIECBAQMR4DxAgQIAAAQIECBAgsFMCImanXi5PlgABAgQIECBAgAABEeM9QIAAAQIECBAgQIDATgmImJ16uTxZAgQIECBAgAABAgREjPcAAQIECBAgQIAAAQI7JSBidurl8mQJECBAgAABAgQIEBAx3gMECBAgQIAAAQIECOyUgIjZqZfLkyVAgAABAgQIECBAQMR4DxAgQIAAAQIECBAgsFMCImanXi5PlgABAgQIECBAgAABEeM9QIAAAQIECBAgQIDATgmImJ16uTxZAgQIECBAgAABAgREjPcAAQIECBAgQIAAAQI7JSBidurl8mQJECBAgAABAgQIEBAx3gMECBAgQIAAAQIECOyUgIjZqZfLkyVAgAABAgQIECBAQMR4DxAgQIAAAQIECBAgsFMCImanXi5PlgABAgQIECBAgAABEeM9QIAAAQIECBAgQIDATgmImJ16uTxZAgQIECBAgAABAgREjPcAAQIECBAgQIAAAQI7JSBidurl8mQJECBAgAABAgQIEBAx3gMECBAgQIAAAQIECOyUgIjZqZfLkyVAgAABAgQIECBAQMR4DxAgQIAAAQIECBAgsFMCImanXq6X7pP9+AMPTX/26Jen++9533T9ddce+YV+53uPT+++8xPTz91y8/T+O27dCZDV1/b1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AAECBAicWgERc2pfel84AQIECBAgQIAAgd0UEDG7+bp51gQIECBAgAABAgROrYCIObUvvS+cAAECBAgQIECAwG4KiJjdfN08awIECBAgQIAAAQKnVkDEnNqX3hdOgAABAgQIECBAYDcFRMxuvm6eNQECBAgQIECAAIFTKyBiTu1L7wsnQIAAAQIECBAgsJsCImY3XzfPmgABAgQIECBAgMCpFRAxp/al94UTIECAAAECBAgQ2E0BEbObr5tnTYAAAQIECBAgQODUCoiYU/vS+8IJECBAgAABAgQI7KaAiNnN182zJkCAAAECBAgQIHBqBUTMqX3pfeEECBAgQIAAAQIEdlNAxOzm6+ZZEyBAgAABAgQIEDi1AiLm1L70vnACBAgQIECAAAECuykgYnbzdfOsCRAgQIAAAQIECJxaARFzal96XzgBAgQIECBAgACB3RQQMbv5unnWBAgQIECAAAECBE6tgIg5tS+9L5wAAQIECBAgQIDAbgqImN183TxrAgQIECBAgAABAqdWQMSc2pfeF06AAAECBAgQIEBgNwVEzG6+bp41AQIECBAgQIAAgVMrIGJO7UvvCydAgAABAgQIECCwmwIiZjdfN8+aAAECBAgQIECAwKkVEDGn9qX3hRMgQIAAAQIECBDYTQERs5uvm2dNgAABAgQIECBA4NQKiJhT+9L7wgkQIECAAAECBAjspoCI2c3XzbMmQIAAAQIECBAgcGoFREzhpf/So1+e3vXee6Y/+P07pzfdcnPhpFECBAgQIECAAAECBFICIqZRcj9gVuMiphHNGAECBAgQIECAAIEFBERMA+pXvvrYdO8nPzt96N+/c/rw3Q9OH7jjVldiGtyMECBAgAABAgQIEFhCQMTMqK4C5rfufnD63btun254xbXTu+/8hIhZ4p1oJwECBAgQIECAAIFGARFzDNR3vvf4dNfvPTh98D2/Or3hdTdNq/8sYhrfWcYIECBAgAABAgQILCQgYo6BXV2FueND901f+8a3XjC1/7mYx751YaGXxtpNAleePTPd+Irz09PPXJq++d2LkE5Q4O9f97Lpu99/anrq6WdP8FE91GtuuHr6+ncuTJcusTgpgSvOTNON1189ff3bvr+flPnqcc5decX0imvOTf/3ez88yYc99Y/18pedna46d3b67hNPnnqLkwa46ZVXn/RDvqQeT8QU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ECBAgACBfgER02/nJAECBAgQIECAAAECWxAQMVtA95AECBAgQIAAAQIECPQLiJh+OycJECBAgAABAgQIENiCgIjZArqHJECAAAECBAgQIECgX0DE9Ns5SYAAAQIECBAgQIDAFgREzBbQPSQBAgQIECBAgAABAv0CIqbfzkkCBAgQIECAAAECBLYgIGK2gO4hCRAgQIAAAQIECBDoFxAx/XZOEiBAgAABAgQIECCwBQERswV0D0mAAAECBAgQIECAQL+AiOm3c5IAAQIECBAgQIAAgS0IiJgtoHtIAgQIECBAgAABAgT6BURMv52TBAgQIECAAAECBAhsQUDEbAHdQxIgQIAAAQIECBAg0C8gYvrtnCRAgAABAgQIECBAYAsCImYL6B6SAAECBAgQIECAAIF+ARHTb+ckAQIECBAgQIAAAQJbEBAxW0D3kAQIECBAgAABAgQI9AuImH47JwkQIECAAAECBAgQ2IKAiNkCuockQIAAAQIECBAgQKBfQMT02zlJgAABAgQIECBAgMAWBETMFtA9JAECBAgQIECAAAEC/QIipt/OSQIECBAgQIAAAQIEtiAgYraA7iEJECBAgAABAgQIEOgXEDH9dk4SIECAAAECBAgQILAFARGzBXQPSYAAAQIECBAgQIBAv4CI6bdzkgABAgQIECBAgACBLQiImC2ge0gCBAgQIECAAAECBPoFREy/nZMECBAgQIAAAQIECGxBQMRsAd1DEiBAgAABAgQIECDQLyBi+u2cJECAAAECBAgQIEBgCwIiZgvoHpIAAQIECBAgQIAAgX4BEdNv5yQBAgQIECBAgAABAlsQEDFbQPeQBAgQIECAAAECBAj0C4iYfjsnCRAgQIAAAQIECBDYgoCI2QK6hyRAgAABAgQIECBAoF9AxPTbOUmAAAECBAgQIECAwBYERMwW0D0kAQIECBAgQIAAAQL9AiKm385JAgQIECBAgAABAgS2ICBitoDuIQkQIECAAAECBAgQ6BcQMf12ThIgQIAAAQIECBAgsAUBEbMFdA9JgAABAgQIECBAgEC/gIjpt3OSAAECBAgQIECAAIEtCIiYLaB7SAIECBAgQIAAAQIE+gVETL+dkwQIECBAgAABAgQIbEFAxGwB3UMSIECAAAECBAgQINAvIGL67ZwkQIAAAQIECBAgQGALAiJmC+gekgABAgQIECBAgACBfgER02/nJAECBAgQIECAAAECWxAQMVtA95AECBAgQIAAAQIECPQLiJh+OycJECBAgAABAgQIENiCgIjZArqHJECAAAECBAgQIECgX0DE9Ns5SYAAAQIECBAgQIDAFgREzBbQPSQBAgQIECBAgAABAv0CIqbfzkkCBAgQIECAAAECBLYg8P8B7L8l5SCX1PQAAAAASUVORK5CYII=", + "text/html": [ + "
" + ], + "text/plain": [ + "FigureWidget({\n", + " 'data': [],\n", + " 'layout': {'annotations': [{'text': 'sample text', 'x': 2, 'y': 5}],\n", + " 'barmode': 'overlay',\n", + " 'template': '...',\n", + " 'title': {'text': 'LogosBFT Dashboard'}}\n", + "})" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = go.FigureWidget(data=[],\n", + " layout=go.Layout(\n", + " title = dict(\n", + " text=\"LogosBFT Dashboard\"\n", + " ),\n", + " barmode=\"overlay\"\n", + " ))\n", + "g.add_annotation(x=2, y=5,\n", + " text=\"sample text\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "912b4e9c-0f20-453b-a1ca-e93bef2c12d1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "78d8aab1-2ab1-4648-9324-1e27f0c2c51e", + "metadata": {}, + "outputs": [], + "source": [ + "widgets.VBox([container, g])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "73ef4de7-cb8e-4fd2-96ed-7a8ef81152d3", "metadata": {}, "outputs": [], "source": []