From b0513011f9ff8d0ffe324b91384d18cf012917ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9rome=20Eertmans?= Date: Tue, 28 May 2024 09:07:31 +0200 Subject: [PATCH] chore(docs): bump differt_core --- differt2d/scene.py | 23 +++++++--- docs/source/GFlowNet.ipynb | 92 ++++++++++++++++++++++++++++++-------- docs/source/conf.py | 1 + examples/qt_interactive.py | 1 + pyproject.toml | 2 +- requirements-dev.lock | 2 +- requirements.lock | 2 +- 7 files changed, 94 insertions(+), 29 deletions(-) diff --git a/differt2d/scene.py b/differt2d/scene.py index b99d2bd..d78fe57 100644 --- a/differt2d/scene.py +++ b/differt2d/scene.py @@ -19,11 +19,11 @@ runtime_checkable, ) -import differt_core import equinox as eqx import jax import jax.numpy as jnp from beartype import beartype as typechecker +from differt_core.rt.graph import CompleteGraph from jaxtyping import Array, Float, PRNGKeyArray, UInt, jaxtyped from matplotlib.artist import Artist @@ -888,21 +888,30 @@ def all_path_candidates( Note that it only includes indices for objects. + .. note:: + + Internally, it uses :py:class:`differt_core.rt.graph.CompleteGraph` + to generate the sequence of all path candidates efficiently. + :param min_order: The minimum order of the path, i.e., the number of interactions. :param max_order: The maximum order of the path, i.e., the number of interactions. :return: The list of list of indices. """ - num_primitives = len(self.objects) + num_nodes = len(self.objects) + + graph = CompleteGraph(num_nodes) + + from_ = num_nodes + to = from_ + 1 return [ - path_candidate + jnp.asarray(path_candidate, dtype=jnp.uint32) for order in range(min_order, max_order + 1) - for path_candidate in jnp.asarray( - differt_core.generate_path_candidates(num_primitives, order), - dtype=jnp.uint32, - ).T + for path_candidate in graph.all_paths( + from_, to, order + 2, include_from_and_to=False + ) ] def get_interacting_objects( diff --git a/docs/source/GFlowNet.ipynb b/docs/source/GFlowNet.ipynb index 07d5b44..f42f875 100644 --- a/docs/source/GFlowNet.ipynb +++ b/docs/source/GFlowNet.ipynb @@ -12,10 +12,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "9f9311af", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.\n" + ] + } + ], "source": [ "from collections.abc import Iterator\n", "from typing import Optional\n", @@ -47,10 +55,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "ba065097-559e-49bf-ba45-e1b786af4f7b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABRHklEQVR4nO3deXxU5dn/8c/MJJnsC2QhhEBYXVBBQSJEqrYoVUuhauVRC2pdqqJV+XWRuvCorai1PrSIUlGrz2OtuCBapVhFbRVQFMGisq9hSUgC2UO2Ob8/7kwmw6KZkMyZmXzfr9d5eXI4M3NlhMyV+7rv63ZYlmUhIiIiYhOn3QGIiIhI96ZkRERERGylZERERERspWREREREbKVkRERERGylZERERERspWREREREbKVkRERERGwVZXcA7eHxeNizZw9JSUk4HA67wxEREZF2sCyLqqoqevfujdN59PGPsEhG9uzZQ25urt1hiIiISAcUFhbSp0+fo/55WCQjSUlJgPlmkpOTbY5GRERE2qOyspLc3NzWz/GjCYtkxFuaSU5OVjIiIiISZr5tioUmsIqIiIitlIyIiIiIrZSMiIiIiK2UjIiIiIitlIyIiIiIrZSMiIiIiK2UjIiIiIitlIyIiIiIrZSMiIiIiK0CTkb+/e9/M2HCBHr37o3D4WDRokXf+pgPPviA0047DbfbzaBBg3j22Wc7EKqIiIhEooCTkZqaGoYNG8bcuXPbdf+2bdu48MILOeecc1izZg233XYb1157LW+//XbAwYqIiEjkCXhvmvPPP5/zzz+/3ffPmzeP/v3784c//AGAE044gY8++oj/+Z//Yfz48YG+fKfxeKC01JzHx8O3tM0XERGJOJYFtbXmPD0dnDZN3ujyjfJWrFjBuHHj/K6NHz+e22677aiPqa+vp76+vvXrysrKTo+rtBSysjr9aUVs444+yM3nPsarn17M9pL+docjImGmuBgyM+157S7PgYqKisg65FM/KyuLyspK6urqjviYWbNmkZKS0nrk5uZ2dZgiYe/28/+HR674JU9ec73doYiIBKTLR0Y6YsaMGUyfPr3168rKyk5PSOLjfefFxZCQ0KlPLxJ0se8vgEoYd/J7VJftA7dNv+KISNioqfFVCdp+LgZblycjvXr1ori42O9acXExycnJxMXFHfExbrcbt9vdpXG1nSOS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vzz/Kg+8XMbHzVOg/xWQmKdEREQkwgWUjJSWltLc3ExWVpbf9aysLIqKitr1HL/+9a/p3bu3X0JzqFmzZpGSktJ65ObmBhKm2Mnp4ssDP+S8B9/hhF9+zdx3bsJjmWTC4YD/Gt2bAzU9GTw9mowb4KcLz2DUmO9x86zFkH0e4y+8iBtvvJGf/OQnVFdX2/zNiIhIMAS1w9ODDz7Iiy++yGuvvUZs7NGXWc6YMYOKiorWo7CwMIhRyrHKbmnWun7PCdz87Fwm/uE1lm0czfkPvcX3HtjN5uJSmjwNvP++xbvvLmXJkiU42ox+/OlPf2Lz5s0kescORUQkogU0gTU9PR2Xy0VxcbHf9eLiYr+lmkfyyCOP8OCDD/Luu+9yyimnfOO9brcbt9sdSGgSQsaOhT59YPdu04n9zdUTeXP1xNY/dzjMn48da2OQIiISMgIaGYmJiWHEiBEsXbq09ZrH42Hp0qWMHj36qI97+OGHuf/++1myZAkjR3bhjrASElwu+OMfzfmh0z28X8+ebe4TEREJuEwzffp05s+fz3PPPce6deu48cYbqamp4eqrrwZg6tSpzJgxo/X+hx56iLvvvptnnnmGvLw8ioqKKCoq0nyACHfRRfDKK3Do6u0+fcz1iy6yJy4REQk9AfcZmTx5MiUlJdxzzz0UFRUxfPhwlixZ0jqpdefOnX5tvJ944gkaGhq45JJL/J5n5syZ/Pd///exRS8h7aKLYOJE04F1714zl2TsWI2IiIiIP22Uh/qMiIhI9xSWfUZEREREOpuSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbFVh5KRuXPnkpeXR2xsLPn5+axcufIb73/55Zc5/vjjiY2N5eSTT2bx4sUdClZEREQiT8DJyIIFC5g+fTozZ87k888/Z9iwYYwfP559+/Yd8f7ly5dz2WWXcc0117B69WomTZrEpEmT+PLLL485eBEREQl/DsuyrEAekJ+fz+mnn85jjz0GgMfjITc3l1tuuYU77rjjsPsnT55MTU0Nb775Zuu1M844g+HDhzNv3rx2vWZlZSUpKSlUVFSQnJwcSLhHVV0NSUnmvLgYEhI65WlFRETCRk0NZGWZ86oqSEzs3Odv7+d3VCBP2tDQwKpVq5gxY0brNafTybhx41ixYsURH7NixQqmT5/ud238+PEsWrToqK9TX19PfX1969eVlZWBhNkutbW+c+//CBERke6qtrbzk5H2CqhMU1paSnNzM1mHfHpnZWVRVFR0xMcUFRUFdD/ArFmzSElJaT1yc3MDCVNERETCSEAjI8EyY8YMv9GUysrKTk9I0tNNeQYgPh4cjk59ehERkZBnWb5KQXq6fXEElIykp6fjcrko9n6KtyguLqZXr15HfEyvXr0Cuh/A7XbjdrsDCS1gTidkZnbpS4iIiIQ8u0ozbQVUpomJiWHEiBEsXbq09ZrH42Hp0qWMHj36iI8ZPXq03/0A77zzzlHvFxERke4l4DLN9OnTufLKKxk5ciSjRo1i9uzZ1NTUcPXVVwMwdepUcnJymDVrFgC33norZ511Fn/4wx+48MILefHFF/nss8948sknO/c7ERERkbAUcDIyefJkSkpKuOeeeygqKmL48OEsWbKkdZLqzp07cTp9Ay5jxozhhRde4K677uI3v/kNgwcPZtGiRZx00kmd912IiIhI2Aq4z4gduqLPiIiIiHSt9n5+a28aERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxVcDt4O3gbRJbWVlpcyQiIiLSXt7P7W9r9h4WyUhVVRUAubm5NkciIiIigaqqqiIlJeWofx4We9N4PB727NlDUlISDoej0563srKS3NxcCgsLtedNF9L7HDx6r4ND73Nw6H0Ojq58ny3Loqqqit69e/ttonuosBgZcTqd9OnTp8uePzk5WX/Rg0Dvc/DovQ4Ovc/Bofc5OLrqff6mEREvTWAVERERWykZEREREVt162TE7XYzc+ZM3G633aFENL3PwaP3Ojj0PgeH3ufgCIX3OSwmsIqIiEjk6tYjIyIiImI/JSMiIiJiKyUjIiIiYislIyIiImKriE9G5s6dS15eHrGxseTn57Ny5cpvvP/ll1/m+OOPJzY2lpNPPpnFixcHKdLwFsj7PH/+fMaOHUtaWhppaWmMGzfuW/+/iE+gf6e9XnzxRRwOB5MmTeraACNEoO9zeXk506ZNIzs7G7fbzZAhQ/Tzox0CfZ9nz57NcccdR1xcHLm5udx+++0cPHgwSNGGp3//+99MmDCB3r1743A4WLRo0bc+5oMPPuC0007D7XYzaNAgnn322a4N0opgL774ohUTE2M988wz1ldffWVdd911VmpqqlVcXHzE+5ctW2a5XC7r4Ycftr7++mvrrrvusqKjo621a9cGOfLwEuj7fPnll1tz5861Vq9eba1bt8666qqrrJSUFGvXrl1Bjjz8BPpee23bts3Kycmxxo4da02cODE4wYaxQN/n+vp6a+TIkdYFF1xgffTRR9a2bdusDz74wFqzZk2QIw8vgb7Pf/3rXy2322399a9/tbZt22a9/fbbVnZ2tnX77bcHOfLwsnjxYuvOO++0Fi5caAHWa6+99o33b9261YqPj7emT59uff3119acOXMsl8tlLVmypMtijOhkZNSoUda0adNav25ubrZ69+5tzZo164j3X3rppdaFF17ody0/P9/62c9+1qVxhrtA3+dDNTU1WUlJSdZzzz3XVSFGjI68101NTdaYMWOsp556yrryyiuVjLRDoO/zE088YQ0YMMBqaGgIVogRIdD3edq0adZ3v/tdv2vTp0+3CgoKujTOSNKeZORXv/qVNXToUL9rkydPtsaPH99lcUVsmaahoYFVq1Yxbty41mtOp5Nx48axYsWKIz5mxYoVfvcDjB8//qj3S8fe50PV1tbS2NhIjx49uirMiNDR9/q+++4jMzOTa665Jhhhhr2OvM9vvPEGo0ePZtq0aWRlZXHSSSfxwAMP0NzcHKyww05H3ucxY8awatWq1lLO1q1bWbx4MRdccEFQYu4u7PgsDIuN8jqitLSU5uZmsrKy/K5nZWWxfv36Iz6mqKjoiPcXFRV1WZzhriPv86F+/etf07t378P+8ou/jrzXH330EU8//TRr1qwJQoSRoSPv89atW3nvvfe44oorWLx4MZs3b+amm26isbGRmTNnBiPssNOR9/nyyy+ntLSUM888E8uyaGpq4oYbbuA3v/lNMELuNo72WVhZWUldXR1xcXGd/poROzIi4eHBBx/kxRdf5LXXXiM2NtbucCJKVVUVU6ZMYf78+aSnp9sdTkTzeDxkZmby5JNPMmLECCZPnsydd97JvHnz7A4tonzwwQc88MADPP7443z++ecsXLiQt956i/vvv9/u0OQYRezISHp6Oi6Xi+LiYr/rxcXF9OrV64iP6dWrV0D3S8feZ69HHnmEBx98kHfffZdTTjmlK8OMCIG+11u2bGH79u1MmDCh9ZrH4wEgKiqKDRs2MHDgwK4NOgx15O90dnY20dHRuFyu1msnnHACRUVFNDQ0EBMT06Uxh6OOvM933303U6ZM4dprrwXg5JNPpqamhuuvv54777wTp1O/X3eGo30WJicnd8moCETwyEhMTAwjRoxg6dKlrdc8Hg9Lly5l9OjRR3zM6NGj/e4HeOedd456v3TsfQZ4+OGHuf/++1myZAkjR44MRqhhL9D3+vjjj2ft2rWsWbOm9fjhD3/IOeecw5o1a8jNzQ1m+GGjI3+nCwoK2Lx5c2uyB7Bx40ays7OViBxFR97n2trawxIObwJoaZu1TmPLZ2GXTY0NAS+++KLldrutZ5991vr666+t66+/3kpNTbWKioosy7KsKVOmWHfccUfr/cuWLbOioqKsRx55xFq3bp01c+ZMLe1th0Df5wcffNCKiYmxXnnlFWvv3r2tR1VVlV3fQtgI9L0+lFbTtE+g7/POnTutpKQk6+abb7Y2bNhgvfnmm1ZmZqb129/+1q5vISwE+j7PnDnTSkpKsv72t79ZW7dutf75z39aAwcOtC699FK7voWwUFVVZa1evdpavXq1BViPPvqotXr1amvHjh2WZVnWHXfcYU2ZMqX1fu/S3l/+8pfWunXrrLlz52pp77GaM2eO1bdvXysmJsYaNWqU9fHHH7f+2VlnnWVdeeWVfve/9NJL1pAhQ6yYmBhr6NCh1ltvvRXkiMNTIO9zv379LOCwY+bMmcEPPAwF+ne6LSUj7Rfo+7x8+XIrPz/fcrvd1oABA6zf/e53VlNTU5CjDj+BvM+NjY3Wf//3f1sDBw60YmNjrdzcXOumm26yDhw4EPzAw8j7779/xJ+53vf2yiuvtM4666zDHjN8+HArJibGGjBggPWXv/ylS2N0WJbGtkRERMQ+ETtnRERERMKDkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsdX/B2Yc9kWPShl9AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "ax = plt.gca()\n", "scene = Scene.square_scene_with_obstacle()\n", @@ -76,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "12c60a29", "metadata": {}, "outputs": [], @@ -137,10 +156,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "5eabdeb5-1f97-4745-b4db-bdb17205e7b5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABV/UlEQVR4nO3deXhU5dnH8e9kJ5CEJWQBgiEggoKALJFNUKOgVsWVqhVc0GqtVelbd6VqK9YVq1gquNSqBaWAbcUgouwgsoqyKPuaQIDse+a8fzwhwygwScjkzEl+n+uai+OZ7Z7heObmOfdzPy7LsixEREREbBJkdwAiIiLSuCkZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVuF2B1Adbjdbvbt20dUVBQul8vucERERKQaLMsiLy+PNm3aEBR04vEPRyQj+/btIykpye4wREREpBZ2795Nu3btTni/I5KRqKgowHyY6Ohom6MRERGR6sjNzSUpKanqd/xEHJGMHL00Ex0drWRERETEYXyVWKiAVURERGylZERERERspWREREREbKVkRERERGylZERERERspWREREREbKVkRERERGylZERERERspWREREREbFXjZGThwoVcfvnltGnTBpfLxaxZs3w+Z/78+ZxzzjmEh4fTqVMn3n333VqEKiIiIg1RjZORgoICevTowcSJE6v1+O3bt3PZZZdx/vnns3btWu6//37GjBnDnDlzahysiIiINDw1Xpvmkksu4ZJLLqn24ydNmkSHDh146aWXAOjatSuLFy/mlVdeYdiwYTV9+zpjWVBYaLYjI8FH23wRERHxE7/XjCxbtoy0tDSvfcOGDWPZsmUnfE5JSQm5ublet7pWWAjNmpnb0aRERERE6p/fk5GMjAzi4+O99sXHx5Obm0tRUdFxnzN+/HhiYmKqbklJSf4OU0RERGwSkLNpHnnkEXJycqpuu3fvtjskERER8ZMa14zUVEJCApmZmV77MjMziY6OpkmTJsd9Tnh4OOHh4f4OTURERAKA30dG+vfvz7x587z2zZ07l/79+/v7rUVERMQBapyM5Ofns3btWtauXQuYqbtr165l165dgLnEMmrUqKrH33XXXWzbto0HH3yQTZs28cYbb/DRRx/xwAMP1M0nEBEREUercTKycuVKevXqRa9evQAYO3YsvXr14sknnwRg//79VYkJQIcOHfj000+ZO3cuPXr04KWXXmLKlCm2TusVERGRwOGyLMuyOwhfcnNziYmJIScnh+jo6Dp5zYICM60XID8fmjatk5cVERGRStX9/Q7I2TQiIiLSeCgZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbhdgdgFSPZUFhodmOjASXy954RETk53Surh2NjDhEYSE0a2ZuRw90EREJLDpX146SEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbGVkhERERGxlZIRERERsZWSEREREbFVrZKRiRMnkpycTEREBKmpqaxYseKkj58wYQJnnHEGTZo0ISkpiQceeIDi4uJaBSwiIiINS42TkWnTpjF27FjGjRvH6tWr6dGjB8OGDePAgQPHffyHH37Iww8/zLhx49i4cSNvvfUW06ZN49FHHz3l4EVERMT5apyMvPzyy9xxxx3ceuutnHnmmUyaNInIyEjefvvt4z5+6dKlDBw4kBtvvJHk5GQuvvhibrjhBp+jKSIiItI41CgZKS0tZdWqVaSlpXleICiItLQ0li1bdtznDBgwgFWrVlUlH9u2bWP27NlceumlJ3yfkpIScnNzvW4iIiLSMIXU5MFZWVlUVFQQHx/vtT8+Pp5NmzYd9zk33ngjWVlZDBo0CMuyKC8v56677jrpZZrx48fz1FNP1SQ0ERERcSi/z6aZP38+zz77LG+88QarV69mxowZfPrppzzzzDMnfM4jjzxCTk5O1W337t3+DlNERERsUqORkdjY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zZtH//79j/uc/v37ez0eYO7cuSd8vIiIiDQuNb5MM3bsWEaPHk2fPn3o168fEyZMoKCggFtvvRWAUaNG0bZtW8aPHw/Afffdx5AhQ3jppZe47LLLmDp1KitXruTNN9+s208iIiIijlTjZGTkyJEcPHiQJ598koyMDHr27El6enpVkequXbsICvIMuAwYMIAPP/yQxx9/nEcffZTTTz+dWbNm0a1bt7r7FCIiIuJYNe4zYgd/9BkRERER/6ru77fWphERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVvVuB28HY42ic3NzbU5EhEREamuo7/bvpq9OyIZycvLAyApKcnmSERERKSm8vLyiImJOeH9jlibxu12s2/fPqKionC5XHX2urm5uSQlJbF7926teeNH+p7rj77r+qHvuX7oe64f/vyeLcsiLy+PNm3aeC2i+1OOGBkJCgqiXbt2fnv96OhoHej1QN9z/dF3XT/0PdcPfc/1w1/f88lGRI5SAauIiIjYSsmIiIiI2KpRJyPh4eGMGzeO8PBwu0Np0PQ91x991/VD33P90PdcPwLhe3ZEAauIiIg0XI16ZERERETsp2REREREbKVkRERERGylZERERERs1eCTkYkTJ5KcnExERASpqamsWLHipI//+OOP6dKlCxEREXTv3p3Zs2fXU6TOVpPvefLkyQwePJgWLVrQokUL0tLSfP69iEdNj+mjpk6disvlYsSIEf4NsIGo6fecnZ3NPffcQ2JiIuHh4XTu3Fnnj2qo6fc8YcIEzjjjDJo0aUJSUhIPPPAAxcXF9RStMy1cuJDLL7+cNm3a4HK5mDVrls/nzJ8/n3POOYfw8HA6derEu+++698grQZs6tSpVlhYmPX2229b33//vXXHHXdYzZs3tzIzM4/7+CVLlljBwcHW888/b23YsMF6/PHHrdDQUGv9+vX1HLmz1PR7vvHGG62JEydaa9assTZu3GjdcsstVkxMjLVnz556jtx5avpdH7V9+3arbdu21uDBg60rr7yyfoJ1sJp+zyUlJVafPn2sSy+91Fq8eLG1fft2a/78+dbatWvrOXJnqen3/MEHH1jh4eHWBx98YG3fvt2aM2eOlZiYaD3wwAP1HLmzzJ4923rsscesGTNmWIA1c+bMkz5+27ZtVmRkpDV27Fhrw4YN1muvvWYFBwdb6enpfouxQScj/fr1s+65556q/66oqLDatGljjR8//riPv/76663LLrvMa19qaqr161//2q9xOl1Nv+efKi8vt6Kioqx//OMf/gqxwajNd11eXm4NGDDAmjJlijV69GglI9VQ0+/5b3/7m5WSkmKVlpbWV4gNQk2/53vuuce64IILvPaNHTvWGjhwoF/jbEiqk4w8+OCD1llnneW1b+TIkdawYcP8FleDvUxTWlrKqlWrSEtLq9oXFBREWloay5YtO+5zli1b5vV4gGHDhp3w8VK77/mnCgsLKSsro2XLlv4Ks0Go7Xf99NNPExcXx+23314fYTpebb7n//znP/Tv35977rmH+Ph4unXrxrPPPktFRUV9he04tfmeBwwYwKpVq6ou5Wzbto3Zs2dz6aWX1kvMjYUdv4WOWCivNrKysqioqCA+Pt5rf3x8PJs2bTruczIyMo77+IyMDL/F6XS1+Z5/6qGHHqJNmzY/O/jFW22+68WLF/PWW2+xdu3aeoiwYajN97xt2za+/PJLbrrpJmbPns2WLVv4zW9+Q1lZGePGjauPsB2nNt/zjTfeSFZWFoMGDcKyLMrLy7nrrrt49NFH6yPkRuNEv4W5ubkUFRXRpEmTOn/PBjsyIs7w3HPPMXXqVGbOnElERITd4TQoeXl53HzzzUyePJnY2Fi7w2nQ3G43cXFxvPnmm/Tu3ZuRI0fy2GOPMWnSJLtDa1Dmz5/Ps88+yxtvvMHq1auZMWMGn376Kc8884zdockparAjI7GxsQQHB5OZmem1PzMzk4SEhOM+JyEhoUaPl9p9z0e9+OKLPPfcc3zxxRecffbZ/gyzQajpd71161Z27NjB5ZdfXrXP7XYDEBISwubNm+nYsaN/g3ag2hzTiYmJhIaGEhwcXLWva9euZGRkUFpaSlhYmF9jdqLafM9PPPEEN998M2PGjAGge/fuFBQUcOedd/LYY48RFKR/X9eFE/0WRkdH+2VUBBrwyEhYWBi9e/dm3rx5Vfvcbjfz5s2jf//+x31O//79vR4PMHfu3BM+Xmr3PQM8//zzPPPMM6Snp9OnT5/6CNXxavpdd+nShfXr17N27dqq2xVXXMH555/P2rVrSUpKqs/wHaM2x/TAgQPZsmVLVbIH8MMPP5CYmKhE5ARq8z0XFhb+LOE4mgBaWmatztjyW+i30tgAMHXqVCs8PNx69913rQ0bNlh33nmn1bx5cysjI8OyLMu6+eabrYcffrjq8UuWLLFCQkKsF1980dq4caM1btw4Te2thpp+z88995wVFhZmTZ8+3dq/f3/VLS8vz66P4Bg1/a5/SrNpqqem3/OuXbusqKgo67e//a21efNm63//+58VFxdn/elPf7LrIzhCTb/ncePGWVFRUda//vUva9u2bdbnn39udezY0br++uvt+giOkJeXZ61Zs8Zas2aNBVgvv/yytWbNGmvnzp2WZVnWww8/bN18881Vjz86tfcPf/iDtXHjRmvixIma2nuqXnvtNat9+/ZWWFiY1a9fP2v58uVV9w0ZMsQaPXq01+M/+ugjq3PnzlZYWJh11llnWZ9++mk9R+xMNfmeTzvtNAv42W3cuHH1H7gD1fSYPpaSkeqr6fe8dOlSKzU11QoPD7dSUlKsP//5z1Z5eXk9R+08Nfmey8rKrD/+8Y9Wx44drYiICCspKcn6zW9+Yx05cqT+A3eQr7766rjn3KPf7ejRo60hQ4b87Dk9e/a0wsLCrJSUFOudd97xa4wuy9LYloiIiNinwdaMiIiIiDMoGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERWykZEREREVspGRERERFbKRkRERERW/0/mW1Y1JsyiyoAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "ax = plt.gca()\n", "scene, _ = next(scenes)\n", @@ -156,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "ac336913-6a59-4eda-9ddc-621fc12b9a37", "metadata": {}, "outputs": [], @@ -170,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "ec513edd-a2d1-475e-91b7-81430bf7ab8b", "metadata": {}, "outputs": [], @@ -200,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "c985f39b-501f-4c4a-abdf-474c1568ad8d", "metadata": {}, "outputs": [], @@ -274,6 +304,7 @@ "\n", " # [num_walls, 2x2]\n", " walls = xys[2:, :].reshape(-1, 4)\n", + " num_walls = walls.shape[0]\n", "\n", " indices = jnp.arange(walls.shape[0], dtype=jnp.uint32)\n", "\n", @@ -292,19 +323,19 @@ " Index = UInt[Array, \" \"]\n", "\n", " def scan_fn(carry: Carry, key: PRNGKeyArray) -> tuple[Carry, Index]:\n", - " state, index = carry\n", + " state, prev_probs = carry\n", " key_categorical, key_dropout = jax.random.split(key, 2)\n", - " probs = jax.vmap(self.phi)(walls)\n", + " probs = jax.vmap(self.phi)(walls).exp()\n", + " probs = prob * (1 - prev_probs)\n", " probs = self.dropout(probs, key=key_dropout)\n", - " probs = jnp.where(indices == index, 0, probs)\n", " index = jax.random.categorical(key=key_categorical, logits=probs)\n", "\n", " state = self.cell(jnp.atleast_1d(index), state)\n", "\n", - " return (state, index), index.astype(jnp.uint32)\n", + " return (state, prev_probs), index.astype(jnp.uint32)\n", "\n", " init_state = jnp.zeros(self.hidden_size)\n", - " init = (init_state, -1)\n", + " init = (init_state, jnp.zeros(num_walls))\n", "\n", " (final_state, _), path_candidate = jax.lax.scan(\n", " scan_fn, init, xs=jax.random.split(key, self.order)\n", @@ -325,7 +356,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "7be7b365-8559-4413-8485-a6126cebee45", "metadata": {}, "outputs": [], @@ -377,7 +408,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "6bf67f8a-b55a-4449-bdce-6a1fd6bf25fb", "metadata": {}, "outputs": [], @@ -388,10 +419,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "0b7cb03a-b637-4fc5-bd98-129c48844f7f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "AttributeError", + "evalue": "DynamicJaxprTracer has no attribute exp", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/repositories/DiffeRT/DiffeRT2d/.venv/lib/python3.11/site-packages/jax/_src/core.py:755\u001b[0m, in \u001b[0;36mTracer.__getattr__\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m 754\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 755\u001b[0m attr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maval, name)\n\u001b[1;32m 756\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n", + "\u001b[0;31mAttributeError\u001b[0m: 'ShapedArray' object has no attribute 'exp'", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[10], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mloss\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtraining_model\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mtrain_samples\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mplot\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Untrained model\u001b[39;00m\n", + "Cell \u001b[0;32mIn[8], line 13\u001b[0m, in \u001b[0;36mloss\u001b[0;34m(model, xys, true_path_candidates, plot, num_paths, key)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mloss\u001b[39m(\n\u001b[1;32m 2\u001b[0m model: Model,\n\u001b[1;32m 3\u001b[0m xys: Float[Array, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m2+num_walls*2 2\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 8\u001b[0m key: PRNGKeyArray,\n\u001b[1;32m 9\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Float[Array, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m]:\n\u001b[1;32m 10\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;124;03m Compute the loss of the model on a specific input scene.\u001b[39;00m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 13\u001b[0m pred_path_candidate, confidence \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mxys\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkey\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m plot:\n\u001b[1;32m 16\u001b[0m order \u001b[38;5;241m=\u001b[39m model\u001b[38;5;241m.\u001b[39morder\n", + "File \u001b[0;32m~/repositories/DiffeRT/DiffeRT2d/.venv/lib/python3.11/site-packages/equinox/_module.py:1189\u001b[0m, in \u001b[0;36mPartial.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1176\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 1177\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Call the wrapped `self.func`.\u001b[39;00m\n\u001b[1;32m 1178\u001b[0m \n\u001b[1;32m 1179\u001b[0m \u001b[38;5;124;03m **Arguments:**\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1187\u001b[0m \u001b[38;5;124;03m The result of the wrapped function.\u001b[39;00m\n\u001b[1;32m 1188\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 1189\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkeywords\u001b[49m\u001b[43m)\u001b[49m\n", + " \u001b[0;31m[... skipping hidden 16 frame]\u001b[0m\n", + "Cell \u001b[0;32mIn[7], line 103\u001b[0m, in \u001b[0;36mModel.__call__\u001b[0;34m(self, xys, key)\u001b[0m\n\u001b[1;32m 100\u001b[0m init_state \u001b[38;5;241m=\u001b[39m jnp\u001b[38;5;241m.\u001b[39mzeros(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhidden_size)\n\u001b[1;32m 101\u001b[0m init \u001b[38;5;241m=\u001b[39m (init_state, jnp\u001b[38;5;241m.\u001b[39mzeros(num_walls))\n\u001b[0;32m--> 103\u001b[0m (final_state, _), path_candidate \u001b[38;5;241m=\u001b[39m \u001b[43mjax\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlax\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mscan\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 104\u001b[0m \u001b[43m \u001b[49m\u001b[43mscan_fn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mxs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mjax\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrandom\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msplit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morder\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 105\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 107\u001b[0m confidence \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate_2_confidence(final_state)\n\u001b[1;32m 109\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m path_candidate, confidence\n", + " \u001b[0;31m[... skipping hidden 9 frame]\u001b[0m\n", + "Cell \u001b[0;32mIn[7], line 91\u001b[0m, in \u001b[0;36mModel.__call__..scan_fn\u001b[0;34m(carry, key)\u001b[0m\n\u001b[1;32m 89\u001b[0m state, prev_probs \u001b[38;5;241m=\u001b[39m carry\n\u001b[1;32m 90\u001b[0m key_categorical, key_dropout \u001b[38;5;241m=\u001b[39m jax\u001b[38;5;241m.\u001b[39mrandom\u001b[38;5;241m.\u001b[39msplit(key, \u001b[38;5;241m2\u001b[39m)\n\u001b[0;32m---> 91\u001b[0m probs \u001b[38;5;241m=\u001b[39m \u001b[43mjax\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvmap\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mphi\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwalls\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexp\u001b[49m()\n\u001b[1;32m 92\u001b[0m probs \u001b[38;5;241m=\u001b[39m prob \u001b[38;5;241m*\u001b[39m (\u001b[38;5;241m1\u001b[39m \u001b[38;5;241m-\u001b[39m prev_probs)\n\u001b[1;32m 93\u001b[0m probs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdropout(probs, key\u001b[38;5;241m=\u001b[39mkey_dropout)\n", + "File \u001b[0;32m~/repositories/DiffeRT/DiffeRT2d/.venv/lib/python3.11/site-packages/jax/_src/core.py:757\u001b[0m, in \u001b[0;36mTracer.__getattr__\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m 755\u001b[0m attr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maval, name)\n\u001b[1;32m 756\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 757\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(\n\u001b[1;32m 758\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m has no attribute \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 759\u001b[0m ) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 760\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 761\u001b[0m t \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtype\u001b[39m(attr)\n", + "\u001b[0;31mAttributeError\u001b[0m: DynamicJaxprTracer has no attribute exp" + ] + } + ], "source": [ "loss(training_model, *next(train_samples), plot=True, key=key) # Untrained model" ] diff --git a/docs/source/conf.py b/docs/source/conf.py index 31071c2..d5cf6ae 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -124,6 +124,7 @@ # -- Intersphinx mapping intersphinx_mapping = { + "differt_core": ("https://differt.eertmans.be/latest/", None), "equinox": ("https://docs.kidger.site/equinox/", None), "jax": ("https://jax.readthedocs.io/en/latest", None), "jaxtyping": ("https://docs.kidger.site/jaxtyping/", None), diff --git a/examples/qt_interactive.py b/examples/qt_interactive.py index 2f16f43..cce4425 100644 --- a/examples/qt_interactive.py +++ b/examples/qt_interactive.py @@ -324,6 +324,7 @@ def set_path_cls(method: str) -> None: # Matplotlib figures self.fig = Figure(figsize=(10, 10), tight_layout=True) self.view = FigureCanvas(self.fig) + self.view.setMinimumHeight(200) self.ax = self.fig.add_subplot() # Toolbar above the figure diff --git a/pyproject.toml b/pyproject.toml index a1ed731..f029cce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ classifiers = [ ] dependencies = [ "beartype>=0.17.2", - "differt-core==0.0.5", + "differt-core==0.0.12", "equinox>=0.11.2", "jax>=0.4.7", "jaxtyping>=0.2.24", diff --git a/requirements-dev.lock b/requirements-dev.lock index df89e5a..f312661 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -74,7 +74,7 @@ decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert -differt-core==0.0.5 +differt-core==0.0.12 # via differt2d distlib==0.3.8 # via virtualenv diff --git a/requirements.lock b/requirements.lock index b45f58b..cf0ae45 100644 --- a/requirements.lock +++ b/requirements.lock @@ -19,7 +19,7 @@ contourpy==1.2.1 # via matplotlib cycler==0.12.1 # via matplotlib -differt-core==0.0.5 +differt-core==0.0.12 # via differt2d equinox==0.11.4 # via differt2d