Skip to content

Instantly share code, notes, and snippets.

@ricsi98
Created May 5, 2023 20:22
Show Gist options
  • Save ricsi98/e0e1029844997b8c0ee089a00e9df38f to your computer and use it in GitHub Desktop.
Save ricsi98/e0e1029844997b8c0ee089a00e9df38f to your computer and use it in GitHub Desktop.
Poincaré embeddings for the Karateclub graph
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "bb251a80-b977-409a-a1ee-b944a88fd30a",
"metadata": {},
"outputs": [],
"source": [
"import networkx\n",
"import geoopt\n",
"import torch\n",
"import torch.nn as nn\n",
"import numpy as np\n",
"import random"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "ead8e198-07e7-45ce-a559-6c7cbb92a2ec",
"metadata": {},
"outputs": [],
"source": [
"class KarateClubDataset(torch.utils.data.Dataset):\n",
" \n",
" def __init__(self, num_negatives=1):\n",
" self.graph = networkx.karate_club_graph()\n",
" self.nneg = num_negatives\n",
" \n",
" def __len__(self):\n",
" return len(self.graph)\n",
" \n",
" def __getitem__(self, index):\n",
" node = index\n",
" ns = list(self.graph.neighbors(node))\n",
" neighbors = torch.tensor(ns, dtype=torch.long)\n",
" positives = torch.stack((torch.ones(len(neighbors)) * node, neighbors), dim=1)\n",
" negatives = list(set(self.graph.nodes()).difference(ns))\n",
" negatives = random.choices(negatives, k=len(neighbors) * self.nneg)\n",
" negatives = torch.tensor(negatives, dtype=torch.long)\n",
" negatives = torch.stack((torch.ones(len(negatives)) * node, negatives), dim=1)\n",
" plabels = torch.ones(len(positives), dtype=torch.long)\n",
" nlabels = torch.zeros(len(negatives), dtype=torch.long)\n",
" return torch.cat((positives, negatives), dim=0).long(), torch.cat((plabels, nlabels), dim=0).double()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "8ecd1095-6d9c-48e3-971b-9997aa9d0d5f",
"metadata": {},
"outputs": [],
"source": [
"class PoincareEmbedding(nn.Module):\n",
" \n",
" def __init__(self, c, vocab_size):\n",
" super().__init__()\n",
" self._manifold = geoopt.manifolds.PoincareBall(c, learnable=False)\n",
" data = torch.tensor(np.random.normal(0, 0.45, size=(vocab_size, 2)), dtype=torch.double)\n",
" data = self._manifold.retr(data, torch.tensor([0,0], dtype=torch.double))\n",
" data = geoopt.ManifoldTensor(data, manifold=self._manifold)\n",
" self.w = geoopt.ManifoldParameter(data, requires_grad=True)\n",
"\n",
" def forward(self, ids):\n",
" s0 = ids.shape\n",
" ws = self.w[ids.view(-1)]\n",
" return ws.view(*s0, 2)\n",
" \n",
"\n",
"class Model(nn.Module):\n",
" \n",
" def __init__(self, embedding):\n",
" super().__init__()\n",
" self.embd = embedding\n",
" \n",
" def forward(self, a, b):\n",
" manifold = self.embd._manifold\n",
" va, vb = self.embd(a), self.embd(b)\n",
" return manifold.dist2(va, vb)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "2d1c393e-2b6a-4de0-90ee-86c50bf3b81f",
"metadata": {},
"outputs": [],
"source": [
"ds = KarateClubDataset()\n",
"e = PoincareEmbedding(3, len(ds.graph))\n",
"m = Model(e)\n",
"opt = geoopt.optim.RiemannianSGD(m.parameters(), lr=0.01)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "f0fdaf7d-9a1e-4e7d-b8b2-8f351b67fad6",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"loss: 1.398: 100%|██████████████████████████| 1000/1000 [00:41<00:00, 24.25it/s]\n"
]
}
],
"source": [
"from tqdm import tqdm\n",
"hist = []\n",
"snapshots = []\n",
"MOD = 50\n",
"\n",
"def crit(d2, y):\n",
" return - (y * torch.log(torch.sigmoid(-d2)) + (1-y) * torch.log(torch.sigmoid(d2))).mean()\n",
" \n",
"E = 1000\n",
"for e in (pbar := tqdm(range(E), total=E)):\n",
" if e % MOD == 0:\n",
" snapshots.append(m.embd.w.data.numpy().copy())\n",
" bloss = []\n",
" for batch in range(len(ds)):\n",
" x, y = ds[batch]\n",
" xa, xb = x[:, 0], x[:, 1]\n",
" y_ = m(xa, xb)\n",
" loss = crit(y_, y)\n",
" bloss.append(loss.item())\n",
" opt.zero_grad()\n",
" loss.backward()\n",
" opt.step()\n",
" hist.append(np.mean(bloss))\n",
" pbar.set_description(f\"loss: {np.mean(hist):.3f}\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "6324d2fd-29ab-4141-8332-724b946b68f4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f491dbc1d80>]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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rtGll14qSero6JDH41F1dfWIYxsbG9XR0ZE/ZrS/h+HHkPP000/r1Vdf1SuvvPKBxxjnwtm3b58effRRrVy5Un/xF3+hV155RX/6p38qj8ej5cuX58dqtLE8cawbGhpGPO5yuVRbW8tYD/na176mSCSiCy+8UE6nU5lMRg899JCWLVsmSYxzERRqTDs6OjR37twPPMfwYzU1NROu8awPHyi8FStWaOfOnXr55ZftLuWsc/DgQd1zzz1au3atfD6f3eWc1bLZrK666ip9+9vfliRdccUV2rlzpx577DEtX77c5urOHv/xH/+hn/70p3ryySd1ySWXaMeOHbr33nvV0tLCOJexs37apb6+Xk6n8wNnA3R2dqqpqcmmqqavu+++W88995x+/etfa9asWfn7m5qalEwm1dfXN+L4E8e5qalp1L+H4ceQm1bp6urShz70IblcLrlcLq1fv14/+MEP5HK51NjYyDgXSHNzsy6++OIR91100UU6cOCApONjdbqfHU1NTerq6hrxeDqdVk9PD2M95Ctf+Yq+9rWv6bbbbtOCBQv0uc99Tl/+8pe1atUqSYxzMRRqTIv5s+SsDx8ej0dXXnml1q1bl78vm81q3bp1Wrx4sY2VTS/GGN1999169tln9eKLL36gFXfllVfK7XaPGOddu3bpwIED+XFevHix3njjjRH/w69du1bBYPADHwLl6rrrrtMbb7yhHTt25G9XXXWVli1blv+acS6Ma6655gOni+/evVtz5syRJM2dO1dNTU0jxjoSiWjz5s0jxrqvr0/btm3LH/Piiy8qm81q0aJFJXgXU9/AwIAcjpEfNU6nU9lsVhLjXAyFGtPFixdrw4YNSqVS+WPWrl2rCy64YFJTLpLK51Rbr9drnnjiCfPWW2+ZL3zhC6a6unrE2QA4vS996UsmFAqZl156ybS3t+dvAwMD+WO++MUvmtmzZ5sXX3zRbN261SxevNgsXrw4//jwKaDXX3+92bFjh3n++efNjBkzOAX0DE4828UYxrlQtmzZYlwul3nooYfMnj17zE9/+lMTCATMv/3bv+WPefjhh011dbX5+c9/bl5//XXz6U9/etTTFa+44gqzefNm8/LLL5v58+eX9SmgJ1u+fLmZOXNm/lTbn/3sZ6a+vt7cd999+WMY5/GLRqNm+/btZvv27UaSeeSRR8z27dvN+++/b4wpzJj29fWZxsZG87nPfc7s3LnTPP300yYQCHCq7Xj8/d//vZk9e7bxeDzm6quvNps2bbK7pGlF0qi3xx9/PH/M4OCg+eM//mNTU1NjAoGAueWWW0x7e/uI53nvvffM0qVLjd/vN/X19ebP/uzPTCqVKvG7mV5ODh+Mc+H84he/MJdeeqnxer3mwgsvND/60Y9GPJ7NZs0DDzxgGhsbjdfrNdddd53ZtWvXiGO6u7vN7bffbiorK00wGDR33nmniUajpXwbU1okEjH33HOPmT17tvH5fObcc881X//610ecvsk4j9+vf/3rUX8mL1++3BhTuDF97bXXzLXXXmu8Xq+ZOXOmefjhhwtSv2XMCdvMAQAAFNlZv+YDAABMLYQPAABQUoQPAABQUoQPAABQUoQPAABQUoQPAABQUoQPAABQUoQPAABQUoQPAABQUoQPAABQUoQPAABQUoQPAABQUv8/bBf9xwB/9RsAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.plot(hist)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "cc34cc3f-3b9e-45a2-96fe-bffe4309c3b5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkcAAAGiCAYAAADtImJbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB70klEQVR4nO3deXxU5b0/8M85Z/Z9JpOVhIQAsgiCRY1YW1vlCtW2antbsbao10Jra3sV68K9Vau2df15e9t6r63XrYvVLmpra6kWazcRFEVQAQGBQJLJPvt2luf3R5zjDAlLIJME+Lxfr3lBzpxz5pwZknx4lu8jCSEEiIiIiAgAII/1BRARERGNJwxHREREREUYjoiIiIiKMBwRERERFWE4IiIiIirCcERERERUhOGIiIiIqAjDEREREVERhiMiIiKiIgxHREREREXKGo7+9re/4ROf+ATq6uogSRKefvrpAx7z4osv4gMf+ADsdjumTJmCRx55ZNA+9913H5qamuBwONDS0oK1a9eO/MUTERHRMams4SiVSmHOnDm47777Dmr/HTt24Nxzz8VHP/pRrF+/HldddRW++MUv4k9/+pO5zxNPPIHly5fj5ptvxmuvvYY5c+Zg4cKF6OrqKtdtEBER0TFEGq2FZyVJwlNPPYXzzz9/n/tcf/31+MMf/oA333zT3LZ48WJEo1GsXLkSANDS0oKTTz4ZP/zhDwEAhmGgoaEBX/va13DDDTeU9R6IiIjo6GcZ6wsotnr1aixYsKBk28KFC3HVVVcBAPL5PNatW4cVK1aYz8uyjAULFmD16tX7PG8ul0MulzO/NgwDfX19qKiogCRJI3sTREREVBZCCCQSCdTV1UGWy9f5Na7CUSQSQXV1dcm26upqxONxZDIZ9Pf3Q9f1IffZvHnzPs97++2345ZbbinLNRMREdHo2r17N+rr68t2/nEVjsplxYoVWL58ufl1LBbDxIkTsXv3bvh8vjG8MiIiIjpY8XgcDQ0N8Hq9ZX2dcRWOampq0NnZWbKts7MTPp8PTqcTiqJAUZQh96mpqdnnee12O+x2+6DtPp+P4YiIiOgIU+4hMeOqztH8+fOxatWqkm3PP/885s+fDwCw2WyYN29eyT6GYWDVqlXmPkRERESHo6zhKJlMYv369Vi/fj2Agan669evR2trK4CB7q4lS5aY+3/5y1/Gu+++i+uuuw6bN2/G//zP/+CXv/wlrr76anOf5cuX44EHHsCjjz6KTZs24YorrkAqlcJll11WzlshIiKiY0RZu9VeffVVfPSjHzW/Loz7ueSSS/DII4+go6PDDEoAMGnSJPzhD3/A1Vdfjf/+7/9GfX09/u///g8LFy4097nwwgvR3d2Nm266CZFIBHPnzsXKlSsHDdImIiIiOhSjVudoPInH4/D7/YjFYhxzREREdIQYrd/f42rMEREREdFYYzgiIiIiKsJwRERERFSE4YiIiIioCMMRERERURGGIyIiIqIiDEdERERERRiOiIiIiIowHBEREREVYTgiIiIiKsJwRERERFSE4YiIiIioCMMRERERURGGIyIiIqIiDEdERERERRiOiIiIiIowHBEREREVYTgiIiIiKsJwRERERFSE4YiIiIioCMMRERERURGGIyIiIqIiDEdERERERRiOiIiIiIowHBEREREVYTgiIiIiKsJwRERERFSE4YiIiIioCMMRERERURGGIyIiIqIiDEdERERERRiOiIiIiIowHBEREREVYTgiIiIiKsJwRERERFRkVMLRfffdh6amJjgcDrS0tGDt2rX73PcjH/kIJEka9Dj33HPNfS699NJBzy9atGg0boWIiIiOcpZyv8ATTzyB5cuX4/7770dLSwu+973vYeHChdiyZQuqqqoG7f/kk08in8+bX/f29mLOnDn4zGc+U7LfokWL8PDDD5tf2+328t0EERERHTPK3nJ07733YunSpbjsssswc+ZM3H///XC5XHjooYeG3D8UCqGmpsZ8PP/883C5XIPCkd1uL9kvGAyW+1aIiIjoGFDWcJTP57Fu3TosWLDg/ReUZSxYsACrV68+qHM8+OCDWLx4Mdxud8n2F198EVVVVZg2bRquuOIK9Pb27vMcuVwO8Xi85EFEREQ0lLKGo56eHui6jurq6pLt1dXViEQiBzx+7dq1ePPNN/HFL36xZPuiRYvwk5/8BKtWrcKdd96Jv/71r/jYxz4GXdeHPM/tt98Ov99vPhoaGg79poiIiOioVvYxR4fjwQcfxOzZs3HKKaeUbF+8eLH599mzZ+OEE07A5MmT8eKLL+Kss84adJ4VK1Zg+fLl5tfxeJwBiYiIiIZU1pajcDgMRVHQ2dlZsr2zsxM1NTX7PTaVSuHxxx/H5ZdffsDXaW5uRjgcxrZt24Z83m63w+fzlTyIiIiIhlLWcGSz2TBv3jysWrXK3GYYBlatWoX58+fv99hf/epXyOVy+PznP3/A19mzZw96e3tRW1t72NdMREREx7ayz1Zbvnw5HnjgATz66KPYtGkTrrjiCqRSKVx22WUAgCVLlmDFihWDjnvwwQdx/vnno6KiomR7MpnEtddei5dffhk7d+7EqlWrcN5552HKlClYuHBhuW+HiIiIjnJlH3N04YUXoru7GzfddBMikQjmzp2LlStXmoO0W1tbIculGW3Lli34xz/+geeee27Q+RRFwYYNG/Doo48iGo2irq4OZ599Nm677TbWOiIiIqLDJgkhxFhfxGiLx+Pw+/2IxWIcf0RERHSEGK3f31xbjYiIiKgIwxERERFREYYjIiIioiIMR0RERERFGI6IiIiIijAcERERERVhOCIiIiIqwnBEREREVIThiIiIiKgIwxERERFREYYjIiIioiIMR0RERERFGI6IiIiIijAcERERERVhOCIiIiIqwnBEREREVIThiIiIiKgIwxERERFREYYjIiIioiIMR0RERERFGI6IiIiIijAcERERERVhOCIiIiIqwnBEREREVIThiIiIiKgIwxERERFREYYjIiIioiIMR0RERERFGI6IiIiIijAcERERERVhOCIiIiIqwnBEREREVIThiIiIiKgIwxERERFREYYjIiIioiKjEo7uu+8+NDU1weFwoKWlBWvXrt3nvo888ggkSSp5OByOkn2EELjppptQW1sLp9OJBQsWYOvWreW+DSIiIjoGlD0cPfHEE1i+fDluvvlmvPbaa5gzZw4WLlyIrq6ufR7j8/nQ0dFhPnbt2lXy/F133YXvf//7uP/++7FmzRq43W4sXLgQ2Wy23LdDRERER7myh6N7770XS5cuxWWXXYaZM2fi/vvvh8vlwkMPPbTPYyRJQk1Njfmorq42nxNC4Hvf+x6++c1v4rzzzsMJJ5yAn/zkJ2hvb8fTTz9d7tshIiKio1xZw1E+n8e6deuwYMGC919QlrFgwQKsXr16n8clk0k0NjaioaEB5513Ht566y3zuR07diASiZSc0+/3o6WlZZ/nzOVyiMfjJQ8iIiKioZQ1HPX09EDX9ZKWHwCorq5GJBIZ8php06bhoYcewm9/+1v87Gc/g2EYOO2007Bnzx4AMI8bzjlvv/12+P1+89HQ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R5WVlaisrDzgfvPnz0c0GsW6deswb948AMALL7wAwzDMwHMw1q9fDwCora01z/ud73wHXV1dZrfd888/D5/Ph5kzZw7zboiIiIhKlW1A9owZM7Bo0SIsXboUa9euxT//+U9ceeWVWLx4sTlTra2tDdOnTzdbgrZv347bbrsN69atw86dO/G73/0OS5YswYc//GGccMIJAICzzz4bM2fOxBe+8AW88cYb+NOf/oRvfvOb+OpXv8rWISIiIjpsZS0C+fOf/xzTp0/HWWedhXPOOQenn346fvzjH5vPq6qKLVu2mLPRbDYb/vznP+Pss8/G9OnTcc011+DTn/40nnnmGfMYRVHw+9//HoqiYP78+fj85z+PJUuWlNRFIiIiIjpUZatzNJ6xzhEREdGR54ivc0RERER0JGI4IiIiIirCcERERERUhOGIiIiIqAjDEREREVERhiMiIiKiIgxHREREREUYjoiIiIiKMBwRERERFWE4IiIiIirCcERERERUhOGIiIiIqAjDEREREVERhiMiIiKiIgxHREREREUYjoiIiIiKMBwRERERFWE4IiIiIirCcERERERUhOGIiIiIqAjDEREREVERhiMiIiKiIgxHREREREUYjoiIiIiKMBwRERERFWE4IiIiIirCcERERERUhOGIiIiIqAjDEREREVERhiMiIiKiIgxHREREREUYjoiIiIiKMBwRERERFWE4IiIiIirCcERERERUpKzhqK+vDxdffDF8Ph8CgQAuv/xyJJPJfe6/c+dOSJI05ONXv/qVud9Qzz/++OPlvBUiIiI6RljKefKLL74YHR0deP7556GqKi677DIsW7YMjz322JD7NzQ0oKOjo2Tbj3/8Y9x999342Mc+VrL94YcfxqJFi8yvA4HAiF8/ERERHXvKFo42bdqElStX4pVXXsFJJ50EAPjBD36Ac845B/fccw/q6uoGHaMoCmpqakq2PfXUU/jsZz8Lj8dTsj0QCAzal4iIiOhwla1bbfXq1QgEAmYwAoAFCxZAlmWsWbPmoM6xbt06rF+/Hpdffvmg57761a8iHA7jlFNOwUMPPQQhxD7Pk8vlEI/HSx5EREREQylby1EkEkFVVVXpi1ksCIVCiEQiB3WOBx98EDNmzMBpp51Wsv3WW2/FmWeeCZfLheeeew5f+cpXkEwm8fWvf33I89x+++245ZZbDu1GiIiI6Jgy7JajG264YZ+DpguPzZs3H/aFZTIZPPbYY0O2Gt1444344Ac/iBNPPBHXX389rrvuOtx99937PNeKFSsQi8XMx+7duw/7+oiIiOjoNOyWo2uuuQaXXnrpfvdpbm5GTU0Nurq6SrZrmoa+vr6DGiv061//Gul0GkuWLDngvi0tLbjtttuQy+Vgt9sHPW+324fcTkRERLS3YYejyspKVFZWHnC/+fPnIxqNYt26dZg3bx4A4IUXXoBhGGhpaTng8Q8++CA++clPHtRrrV+/HsFgkAGIiIiIDlvZxhzNmDEDixYtwtKlS3H//fdDVVVceeWVWLx4sTlTra2tDWeddRZ+8pOf4JRTTjGP3bZtG/72t7/h2WefHXTeZ555Bp2dnTj11FPhcDjw/PPP47vf/S6+8Y1vlOtWiIiI6BhS1jpHP//5z3HllVfirLPOgizL+PSnP43vf//75vOqqmLLli1Ip9Mlxz300EOor6/H2WefPeicVqsV9913H66++moIITBlyhTce++9WLp0aTlvhYiIiI4RktjfHPijVDweh9/vRywWg8/nG+vLISIiooMwWr+/ubYaERERURGGIyIiIqIiDEdERERERRiOiIiIiIowHBEREREVYTgiIiIiKsJwRERERFSE4YiIiIioCMMRERERURGGIyIiIqIiDEdERERERRiOiIiIiIowHBEREREVYTgiIiIiKsJwRERERFSE4YiIiIioCMMRERERURGGIyIiIqIiDEdERERERRiOiIiIiIowHBEREREVYTgiIiIiKsJwRERERFSE4YiIiIioCMMRERERURGGIyIiIqIiDEdERERERRiOiIiIiIowHBEREREVYTgiIiIiKsJwRERERFSE4YiIiIioCMMRERERURGGIyIiIqIiDEdERERERRiOiIiIiIqULRx95zvfwWmnnQaXy4VAIHBQxwghcNNNN6G2thZOpxMLFizA1q1bS/bp6+vDxRdfDJ/Ph0AggMsvvxzJZLIMd0BERETHorKFo3w+j8985jO44oorDvqYu+66C9///vdx//33Y82aNXC73Vi4cCGy2ay5z8UXX4y33noLzz//PH7/+9/jb3/7G5YtW1aOWyAiIqJjkCSEEOV8gUceeQRXXXUVotHofvcTQqCurg7XXHMNvvGNbwAAYrEYqqur8cgjj2Dx4sXYtGkT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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.cluster import SpectralClustering\n",
"\n",
"N = 20\n",
"w = m.embd.w.data\n",
"manifold = m.embd._manifold\n",
"\n",
"def snapshot(w, manifold, graph, colors, savename=None):\n",
" edges = set()\n",
" for node in graph:\n",
" for neigh in graph.neighbors(node):\n",
" if (neigh, node) in edges: continue\n",
" edges.add((node, neigh))\n",
" a, b = w[node], w[neigh]\n",
" t = torch.arange(N)/N\n",
" points = manifold.geodesic(t.view(-1,1), a.repeat(N).view(N, 2), b.repeat(N).view(N,2))\n",
" plt.plot(points[:, 0], points[:, 1], c=\"gray\", alpha=0.3, linestyle=\"--\")\n",
" plt.scatter(w[:, 0], w[:, 1], c=colors)\n",
" plt.xlim(-1,1)\n",
" plt.ylim(-1,1)\n",
" if savename is not None:\n",
" plt.savefig(f\"./figs/{savename}.png\", dpi=250)\n",
" plt.clf()\n",
" plt.cla()\n",
" plt.close()\n",
" else:\n",
" plt.show()\n",
" \n",
" \n",
"A = networkx.adjacency_matrix(ds.graph).todense()\n",
"\n",
"sc = SpectralClustering(2, affinity='precomputed', n_init=100)\n",
"sc.fit(A)\n",
"colors = sc.labels_\n",
"\n",
"snapshot(torch.tensor(snapshots[-1]).double(), manifold, ds.graph, colors)"
]
}
],
"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.10.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment