{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "44444963-1f48-4d95-bacc-7e3251d69440",
   "metadata": {},
   "outputs": [],
   "source": [
    "import groggy as gr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "731ae336-af6f-4a27-ab8e-91c3a2af251e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# gt = gr.from_csv(nodes_filepath='../comprehensive_test_objects_20251004_152053.csv', \n",
    "#             edges_filepath='../comprehensive_test_methods_20251004_152053.csv',\n",
    "#             node_id_column='object_name',\n",
    "#             source_id_column='object_name',\n",
    "#             target_id_column='result_type'\n",
    "#            )\n",
    "\n",
    "# g = gt.to_graph()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "2fced5fc-2d95-4c15-8f43-a37b9957c900",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "🔧 Auto-expanding nodes to include 26 result types (including 319 unknown)\n",
      "   Added: ['AggregationResult', 'BaseArray', 'BaseArrayIterator', 'BaseTableRowIterator', 'DataFrame']...\n",
      "✅ Created GraphTable from /Users/michaelroth/Documents/Code/groggy/comprehensive_test_objects_20251007_213534.csv and /Users/michaelroth/Documents/Code/groggy/comprehensive_test_methods_20251007_213534.csv\n",
      "📊 Mapped 27 unique object_name values to integer node IDs\n",
      "🔗 Edge columns: object_name -> result_type\n",
      "📈 Nodes: 53, Edges: 921\n",
      "🔧 Auto-expanding nodes to include 26 result types (including 319 unknown)\n",
      "   Added: ['AggregationResult', 'BaseArray', 'BaseArrayIterator', 'BaseTableRowIterator', 'DataFrame']...\n",
      "✅ Created GraphTable from /Users/michaelroth/Documents/Code/groggy/comprehensive_test_objects_20251007_213534.csv and /Users/michaelroth/Documents/Code/groggy/comprehensive_test_methods_20251007_213534.csv\n",
      "📊 Mapped 27 unique object_name values to integer node IDs\n",
      "🔗 Edge columns: object_name -> result_type\n",
      "📈 Nodes: 53, Edges: 921\n"
     ]
    }
   ],
   "source": [
    "from comprehensive_library_testing import load_comprehensive_test_graph, iter_method_results\n",
    "\n",
    "g = load_comprehensive_test_graph()          # Graph object\n",
    "gt = load_comprehensive_test_graph(to_graph=False)  # GraphTable if you’d rather stay columnar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "48f08894-77a3-4669-b4e7-b428a4620c32",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['AttrName',\n",
       " 'BaseTable_from_builder',\n",
       " 'BaseTable',\n",
       " 'GraphMatrix_from_builder',\n",
       " 'NodesAccessor',\n",
       " 'EdgesArray',\n",
       " 'BaseArray_from_builder',\n",
       " 'GraphTable',\n",
       " 'Subgraph',\n",
       " 'BranchName',\n",
       " 'EdgesAccessor',\n",
       " 'DisplayConfig',\n",
       " 'Graph',\n",
       " 'NumArray',\n",
       " 'NodesTable',\n",
       " 'GraphMatrix',\n",
       " 'SubgraphArray',\n",
       " 'EdgesTable',\n",
       " 'StateId',\n",
       " 'EdgeId',\n",
       " 'TableArray',\n",
       " 'NodesArray',\n",
       " 'ComponentsArray',\n",
       " 'NumArray_from_builder',\n",
       " 'NodeId',\n",
       " 'InvalidInputError',\n",
       " 'GroggyError']"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(g.edges['object_name'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "0718a973-7538-4bd9-a687-a2909626f9b4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-integer\" data-type=\"integer\" title=\"Column: edge_id (integer)\">edge_id</th><th class=\"col-string\" data-type=\"string\" title=\"Column: error_category (string)\">error_category</th><th class=\"col-boolean\" data-type=\"boolean\" title=\"Column: has_signature_info (boolean)\">has_signature_info</th><th class=\"col-string\" data-type=\"string\" title=\"Column: message (string)\">message</th><th class=\"col-string\" data-type=\"string\" title=\"Column: method_name (string)\">method_name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: object_name (string)\">object_name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: result_type (string)\">result_type</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: source (integer)\">source</th><th class=\"col-boolean\" data-type=\"boolean\" title=\"Column: success (boolean)\">success</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: target (integer)\">target</th></tr></thead><tbody><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">38</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: No-args call successful: bool\">No-args call successful: bool</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">is_connected</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">bool</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">12</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">47</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">7</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: No-args call successful: list\">No-args call successful: list</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: all_node_attribute_names\">all_node_attribute_names</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">list</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">12</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">48</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">18</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: With-args call successful: list\">With-args call successful: list</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">edge_attribute_keys</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">list</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">12</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">48</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">6</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: No-args call successful: list\">No-args call successful: list</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: all_edge_attribute_names\">all_edge_attribute_names</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">list</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">12</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">48</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">28</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">type_conversion</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: With-args failed: argument &#39;attrs&#39;: &#39;dict&#39; object cannot be converted to &#39;Sequence&#39;\">With-args failed: argument &#39;attrs&#39;: &#39;dict&#39; object cannot be converted to &#39;Sequence&#39;</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">get_node_attrs</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">unknown_return_type</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">12</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">33</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">44</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: No-args call successful: NeighborhoodStats\">No-args call successful: NeighborhoodStats</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: neighborhood_statistics\">neighborhood_statistics</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NeighborhoodStats</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">12</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">36</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">23</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: With-args call successful: Subgraph\">With-args call successful: Subgraph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">filter_edges</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Subgraph</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">12</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">25</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">other_error</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: With-args failed: add_edges expects a list of (source, target) tuples, (source, target, attrs) tuples, or dictionaries. Use uid_key parameter for string node IDs, node_mapping for dictionary format, or source/target parameters to specify custom field names.\">With-args failed: add_edges expects a list of (source, target) tuples, (source, target, attrs) tuples, or dictionaries. Use uid_key parameter for string node IDs, node_mapping for dictionary format, or source/target parameters to specify custom field names.</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">add_edges</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">unknown_return_type</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">12</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">33</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>65 rows x 10 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (65 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "EdgesTable[65 x 10]"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.edges[g.edges['object_name'] == 'Graph'].edges.table()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "464d1a0a-1687-47a4-97c9-1a10f8df2a46",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-string\" data-type=\"string\" title=\"Column: group_key (string)\">group_key</th><th class=\"col-float\" data-type=\"float\" title=\"Column: mean (float)\">mean</th></tr></thead><tbody><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesTable</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">21.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NeighborhoodResult</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">SubgraphArray</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">10.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">unknown_return_type</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">50.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesTable</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">24.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesAccessor</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">12.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">41.00</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>53 rows x 2 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (53 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "┌─────────────────────┬──────┐\n",
       "│ group_key           │ mean │\n",
       "├─────────────────────┼──────┤\n",
       "│ NodesTable          │   21 │\n",
       "│ NeighborhoodResult  │    0 │\n",
       "│ SubgraphArray       │   10 │\n",
       "│ unknown_return_type │    0 │\n",
       "│ ⋮                   │    ⋮ │\n",
       "│ GraphMatrix         │   50 │\n",
       "│ EdgesTable          │   24 │\n",
       "│ NodesAccessor       │   12 │\n",
       "│ BaseTable           │   41 │\n",
       "└─────────────────────┴──────┘\n",
       "53 rows x 2 cols"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.nodes.table().group_by(['object_name'])['successful_methods'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ceeb595e-224e-400a-a158-a0ccbff97922",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NodesTableArray[53 groups]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gt.nodes.group_by(['object_name'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ee68d8fa-d7d3-49f2-93d8-a3be0c9c9629",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "EdgesTableArray[27 groups]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gt.edges.group_by(['object_name'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "8afecb6c-8152-4088-b3f0-ca2b08a8bacc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Subgraph(nodes=8, edges=47)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.edges.group_by('object_name')[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5e5eb424-0392-45a2-8dd5-034d0a6f0f52",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 122 node pairs with multiple edges\n"
     ]
    }
   ],
   "source": [
    "from collections import Counter\n",
    "edge_pairs = [(min(e[0], e[1]), max(e[0], e[1])) for e in [(g.edges.sources[e], g.edges.targets[e])\n",
    "for e in range(g.edge_count())]]\n",
    "multi = [(pair, count) for pair, count in Counter(edge_pairs).items() if count > 1]\n",
    "print(f\"Found {len(multi)} node pairs with multiple edges\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "72675b73-d116-4a84-bdb7-51c61bf8cb86",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-string\" data-type=\"string\" title=\"Column: group_key (string)\">group_key</th><th class=\"col-float\" data-type=\"float\" title=\"Column: mean (float)\">mean</th></tr></thead><tbody><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">subgraph_0</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">subgraph_1</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">36.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">subgraph_2</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">subgraph_3</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">subgraph_49</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">subgraph_50</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">subgraph_51</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-string\" data-type=\"string\" title=\"string value\">subgraph_52</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>53 rows x 2 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (53 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "┌─────────────┬──────┐\n",
       "│ group_key   │ mean │\n",
       "├─────────────┼──────┤\n",
       "│ subgraph_0  │    0 │\n",
       "│ subgraph_1  │   36 │\n",
       "│ subgraph_2  │    0 │\n",
       "│ subgraph_3  │    0 │\n",
       "│ ⋮           │    ⋮ │\n",
       "│ subgraph_49 │    0 │\n",
       "│ subgraph_50 │    0 │\n",
       "│ subgraph_51 │    0 │\n",
       "│ subgraph_52 │    0 │\n",
       "└─────────────┴──────┘\n",
       "53 rows x 2 cols"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.nodes.group_by(['object_name'])['successful_methods'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "dedffb5e-8a04-4f19-87bc-6c5b4bcd40ab",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-integer\" data-type=\"integer\" title=\"Column: edge_id (integer)\">edge_id</th><th class=\"col-string\" data-type=\"string\" title=\"Column: error_category (string)\">error_category</th><th class=\"col-boolean\" data-type=\"boolean\" title=\"Column: has_signature_info (boolean)\">has_signature_info</th><th class=\"col-string\" data-type=\"string\" title=\"Column: message (string)\">message</th><th class=\"col-string\" data-type=\"string\" title=\"Column: method_name (string)\">method_name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: object_name (string)\">object_name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: result_type (string)\">result_type</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: source (integer)\">source</th><th class=\"col-boolean\" data-type=\"boolean\" title=\"Column: success (boolean)\">success</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: target (integer)\">target</th></tr></thead><tbody><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">444</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: No-args call successful: bool\">No-args call successful: bool</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">is_empty</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: BaseArray_from_builder\">BaseArray_from_builder</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">bool</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">16</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">47</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">116</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">missing_parameters</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: With-args failed: GraphTable.verify_bundle() missing 1 required positional argument: &#39;bundle_path&#39;\">With-args failed: GraphTable.verify_bundle() missing 1 required positional argument: &#39;bundle_path&#39;</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">verify_bundle</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphTable</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">unknown_return_type</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">23</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">33</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">196</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: No-args call successful: dict\">No-args call successful: dict</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">stats</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NodesArray</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">dict</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">18</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">30</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">17</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: With-args call successful: Subgraph\">With-args call successful: Subgraph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">dfs</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Graph</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Subgraph</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">12</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">25</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">669</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: No-args call successful: GraphMatrix\">No-args call successful: GraphMatrix</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">sqrt</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: GraphMatrix_from_builder\">GraphMatrix_from_builder</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GraphMatrix</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">15</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">24</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">901</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Property access successful: tuple\">Property access successful: tuple</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">args</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">InvalidInputError</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">tuple</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">51</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">245</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">success</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: No-args call successful: list\">No-args call successful: list</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">to_list</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">SubgraphArray</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">list</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">17</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✓</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">48</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">582</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">missing_parameters</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: Parameter required but none worked: BaseTable.shift() missing 2 required positional arguments: &#39;column&#39; and &#39;periods&#39;\">Parameter required but none worked: BaseTable.shift() missing 2 required positional arguments: &#39;column&#39; and &#39;periods&#39;</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">shift</td><td class=\"cell-string cell-truncated\" data-type=\"string\" title=\"Full value: BaseTable_from_builder\">BaseTable_from_builder</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">unknown_return_type</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">19</td><td class=\"cell-boolean\" data-type=\"boolean\" title=\"boolean value\">✗</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">33</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>921 rows x 10 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (921 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "EdgesTable[921 x 10]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.edges.table()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "efc7b22c-adde-4643-aecb-8275292ef27d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# g.viz.show(layout='circular', \n",
    "#            node_label='object_name', \n",
    "#            edge_label='method_name', \n",
    "#            edge_color='success',\n",
    "#            node_color='object_name', \n",
    "#            color_scale_type='categorical',\n",
    "#           node_size_range=(5, 20))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "17daeb8f-355c-4ae2-ad19-fa2b73a3b47f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(g.nodes)[:1][0].id"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "80cefa39-6070-4b33-80ab-8bce17b3e8e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-integer\" data-type=\"integer\" title=\"Column: index (integer)\">index</th><th class=\"col-string\" data-type=\"string\" title=\"Column: value (string)\">value</th></tr></thead><tbody><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTableRowIterator</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">GroggyError</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">EdgesArray</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">3</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">BaseTable</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">49</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">VizAccessor</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">50</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">NeighborhoodStats</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">51</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">TableArray</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">52</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">str</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>53 rows x 2 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (53 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "BaseArray[53] ['BaseTableRowIterator', 'GroggyError', 'EdgesArray', ...] (dtype: Text)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.nodes['object_name'].unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "061f1cfa-5c8c-4f05-8759-2220683611fe",
   "metadata": {},
   "outputs": [],
   "source": [
    "g.nodes.set_attrs({0:{'new_attr':'new_value'}})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "c3d7bcfd-a5a1-4543-82e6-8fd1d7efc60e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Subgraph(nodes=1, edges=1)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.nodes.filter('object_name == \"Graph\"')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8d5d3c7b-b129-4967-bade-71c6d95ad49e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "0375e6b1-87d6-46d2-805c-b4cba09b71c2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['main']"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[branch.name for branch in g.branches()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "b360981a-c733-4b05-8779-182f215d33bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "array = gr.array(g.nodes.attribute_names())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "c038dbb8-b25b-4fef-8b5d-484cc81e49bb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['failed_methods',\n",
       " 'new_attr',\n",
       " 'object_name',\n",
       " 'object_type',\n",
       " 'status',\n",
       " 'success_rate',\n",
       " 'successful_methods',\n",
       " 'total_methods']"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(array)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "778bb27b-ee05-4741-b697-08f5137b5650",
   "metadata": {},
   "outputs": [],
   "source": [
    "array = gr.array([])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "e0c91772-e43a-4548-a467-554104f3f5b7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "array.is_empty()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "d8fb7418-ae2d-49d5-a1bf-7098960b789d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-integer\" data-type=\"integer\" title=\"Column: index (integer)\">index</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: value (integer)\">value</th></tr></thead><tbody><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">24</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">10</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">3</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">1</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">⋮</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">49</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">19</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">50</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">51</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">9</td></tr><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">52</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">2</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>53 rows x 2 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (53 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "BaseArray[53] [1, 24, 10, ...] (dtype: SmallInt)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.degree().to_type('basearray')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "e0674646-d786-4cde-9b7f-f461642bcc9c",
   "metadata": {},
   "outputs": [],
   "source": [
    "numarray = g.degree()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "86c6754f-132b-4023-b307-c559b20d0253",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "BaseArray[0] empty (dtype: Null)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "array.filter(lambda x: 'a' in x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "d9f134bc-1ad6-42d7-8f06-34f9075b932d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(53, 9)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.nodes.table().shape()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "8bcb355f-c720-440d-9a6d-c77b049c7c47",
   "metadata": {},
   "outputs": [],
   "source": [
    "sg = g.view()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "74ba4b96-2756-4fe3-9365-f2df7b7c393f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[PyMetaNode(MetaNode(id=53, degree=19, subgraph_id=Some(14137822726467120362)) )]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sg.neighborhood(0, hops=1).collapse()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "e2abd67c-03d1-4027-80f4-cb56eda4d348",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NumArray(dtype: int64)\n",
       "[  0] 53"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.nodes.meta.ids()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "9145e1ae-2a36-4a8e-88a7-cd7ca986122d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><thead><tr><th class=\"col-integer\" data-type=\"integer\" title=\"Column: failed_methods (integer)\">failed_methods</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: node_id (integer)\">node_id</th><th class=\"col-string\" data-type=\"string\" title=\"Column: object_name (string)\">object_name</th><th class=\"col-string\" data-type=\"string\" title=\"Column: object_type (string)\">object_type</th><th class=\"col-string\" data-type=\"string\" title=\"Column: status (string)\">status</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: success_rate (integer)\">success_rate</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: successful_methods (integer)\">successful_methods</th><th class=\"col-integer\" data-type=\"integer\" title=\"Column: total_methods (integer)\">total_methods</th></tr></thead><tbody><tr><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">40</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">str</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Type: str</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">Type: str</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td><td class=\"cell-integer\" data-type=\"integer\" title=\"integer value\">0</td></tr></tbody></table></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "NodesTable[1 x 8]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.nodes[-1:].nodes.table()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "ea41328f-c7ca-4c5a-8f8f-5dd669a6f078",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><tbody><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">2.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">-1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">-1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">-1.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">-1.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">-1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">-1.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">-1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>54 rows x 54 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (54 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "GraphMatrix(shape=(54, 54), dtype=f64)\n",
       "[[   2.000     0.000  ...     0.000]\n",
       " [   0.000     1.000  ...     0.000]\n",
       " [   0.000     0.000  ...     0.000]\n",
       "\n",
       " ... [   0.000     0.000  ...     0.000]\n",
       " [   0.000     0.000  ...    14.000]]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.laplacian_matrix()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "b0a0117c-3ac0-4e04-9ff3-2cd161520a18",
   "metadata": {},
   "outputs": [],
   "source": [
    "sg = g.view()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "fa1cc9ba-cca3-4a2c-a008-ee22487f6572",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"groggy-display-container\" data-theme=\"sleek\"><div class=\"groggy-table-container\"><table class=\"groggy-table theme-sleek\"><tbody><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">⋮</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr><tr><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-string\" data-type=\"string\" title=\"string value\">⋯</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">1.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td><td class=\"cell-float\" data-type=\"float\" title=\"float value\">0.00</td></tr></tbody></table><div class=\"table-info\">\n",
       "                <span>54 rows x 54 cols</span>\n",
       "                <button class=\"interactive-btn\" onclick=\"launchInteractive()\" \n",
       "                        title=\"Launch interactive view for full dataset\">\n",
       "                    View All (54 rows) →\n",
       "                </button>\n",
       "            </div></div></div><style>/* Sleek style */\n",
       ":root {\n",
       "  --radius: 10px;\n",
       "  --border: 2px;\n",
       "  --bg: #fff;\n",
       "  --fg: #1f2328;\n",
       "  --muted: #6a737d;\n",
       "  --line: #eee;\n",
       "  --accent: #3267e3;\n",
       "  --hover: #f6f8fa;\n",
       "  --row-hover: #f3f6ff;\n",
       "  --selected: #e8f0ff;\n",
       "  --shadow: 0 1px 2px rgba(0,0,0,.05), 0 2px 8px rgba(0,0,0,.06);\n",
       "  --cell-py: 5px;\n",
       "  --cell-px: 12px;\n",
       "  --font: system-ui, -apple-system, sans-serif;\n",
       "  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace;\n",
       "}\n",
       "\n",
       "/* Container */\n",
       ".groggy-display-container {\n",
       "  font-family: var(--font);\n",
       "  background: var(--bg);\n",
       "  color: var(--fg);\n",
       "  border: var(--border) solid var(--line);\n",
       "  border-radius: var(--radius);\n",
       "  overflow: hidden;\n",
       "  width: fit-content;\n",
       "  margin-top: 4px;\n",
       "  margin-bottom: 4px;\n",
       "}\n",
       "\n",
       ".groggy-table-container {\n",
       "  width: fit-content;\n",
       "}\n",
       "\n",
       "/* Table */\n",
       ".groggy-table {\n",
       "  border-collapse: separate;\n",
       "  border-spacing: 0;\n",
       "  font-size: 11.5px !important;\n",
       "  line-height: 1.1;\n",
       "  background-color: #f8f9fa;\n",
       "  margin-bottom: 0 !important\n",
       "}\n",
       "\n",
       ".groggy-table th,\n",
       ".groggy-table td {\n",
       "  padding: var(--cell-py) var(--cell-px);\n",
       "  border-right: var(--border) solid var(--line);\n",
       "  border-bottom: var(--border) solid var(--line);\n",
       "}\n",
       ".groggy-table th:last-child,\n",
       ".groggy-table td:last-child {\n",
       "  border-right: none;\n",
       "}\n",
       "\n",
       "/* Sticky header */\n",
       ".groggy-table thead th {\n",
       "  position: sticky;\n",
       "  top: 0;\n",
       "  z-index: 2;\n",
       "  background: #fafafa;\n",
       "  font-weight: 600;\n",
       "  text-align: left;\n",
       "  color: var(--fg);\n",
       "}\n",
       ".groggy-table thead th:first-child { border-top-left-radius: var(--radius); }\n",
       ".groggy-table thead th:last-child  { border-top-right-radius: var(--radius); }\n",
       "\n",
       "/* Rounded corners bottom */\n",
       ".groggy-table tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius); }\n",
       ".groggy-table tbody tr:last-child td:last-child  { border-bottom-right-radius: var(--radius); }\n",
       "\n",
       "/* Zebra striping + hover */\n",
       ".groggy-table tbody tr:nth-child(even) td { background: #f9f9f9; }\n",
       ".groggy-table tbody tr:hover td { background: var(--row-hover); }\n",
       "\n",
       "/* Selection state */\n",
       ".groggy-table tbody tr.is-selected td {\n",
       "  background: var(--selected) !important;\n",
       "}\n",
       ".groggy-table tbody tr.is-selected td:first-child {\n",
       "  box-shadow: inset 3px 0 0 var(--accent);\n",
       "}\n",
       "\n",
       "/* Column hover highlight (set via JS with --col) */\n",
       ".groggy-table td:nth-child(var(--col)),\n",
       ".groggy-table th:nth-child(var(--col)) {\n",
       "  background: var(--hover);\n",
       "}\n",
       "\n",
       "/* Cell types */\n",
       ".cell-num    { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--mono); }\n",
       ".cell-bool   { text-align: center; }\n",
       ".cell-str,\n",
       ".cell-time   { text-align: left; }\n",
       ".cell-ellipsis {\n",
       "  max-width: 240px;\n",
       "  white-space: nowrap;\n",
       "  overflow: hidden;\n",
       "  text-overflow: ellipsis;\n",
       "}\n",
       "\n",
       "/* Responsive hiding by priority */\n",
       "@media (max-width: 820px) { [data-col-priority=\"low\"] { display:none; } }\n",
       "@media (max-width: 560px) { [data-col-priority=\"med\"] { display:none; } }\n",
       "\n",
       "/* Focus ring */\n",
       ".groggy-table:focus { outline: 2px solid var(--accent); outline-offset: 2px; }\n",
       "\n",
       "/* Transitions */\n",
       ".groggy-table th,\n",
       ".groggy-table td,\n",
       ".groggy-table tbody tr {\n",
       "  transition: background-color .18s ease, box-shadow .18s ease;\n",
       "}\n",
       "\n",
       "/* Table info section */\n",
       ".groggy-display-container .table-info {\n",
       "    margin-top: 0px;\n",
       "    padding: 5px 12px 3px;\n",
       "    border-radius: 4px;\n",
       "    font-size: 10px;\n",
       "    color: #6c757d;\n",
       "    display: flex;\n",
       "    justify-content: space-between;\n",
       "    align-items: center;\n",
       "    background-color: #f8f9fa;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn {\n",
       "    background-color: #eee;\n",
       "    color: #bbb;\n",
       "    border: none;\n",
       "    padding: 4px 8px;\n",
       "    border-radius: 3px;\n",
       "    font-size: 10px;\n",
       "    cursor: pointer;\n",
       "    transition: background-color 0.2s;\n",
       "    display: none;\n",
       "}\n",
       "\n",
       ".table-info .interactive-btn:hover {\n",
       "    background-color: #0056b3;\n",
       "}\n",
       "\n",
       "\n",
       "/* Accessibility improvements */\n",
       ".groggy-table:focus-within {\n",
       "    outline: 2px solid #007bff;\n",
       "    outline-offset: 2px;\n",
       "}\n",
       "\n",
       ".groggy-table th {\n",
       "    position: sticky;\n",
       "    top: 0;\n",
       "    z-index: 10;\n",
       "}\n",
       "\n",
       "/* Truncated content indicator */\n",
       ".cell-truncated::after {\n",
       "    content: \"…\";\n",
       "    color: #6c757d;\n",
       "    font-weight: normal;\n",
       "}</style><script>\n",
       "function launchInteractive() {\n",
       "    // Phase 1: Basic placeholder\n",
       "    alert('Interactive streaming view coming in Phase 3!\\n\\nThis will launch a WebSocket-powered interface for browsing massive datasets with virtual scrolling.');\n",
       "    \n",
       "    // Phase 3: Will be replaced with actual WebSocket connection\n",
       "    // if (window.groggyInteractive) {\n",
       "    //     window.groggyInteractive.launch();\n",
       "    // }\n",
       "}\n",
       "\n",
       "// Add keyboard navigation support\n",
       "document.addEventListener('DOMContentLoaded', function() {\n",
       "    const tables = document.querySelectorAll('.groggy-table');\n",
       "    tables.forEach(table => {\n",
       "        // Make table focusable\n",
       "        table.setAttribute('tabindex', '0');\n",
       "        \n",
       "        // Add keyboard navigation\n",
       "        table.addEventListener('keydown', function(e) {\n",
       "            if (e.key === 'Enter' || e.key === ' ') {\n",
       "                const interactiveBtn = table.parentElement.querySelector('.interactive-btn');\n",
       "                if (interactiveBtn) {\n",
       "                    interactiveBtn.click();\n",
       "                    e.preventDefault();\n",
       "                }\n",
       "            }\n",
       "        });\n",
       "    });\n",
       "});\n",
       "</script>"
      ],
      "text/plain": [
       "GraphMatrix(shape=(54, 54), dtype=f64)\n",
       "[[   1.000     0.000  ...     0.000]\n",
       " [   0.000     0.000  ...     0.000]\n",
       " [   0.000     1.000  ...     0.000]\n",
       "\n",
       " ... [   1.000     0.000  ...     0.000]\n",
       " [   0.000     0.000  ...     1.000]]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sg.adjacency_matrix()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "9f39a5fc-8612-4871-a52c-8ac93b7f835e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NumArray(dtype: int32)\n",
       "[  0] 17\n",
       "[  1] 38\n",
       "[  2] 125\n",
       "[  3] 25\n",
       "[  4] 2\n",
       "      ...\n",
       "[ 51] 2\n",
       "[ 52] 1\n",
       "[ 53] 3"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sg.degree()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0feb86eb-2fe7-4f52-a9e1-73f6da2a7bbb",
   "metadata": {},
   "outputs": [],
   "source": [
    "sg.nodes.filter()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
