diff --git a/.gitignore b/.gitignore index c3912f7..5950b5c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ wheels/ jax_cache/ .DS_Store + +site/ +slides/ \ No newline at end of file diff --git a/docs/dev.md b/docs/dev.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..45f4821 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,16 @@ +## What is GenJAXMix? +GenJAXMix is Dirichlet Process Mixture Modeling framework written in the JAX-accelerated probabilistic programming language `GenJAX`. Thus it provides a fast implementation to model and infer clusters using DPMMs on the GPU using clean *Genial* programs. + +## Quickstart +Currently GenJAXMix is currently *private*, so please install it directly from Github: + +``` +pip install git+git@github.com:OpenGen/genjaxmix.git +``` + +## For Developers +GenJAXMix uses `uv` for package management and development. To set up GenJAXMix for development, please install `uv` and run +``` +uv sync +``` + diff --git a/docs/reference/api.md b/docs/reference/api.md new file mode 100644 index 0000000..19b9b96 --- /dev/null +++ b/docs/reference/api.md @@ -0,0 +1 @@ +::: src.genjaxmix.dpmm \ No newline at end of file diff --git a/docs/reference/conjugacy.md b/docs/reference/conjugacy.md new file mode 100644 index 0000000..01cbc72 --- /dev/null +++ b/docs/reference/conjugacy.md @@ -0,0 +1 @@ +::: src.genjaxmix.conjugacy \ No newline at end of file diff --git a/docs/reference/inference.md b/docs/reference/inference.md new file mode 100644 index 0000000..64e638f --- /dev/null +++ b/docs/reference/inference.md @@ -0,0 +1 @@ +::: src.genjaxmix.smc \ No newline at end of file diff --git a/docs/tutorials/dpmm_ground_up.ipynb b/docs/tutorials/dpmm_ground_up.ipynb new file mode 100644 index 0000000..62960e4 --- /dev/null +++ b/docs/tutorials/dpmm_ground_up.ipynb @@ -0,0 +1,266 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import jax\n", + "import jax.numpy as jnp\n", + "import matplotlib.pyplot as plt\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "key = jax.random.key(0)\n", + "\n", + "K_true = 4\n", + "D = 2\n", + "N = 1000\n", + "key, subkey = jax.random.split(key)\n", + "mu = jax.random.normal(subkey, (K_true,D))\n", + "\n", + "key, subkey = jax.random.split(key)\n", + "pi_true = jax.random.dirichlet(subkey, jnp.ones(K_true))\n", + "y_labels = jax.random.categorical(subkey, pi_true, shape=(N,))\n", + "key, subkey = jax.random.split(key)\n", + "sigma_hyper = 0.5\n", + "data = jax.random.normal(subkey, (N, D)) * sigma_hyper + mu[y_labels]" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "from dataclasses import dataclass\n", + "from functools import partial\n", + "\n", + "@partial(jax.tree_util.register_dataclass,\n", + " data_fields=('alpha', 'assignments', 'mu', 'pi'),\n", + " meta_fields = ())\n", + "@dataclass\n", + "class Latent:\n", + " alpha: float\n", + " assignments: jax.Array\n", + " mu: jax.Array\n", + " pi: jax.Array\n", + "\n", + "def gibbs_pi(key, data_NL, latent: Latent):\n", + " counts = jax.numpy.bincount(latent.assignments, length=latent.pi.shape[0])\n", + " pi_new = jax.random.dirichlet(key, counts + latent.alpha)\n", + " return Latent(alpha=latent.alpha, assignments=latent.assignments, mu=latent.mu, pi=pi_new)\n", + "\n", + "def gibbs_mu(key, data_nL, latent: Latent, i: int):\n", + " N = jnp.count_nonzero(latent.assignments == i)\n", + " sigma_sq_posterior = 1/(1 + N / sigma_hyper**2)\n", + " x_sum = jnp.sum(data_nL[latent.assignments == i], axis=0)\n", + " mu_posterior = sigma_sq_posterior / sigma_hyper**2 * x_sum\n", + " mu_new = jax.random.normal(key, (D,)) * jnp.sqrt(sigma_sq_posterior) + mu_posterior\n", + " return Latent(alpha=latent.alpha, assignments=latent.assignments, mu=latent.mu.at[i].set(mu_new), pi=latent.pi)\n", + "\n", + "def gibbs_assignments(key, data_nL, latent: Latent, i:int):\n", + " key, subkey = jax.random.split(key)\n", + " pi = latent.pi\n", + " mu = latent.mu\n", + " z_scores = (data_nL[i] - mu) / sigma_hyper\n", + " logp = jax.scipy.stats.norm.logpdf(z_scores)\n", + " logp = jnp.sum(logp, axis=1)\n", + " log_pi = jnp.log(pi)\n", + " logp = logp + log_pi\n", + " key, subkey = jax.random.split(key)\n", + " assignment = jax.random.categorical(subkey, logp)\n", + " new_assignments = latent.assignments.at[i].set(assignment) \n", + " return Latent(alpha=latent.alpha, assignments=new_assignments, mu=latent.mu, pi=latent.pi)\n", + "\n", + "def init(key, N, K_max, D):\n", + " key, subkey = jax.random.split(key)\n", + " mu = jax.random.normal(subkey, (K_max,D))\n", + " key, subkey = jax.random.split(key)\n", + " assignments = jax.random.randint(subkey, (N,), 0, K_max)\n", + " pi = jax.random.dirichlet(key, jax.numpy.ones(K_max))\n", + " return Latent(alpha=1.0, assignments=assignments, mu=mu, pi=pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inference" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Latent(alpha=Array(1., dtype=float32, weak_type=True), assignments=Array([2, 2, 2, 1, 2, 0, 2, 3, 1, 1, 2, 1, 3, 0, 0, 0, 0, 1, 2, 2, 0, 2,\n", + " 3, 2, 1, 3, 0, 1, 2, 3, 1, 2, 3, 3, 2, 0, 0, 3, 2, 0, 3, 3, 2, 1,\n", + " 0, 1, 0, 1, 1, 2, 0, 3, 3, 2, 3, 0, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2,\n", + " 2, 2, 3, 2, 2, 2, 3, 3, 2, 2, 3, 2, 0, 3, 0, 3, 0, 2, 0, 0, 0, 1,\n", + " 1, 2, 2, 1, 1, 3, 2, 3, 1, 3, 2, 3, 3, 2, 1, 0, 2, 3, 2, 1, 0, 3,\n", + " 3, 3, 2, 0, 2, 0, 3, 3, 3, 0, 3, 0, 1, 3, 0, 0, 0, 1, 3, 0, 1, 2,\n", + " 3, 1, 2, 3, 1, 0, 0, 1, 0, 1, 2, 2, 2, 2, 1, 1, 3, 2, 3, 1, 0, 0,\n", + " 3, 3, 1, 2, 0, 1, 1, 1, 2, 0, 1, 1, 2, 2, 0, 0, 0, 0, 1, 0, 3, 2,\n", + " 0, 0, 1, 0, 0, 0, 3, 3, 2, 2, 1, 3, 1, 2, 1, 0, 2, 2, 2, 1, 0, 2,\n", + " 2, 2, 2, 2, 0, 3, 0, 0, 1, 2, 2, 0, 2, 0, 0, 0, 0, 2, 2, 2, 0, 2,\n", + " 3, 2, 2, 2, 2, 2, 1, 0, 1, 2, 3, 1, 2, 2, 0, 1, 2, 0, 1, 3, 1, 0,\n", + " 1, 0, 2, 3, 2, 2, 2, 0, 1, 2, 3, 0, 2, 2, 2, 3, 3, 2, 3, 3, 1, 1,\n", + " 1, 0, 1, 1, 0, 3, 2, 2, 2, 3, 2, 1, 1, 3, 3, 0, 3, 0, 3, 1, 0, 3,\n", + " 2, 1, 3, 3, 1, 3, 1, 1, 0, 0, 3, 0, 1, 2, 0, 1, 1, 3, 0, 2, 1, 2,\n", + " 3, 2, 3, 0, 3, 2, 2, 2, 2, 1, 3, 0, 0, 1, 0, 2, 2, 2, 2, 2, 3, 3,\n", + " 0, 2, 0, 0, 1, 2, 0, 2, 2, 1, 3, 1, 2, 2, 1, 0, 2, 1, 2, 3, 3, 3,\n", + " 1, 1, 1, 1, 1, 0, 2, 0, 0, 2, 1, 0, 2, 0, 1, 0, 3, 0, 3, 1, 0, 1,\n", + " 0, 1, 1, 2, 2, 1, 3, 0, 0, 2, 2, 1, 2, 1, 3, 0, 2, 1, 2, 0, 0, 0,\n", + " 0, 0, 2, 3, 3, 2, 0, 1, 0, 2, 3, 1, 2, 2, 2, 0, 1, 1, 3, 2, 0, 2,\n", + " 3, 3, 2, 1, 0, 1, 2, 3, 2, 0, 1, 0, 1, 0, 3, 3, 1, 2, 0, 3, 3, 1,\n", + " 0, 2, 0, 2, 0, 3, 1, 2, 2, 0, 3, 1, 3, 1, 0, 1, 2, 1, 2, 3, 0, 0,\n", + " 1, 3, 1, 0, 2, 0, 3, 0, 0, 1, 2, 3, 2, 2, 0, 2, 2, 3, 1, 1, 1, 2,\n", + " 1, 0, 1, 3, 1, 1, 3, 1, 0, 3, 0, 2, 0, 1, 3, 0, 0, 2, 2, 3, 3, 0,\n", + " 2, 3, 0, 1, 1, 3, 3, 1, 3, 1, 3, 3, 2, 2, 2, 0, 2, 1, 0, 3, 2, 2,\n", + " 3, 2, 2, 3, 1, 2, 3, 2, 3, 0, 1, 3, 1, 2, 0, 0, 3, 3, 3, 1, 1, 3,\n", + " 0, 2, 0, 2, 2, 0, 1, 2, 2, 2, 2, 0, 2, 1, 3, 0, 3, 2, 2, 1, 3, 0,\n", + " 3, 3, 3, 2, 1, 0, 2, 2, 2, 3, 3, 0, 0, 2, 2, 1, 0, 1, 1, 1, 0, 0,\n", + " 2, 3, 2, 3, 1, 2, 2, 3, 3, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2, 3, 0,\n", + " 1, 2, 2, 1, 1, 2, 1, 0, 3, 2, 0, 0, 2, 1, 3, 0, 1, 3, 0, 0, 0, 3,\n", + " 1, 2, 1, 2, 2, 1, 0, 3, 1, 2, 1, 1, 2, 2, 2, 2, 0, 0, 3, 3, 1, 0,\n", + " 2, 3, 2, 0, 1, 1, 2, 2, 1, 3, 2, 1, 1, 1, 3, 2, 3, 1, 3, 2, 1, 2,\n", + " 1, 3, 1, 1, 1, 0, 1, 2, 3, 0, 2, 0, 1, 0, 0, 0, 3, 2, 0, 0, 3, 0,\n", + " 1, 1, 2, 1, 2, 2, 2, 1, 0, 2, 2, 1, 3, 3, 2, 0, 2, 3, 3, 0, 0, 1,\n", + " 2, 1, 3, 3, 1, 3, 1, 2, 3, 0, 3, 2, 0, 1, 2, 1, 3, 1, 1, 2, 2, 2,\n", + " 3, 0, 2, 2, 3, 1, 3, 0, 2, 2, 3, 3, 2, 3, 2, 0, 2, 2, 3, 2, 1, 2,\n", + " 3, 2, 2, 0, 2, 2, 2, 2, 1, 0, 0, 0, 0, 3, 2, 1, 3, 0, 1, 1, 1, 2,\n", + " 3, 0, 0, 0, 2, 3, 3, 0, 0, 2, 0, 1, 3, 2, 2, 0, 2, 2, 2, 2, 3, 3,\n", + " 3, 2, 3, 1, 2, 3, 0, 2, 3, 0, 3, 2, 1, 0, 0, 3, 1, 1, 0, 2, 0, 2,\n", + " 2, 2, 0, 0, 3, 2, 2, 0, 2, 0, 0, 3, 2, 0, 1, 0, 2, 3, 3, 0, 1, 3,\n", + " 3, 0, 0, 3, 3, 1, 2, 2, 1, 1, 0, 3, 1, 2, 3, 1, 0, 3, 0, 3, 1, 2,\n", + " 0, 3, 1, 1, 2, 1, 3, 2, 2, 1, 2, 2, 2, 0, 1, 0, 3, 3, 3, 1, 2, 0,\n", + " 0, 3, 2, 0, 3, 0, 0, 3, 1, 2, 3, 0, 2, 0, 2, 3, 2, 3, 0, 0, 1, 3,\n", + " 3, 3, 1, 3, 1, 3, 1, 0, 3, 2, 2, 0, 1, 2, 1, 1, 2, 2, 1, 1, 2, 0,\n", + " 1, 1, 2, 2, 0, 0, 0, 3, 1, 0, 1, 0, 3, 2, 2, 1, 3, 2, 0, 3, 3, 2,\n", + " 3, 2, 3, 1, 3, 2, 3, 2, 2, 3, 1, 0, 3, 1, 3, 3, 1, 0, 3, 1, 0, 0,\n", + " 0, 0, 0, 1, 1, 1, 0, 3, 3, 0], dtype=int32), mu=Array([[-0.10152432, 0.4275491 ],\n", + " [-0.189958 , 0.30651692],\n", + " [-0.09727768, 0.32917628],\n", + " [-0.05243107, 0.35936815]], dtype=float32), pi=Array([0.2523054 , 0.23154502, 0.28939706, 0.22556628], dtype=float32))" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def gibbs_pi(key, data_nL, latent: Latent):\n", + " counts = jnp.bincount(latent.assignments, length=latent.pi.shape[0])\n", + " concentrations = jnp.concat([counts, jnp.array([latent.alpha])], axis=0)\n", + " pi_new = jax.random.dirichlet(key, concentrations)[:-1]\n", + " return Latent(alpha=latent.alpha, assignments=latent.assignments, mu=latent.mu, pi=pi_new)\n", + "\n", + "def gibbs_mu(key, data_nL, latent: Latent):\n", + " K = latent.mu.shape[0]\n", + " counts = jnp.bincount(latent.assignments, length=K)\n", + " sigma_sq_posterior = 1/(1 + counts / sigma_hyper**2)\n", + " x_sum = jax.ops.segment_sum(data_nL, latent.assignments, K)\n", + " mu_posterior = sigma_sq_posterior.reshape(-1,1) * x_sum / sigma_hyper**2 \n", + " mu_new = jax.random.normal(key, (K,D)) * jnp.sqrt(sigma_sq_posterior).reshape(-1,1) + mu_posterior\n", + " return Latent(alpha=latent.alpha, assignments=latent.assignments, mu=mu_new, pi=latent.pi)\n", + "\n", + "def gibbs_assignments(key, data_nL, latent: Latent):\n", + " log_pi = jnp.log(latent.pi)\n", + " def pdf(x, mu, log_pi):\n", + " z_scores = (x - mu) / sigma_hyper\n", + " log_p = log_pi + jnp.sum(jax.scipy.stats.norm.logpdf(z_scores))\n", + " return log_p\n", + "\n", + " log_probs = jax.vmap(jax.vmap(pdf, in_axes=(None, 0, 0)), in_axes=(0, None, None))(data_nL, latent.mu, log_pi)\n", + " assignments_new = jax.random.categorical(key, log_probs)\n", + " return Latent(alpha=latent.alpha, assignments=assignments_new, mu=latent.mu, pi=latent.pi)\n", + "\n", + "def gibbs_sweep(key, data, latent):\n", + " key, subkey = jax.random.split(key)\n", + " latent = gibbs_pi(subkey, data, latent)\n", + " latent = gibbs_mu(subkey, data, latent)\n", + " latent = gibbs_assignments(subkey, data, latent)\n", + " return latent\n", + "\n", + "latent = init(key, N, K_true, D)\n", + "gibbs_sweep_jit = jax.jit(gibbs_sweep)\n", + "gibbs_sweep_jit(key, data, latent)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "key = jax.random.key(0)\n", + "latent = init(key, N, K_true, D)\n", + "latent_history = []\n", + "for i in range(100):\n", + " key, subkey = jax.random.split(key)\n", + " latent = gibbs_sweep_jit(subkey, data, latent)\n", + " if i % 10 == 0:\n", + " latent_history.append(latent)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAHHCAYAAABOTAltAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOyddZwU5RvAvzO7t9cJR8PRjXSnSIh0C0r9lFARG0GRFBFQwAAUEVBEukO6pbu767juu72deX9/7N3Ccrt7e0HJfD+fFW/mnfd9ZjbmmSclIYRAQ0NDQ0NDQ+M5Q37aAmhoaGhoaGhoZAZNidHQ0NDQ0NB4LtGUGA0NDQ0NDY3nEk2J0dDQ0NDQ0Hgu0ZQYDQ0NDQ0NjecSTYnR0NDQ0NDQeC7RlBgNDQ0NDQ2N5xJNidHQ0NDQ0NB4LtGUGA0NDQ0NDY3nEk2J0XimadSoEY0aNXraYlgRHBxMp06dyJEjB5IkMWXKlAwdf+3aNSRJYs6cOY9FvidJ4cKF6d27t9NjW7Vqlem1JEli5MiRmTrWZDIxePBgChYsiCzLtGvXLtNyPClGjhyJJEnpjuvduzeFCxd+/AJpaDyDaErMU+DkyZN06tSJoKAg3NzcyJ8/P02bNuWnn356bGv+/fffNm+2d+7cYeTIkRw7duyxrf00iI+PZ+TIkWzfvj3b5/7oo4/YsGEDQ4cOZe7cubz66qvZvoY99uzZw8iRI4mMjHxia2aEM2fOMHLkSK5du/a0RbFi1qxZTJw4kU6dOvHHH3/w0UcfPW2Rngm++eYbVqxY8UTWsvcbpKGRFfRPW4AXjT179vDyyy9TqFAh+vbtS548ebh58yb79u3jhx9+4P33338s6/7999+cOnWKDz/80Gr7nTt3GDVqFIULF6ZSpUqPZe2nQXx8PKNGjQLIdkvO1q1badu2LZ9++mm2zusMe/bsYdSoUfTu3Rs/P78nvv6jnD9/Hll+8Cx05swZRo0aRaNGjbLdOpCQkIBen7mfrK1bt5I/f34mT56crTI973zzzTd06tTpiVim7P0GaWhkBU2JecKMHTsWX19fDh48mOYmdP/+/acj1GMgLi4OT0/Ppy3GY+H+/fvPhALxLODq6vrE1nJzc8v0sdn9ngkhSExMxN3dPc2+xMREDAaDlXKnoaHxmBAaT5RSpUqJRo0aOT1+7ty5onr16sLd3V34+fmJ+vXriw0bNlj2r1ixQrz22msib968wmAwiKJFi4rRo0cLk8lkGdOwYUMBWL2CgoLEtm3b0mwHxOzZsy3H7tu3TzRv3lz4+PgId3d30aBBA7F7924rGUeMGCEAcfr0adGtWzfh5+cnKlWqZPecZs+eLQCxY8cO0a9fPxEQECC8vb1Fjx49RHh4uNXYhg0bioYNG1ptCw4OFv/73/9Erly5hKurq3jppZfEnDlzLPuvXr1q87xGjBjh8FpfvnxZdOrUSfj7+wt3d3dRs2ZNsWbNmjRyP/pyREREhOjVq5fw8fERvr6+omfPnuLo0aNprvPx48dFr169RJEiRYSrq6vInTu36NOnjwgNDbWMSb3Oj76uXr0qhBBi1qxZ4uWXXxaBgYHCYDCIMmXKiGnTpjmUTwghVq5cKQBx/Phxy7YlS5YIQLRv395qbOnSpUWXLl0sfwcFBYlevXo5vD7btm2zjG3ZsqXYtWuXqF69unB1dRVFihQRf/zxR7oyCiHSvIep1+PixYuiV69ewtfXV/j4+IjevXuLuLg4IYT9z0KqTIqiiMmTJ4uyZcsKV1dXkStXLtGvX780n8NU2devXy+qVq0qXF1dxeTJky3fofnz54svv/xS5MuXT0iSJCIiIoQQzn1/hBBi165dolq1asLV1VUULVpU/PLLL5bzS49evXqJoKAgq20TJ04UtWvXFgEBAcLNzU1UqVJFLF68OM31fPSV+l4KIcStW7dEnz59RK5cuYTBYBBly5YVv//+u9Ucqee/cOFC8fXXX4v8+fMLV1dX0bhxY3Hx4kXLOHu/Qan8+OOPomzZspbfuapVq4p58+ale+4aGpol5gkTFBTE3r17OXXqFOXLl3c4dtSoUYwcOZI6deowevRoDAYD+/fvZ+vWrTRr1gyAOXPm4OXlxccff4yXlxdbt25l+PDhREdHM3HiRAC+/PJLoqKiuHXrlsWc7uXlRZkyZRg9ejTDhw+nX79+1K9fH4A6deoAZhN8ixYtqFq1KiNGjECWZWbPnk3jxo3ZtWsXNWrUsJK3c+fOlChRgm+++QYhRLrXYuDAgfj5+TFy5EjOnz/P9OnTuX79Otu3b7cb0JiQkECjRo24dOkSAwcOpEiRIixevJjevXsTGRnJBx98QGBgINOnT+edd96hffv2dOjQAYCXXnrJrizBwcHUqVOH+Ph4Bg0aRI4cOfjjjz9o06YNS5YsoX379jRo0IC5c+fSo0cPmjZtSs+ePR2enxCCtm3bsnv3bgYMGECZMmVYvnw5vXr1SjN206ZNXLlyhT59+pAnTx5Onz7NjBkzOH36NPv27UOSJDp06MCFCxeYP38+kydPJmfOnAAEBgYCMH36dMqVK0ebNm3Q6/WsXr2ad999F1VVee+99+zKWa9ePSRJYufOnZZrtGvXLmRZZvfu3ZZxISEhnDt3joEDB9qcp0GDBgwaNIgff/yRL774gjJlygBY/gW4dOkSnTp14q233qJXr17MmjWL3r17U7VqVcqVK+fwetqjS5cuFClShHHjxnHkyBFmzpxJrly5GD9+PIGBgcydO5exY8cSGxvLuHHjrGTq378/c+bMoU+fPgwaNIirV6/y888/c/ToUf79919cXFws65w/f55u3brRv39/+vbtS6lSpSz7xowZg8Fg4NNPPyUpKQmDweD09+fkyZM0a9aMwMBARo4ciclkYsSIEeTOnTtT1wPghx9+oE2bNrzxxhsYjUYWLFhA586dWbNmDS1btgRg7ty5vP3229SoUYN+/foBUKxYMcD8fahVqxaSJDFw4EACAwP5559/eOutt4iOjk7jEvr222+RZZlPP/2UqKgoJkyYwBtvvMH+/fsB+79BAL/99huDBg2iU6dOfPDBByQmJnLixAn2799P9+7dM30NNF4QnrYW9aKxceNGodPphE6nE7Vr1xaDBw8WGzZsEEaj0WrcxYsXhSzLon379kJRFKt9qqpa/j8+Pj7NGv379xceHh4iMTHRsq1ly5ZpntaEEOLgwYNprAKpa5QoUUI0b948zXpFihQRTZs2tWxLfWLs1q2bU9cg9Ym9atWqVuc9YcIEAYiVK1datj1qiZkyZYoAxF9//WXZZjQaRe3atYWXl5eIjo4WQggREhLilPUllQ8//FAAYteuXZZtMTExokiRIqJw4cJW7wEg3nvvvXTnXLFihQDEhAkTLNtMJpOoX79+mmtu632cP3++AMTOnTst2yZOnGhlfXkYW3M0b95cFC1aNF1Zy5UrZ2VhqVKliujcubMAxNmzZ4UQQixbtiyNxeZhS4wQQixevNjK0vEwQUFBac7n/v37wtXVVXzyySfpyvjo+5n6ufvf//5nNa59+/YiR44cVtsaNmwoypUrZ7Vt165dAkjzxL9+/fo0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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(data[:, 0], data[:, 1], c=latent.assignments, cmap='viridis', alpha=1.0, label='Data points')\n", + "plt.scatter(latent.mu[:, 0], latent.mu[:, 1], c='red', marker='x', s=100, label='Inferred means')\n", + "plt.xlabel('Feature 1')\n", + "plt.ylabel('Feature 2')\n", + "plt.title('Scatter plot of data with inferred latents')\n", + "plt.colorbar(label='Cluster')\n", + "plt.legend()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/tutorials/getting_started.py b/docs/tutorials/getting_started.py new file mode 100644 index 0000000..ec88e95 --- /dev/null +++ b/docs/tutorials/getting_started.py @@ -0,0 +1,58 @@ +# %% [markdown] +# # Test + +# %% [markdown] +# This tutorial introduces Dirichlet Process Mixture Models and explores how to cluster using a simple example. + +# %% [markdown] +# # Dataset +# First we need a dataset. In this tutorial, we will synthetically generate points on on the 2D plane and form small clusters that we expect to later detect during inference. We will generate data using a [Gaussian Mixture Model](https://en.wikipedia.org/wiki/Mixture_model#Gaussian_mixture_model) in pure JAX and later feed in this dataset to GenJAXMix. +# + +# %% +import jax +import matplotlib.pyplot as plt + +key = jax.random.key(0) +K_max = 5 +N = 1000 + +# Generate cluster proportions +betas = jax.random.beta(key, 1.0, 1.0, shape=(K_max, )) +beta_not = jax.lax.cumprod(1 - betas[:-1]) +beta_not = jax.numpy.concatenate([jax.numpy.array([1.0]), beta_not]) +weights = betas * beta_not + +# Generate cluster centers +cluster_centers = jax.random.normal(key, (K_max, 2)) + + +# %% [markdown] +# We follow [the stick-breaking process](https://en.wikipedia.org/wiki/Dirichlet_process#The_stick-breaking_process) description for Dirichlet Process Mixture Models. First we generate the stick lengths which represents the proportion of data points expected to belong to each cluster. We then generate the cluster centers - here we use sample the clusters using normal distributions. + +# %% + +# Sample cluster assignments +cluster_assignments = jax.random.categorical(key, jax.numpy.log(weights), shape=(N,)) + +# Generate data points +data_points = cluster_centers[cluster_assignments] + jax.random.normal(key, (N, 2))/5 + +# Plot the clusters +plt.figure(figsize=(8, 6)) +plt.scatter(data_points[:, 0], data_points[:, 1], c=cluster_assignments, cmap='viridis', alpha=0.6) +plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='red', marker='x', s=100, label='Cluster Centers') +plt.title('Generated Data Points and Cluster Centers') +plt.xlabel('X-axis') +plt.ylabel('Y-axis') +plt.legend() +plt.show() + +# %% [markdown] +# Here we generated 100 data points for five clusters. + +# %% [markdown] +# # Model +# We will now define a Dirichlet Process Mixture Model using GenJAXMix to cluster this dataset. + +# %% \ No newline at end of file diff --git a/docs/tutorials/inferred_clusters_animation.mp4 b/docs/tutorials/inferred_clusters_animation.mp4 new file mode 100644 index 0000000..4618aa0 Binary files /dev/null and b/docs/tutorials/inferred_clusters_animation.mp4 differ diff --git a/docs/tutorials/sub_cluster.ipynb b/docs/tutorials/sub_cluster.ipynb new file mode 100644 index 0000000..aaa76c7 --- /dev/null +++ b/docs/tutorials/sub_cluster.ipynb @@ -0,0 +1,606 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sub-Clusters...." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "import jax\n", + "import jax.numpy as jnp\n", + "from dataclasses import dataclass\n", + "from functools import partial" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "@partial(jax.tree_util.register_dataclass,\n", + " data_fields=('alpha', 'sigma', 'K', 'z', 'mu', 'pi', 'mu_sub', 'pi_sub', 'z_sub'),\n", + " meta_fields = ())\n", + "@dataclass\n", + "class Latent:\n", + " alpha: float\n", + " sigma: float\n", + " K: int\n", + " pi: jax.Array\n", + " mu: jax.Array\n", + " z: jax.Array\n", + " pi_sub: jax.Array\n", + " mu_sub: jax.Array\n", + " z_sub: jax.Array\n", + "\n", + "def init_latent(key, alpha: float, sigma: float, num_data_points: int, dimension: int, K: int, K_max: int):\n", + " if K > K_max:\n", + " raise Exception()\n", + " \n", + " key, *subkeys = jax.random.split(key, 7)\n", + "\n", + " pi = jax.random.dirichlet(subkeys[0], alpha* jnp.ones(K+1))\n", + " pi = jnp.concat([pi, jnp.zeros(K_max-K)])\n", + " mu = jax.random.normal(subkeys[1], shape=(K_max, dimension))\n", + " z = jax.random.categorical(subkeys[2], jnp.ones(K), shape=(num_data_points,))\n", + "\n", + " pi_sub = jax.random.dirichlet(subkeys[3], jnp.ones(2)*alpha, shape=(K_max,))\n", + " mu_sub = jax.random.normal(subkeys[4], shape=(2, K_max, dimension))\n", + " z_sub = jax.random.categorical(subkeys[5], jnp.array([0.5, 0.5]), shape=(num_data_points,))\n", + " return Latent(alpha, sigma, K, pi, mu, z, pi_sub, mu_sub, z_sub)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "def gibbs_pi(key, data, latent: Latent, K: int):\n", + " counts = jnp.bincount(latent.z, length=K)\n", + " concentrations = jnp.concat([counts, latent.alpha * jnp.ones(1)])\n", + " pi = jax.random.dirichlet(key, concentrations)\n", + "\n", + " # this is a hack to avoid nans with jax.random.dirichlet\n", + " pi = jnp.where(pi > 0, pi, 1e-4)\n", + " pi = pi / jnp.sum(pi)\n", + "\n", + " pi = jnp.concat([pi, jnp.zeros(latent.pi.shape[0] - K-1)])\n", + "\n", + " return Latent(latent.alpha, latent.sigma, latent.K, pi, latent.mu, latent.z, latent.pi_sub, latent.mu_sub, latent.z_sub)\n", + "\n", + "def gibbs_mu(key, data_nL, latent: Latent):\n", + " K_max = latent.mu.shape[0]\n", + " sigma_hyper = 1.0\n", + " counts = jnp.bincount(latent.z, length=K_max)\n", + " sigma_sq_posterior = 1/(1 + counts / sigma_hyper**2)\n", + " x_sum = jax.ops.segment_sum(data_nL, latent.z, K_max)\n", + " mu_posterior = sigma_sq_posterior.reshape(-1,1) * x_sum / sigma_hyper**2 \n", + " noise = jax.random.normal(key, (K_max,latent.mu.shape[1]))\n", + " mu_new = noise * jnp.sqrt(sigma_sq_posterior).reshape(-1,1) + mu_posterior\n", + " return Latent(\n", + " alpha=latent.alpha, \n", + " sigma=latent.sigma, \n", + " K=latent.K,\n", + " pi=latent.pi,\n", + " mu=mu_new, \n", + " z=latent.z, \n", + " pi_sub=latent.pi_sub,\n", + " mu_sub=latent.mu_sub,\n", + " z_sub=latent.z_sub,\n", + " )\n", + "\n", + "def gibbs_z(key, data_nL, latent: Latent):\n", + " log_pi = jnp.log(latent.pi)[:-1]\n", + " log_pi = jnp.where(jnp.arange(log_pi.shape[0]) < latent.K, log_pi, -jnp.inf)\n", + " def pdf(x, mu, log_pi):\n", + " z_scores = (x - mu) / latent.sigma\n", + " log_p = log_pi + jnp.sum(jax.scipy.stats.norm.logpdf(z_scores))\n", + " return log_p\n", + "\n", + " log_probs = jax.vmap(jax.vmap(pdf, in_axes=(None, 0, 0)), in_axes=(0, None, None))(data_nL, latent.mu, log_pi)\n", + " z_new = jax.random.categorical(key, log_probs)\n", + " return Latent(\n", + " alpha=latent.alpha, \n", + " sigma=latent.sigma, \n", + " K=latent.K,\n", + " pi=latent.pi,\n", + " mu=latent.mu,\n", + " z=z_new,\n", + " pi_sub=latent.pi_sub,\n", + " mu_sub=latent.mu_sub,\n", + " z_sub=latent.z_sub,\n", + " )\n", + "\n", + "def gibbs_pi_sub(key, data_nL, latent: Latent):\n", + " K_max = latent.pi.shape[0]-1\n", + " idx = latent.z + latent.z_sub * K_max\n", + " counts = jax.ops.segment_sum(jnp.ones(latent.z.shape), idx, 2*K_max)\n", + " counts = counts.reshape(2,K_max).T\n", + " alpha = counts + latent.alpha/2\n", + " pi_sub = jax.random.dirichlet(key, alpha=alpha)\n", + " return Latent(\n", + " alpha=latent.alpha, \n", + " sigma=latent.sigma, \n", + " K=latent.K,\n", + " pi=latent.pi,\n", + " mu=latent.mu,\n", + " z=latent.z,\n", + " pi_sub=pi_sub,\n", + " mu_sub=latent.mu_sub,\n", + " z_sub=latent.z_sub,\n", + " )\n", + "\n", + "\n", + "def gibbs_mu_sub(key, data_nL, latent: Latent):\n", + " K_max = latent.mu.shape[0]\n", + " idx = latent.z + latent.z_sub * K_max\n", + " counts = jax.ops.segment_sum(jnp.ones(latent.z.shape), idx, 2*K_max)\n", + " sigma_hyper = 1.0\n", + " sigma_sq_posterior = 1/(1 + counts / sigma_hyper**2)\n", + " sigma_sq_posterior = sigma_sq_posterior.reshape(-1,1)\n", + "\n", + " x_sum = jax.ops.segment_sum(data_nL, idx, 2*K_max)\n", + " mu_posterior = sigma_sq_posterior * x_sum / sigma_hyper**2 \n", + " D = latent.mu.shape[1]\n", + " mu_sub_new = jax.random.normal(key, (2*K_max,D)) *jnp.sqrt(sigma_sq_posterior) + mu_posterior\n", + " mu_sub_new = mu_sub_new.reshape(2,K_max, D)\n", + " return Latent(\n", + " latent.alpha,\n", + " latent.sigma,\n", + " latent.K,\n", + " latent.pi,\n", + " latent.mu,\n", + " latent.z,\n", + " latent.pi_sub,\n", + " mu_sub_new,\n", + " latent.z_sub\n", + " )\n", + "\n", + "def gibbs_z_sub(key, data_nL, latent: Latent):\n", + " log_pi_sub = jnp.log(latent.pi_sub)\n", + " def log_pdf(x, z, mus, log_pis):\n", + " mu = mus[z]\n", + " log_pi = log_pis[z]\n", + " z_scores = (x - mu) / (latent.sigma)\n", + " log_p = log_pi + jnp.sum(jax.scipy.stats.norm.logpdf(z_scores))\n", + " return log_p\n", + "\n", + "\n", + " sub_func = jax.vmap(log_pdf, in_axes=(None, None, 0, 1))\n", + "\n", + " log_probs = jax.vmap(sub_func, in_axes=(0, 0, None, None))(data_nL, latent.z, latent.mu_sub, log_pi_sub)\n", + " z_sub_new = jax.random.categorical(key, log_probs)\n", + "\n", + " return Latent(\n", + " alpha=latent.alpha, \n", + " sigma=latent.sigma, \n", + " K=latent.K,\n", + " pi=latent.pi,\n", + " mu=latent.mu,\n", + " z=latent.z,\n", + " pi_sub=latent.pi_sub,\n", + " mu_sub=latent.mu_sub,\n", + " z_sub=z_sub_new,\n", + " )\n", + "\n", + "@partial(jax.jit, static_argnames=('K',))\n", + "def gibbs_sweep(key, data_nL, latent: Latent, K: int):\n", + " key, *subkeys = jax.random.split(key, 7)\n", + " latent = gibbs_pi(subkeys[0], data_nL, latent, K)\n", + " latent = gibbs_pi_sub(subkeys[3], data_nL, latent)\n", + " latent = gibbs_mu(subkeys[1], data_nL, latent)\n", + " latent = gibbs_mu_sub(subkeys[4], data_nL, latent)\n", + " latent = gibbs_z(subkeys[2], data_nL, latent)\n", + " latent = gibbs_z_sub(subkeys[5], data_nL, latent)\n", + " return latent\n" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "N = 50\n", + "D = 2\n", + "K = 4\n", + "K_max = 7\n", + "alpha = 2.0\n", + "sigma_obs = 1.00\n", + "\n", + "key = jax.random.key(0)\n", + "key, subkey = jax.random.split(key)\n", + "mu_true = 2*jax.random.normal(subkey, (K, D))\n", + "z_true = jax.random.categorical(subkey, jnp.ones(K), shape=(N,))\n", + "data = jax.random.normal(key, (N, D)) * sigma_obs + mu_true[z_true]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Define colors for clusters\n", + "\n", + "# Plot the data points with inferred clusters\n", + "for k in range(K):\n", + " plt.scatter(data[z_true == k, 0], data[z_true == k, 1], label=f'Cluster {k}')\n", + "\n", + "# Plot the inferred means\n", + "plt.scatter(mu_true[:K, 0], mu_true[:K, 1], color='red', marker='x', s=100, label='Cluster Means')\n", + "\n", + "plt.xlabel('Dimension 1')\n", + "plt.ylabel('Dimension 2')\n", + "plt.legend()\n", + "plt.title('Data Points and Cluster Means')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [], + "source": [ + "latent = init_latent(key, alpha, sigma_obs, N, D, K-1, K_max)\n", + "latent_history = [latent]\n", + "for i in range(10):\n", + " key, subkey = jax.random.split(key)\n", + " latent = gibbs_sweep(subkey, data, latent, K-1)\n", + " latent_history.append(latent)" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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s2u6u7ujUaNGuHHjBvz8/FS+qkqeyvLy8sKECROwefNmvP/++1i1apXadq1bt8axY8dUjh07dgz+/v6wtrau9r0QkeHVMXYARGT6iouLkZWVBalUinv37mHPnj1ITEzEgAEDMGrUKJ2+VkJCAiZPngwnJyeEh4ejuLgYv/zyC/766y/ExMRodI0pU6agf//+8Pf3x19//YXDhw+jdevWatu+//776NKlC+bMmYPXX38dJ06cwBdffKEy46o68vPzkZaWpnycnp6Os2fPwsXFBU2bNq3RtYlIPSY1RFSlPXv2wNPTE3Xq1IGzszPat2+Pzz77DJGRkbCy0m2H77hx42Bvb49Fixbhgw8+gIODA9q1a4cpU6ZofA2pVIro6Gj873//g6OjI8LDw7F06VK1bTt27IgffvgBs2fPxpw5c+Dp6YmPPvoIUVFRNbqPX375BcHBwcrHioQsMjKy3MwqItINQRRF0dhBEBEREdUUa2qIiIjIIjCpISIiIovApIaIiIgsApMaIiIisghMaoiIiMgiMKkhIiIii8CkhoiIiCwCkxoiIiKyCExqiIiIyCIwqSEiIiKLwKSGiIiILAKTGiIiIrII/w/hMmn/csvVggAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Define colors for clusters\n", + "\n", + "# Plot the data points with inferred clusters\n", + "for k in range(K-1):\n", + " plt.scatter(data[latent.z == k, 0], data[latent.z == k, 1], label=f'Inferred Cluster {k}')\n", + "\n", + "# Plot the inferred means\n", + "plt.scatter(latent.mu[:K-1, 0], latent.mu[:K-1, 1], color='red', marker='x', s=100, label='Inferred Means')\n", + "\n", + "plt.xlabel('Dimension 1')\n", + "plt.ylabel('Dimension 2')\n", + "plt.legend()\n", + "plt.title('Data Points and Inferred Cluster Means')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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79023ztg2+/f1O+9oRYaBQ4UJiIiIqvAUENERERWgaGmGRwdHZGSkgJHR0dTl2J0fO+2+d4B237/fO+2+d4B237/lvTebWqgMBEREVkvttQQERGRVWCoISIiIqvAUENERERWgaGGiIiIrAJDjZ5VV1fjwQcfhCAIyM3NNXU5RjNs2DB06NABTk5O8PPzw+jRo3Ht2jVTl2Vwly5dwssvv4yAgAA4OzujU6dOSElJQU1NjalLM4o5c+agX79+cHFxQevWrU1djsEtXboUHTt2hJOTEx566CFkZ2ebuiSD27dvH4YOHYp27dpBEAT88MMPpi7JaNLT09GnTx+4ubnB29sbw4cPx7lz50xdllFkZGQgLCxMueBe3759sW3bNlOX1SiGGj2bNm0a2rVrZ+oyjC4qKgrff/89zp07h/Xr1yM/Px/PPPOMqcsyuLNnz0Imk2HZsmX47bffsHDhQnz22Wf417/+ZerSjKKmpgYjR47EpEmTTF2KwX333XdISkpCSkoKcnJy0KNHD8TGxqKkpMTUpRnUnTt30KNHDyxdutTUpRjdzz//jMTERBw+fBg7d+7E3bt38dhjj+HOnTumLs3g7r//fsybNw+//vorjh07hsGDB+Mf//gHfvvtN1OX1jCR9Gbr1q1ily5dxN9++00EIB4/ftzUJZnMpk2bREEQxJqaGlOXYnTvv/++GBAQYOoyjGrFihWih4eHqcswqIiICDExMVH5WCqViu3atRPT09NNWJVxARA3btxo6jJMpqSkRAQg/vzzz6YuxSTatGkjfvHFF6Yuo0FsqdGT69evY8KECVizZg1cXFxMXY5J3bp1C1999RX69esHBwcHU5djdKWlpfD09DR1GaRHNTU1+PXXXxEdHa08Zmdnh+joaBw6dMiElZExlZaWAoDN/f2WSqX49ttvcefOHfTt29fU5TSIoUYPRFFEQkICJk6ciN69e5u6HJOZPn06XF1d0bZtW1y+fBmbNm0ydUlGl5eXhyVLluDVV181dSmkR7///jukUil8fHxUjvv4+KC4uNhEVZExyWQyTJ06FZGRkejWrZupyzGKkydPolWrVnB0dMTEiROxceNGhIaGmrqsBjHUNCA5ORmCIDT4c/bsWSxZsgR//vknZsyYYeqS9Urb96/w9ttv4/jx49ixYwfs7e0xZswYiBa6YLWu7x0Arl69iri4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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import matplotlib.animation as animation\n", + "\n", + "fig, ax = plt.subplots()\n", + "\n", + "def update(frame):\n", + " ax.clear()\n", + " latent = latent_history[frame]\n", + " for k in range(K-1):\n", + " # for k in range(K):\n", + " ax.scatter(data[latent.z == k, 0], data[latent.z == k, 1], label=f'Inferred Cluster {k}')\n", + " # ax.scatter(latent.mu[:K, 0], latent.mu[:K, 1], color='red', marker='x', s=100, label='Inferred Means')\n", + " ax.scatter(latent.mu[:K-1, 0], latent.mu[:K-1, 1], color='red', marker='x', s=100, label='Inferred Means')\n", + " ax.set_xlabel('Dimension 1')\n", + " ax.set_ylabel('Dimension 2')\n", + " ax.legend()\n", + " ax.set_title(f'Iteration {frame}')\n", + "\n", + "ani = animation.FuncAnimation(fig, update, frames=len(latent_history), repeat=False)\n", + "ani.save('inferred_clusters_animation.mp4', writer='ffmpeg')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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2KeZ6/Fy1k1Eto+BiIgKZfv27Thx4gRefPFFkx2zVKlSKFOmDC5evIiKFStmuxQUvHIKCQnByJEjsWbNGrz++utYsGCB3v2qVauGffv2Zdu2b98+VK5cGc7OzoV+LkRkW1yULoCIrF96ejpu3rwJtVqNW7duITY2FjNnzkTnzp0xcOBAkz5WTEwMxo8fD39/f3To0AHp6en4559/cP/+fUyaNMmgY0ycOBFRUVGoXLky7t+/jx07dqBatWp693399dfxzDPP4L333kPv3r3x119/4euvv842sq0wUlJScP78ed31S5cu4dixYyhevDjKly9fpGMTkekxEBFRgWJjYxEcHAwXFxcEBASgTp06mD17NgYNGgQnJ9M2NA8bNgxeXl6YNWsWJk+eDG9vb9SqVQsTJ040+BhqtRpjxozBtWvX4Ofnhw4dOuCLL77Qu2/9+vWxatUqTJ8+He+99x6Cg4Px7rvvYvDgwUV6Hv/88w9atWqlu64Nc4MGDco1go2IlKcSQgiliyAiIiJSEvsQERERkcNjICIiIiKHx0BEREREDo+BiIiIiBweAxERERE5PAYiIiIicngMREREROTwGIiIiIjI4TEQERERkcNjICIiIiKHx0BEREREDo+BiIiIiBze/wMnWLVPBS5msQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as patches\n", + "\n", + "# Define markers and colors\n", + "markers = ['o', 's', 'D', '^', 'v', '<', '>']\n", + "colors = ['blue', 'green', 'orange', 'purple', 'brown', 'pink', 'gray']\n", + "# Add index labels near the means\n", + "for k in range(K-1):\n", + " plt.text(latent.mu[k, 0], latent.mu[k, 1], f'{k}', fontsize=12, color='red', ha='right')\n", + " for j in range(2):\n", + " idx = (latent.z == k) & (latent.z_sub == j)\n", + " plt.scatter(data[idx, 0], data[idx, 1], label=f'Inferred Cluster {k}-{j}', marker=markers[k % len(markers)])\n", + "\n", + " # Plot the inferred means\n", + " plt.scatter(latent.mu[k, 0], latent.mu[k, 1], color=colors[k], marker='x', s=100, label=f'Inferred Mean {k}')\n", + " \n", + " # Plot the circle indicating one standard deviation away\n", + " circle = patches.Circle((latent.mu[k, 0], latent.mu[k, 1]), radius=latent.sigma, fill=False, edgecolor='red', linestyle='--')\n", + " plt.gca().add_patch(circle)\n", + "\n", + " # Plot the inferred means for subclusters\n", + " for j in range(2):\n", + " plt.scatter(latent.mu_sub[j, k, 0], latent.mu_sub[j, k, 1], color=colors[k], marker='+', s=100, label=f'Inferred Subcluster Mean {k}-{j}')\n", + "\n", + "\n", + "plt.xlabel('Dimension 1')\n", + "plt.ylabel('Dimension 2')\n", + "# plt.legend()\n", + "plt.title('Data and Inferred Clusters with One Standard Deviation Circles')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [], + "source": [ + "def marginal_loglikelihood_sufficient_statistics(\n", + " x_mean:jax.Array, \n", + " x_sum_sq:jax.Array, \n", + " N:int, \n", + " sigma_sq: float, \n", + " mu_0: float, \n", + " sigma_sq_0: float\n", + " ):\n", + " c = 0.5*jnp.log(sigma_sq) - 0.5 * (N*jnp.log(2 * jnp.pi * sigma_sq) + jnp.log(N*sigma_sq_0 + sigma_sq))\n", + "\n", + " A = -x_sum_sq / (2 * sigma_sq) - mu_0**2 / 2 / sigma_sq_0\n", + "\n", + " denom = 2*(N * sigma_sq_0 + sigma_sq)\n", + " numer = sigma_sq_0 * N**2 * x_mean**2 / sigma_sq + sigma_sq * mu_0**2 / sigma_sq_0 + 2 * N * x_mean * mu_0\n", + " B = denom / numer\n", + " return c + A + B\n", + "\n", + "def marginal_loglikelihood(x, sigma_sq, mu_0, sigma_sq_0):\n", + " x_mean = jnp.mean(x, axis=0)\n", + " x_sum_sq = jnp.sum(x**2, axis=0)\n", + "\n", + " N = x.shape[0]\n", + " return marginal_loglikelihood_sufficient_statistics(x_mean, x_sum_sq, N, sigma_sq, mu_0, sigma_sq_0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [], + "source": [ + "def mh_split(key, data, latent):\n", + " K_max = latent.pi.shape[0]-1\n", + " idx = latent.z + latent.z_sub * K_max\n", + "\n", + " sub_counts = jax.ops.segment_sum(jnp.ones(latent.z.shape), idx, 2*K_max)\n", + " counts = jnp.bincount(latent.z, length=K_max)\n", + "\n", + " x_sum_sub = jax.ops.segment_sum(data, idx, 2*K_max)\n", + " x_mean_sub = x_sum_sub / sub_counts.reshape(-1, 1)\n", + " x_sum_sq_sub = jax.ops.segment_sum(data**2, idx, 2*K_max)\n", + "\n", + " x_sum = jax.ops.segment_sum(data, latent.z, K_max)\n", + " x_sum_sq = jax.ops.segment_sum(data**2, latent.z, K_max)\n", + " x_mean = x_sum / counts.reshape(-1, 1)\n", + "\n", + " log_p_sub = jax.vmap(\n", + " marginal_loglikelihood_sufficient_statistics, \n", + " in_axes=(0, 0, 0, None, None, None))(x_mean_sub, x_sum_sq_sub, sub_counts, latent.sigma, 0.0, 1.0)\n", + " \n", + " log_p_sub = jnp.where(jnp.isnan(log_p_sub), 0.0, log_p_sub)\n", + " log_p_sub = jnp.sum(log_p_sub, axis=1)\n", + " log_p_sub = jnp.sum(log_p_sub.reshape(2, K_max), axis=0)\n", + "\n", + " log_p = jax.vmap(\n", + " marginal_loglikelihood_sufficient_statistics, \n", + " in_axes=(0, 0, 0, None, None, None))(x_mean, x_sum_sq, counts, latent.sigma, 0.0, 1.0)\n", + " log_p = jnp.where(jnp.isnan(log_p), 0.0, log_p)\n", + " log_p = jnp.sum(log_p, axis=1)\n", + "\n", + " sub_counts = sub_counts.reshape(2, K_max).T\n", + " ratio = jnp.log(latent.alpha) + jnp.sum(jax.scipy.special.gammaln(sub_counts), axis=1) - jax.scipy.special.gammaln(counts)\n", + " ratio = ratio + log_p_sub\n", + " ratio = ratio - log_p\n", + " ratio = jnp.where(jnp.isnan(ratio), -jnp.inf, ratio)\n", + " ratio = jnp.where(ratio > 0, 0, ratio)\n", + " ratio = jnp.where(ratio == jnp.inf, 0, ratio)\n", + " ratio = jnp.exp(ratio)\n", + " accepts = jax.random.uniform(key, (ratio.shape[0],)) < ratio\n", + " return accepts\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0 1 2]\n" + ] + }, + { + "data": { + "text/plain": [ + "Latent(alpha=Array(2., dtype=float32, weak_type=True), sigma=Array(1., dtype=float32, weak_type=True), K=Array(3, dtype=int32, weak_type=True), pi=Array([0.18095681, 0.37822875, 0.41257277, 0.0282417 , 0. ,\n", + " 0. , 0. , 0. ], dtype=float32), mu=Array([[ 0.48372495, -1.3636018 ],\n", + " [-1.2735299 , -0.40752804],\n", + " [ 0.4500947 , 2.032709 ],\n", + " [ 1.6798486 , -0.25979078],\n", + " [ 0.96907634, -0.7511777 ],\n", + " [-0.5653657 , -0.5354302 ],\n", + " [-0.9029019 , 0.92294025]], dtype=float32), z=Array([2, 1, 0, 0, 1, 2, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 0, 2, 1, 2, 0, 2,\n", + " 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 0, 1, 2, 1, 2, 0, 1, 2, 2, 0, 2, 1,\n", + " 1, 2, 2, 2, 0, 0], dtype=int32), pi_sub=Array([[0.8971081 , 0.1028919 ],\n", + " [0.796864 , 0.203136 ],\n", + " [0.5158339 , 0.48416606],\n", + " [0.8963228 , 0.10367718],\n", + " [0.7453937 , 0.25460625],\n", + " [0.1640812 , 0.8359188 ],\n", + " [0.9295871 , 0.07041288]], dtype=float32), mu_sub=Array([[[ 0.87291455, -0.673888 ],\n", + " [-0.7061761 , -1.2426327 ],\n", + " [-0.511562 , 2.012715 ],\n", + " [ 0.4797941 , 1.4037753 ],\n", + " [ 0.61419064, -0.07170032],\n", + " [-1.1396977 , -2.082589 ],\n", + " [-0.8026148 , 0.24177451]],\n", + "\n", + " [[-1.013991 , 0.13363044],\n", + " [-3.0499272 , 0.30812076],\n", + " [ 1.3946197 , 1.7848582 ],\n", + " [-1.3476132 , 0.19613343],\n", + " [-0.6585017 , 1.8039787 ],\n", + " [ 0.52953553, -0.08053942],\n", + " [ 1.1491245 , -0.4790153 ]]], dtype=float32), z_sub=Array([1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0,\n", + " 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1,\n", + " 0, 0, 1, 0, 0, 0], dtype=int32))" + ] + }, + "execution_count": 207, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def normalize_latent(latent, K):\n", + " z = latent.z\n", + " unique_vals = jnp.unique(z, size=K, fill_value=1000000000)\n", + " # print(unique_vals)\n", + "\n", + " # latent.mu[]\n", + " z_new = jnp.searchsorted(unique_vals, z, method='sort')\n", + "\n", + " pi = latent.pi\n", + " return Latent(\n", + " latent.alpha,\n", + " latent.sigma,\n", + " latent.K,\n", + " latent.pi,\n", + " latent.mu,\n", + " z_new,\n", + " latent.pi_sub,\n", + " latent.mu_sub,\n", + " latent.z_sub\n", + " )\n", + "\n", + "normalize_latent(latent, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 209, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Array([1, 2, 3, 5], dtype=int32)" + ] + }, + "execution_count": 209, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "jnp.unique(jnp.array([5,3,1,2]), fill_value=100)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/clean.ipynb b/examples/clean.ipynb new file mode 100644 index 0000000..bc55c65 --- /dev/null +++ b/examples/clean.ipynb @@ -0,0 +1,207 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Platform 'METAL' is experimental and not all JAX functionality may be correctly supported!\n", + "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n", + "W0000 00:00:1732727905.549339 19028456 mps_client.cc:510] WARNING: JAX Apple GPU support is experimental and not all JAX functionality is correctly supported!\n", + "I0000 00:00:1732727905.563482 19028456 service.cc:145] XLA service 0x109fdd760 initialized for platform METAL (this does not guarantee that XLA will be used). Devices:\n", + "I0000 00:00:1732727905.563494 19028456 service.cc:153] StreamExecutor device (0): Metal, \n", + "I0000 00:00:1732727905.564831 19028456 mps_client.cc:406] Using Simple allocator.\n", + "I0000 00:00:1732727905.564845 19028456 mps_client.cc:384] XLA backend will use up to 11452858368 bytes on device 0 for SimpleAllocator.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metal device set to: Apple M1 Pro\n", + "\n", + "systemMemory: 16.00 GB\n", + "maxCacheSize: 5.33 GB\n", + "\n" + ] + } + ], + "source": [ + "import jax\n", + "# import genjaxmix.dpmm as dpmm\n", + "from genjaxmix import generate\n", + "from genjax import pretty\n", + "pretty()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "StaticTrace(\n", + " gen_fn=StaticGenerativeFunction(\n", + " source=Closure(dyn_args=(), fn=.dpmm at 0x128690a40>),\n", + " ),\n", + " args=(\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ),\n", + " retval=(\n", + " ,\n", + " ,\n", + " ,\n", + " ),\n", + " addresses=AddressVisitor(visited=[('pi',), ('hyperparameters',), ('assignments',)]),\n", + " subtraces=[StaticTrace(gen_fn=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), args=(,), retval=, addresses=AddressVisitor(visited=[('pi',)]), subtraces=[DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x128529580>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x128529760>)), args=(, ), value=, score=)]), StaticTrace(gen_fn=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), args=(, , , ), retval=(, , ), addresses=AddressVisitor(visited=[('sigma',), ('mu',), ('logp',)]), subtraces=[DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x12852aa20>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x12852aac0>)), args=(, ), value=, score=), DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x12852b880>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x12852b920>)), args=(, ), value=, score=), DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x12852a200>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x12852a2a0>)), args=(,), value=, score=)]), DimapTrace(gen_fn=DimapCombinator(inner=VmapCombinator(gen_fn=DimapCombinator(inner=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), argument_mapping=. at 0x128690900>, retval_mapping=. at 0x128690ae0>, info=None), in_axes=(0, None)), argument_mapping=. at 0x128690c20>, retval_mapping=. at 0x128690d60>, info=None), inner=VmapTrace(gen_fn=VmapCombinator(gen_fn=DimapCombinator(inner=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), argument_mapping=. at 0x128690900>, retval_mapping=. at 0x128690ae0>, info=None), in_axes=(0, None)), inner=DimapTrace(gen_fn=DimapCombinator(inner=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), argument_mapping=. at 0x128690900>, retval_mapping=. at 0x128690ae0>, info=None), inner=StaticTrace(gen_fn=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), args=(, , , ), retval=(, , ), addresses=AddressVisitor(visited=[('c',), ('y1',), ('y2',)]), subtraces=[DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x12852bd80>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x12852be20>)), args=(,), value=, score=), DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x12852b880>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x12852b920>)), args=(, ), value=, score=), DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x12852bd80>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x12852be20>)), args=(,), value=, score=)]), args=(, (, , , )), retval=(, , )), args=(, (, , , )), score=, chm=Static({'c': Choice(v=), 'y1': Choice(v=), 'y2': Choice(v=)}), dim_length=7), args=(, , , ), retval=(, , ))],\n", + ")" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "key = jax.random.key(0)\n", + "\n", + "model = generate(N_max=7)\n", + "tr = jax.jit(model.simulate)(key, (1.0, 0.0, 1.0, 3.0, 0.5))\n", + "tr" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Old parameters\n", + "mu [-0.6985804 -0.8248212 0.21795563 0.83772683 -1.0604821 ]\n", + "sigma [0.3464867 0.3496993 0.340931 0.37010777 0.25367144]\n", + "logp [[0.09438226 0.00282767 0.04096948 0.08485078 0.0489018 0.49663323\n", + " 0.23143476]\n", + " [0.13750365 0.13743183 0.1123658 0.38792682 0.02242342 0.04836479\n", + " 0.15398356]\n", + " [0.162733 0.0838028 0.10103215 0.16631661 0.1136003 0.26927957\n", + " 0.10323555]\n", + " [0.07585612 0.11168033 0.42487857 0.1220006 0.21683493 0.04375059\n", + " 0.00499873]\n", + " [0.2314116 0.0582075 0.02395316 0.00416281 0.02321914 0.21533836\n", + " 0.4437075 ]]\n", + "\n", + "New parameters\n", + "mu [-0.6111581 -0.4638838 0.41751742 3.9061658 -0.45953447]\n", + "sigma [0.35883906 0.35544455 0.40168008 5.6444116 1.1374482 ]\n", + "logp [[0.02781614 0.00530343 0.06577533 0.06104895 0.03928433 0.46402544\n", + " 0.33674636]\n", + " [0. 0.50572026 0.36900312 0.12527657 0. 0.\n", + " 0. ]\n", + " [0.07929692 0.17245011 0. 0. 0.15229306 0.39758736\n", + " 0.19837251]\n", + " [1. 0. 0. 0. 0. 0.\n", + " 0. ]\n", + " [0. 0. 0. 1. 0. 0.\n", + " 0. ]]\n" + ] + } + ], + "source": [ + "from genjaxmix.rejuvenation import gibbs_move, propose_parameters\n", + "from genjax._src.core.interpreters.incremental import Diff\n", + "\n", + "key = jax.random.key(3)\n", + "model = generate(100)\n", + "model_args = (1.0, 0.0, 1.0, 3.0, 0.5)\n", + "tr = model.simulate(key, model_args)\n", + "obs = tr.get_choices()(\"assignments\")\n", + "\n", + "# print(\"Data \", obs[:, \"y2\"])\n", + "# print(\"c = \", obs[:,\"c\"])\n", + "print(\"Old parameters\")\n", + "print(\"mu \", tr.get_choices()[\"hyperparameters\", \"mu\"])\n", + "print(\"sigma \", tr.get_choices()[\"hyperparameters\", \"sigma\"])\n", + "print(\"logp \", tr.get_choices()[\"hyperparameters\", \"logp\"])\n", + "key, *subkeys = jax.random.split(key, 5)\n", + "tr_new = gibbs_move(model, propose_parameters, model_args, tr, obs, subkeys[0])\n", + "tr_new = gibbs_move(model, propose_parameters, model_args, tr_new, obs, subkeys[1])\n", + "tr_new = gibbs_move(model, propose_parameters, model_args, tr_new, obs, subkeys[2])\n", + "tr_new = gibbs_move(model, propose_parameters, model_args, tr_new, obs, subkeys[3])\n", + "# print(tr_new)\n", + "print()\n", + "print(\"New parameters\")\n", + "print(\"mu \", tr_new.get_choices()[\"hyperparameters\", \"mu\"])\n", + "print(\"sigma \", tr_new.get_choices()[\"hyperparameters\", \"sigma\"])\n", + "print(\"logp \", tr_new.get_choices()[\"hyperparameters\", \"logp\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/vector.ipynb b/examples/vector.ipynb new file mode 100644 index 0000000..a4977cb --- /dev/null +++ b/examples/vector.ipynb @@ -0,0 +1,264 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Platform 'METAL' is experimental and not all JAX functionality may be correctly supported!\n", + "WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n", + "W0000 00:00:1732740992.297821 19079572 mps_client.cc:510] WARNING: JAX Apple GPU support is experimental and not all JAX functionality is correctly supported!\n", + "I0000 00:00:1732740992.315939 19079572 service.cc:145] XLA service 0x13f419b70 initialized for platform METAL (this does not guarantee that XLA will be used). Devices:\n", + "I0000 00:00:1732740992.315961 19079572 service.cc:153] StreamExecutor device (0): Metal, \n", + "I0000 00:00:1732740992.317166 19079572 mps_client.cc:406] Using Simple allocator.\n", + "I0000 00:00:1732740992.317172 19079572 mps_client.cc:384] XLA backend will use up to 11452858368 bytes on device 0 for SimpleAllocator.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metal device set to: Apple M1 Pro\n", + "\n", + "systemMemory: 16.00 GB\n", + "maxCacheSize: 5.33 GB\n", + "\n" + ] + } + ], + "source": [ + "import jax\n", + "import jax.numpy as jnp\n", + "import genjaxmix.vectorized as vectorized\n", + "from genjax import pretty\n", + "pretty()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "StaticTrace(\n", + " gen_fn=StaticGenerativeFunction(\n", + " source=Closure(dyn_args=(), fn=.dpmm at 0x33b771c60>),\n", + " ),\n", + " args=(\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ),\n", + " retval=(\n", + " ,\n", + " ,\n", + " ),\n", + " addresses=AddressVisitor(\n", + " visited=[('pi',), ('hyperparameters',), ('assignments',)],\n", + " ),\n", + " subtraces=[StaticTrace(gen_fn=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), args=(,), retval=, addresses=AddressVisitor(visited=[('pi',)]), subtraces=[DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x3069256c0>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x3069258a0>)), args=(, ), value=, score=)]), StaticTrace(gen_fn=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), args=(, , , , ), retval=(, ), addresses=AddressVisitor(visited=[('sigma',), ('mu',)]), subtraces=[DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x306926b60>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x306926c00>)), args=(, ), value=, score=), DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x3069279c0>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x306927a60>)), args=(, ), value=, score=)]), DimapTrace(gen_fn=DimapCombinator(inner=VmapCombinator(gen_fn=DimapCombinator(inner=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), argument_mapping=. at 0x319a47560>, retval_mapping=. at 0x32d1e5440>, info=None), in_axes=(0, None)), argument_mapping=. at 0x3338dd760>, retval_mapping=. at 0x317c437e0>, info=None), inner=VmapTrace(gen_fn=VmapCombinator(gen_fn=DimapCombinator(inner=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), argument_mapping=. at 0x319a47560>, retval_mapping=. at 0x32d1e5440>, info=None), in_axes=(0, None)), inner=DimapTrace(gen_fn=DimapCombinator(inner=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), argument_mapping=. at 0x319a47560>, retval_mapping=. at 0x32d1e5440>, info=None), inner=StaticTrace(gen_fn=StaticGenerativeFunction(source=Closure(dyn_args=(), fn=)), args=(, , ), retval=(, ), addresses=AddressVisitor(visited=[('c',), ('y1',)]), subtraces=[DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x306927ec0>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x306927f60>)), args=(,), value=, score=), DistributionTrace(gen_fn=ExactDensityFromCallables(sampler=Closure(dyn_args=(), fn=.sampler at 0x3069279c0>), logpdf_evaluator=Closure(dyn_args=(), fn=.logpdf at 0x306927a60>)), args=(, ), value=, score=)]), args=(, (, , )), retval=(, )), args=(, (, , )), score=, chm=Static({'c': Choice(v=), 'y1': Choice(v=)}), dim_length=1000), args=(, , ), retval=(, ))],\n", + ")" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "key = jax.random.key(0)\n", + "\n", + "model = vectorized.generate(N_max=1000)\n", + "tr_gt = jax.jit(model.simulate)(key, (1.0, 0.0, 3.0, 3.0, 0.5))\n", + "tr_gt" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "obs = tr_gt.get_choices()\n", + "c = obs[\"assignments\", \"c\"]\n", + "y1 = obs[\"assignments\", \"y1\"]\n", + "mu = obs[\"hyperparameters\", \"mu\"]\n", + "\n", + "sigma = jnp.sqrt(obs[\"hyperparameters\", \"sigma\"])\n", + "\n", + "# Create a 2D plot\n", + "plt.figure(figsize=(10, 8))\n", + "\n", + "# Plot each cluster\n", + "for cluster in np.unique(c):\n", + " cluster_points = y1[c == cluster]\n", + " cluster_mu = mu[cluster]\n", + " cluster_sigma = sigma[cluster]\n", + "\n", + " # Plot the points\n", + " plt.scatter(cluster_points[:, 0], cluster_points[:, 1], label=f'Cluster {cluster}')\n", + "\n", + " # Plot the mean\n", + " plt.scatter(cluster_mu[0], cluster_mu[1], color='black', marker='x')\n", + "\n", + " # Plot the variance as an ellipse\n", + " ellipse = matplotlib.patches.Ellipse(cluster_mu, 2 * cluster_sigma[0], 2 * cluster_sigma[1], edgecolor='black', facecolor='none')\n", + " plt.gca().add_patch(ellipse)\n", + "\n", + "plt.xlabel('X')\n", + "plt.ylabel('Y')\n", + "plt.title('Clusters with Mean and Variance')\n", + "plt.legend()\n", + "\n", + "# Save the plot\n", + "plt.savefig('clusters_plot.png')\n", + "plt.close()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "from genjaxmix.rejuvenation import gibbs_move\n", + "from genjaxmix.vectorized_rejuvenation import propose_parameters\n", + "from genjax._src.core.interpreters.incremental import Diff\n", + "\n", + "key = jax.random.key(31415)\n", + "model_args = (1.0, 0.0, 1.0, 3.0, 0.5)\n", + "obs = tr_gt.get_choices()(\"assignments\")\n", + "\n", + "gibbs_jitted = jax.jit(gibbs_move)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "from genjax import ChoiceMapBuilder as C\n", + "key = jax.random.key(313341)\n", + "key, subkey = jax.random.split(key)\n", + "constraint = C[\"assignments\", \"c\"].set(obs[:, \"c\"]) ^ C[\"assignments\", \"y1\"].set(obs[:, \"y1\"])\n", + "\n", + "tr,_ = model.importance(subkey, constraint, model_args)\n", + "for t in range(10):\n", + " key, subkey = jax.random.split(key)\n", + " tr = gibbs_jitted(model, propose_parameters, model_args, tr, obs, subkey)\n", + "\n", + "# print(tr.get_choices()[\"assignments\", :, \"c\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "c = obs[:, \"c\"]\n", + "y1 = obs[:, \"y1\"]\n", + "\n", + "new_chm = tr.get_choices()\n", + "mu = new_chm[\"hyperparameters\", \"mu\"]\n", + "sigma = jnp.sqrt(new_chm[\"hyperparameters\", \"sigma\"])\n", + "\n", + "# Create a 2D plot\n", + "plt.figure(figsize=(10, 8))\n", + "\n", + "# Plot each cluster\n", + "for cluster in np.unique(c):\n", + " cluster_points = y1[c == cluster]\n", + " cluster_mu = mu[cluster]\n", + " cluster_sigma = sigma[cluster]\n", + "\n", + " # Plot the points\n", + " plt.scatter(cluster_points[:, 0], cluster_points[:, 1], label=f'Cluster {cluster}')\n", + "\n", + " # Plot the mean\n", + " plt.scatter(cluster_mu[0], cluster_mu[1], color='black', marker='x')\n", + "\n", + " # Plot the variance as an ellipse\n", + " ellipse = matplotlib.patches.Ellipse(cluster_mu, 2 * cluster_sigma[0], 2 * cluster_sigma[1], edgecolor='black', facecolor='none')\n", + " plt.gca().add_patch(ellipse)\n", + "\n", + "plt.xlabel('X')\n", + "plt.ylabel('Y')\n", + "plt.title('Clusters with Mean and Variance')\n", + "plt.legend()\n", + "\n", + "# Save the plot\n", + "plt.savefig('clusters_plot_inferred.png')\n", + "plt.close()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..96b32b0 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,33 @@ +site_name: GenJAXMix + +theme: + name: "material" + # features: + # - navigation.tabs + # - toc.follow + # - toc.integrate + +# markdown_extensions: +# - toc + +plugins: + - mkdocs-jupyter: + execute: true + - mkdocstrings: + handlers: + python: + options: + show_source: false + + +nav: + - Home: index.md + - Tutorials: + - Getting Started: tutorials/getting_started.py + - DPMMs from the Ground Up: tutorials/dpmm_ground_up.ipynb + - Splitting Clusters: tutorials/sub_cluster.ipynb + - Library Reference: + - API: reference/api.md + - Conjugacy: reference/conjugacy.md + - Inference: reference/inference.md + - For Developers: dev.md \ No newline at end of file diff --git a/notebooks/split_merge.ipynb b/notebooks/split_merge.ipynb new file mode 100644 index 0000000..e339ea2 --- /dev/null +++ b/notebooks/split_merge.ipynb @@ -0,0 +1,152 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Jain Neal Split-Merge Moves" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Random Split-Merge Procedure" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "import jax\n", + "import jax.numpy as jnp\n", + "import matplotlib.pyplot as plt\n", + "from dataclasses import dataclass" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "K_max = 10\n", + "K_true = 3\n", + "D = 2\n", + "N = 10\n", + "alpha = 1.0\n", + "sigma_hyper = 1.0\n", + "\n", + "key = jax.random.key(0)\n", + "\n", + "key, *subkeys = jax.random.split(key, 5)\n", + "\n", + "mu_true = jax.random.normal(subkeys[0], (K_max, D)) * sigma_hyper\n", + "\n", + "pi_true = jax.random.dirichlet(subkeys[1], jnp.ones(K_true)* alpha)\n", + "pi_true = jnp.concat([pi_true, jnp.zeros(K_max-K_true)], axis=0)\n", + "\n", + "z_true = jax.random.categorical(subkeys[2], jnp.log(pi_true), shape=(N,))\n", + "\n", + "data = jax.random.normal(subkeys[3], (N,D)) + mu_true[z_true]" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 1 0 0 1 1 1 1 0 1]\n", + "A: 3.465735912322998 B: -4.094344615936279 C: 0.0\n", + "0.53333324\n" + ] + }, + { + "data": { + "text/plain": [ + "Array([1, 1, 0, 0, 1, 1, 1, 1, 0, 1], dtype=int32)" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@dataclass\n", + "class Latent:\n", + " K_max: int\n", + " alpha: float\n", + " K: int\n", + " z: jax.Array\n", + "\n", + "\n", + "def partition_log_ratio(alpha, M: int, N: int):\n", + " return jnp.log(alpha) - jax.scipy.special.gammaln(M+N) + jax.scipy.special.gammaln(M) + jax.scipy.special.gammaln(N)\n", + "\n", + "def proposal_log_ratio(M,N):\n", + " return jnp.log(2)*(M+N-2)\n", + "\n", + "def likelihood_log_ratio(data, ):\n", + " return 0.0\n", + "\n", + "def random_split(key, data, latent: Latent, i: int, j: int):\n", + " c_next = jnp.max(latent.z)+1\n", + " key, subkey = jax.random.split(key)\n", + " splits = jnp.where(jax.random.bernoulli(subkey, shape=(latent.z.shape[0],)), latent.z[i], c_next)\n", + " mask = latent.z == latent.z[i]\n", + " z_proposal = jnp.where(mask, splits, latent.z)\n", + " z_proposal = z_proposal.at[i].set(latent.z[i])\n", + " z_proposal = z_proposal.at[j].set(c_next)\n", + " \n", + " Ni = jnp.count_nonzero(z_proposal == latent.z[i])\n", + " Nj = jnp.count_nonzero(z_proposal == c_next)\n", + "\n", + " A = proposal_log_ratio(Ni,Nj)\n", + " B = partition_log_ratio(alpha, Ni, Nj)\n", + " C = likelihood_log_ratio(1,1)\n", + " print(f\"A: {A} B: {B} C: {C}\")\n", + "\n", + " a = jnp.exp(min(0, A + B + C))\n", + " print(a)\n", + " key, subkey = jax.random.split(key)\n", + " u = jax.random.uniform(subkey)\n", + " z_new = jnp.where(u < a, z_proposal, latent.z)\n", + " return z_new\n", + "\n", + "\n", + "key = jax.random.key(2)\n", + "latent = Latent(K_max, alpha, 2, jax.random.categorical(key, jnp.ones(2), shape=(N,)))\n", + "print(latent.z)\n", + "random_split(key, data, latent, 0, 1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/genjaxmix/__init__.py b/src/genjaxmix/__init__.py new file mode 100644 index 0000000..f90ce71 --- /dev/null +++ b/src/genjaxmix/__init__.py @@ -0,0 +1,11 @@ +"""Run Dirichlet Process Mixture Model inference using GenJAX. + +Modules exported by this package: + +- `dpmm` +""" +# from .dpmm import generate + +# __all__ = [ +# "generate" +# ] \ No newline at end of file diff --git a/src/genspn/smc.py b/src/genjaxmix/_smc.py similarity index 92% rename from src/genspn/smc.py rename to src/genjaxmix/_smc.py index f29843c..f889687 100644 --- a/src/genspn/smc.py +++ b/src/genjaxmix/_smc.py @@ -3,16 +3,12 @@ import numpy as np from plum import dispatch from jaxtyping import Array, Integer -from genspn.distributions import (Dirichlet, MixtureModel, +from genjaxmix.distributions import (Dirichlet, MixtureModel, posterior, sample, logpdf, Normal, Categorical, Mixed, Cluster, Trace) from functools import partial @partial(jax.jit, static_argnames=['gibbs_iters', 'max_clusters', 'n_steps']) def smc(key, trace, data_test, n_steps, data, gibbs_iters, max_clusters): - - if not isinstance(data, tuple): - data = (data,) - data_test = (data_test,) smc_keys = jax.random.split(key, n_steps) def wrap_step(trace, n): @@ -45,7 +41,6 @@ def wrap_step(trace, n): return trace, sum_logprobs - def rejuvenate(key, data, trace, gibbs_iters, max_clusters): extended_pi = jnp.concatenate((trace.cluster.pi, jnp.zeros(max_clusters))) log_likelihood_mask = jnp.where(extended_pi == 0, -jnp.inf, 0) @@ -94,6 +89,16 @@ def get_weights(trace, K, data, q_split_trace, max_clusters): return logpdf_pi + logpdf_split_clusters - logpdf_clusters +def score_q_pi(q_pi, max_clusters, alpha): + q_pi_dist = Dirichlet(alpha=jnp.ones((1, 2)) * alpha/2) + q_pi_stack = Categorical( + jnp.vstack(( + jnp.log(q_pi[:max_clusters]), + jnp.log(q_pi[max_clusters:]), + ))[None, :]) + + return jax.vmap(logpdf, in_axes=(None, -1))(q_pi_dist, q_pi_stack) + def make_pi(pi, k, pi_split, max_clusters): pi_k0 = pi[k] pi = pi.at[k].set(pi_k0 * pi_split[k]) @@ -153,11 +158,10 @@ def update_f(f0: Categorical, f: Categorical, k: Integer[Array, ""], K: Integer[ return Categorical(logprobs) @dispatch -# plum is struggling with this signature for some reason, momentarily using a catch all -# def update_f(f0: Mixed, f: Mixed, k: Integer[Array, ""], K: Integer[Array, ""], max_clusters: Integer[Array, ""]): -def update_f(f0: Mixed, f, k, K, max_clusters): +def update_f(f0: Mixed, f: Mixed, k: Integer[Array, ""], K: Integer[Array, ""], max_clusters: Integer[Array, ""]): return Mixed( - dists=tuple([update_f(f0.dists[i], f.dists[i], k, K, max_clusters) for i in range(len(f0.dists))]) + update_f(f0.normal, f.normal, k, K, max_clusters), + update_f(f0.categorical, f.categorical, k, K, max_clusters) ) def update_vector(v0, split_v, k, K, max_clusters): @@ -224,4 +228,4 @@ def gibbs_pi(max_clusters, key, alpha, c, rejuvenation=False): pi = jax.random.dirichlet(key, alpha / 2 + cluster_counts) pi_pairs = pi.reshape((2, -1)) pi_pairs = pi_pairs / jnp.sum(pi_pairs, axis=0) - return pi_pairs.reshape(-1) + return pi_pairs.reshape(-1) \ No newline at end of file diff --git a/src/genjaxmix/conjugacy.py b/src/genjaxmix/conjugacy.py new file mode 100644 index 0000000..6cae51b --- /dev/null +++ b/src/genjaxmix/conjugacy.py @@ -0,0 +1,38 @@ +import jax.numpy as jnp +import jax +from .dpmm import K, L_num + +def posterior_normal_inverse_gamma(assignments:jax.Array, x: jax.Array, mu_0:float=0.0, v_0:float=1.0, a_0:float=1.0, b_0:float=1.0): + """Compute the posterior parameters of a normal-inverse-gamma distribution given the assignments and data. + + See Section 6 of https://www.cs.ubc.ca/~murphyk/Papers/bayesGauss.pdf by Kevin P. Murphy. + + Args: + assignments: an array of integers in [0, K) representing the cluster assignments + x: an array of floats representing the data + mu_0: the prior mean + v_0: the prior precision + a_0: the prior shape + b_0: the + """ + counts = jnp.bincount(assignments, length=K) + sum_x = jax.ops.segment_sum(x, assignments, K) + sum_x_sq = jax.ops.segment_sum(x**2, assignments, K) + + v_n_inv = 1/v_0 + counts + m = (1/v_0 * mu_0 + sum_x) / v_n_inv + a = a_0 + counts / 2 + b = b_0 + 0.5 * (sum_x_sq + 1/v_0*mu_0**2 - v_n_inv * m ** 2) + return m, 1/v_n_inv, a, b + +def posterior_dirichlet(assignments:jax.Array, x:jax.Array): + """Computes the posterior parameters of a Dirichlet distribution for a multinomial likelihood. + + Args: + assignments: an array of integers in [0, K) representing the cluster assignments + x: an array of integers in [0, L_num) representing the data + """ + one_hot_c = jax.nn.one_hot(assignments, K) + one_hot_y = jax.nn.one_hot(x, L_num) + frequency_matrix = one_hot_c.T @ one_hot_y + return frequency_matrix \ No newline at end of file diff --git a/src/genjaxmix/dpmm.py b/src/genjaxmix/dpmm.py new file mode 100644 index 0000000..726330d --- /dev/null +++ b/src/genjaxmix/dpmm.py @@ -0,0 +1,118 @@ +"""Provides the generative function for a Dirichlet process mixture model. + +This module allows the user to create and execute Dirichlet Process Mixture Models (DPMM) using GenJAX. +""" + + +from genjax import gen, repeat +from genjax import normal, inverse_gamma, dirichlet, categorical, beta +import jax.numpy as jnp +from .utils import beta_to_logpi +import jax + +K = 5 +L_num = 7 + +@gen +def hyperparameters(mu_0=0.0, l=1.0, shape=1.0, scale=1.0, alpha=1.0): + """ + µ, sigma^2 ~ N(µ|m_0, sigma^2*l)IG(sigma^2| shape, scale) + """ + sigma_sq = inverse_gamma(shape*jnp.ones(K), scale*jnp.ones(K)) @ "sigma" + sigma = jnp.sqrt(sigma_sq) + mu = normal(mu_0 * jnp.ones(K), sigma * l) @ "mu" + logp = dirichlet(alpha*jnp.ones((K, L_num))) @ "logp" + logp = jnp.log(logp) + return mu, sigma, logp + +@gen +def cluster(pi:jax.Array, mu:jax.Array, sigma:jax.Array, logp:jax.Array): + """Sample from a mixture model with proportions ``pi``, normal inverse gamma parameters ``mu`` and ``sigma``, and + categorical parameter ``logp``. + + Args: + pi - a one dimensional array of proportions + mu: - a K-dimensional array of means + sigma - a K-dimensional array of standard deviations + logp - a KxL_num array of log probabilities + + Returns: + idx - an integer representing the cluster assignment + y1 - an array representing the numerical feature + y2 - an array representing the categorical feature + + """ + idx = categorical(pi) @ "c" + y1 = normal(mu[idx], sigma[idx]) @ "y1" + y2 = categorical(logp[idx]) @ "y2" + return idx, y1, y2 + +@gen +def gem(alpha:float) -> jnp.ndarray: + """Sample from a Griffiths, Engen, and McCloskey's (GEM) distribution with concentration ``alpha``. + + Args: + alpha: a positive scalar + + Returns: + A random array given by shape ``K`` + + """ + betas = beta(jnp.ones(K), alpha*jnp.ones(K)) @ "pi" + pi = beta_to_logpi(betas) + return pi + + +# @gen +# def dpmm(concentration=1.0, mu_0=0.0, l=1.0, a=1.0, b=1.0): +# """Sample from a Dirichlet process mixture model. + +# Args: +# concentration: +# mu_0: ? +# precision: ? +# a: shape of the inverse gamma +# b: scale of the inverse gamma + +# Returns: +# A triplet ``(c, y1, y2)`` of three arrays. The first value, ``c``, is the assignments. The values ``y1` and ``y2`` +# represent the numerical and categorical features of each data point, respectively. +# """ + +# logpi = gem(concentration) @ "pi" +# mu, sigma, logp = hyperparameters(mu_0, l, a, b) @ "hyperparameters" +# y = cluster_repeat(logpi, mu, sigma, logp) @ "assignments" +# return y + +def generate(N_max: int): + """ Construct a Dirichlet Procsess Mixture Model with a given number of data points. + + Args: + N_max: maximum number of data points + + Returns: + A generative function that generates a DPMM model with a given number of data points + """ + cluster_repeat = repeat(n=N_max)(cluster) + + @gen + def dpmm(concentration:float=1.0, mu_0:float=0.0, l:float=1.0, a:float=1.0, b:float=1.0): + """Sample from a Dirichlet process mixture model. + + Args: + concentration: Dirichlet Process concentration + mu_0: mean prior + precision: precision prior + a: shape of the inverse gamma + b: scale of the inverse gamma + + Returns: + A triplet ``(c, y1, y2)`` of three arrays. The first value, ``c``, is the assignments. The values ``y1` and ``y2`` + represent the numerical and categorical features of each data point, respectively. + """ + + logpi = gem(concentration) @ "pi" + mu, sigma, logp = hyperparameters(mu_0, l, a, b) @ "hyperparameters" + y = cluster_repeat(logpi, mu, sigma, logp) @ "assignments" + return y + return dpmm \ No newline at end of file diff --git a/src/genjaxmix/jax_distributions.py b/src/genjaxmix/jax_distributions.py new file mode 100644 index 0000000..9f106f9 --- /dev/null +++ b/src/genjaxmix/jax_distributions.py @@ -0,0 +1,128 @@ +import jax +import jax.numpy as jnp +from tensorflow_probability.substrates import jax as tfp + +import genjax +from genjax import Pytree +from genjax._src.generative_functions.distributions.distribution import Distribution +from genjax.typing import PRNGKey, Array, Float + +tfd = tfp.distributions + +@Pytree.dataclass +class NormalInverseGamma(Distribution): + def random_weighted(self, key: PRNGKey, mu, l, a, b): + ig = tfd.InverseGamma(concentration=a, scale=b) + key, subkey = jax.random.split(key) + precision = ig.sample(seed=subkey) + ig_logp = ig.log_prob(precision) + + normal = tfd.Normal(loc=mu, scale=precision / l) + key, subkey = jax.random.split(key) + mu = normal.sample(seed=subkey) + mu_logp = normal.log_prob(mu) + + retval = jnp.stack([mu, precision], axis=1) + inv_logp = -jnp.sum(ig_logp) - jnp.sum(mu_logp) + return inv_logp, retval + + def estimate_logpdf(self, key: PRNGKey, x, mu, l, a, b): + mu_sampled = x[:,0] + precision = x[:,1] + ig = tfd.InverseGamma(concentration=a, scale=b) + ig_logp = ig.log_prob(precision) + normal = tfd.Normal(loc=mu, scale= precision/l) + mu_logp = normal.log_prob(mu_sampled) + return jnp.sum(ig_logp) + jnp.sum(mu_logp) + +@Pytree.dataclass +class Dirichlet(Distribution): + def random_weighted(self, key:PRNGKey, alpha): + dir = tfd.Dirichlet(concentration = alpha) + probs = dir.sample(seed=key) + inv_weight = -dir.log_prob(probs) + return inv_weight, probs + def estimate_logpdf(self, key:PRNGKey, x, alpha): + dir = tfd.Dirichlet(concentration = alpha) + return dir.log_prob(x) + +""" +A class to store DP samples and the corresponding beta values. + +Used in GEM to avoid floating point error +""" +@Pytree.dataclass +class DPSample(Pytree): + betas: Array + pi: Array + def __init__(self, betas, pi): + self.betas = betas + self.pi = pi + +@Pytree.dataclass +class GEM(Distribution): + C: int = Pytree.static(default=1) + def __init__(self, C:int=10): + self.C = jnp.asarray(C) + def random_weighted(self, key: PRNGKey, alpha: Float): + C = self.C + sampler = tfd.Beta(concentration1 = jnp.array(alpha), concentration0=jnp.array(1.0)) + betas = sampler.sample(seed=key, sample_shape = C) + inv_weight = -jnp.sum(sampler.log_prob(betas)) + betas_not = 1-betas + + betas = jnp.log(betas) + betas_not = jnp.log(betas_not) + # prefix sum of betas + logpi = jnp.zeros(C) + for i in range(1,C): + logpi = logpi.at[i].set(jnp.sum(betas_not[:i])) + for i in range(C): + logpi = logpi.at[i].set(logpi[i] + betas[i]) + + return inv_weight, logpi + + def estimate_logpdf(self, key: PRNGKey, pi, alpha: Float): + # assumes dist.pi corresponds to dist.betas + sampler = tfd.Beta(concentration1 = jnp.array(alpha), concentration0 = jnp.array(1.0)) + def unfold(carry, pi): + logbeta = pi - carry + return carry + jnp.log(-jnp.expm1(logbeta)) , jnp.exp(logbeta) + + _, betas = jax.lax.scan(unfold, 0.0, pi) + weight = jnp.sum(sampler.log_prob(betas)) + return weight + +nig = NormalInverseGamma() +dirichlet = Dirichlet() +@Pytree.dataclass +class MixtureModel(Distribution): + def random_weighted(self, key, pi, categorical_probs): + key_0, key_1 = jax.random.split(key, 2) + cluster_dist = tfd.Categorical(pi) + c = cluster_dist.sample(seed=key_0) + c_logp = cluster_dist.log_prob(c) + label_dist = tfd.Categorical(categorical_probs[c]) + y = label_dist.sample(seed=key_1) + y_logp = label_dist.log_prob(y) + return -c_logp-y_logp, (c,y) + + def estimate_logpdf(self, x, pi, categorical_probs): + c, y = x + cluster_dist = tfd.Categorical(pi) + label_dist = tfd.Categorical(categorical_probs[c]) + logp = cluster_dist.log_prob(c) + label_dist.log_prob(y) + return -logp + +cmm = MixtureModel() + +@genjax.repeat(n=100) +@gen +def cluster(pi, probs): + assignments = cmm(pi, probs) @ "assignments" + return assignments + +pi = jnp.ones(10) / 10 +categorical_probs = jax.random.uniform(key, (10, 36, 19)) +tr = cluster.simulate(key, (pi, categorical_probs,)) +tr.get_choices()[0, "assignments"].unmask() \ No newline at end of file diff --git a/src/genjaxmix/rejuvenation.py b/src/genjaxmix/rejuvenation.py new file mode 100644 index 0000000..522f571 --- /dev/null +++ b/src/genjaxmix/rejuvenation.py @@ -0,0 +1,98 @@ +import jax +import jax.numpy as jnp +from genjax import inverse_gamma, normal, dirichlet, Pytree, gen +from genjax.typing import PRNGKey +from genjax._src.generative_functions.distributions.distribution import Distribution +from tensorflow_probability.substrates import jax as tfp +from genjax._src.core.interpreters.incremental import Diff +from .dpmm import K +from .utils import beta_to_logpi, logpi_to_beta +from .conjugacy import posterior_dirichlet, posterior_normal_inverse_gamma + +tfd = tfp.distributions + +def gibbs_move(model, proposal, model_args, tr, observations, key): + proposal_args = (observations,) + fwd_choices, fwd_weight, _ = proposal.propose(key, proposal_args) + + key, subkey = jax.random.split(key) + argdiffs = Diff.no_change(model_args) + tr_new, weight, _, discard = model.update(subkey, tr, fwd_choices, argdiffs) + return tr_new + + +@gen +def propose_parameters(obs): + _propose_parameters(obs) @ "hyperparameters" + +@gen +def _propose_parameters(obs): + c = obs[:, "c"] + y1 = obs[:, "y1"] + y2 = obs[:, "y2"] + + mu_n, v_n, a, b = posterior_normal_inverse_gamma(c, y1) + frequency_matrix = posterior_dirichlet(c, y2) + 1e-6 # to prevent degeneracy + + # Propose sigma + sigma_sq = inverse_gamma(a,b) @ "sigma" + sigma = jnp.sqrt(sigma_sq) + + # Propose mu + mu = normal(mu_n, sigma*v_n) @ "mu" + + # Propose logp + p = dirichlet(frequency_matrix) @ "logp" + + return mu, sigma, p + + +def apply_decay(x, gamma): + decay_factors = jnp.arange(x.shape[0]) * jnp.log(gamma) + logpi = jnp.log(x) + decay_factors + log_max = jnp.max(logpi) + log_shifted = logpi - log_max + + # Compute log-sum-exp for normalization + # Normalize in log-space + log_norm = jnp.log(jnp.sum(jnp.exp(log_shifted))) + logpi = log_shifted - log_norm + return logpi + + +@Pytree.dataclass +class DirichletBeta(Distribution): + def random_weighted(self, key: PRNGKey, alpha): + sampler = tfd.Dirichlet(concentration = alpha) + pi = sampler.sample(seed=key) + logpi = jnp.log(pi) + # logpi = apply_decay(pi, gamma=0.80) + + betas = logpi_to_beta(logpi) + + inv_weight = -sampler.log_prob(pi) + + return inv_weight, betas + + def estimate_logpdf(self, key: PRNGKey, betas, alpha): + sampler = tfd.Dirichlet(concentration = alpha) + + logpi = beta_to_logpi(betas) + pi = jnp.exp(logpi) + + weight = jnp.sum(sampler.log_prob(pi)) + return weight + +dirichlet_beta = DirichletBeta() + +@gen +def propose_pi(obs): + pi = _propose_pi(obs) @ "pi" + return pi + +@gen +def _propose_pi(obs): + c = obs[:, "c"] + proportions = jnp.bincount(c, length = K) + 1e-6 + pi = dirichlet_beta(proportions) @ "pi" + return pi \ No newline at end of file diff --git a/src/genjaxmix/smc.py b/src/genjaxmix/smc.py new file mode 100644 index 0000000..ab07048 --- /dev/null +++ b/src/genjaxmix/smc.py @@ -0,0 +1,282 @@ +import jax.numpy as jnp +import jax +import numpy as np +from plum import dispatch +from jaxtyping import Array, Integer +from genjaxmix.distributions import (Dirichlet, MixtureModel, + posterior, sample, logpdf, Normal, Categorical, Mixed, Cluster, Trace) +from functools import partial + +@partial(jax.jit, static_argnames=['gibbs_iters', 'max_clusters', 'n_steps']) +def smc(key:jax.random.PRNGKey, trace:Trace, data_test: jax.Array, n_steps:int, data:jax.Array, gibbs_iters:int, max_clusters:int): + """Runs a sequential Monte Carlo algorithm for a DPMM. + + Args: + key: a PRNG key + trace: the initial trace + data_test: the test data + n_steps: the number of steps + data: the data + gibbs_iters: the number of Gibbs iterations + max_clusters: the maximum number of clusters + + Returns: + A tuple of the final trace and the sum of the log probabilities + """ + smc_keys = jax.random.split(key, n_steps) + + def wrap_step(trace, n): + key = smc_keys[n] + keys = jax.random.split(key, 3) + new_cluster = step(data=data, trace=trace, gibbs_iters=gibbs_iters, + max_clusters=max_clusters, key=keys[0], K=n+2) + split_trace = Trace( + gem=trace.gem, + g=trace.g, + cluster=new_cluster + ) + + rejuvenated_cluster = rejuvenate(keys[1], data, split_trace, gibbs_iters, max_clusters) + rejuvenated_trace = Trace( + gem=split_trace.gem, + g=trace.g, + cluster=rejuvenated_cluster + ) + + mixture_model = MixtureModel( + pi=rejuvenated_trace.cluster.pi/jnp.sum(rejuvenated_trace.cluster.pi), + f=rejuvenated_trace.cluster.f[:max_clusters]) + logprobs = jax.vmap(logpdf, in_axes=(None, 0))(mixture_model, data_test) + sum_logprobs = jnp.sum(logprobs) + + return rejuvenated_trace, (rejuvenated_trace, sum_logprobs) + + carry, (trace, sum_logprobs) = jax.lax.scan(wrap_step, trace, jnp.arange(n_steps)) + return trace, sum_logprobs + + + +def rejuvenate(key:jax.random.PRNGKey, data:jax.Array, trace:Trace, gibbs_iters:int, max_clusters:int): + """Rejuvenate the trace by running rejuvenation moves for the cluster parameters, cluster proportions, and data point assignments. + + Args: + key: a PRNG key + data: the data + trace: the trace + gibbs_iters: the number of Gibbs iterations + max_clusters: the maximum number of clusters + """ + extended_pi = jnp.concatenate((trace.cluster.pi, jnp.zeros(max_clusters))) + log_likelihood_mask = jnp.where(extended_pi == 0, -jnp.inf, 0) + + partial_gibbs_step = partial(gibbs_step, + alpha=trace.gem.alpha, g=trace.g, data=data, + log_likelihood_mask=log_likelihood_mask, max_clusters=max_clusters, + rejuvenation=True) + + keys = jax.random.split(key, gibbs_iters) + _, q_split_trace = jax.lax.scan(partial_gibbs_step, trace.cluster.c, keys) + + cluster = q_split_trace[-1] + cluster = Cluster(cluster.c, jnp.sum(trace.cluster.pi) * cluster.pi[:max_clusters], cluster.f) + + return cluster + +@partial(jax.jit, static_argnames=['gibbs_iters', 'max_clusters']) +def step(data, gibbs_iters, key, K, trace, max_clusters): + q_split_trace = q_split(data, gibbs_iters, max_clusters, key, trace.cluster.c, trace.gem.alpha, trace.g) + + cluster_weights = get_weights(trace, K, data, q_split_trace, max_clusters) + + logprob_pi0 = logpdf(trace.gem, jnp.sort(trace.cluster.pi, descending=True), K-1) + + weights = jnp.zeros(max_clusters + 1) + weights = weights.at[1:].set(cluster_weights - logprob_pi0) + weights = weights.at[0].set(-jnp.inf) # temp, don't stop + k = jax.random.categorical(key, weights) + + new_cluster = jax.lax.cond(k==0, + lambda cluster0, cluster1, k, K, max_clusters: trace.cluster, + lambda cluster0, cluster1, k, K, max_clusters: split_cluster(cluster0, cluster1, k, K, max_clusters), + trace.cluster, q_split_trace[-1], k-1, K, max_clusters) + + return new_cluster + +def get_weights(trace, K, data, q_split_trace, max_clusters): + # for each cluster, get the pi score + pi_split = jax.vmap(make_pi, in_axes=(None, 0, None, None))( + trace.cluster.pi, jnp.arange(max_clusters), q_split_trace.pi[-1], max_clusters) + logpdf_pi = jax.vmap(logpdf, in_axes=(None, 0, None))(trace.gem, pi_split, K) + + logpdf_clusters = score_trace_cluster(data, trace.g, trace.cluster, max_clusters) + logpdf_split_clusters = score_trace_cluster(data, trace.g, q_split_trace[-1], max_clusters, add_c=True) + + return logpdf_pi + logpdf_split_clusters - logpdf_clusters + +def score_q_pi(q_pi, max_clusters, alpha): + q_pi_dist = Dirichlet(alpha=jnp.ones((1, 2)) * alpha/2) + q_pi_stack = Categorical( + jnp.vstack(( + jnp.log(q_pi[:max_clusters]), + jnp.log(q_pi[max_clusters:]), + ))[None, :]) + + return jax.vmap(logpdf, in_axes=(None, -1))(q_pi_dist, q_pi_stack) + +def make_pi(pi, k, pi_split, max_clusters): + pi_k0 = pi[k] + pi = pi.at[k].set(pi_k0 * pi_split[k]) + idx = jnp.argwhere(pi == 0, size=1) + pi = pi.at[idx].set(pi_k0 * pi_split[k + max_clusters]) + + return jnp.sort(pi, descending=True) + +def score_trace_cluster(data, g, cluster, max_clusters, add_c=False): + c, pi, f = cluster.c, cluster.pi, cluster.f + + x_scores = jax.vmap(logpdf, in_axes=(None, 0, 0))(f, data, c) + + c = jnp.mod(c, max_clusters) + + pi_dist = Categorical(logprobs=jnp.log(pi.reshape(1, -1))) + theta_scores = jax.vmap(logpdf, in_axes=(None, 0))(g, f)[:max_clusters] + + if add_c: + c_scores = jax.vmap(logpdf, in_axes=(None, 0))(pi_dist, c.reshape(-1, 1)) + x_scores = x_scores + c_scores + + xc_scores_cluster = jax.ops.segment_sum( + x_scores, c, + num_segments=max_clusters) + + return xc_scores_cluster + theta_scores + +def split_cluster(cluster, split_clusters, k, K, max_clusters): + # update pi + pi = cluster.pi + pi0 = pi[k] + pi = pi.at[k].set(pi0 * split_clusters.pi[k]) + pi = pi.at[K - 1].set(pi0 * split_clusters.pi[k + max_clusters]) + + # update c + c = cluster.c + c = jnp.where(c == k, split_clusters.c, c) + c = jnp.where(c == k + max_clusters, K-1, c) + + # update f + f = update_f(cluster.f, split_clusters.f, k, K-1, max_clusters) + + return Cluster(c, pi, f) + +@dispatch +def update_f(f0: Normal, f: Normal, k: Integer[Array, ""], K: Integer[Array, ""], max_clusters: Integer[Array, ""]): + mu = update_vector(f0.mu, f.mu, k, K, max_clusters) + std = update_vector(f0.std, f.std, k, K, max_clusters) + + return Normal(mu, std) + +@dispatch +def update_f(f0: Categorical, f: Categorical, k: Integer[Array, ""], K: Integer[Array, ""], max_clusters: Integer[Array, ""]): + logprobs = update_vector(f0.logprobs, f.logprobs, k, K, max_clusters) + + return Categorical(logprobs) + +@dispatch +def update_f(f0: Mixed, f: Mixed, k: Integer[Array, ""], K: Integer[Array, ""], max_clusters: Integer[Array, ""]): + return Mixed( + update_f(f0.normal, f.normal, k, K, max_clusters), + update_f(f0.categorical, f.categorical, k, K, max_clusters) + ) + +def update_vector(v0, split_v, k, K, max_clusters): + v = v0 + v = v.at[k].set(split_v[k]) + v = v.at[K].set(split_v[k + max_clusters]) + return v + +@partial(jax.jit, static_argnames=['gibbs_iters', 'max_clusters']) +def q_split(data, gibbs_iters, max_clusters, key, c0, alpha, g) -> Cluster: + keys = jax.random.split(key, 3) + c = (c0 + max_clusters * jax.random.bernoulli(keys[0], shape=c0.shape)).astype(int) + # c = jnp.concatenate((jnp.zeros(100), jnp.ones(100) * 2)) + + log_likelihood_mask = make_log_likelihood_mask(c0, max_clusters) + + partial_gibbs_step = partial(gibbs_step, + alpha=alpha, g=g, data=data, + log_likelihood_mask=log_likelihood_mask, max_clusters=max_clusters) + + keys = jax.random.split(keys[2], gibbs_iters) + _, q_split_trace = jax.lax.scan(partial_gibbs_step, c, keys) + + + return q_split_trace + +def make_log_likelihood_mask(c, max_clusters): + log_likelihood_mask = -jnp.inf * jnp.ones((c.shape[0], 2 * np.array(max_clusters, dtype=int))) + + n = jnp.arange(c.shape[0], dtype=int) + clusters_x = jnp.concatenate((n, n)) + clusters_y = jnp.concatenate((c, max_clusters + c), dtype=int) + return log_likelihood_mask.at[clusters_x, clusters_y].set(0) + +def gibbs_step(assignments, key, alpha, g, data, log_likelihood_mask, max_clusters, rejuvenation=False): + subkey1, subkey2, subkey3 = jax.random.split(key, 3) + f = gibbs_f(max_clusters, data, subkey1, g, assignments) + pi = gibbs_pi(max_clusters, subkey2, alpha, assignments, rejuvenation=rejuvenation) + + assignments = gibbs_c(subkey3, pi, log_likelihood_mask, f, data) + + # now compute the logpdf for the assignments given the new distribution + return assignments, Cluster(assignments, pi, f) + +def gibbs_f(max_clusters:int, data:jax.Array, key:jax.random.PRNGKey, g, assignments:jax.Array): + """Gibbs move for the cluster parameters. + + Args: + max_clusters: the maximum number of clusters + data: the data + key: a PRNG key + g: the prior distribution + assignments: the data point assignments + """ + g_prime = posterior(g, data, assignments, 2*max_clusters) + f = sample(key, g_prime) + return f + +def gibbs_c(key:jax.random.PRNGKey, pi:jax.Array, log_likelihood_mask:jax.Array, f, data:jax.Array): + """Gibbs move for the data point assignments. + + Args: + key: a PRNG key + pi: the cluster proportions + log_likelihood_mask: a mask for the log likelihoods + f: the cluster parameters + data: the data + """ + log_likelihoods = jax.vmap(jax.vmap(logpdf, in_axes=(0, None)), in_axes=(None, 0))(f, data) + log_likelihoods = log_likelihoods + log_likelihood_mask + log_score = log_likelihoods + jnp.log(pi) + + assignments = jax.random.categorical(key, log_score, axis=-1).astype(int) + return assignments + +def gibbs_pi(max_clusters:int, key:jax.random.PRNGKey, alpha:float, c:jax.Array, rejuvenation:bool=False): + """Gibbs move for the cluster proportions. + + Args: + max_clusters: the maximum number of clusters + key: a PRNG key + alpha: the Dirichlet hyperparameter + c: the data point assignments + rejuvenation: whether to rejuvenate the cluster proportions + """ + cluster_counts = jnp.sum(jax.nn.one_hot(c, num_classes=2 * max_clusters, dtype=jnp.int32), axis=0) + if rejuvenation: + pi = jax.random.dirichlet(key, cluster_counts) + return pi + else: + pi = jax.random.dirichlet(key, alpha / 2 + cluster_counts) + pi_pairs = pi.reshape((2, -1)) + pi_pairs = pi_pairs / jnp.sum(pi_pairs, axis=0) + return pi_pairs.reshape(-1) \ No newline at end of file diff --git a/src/genjaxmix/utils.py b/src/genjaxmix/utils.py new file mode 100644 index 0000000..f3b5fca --- /dev/null +++ b/src/genjaxmix/utils.py @@ -0,0 +1,19 @@ +import jax.numpy as jnp + +def beta_to_logpi(betas): + logb = jnp.log(betas) + logb_not = jnp.log(1-betas) + C = betas.shape[0] + logpi = jnp.zeros(C) + for i in range(1,C): + logpi = logpi.at[i].set(jnp.sum(logb_not[:i])) + for i in range(C): + logpi = logpi.at[i].set(logpi[i] + logb[i]) + return logpi + +def logpi_to_beta(logpi): + C = logpi.shape[0] + betas = logpi[0]*jnp.ones(C) + for i in range(1,C): + betas = betas.at[i].set(logpi[i]-jnp.sum(jnp.log(-jnp.expm1(betas[:i])))) + return betas \ No newline at end of file diff --git a/src/genjaxmix/vectorized.py b/src/genjaxmix/vectorized.py new file mode 100644 index 0000000..b7b7a99 --- /dev/null +++ b/src/genjaxmix/vectorized.py @@ -0,0 +1,43 @@ +import jax +import jax.numpy as jnp +from genjax import gen, repeat, normal, inverse_gamma, categorical, dirichlet, beta +from .utils import beta_to_logpi + +N = 1000 +K = 5 +F_numerical = 2 +F_categorical = 7 + +@gen +def hyperparameters(mu_0=0.0, v_0=1.0, shape=1.0, scale=1.0, alpha=1.0): + sigma_sq = inverse_gamma(shape*jnp.ones((K, F_numerical)), scale*jnp.ones((K, F_numerical))) @ "sigma" + sigma = jnp.sqrt(sigma_sq) + mu = normal(mu_0*jnp.ones((K, F_numerical)), sigma*v_0) @ "mu" + # logp = genjax.dirichlet(0.7*jnp.ones((K, L_num))) @ "logp" + # logp = jnp.log(logp) + return mu, sigma + +@gen +def cluster(pi, mu, sigma): + idx = categorical(pi) @ "c" + y1 = normal(mu[idx], sigma[idx]) @ "y1" + # y2 = genjax.categorical(logp[idx]) @ "y2" + return idx, y1 + +@gen +def gem(alpha): + betas = beta(alpha*jnp.ones(K), jnp.ones(K)) @ "pi" + pi = beta_to_logpi(betas) + return pi + +def generate(N_max): + cluster_repeat = repeat(n=N_max)(cluster) + + @gen + def dpmm(alpha, mu_0, v_0, a, b): + logpi = gem(alpha) @ "pi" + mu, sigma = hyperparameters(mu_0, v_0, a, b, 1.0) @ "hyperparameters" + y = cluster_repeat(logpi, mu, sigma) @ "assignments" + return y + + return dpmm diff --git a/src/genjaxmix/vectorized_rejuvenation.py b/src/genjaxmix/vectorized_rejuvenation.py new file mode 100644 index 0000000..5f9f81f --- /dev/null +++ b/src/genjaxmix/vectorized_rejuvenation.py @@ -0,0 +1,119 @@ +from genjax import ChoiceMapBuilder as C +from genjax import beta, gen, inverse_gamma, normal +from genjax._src.core.interpreters.incremental import Diff +from genjax import Pytree +from genjax._src.generative_functions.distributions.distribution import Distribution +from genjax.typing import PRNGKey +from tensorflow_probability.substrates import jax as tfp +import jax.numpy as jnp +from .utils import beta_to_logpi +import jax +from .vectorized import K +from .conjugacy import posterior_normal_inverse_gamma +tfd = tfp.distributions + +# def posterior_normal_inverse_gamma(assignments, x): + # counts = jnp.bincount(assignments, length=N_max) + # # sum_x = jnp.where(counts > 0, jax.ops.segment_sum(x, assignments, N_max)/counts, 0.0) + # sum_x = jax.ops.segment_sum(x, assignments, N_max) + # sum_x_sq = jax.ops.segment_sum(x**2, assignments, N_max) + + # l_0 = 0.01 + # m_0 = 1.0 + # a_0 = 1.0 + # b_0 = 1.0 + + # l = l_0 + counts + # m = (l_0 * m_0 + sum_x) / l + # a = a_0 + counts / 2 + # b = b_0 + 0.5 * (sum_x_sq + l_0*m_0**2 - l * m ** 2) + # return l,m,a,b + +# def posterior_dirichlet(assignments, x): +# one_hot_c = jax.nn.one_hot(assignments, N_max) +# one_hot_y = jax.nn.one_hot(x, L_num) +# frequency_matrix = one_hot_c.T @ one_hot_y +# # print(frequency_matrix) +# # row_sums = jnp.sum(frequency_matrix, axis=1, keepdims=True) +# # row_sums = jnp.where(row_sums == 0, 1, row_sums) +# # empirical = frequency_matrix / row_sums +# # return jnp.log(empirical) +# return frequency_matrix + +@gen +def propose_parameters(obs): + _propose_parameters(obs) @ "hyperparameters" + +@gen +def _propose_parameters(obs): + c = obs[:, "c"] + y1 = obs[:, "y1"] + + mu_0, v_0, a, b = jax.vmap(posterior_normal_inverse_gamma, in_axes=(None, 1))(c, y1) + mu_0 = mu_0.T + v_0 = v_0.T + a = a.T + b = b.T + + # Propose sigma + sigma_sq = inverse_gamma(a,b) @ "sigma" + sigma = jnp.sqrt(sigma_sq) + + # Propose mu + mu = normal(mu_0, sigma * v_0 ) @ "mu" + + return mu, sigma + + +def apply_decay(x, gamma): + decay_factors = jnp.arange(x.shape[0]) * jnp.log(gamma) + logpi = jnp.log(x) + decay_factors + log_max = jnp.max(logpi) + log_shifted = logpi - log_max + + # Compute log-sum-exp for normalization + # Normalize in log-space + log_norm = jnp.log(jnp.sum(jnp.exp(log_shifted))) + logpi = log_shifted - log_norm + return logpi + + +@Pytree.dataclass +class DirichletBeta(Distribution): + def random_weighted(self, key: PRNGKey, alpha): + sampler = tfd.Dirichlet(concentration = alpha) + pi = sampler.sample(seed=key) + # logpi = jnp.log(pi) + logpi = apply_decay(pi, gamma=0.80) + + def unfold(carry, pi): + logbeta = pi - carry + return carry + jnp.log(-jnp.expm1(logbeta)) , jnp.exp(logbeta) + _, betas = jax.lax.scan(unfold, 0.0, logpi) + + inv_weight = -sampler.log_prob(pi) + + return inv_weight, betas + + def estimate_logpdf(self, key: PRNGKey, betas, alpha): + sampler = tfd.Dirichlet(concentration = alpha) + + logpi = beta_to_logpi(betas) + pi = jnp.exp(logpi) + + weight = jnp.sum(sampler.log_prob(pi)) + return weight + +dirichlet_beta = DirichletBeta() + +@gen +def propose_pi(obs): + pi = _propose_pi(obs) @ "pi" + return pi + +@gen +def _propose_pi(obs): + c = obs[:, "c"] + proportions = jnp.bincount(c, length = K) + 1e-6 + pi = dirichlet_beta(proportions) @ "pi" + return pi \ No newline at end of file diff --git a/src/genspn/__init__.py b/src/genspn/__init__.py deleted file mode 100644 index 5eb6009..0000000 --- a/src/genspn/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -def hello() -> str: - return "Hello from genspn!" diff --git a/src/genspn/distributions.py b/src/genspn/distributions.py deleted file mode 100644 index 17b411a..0000000 --- a/src/genspn/distributions.py +++ /dev/null @@ -1,287 +0,0 @@ -import jax.numpy as jnp -import jax -import equinox as eqx -from jaxtyping import Array, Float, Integer -from plum import dispatch -from typing import Optional -from numbers import Real - -ZERO = 1e-20 - -class NormalInverseGamma(eqx.Module): - m: Float[Array, "*batch n_dim"] - l: Float[Array, "*batch n_dim"] - a: Float[Array, "*batch n_dim"] - b: Float[Array, "*batch n_dim"] - -class Dirichlet(eqx.Module): - alpha: Float[Array, "*batch n_dim k"] - - def __getitem__(self, key): - return Dirichlet(alpha=self.alpha[key]) - -class Normal(eqx.Module): - mu: Float[Array, "*batch n_dim"] - std: Float[Array, "*batch n_dim"] - - def __getitem__(self, key): - return Normal(mu=self.mu[key], std=self.std[key]) - -class Categorical(eqx.Module): - # assumed normalized, padded - logprobs: Float[Array, "*batch n_dim k"] - def __getitem__(self, key): - return Categorical(logprobs=self.logprobs[key]) - -type BaseF = Categorical | Normal -type BaseG = NormalInverseGamma | Dirichlet - -class Mixed(eqx.Module): - dists: tuple[BaseF, ...] - - def __getitem__(self, key): - return Mixed(dists=tuple([dist[key] for dist in self.dists])) - -type F = BaseF | Mixed - -class MixedConjugate(eqx.Module): - dists: tuple[BaseG, ...] - -class GEM(eqx.Module): - alpha: Float[Array, "*batch"] - d: Float[Array, "*batch"] - -class Cluster(eqx.Module): - c: Float[Array, "*batch n"] - pi: Float[Array, "*batch k"] - f: Float[Array, "*batch k"] - - def __getitem__(self, key): - return Cluster(self.c[key], self.pi[key], self.f[key]) - -class Trace(eqx.Module): - gem: GEM - g: NormalInverseGamma | Dirichlet | MixedConjugate - cluster: Cluster - - -type BaseDatapoint = Float[Array, "*batch n_c"] | Integer[Array, "*batch n_d"] -type Datapoint = BaseDatapoint | tuple[BaseDatapoint, ...] - -class MixtureModel(eqx.Module): - # mask: Datapoint - pi: Float[Array, "*batch k"] - f: F - -@dispatch -def sample(key: Array, dist: Dirichlet) -> Categorical: - probs = jax.random.dirichlet(key, dist.alpha) - probs = jnp.where(probs == 0, ZERO, probs) - - return Categorical(jnp.log(probs)) - -@dispatch -def sample(key: Array, dist: NormalInverseGamma) -> Normal: - """ See Kevin Murphy's Conjugate Bayesian analysis of the Gaussian distribution: - https://www.cs.ubc.ca/~murphyk/Papers/bayesGauss.pdf """ - keys = jax.random.split(key) - - log_lambda = jax.random.loggamma(key, dist.a) - jnp.log(dist.b) - log_sigma = -jnp.log(dist.l) - log_lambda - std = jnp.exp(log_sigma/ 2) - mu = dist.m + jax.random.normal(keys[1], shape=dist.m.shape) * std - - return Normal(mu=mu, std=jnp.exp(-log_lambda/2)) - -@dispatch -def sample(key: Array, dist: MixedConjugate) -> Mixed: - keys = jax.random.split(key, len(dist.dists)) - dists = tuple([sample(keys[i], dist.dists[i]) for i in range(len(dist.dists))]) - - return Mixed(dists=dists) - -@dispatch -def sample(key: Array, dist: Normal) -> Float[Array, "n_c"]: - return dist.mu + dist.std * jax.random.normal(key, shape=dist.mu.shape) - -@dispatch -def sample(key: Array, dist: Categorical) -> Integer[Array, "n_D"]: - return jax.random.categorical(key, dist.logprobs) - -@dispatch -def sample(key: Array, dist: Mixed) -> tuple[Float[Array, "n_c"], Integer[Array, "n_d"]]: - keys = jax.random.split(key, len(dist.dists)) - dists = tuple([sample(keys[i], dist.dists[i]) for i in range(len(dist.dists))]) - return dists - -@dispatch -def sample(key: Array, dist: MixtureModel): - keys = jax.random.split(key) - cluster = jax.random.categorical(keys[0], dist.pi) - return sample(key, dist.f[cluster]) - -@dispatch -def posterior(dist: MixedConjugate, x: tuple[Float[Array, "batch n_normal_dim"], Integer[Array, "batch n_categorical_dim"]]) -> MixedConjugate: - dists = tuple([posterior(dist.dists[i], x[i]) for i in range(len(dist.dists))]) - - return MixedConjugate(dists=dists) - -@dispatch -def posterior(dist: MixedConjugate, x: tuple[BaseDatapoint, ...], c: Integer[Array, "batch"], max_clusters:Optional[int]=None) -> MixedConjugate: - dists = tuple([posterior(dist.dists[i], x[i], c, max_clusters) for i in range(len(dist.dists))]) - - return MixedConjugate(dists=dists) - -@dispatch -def posterior(dist: MixedConjugate, x: Integer[Array, "batch n_dim"], c: Integer[Array, "batch"], max_clusters:Optional[int]=None) -> MixedConjugate: - dists = tuple([posterior(dist.dists[i], x[i], c, max_clusters) for i in range(len(dist.dists))]) - - return MixedConjugate(dists=dists) -### - -@dispatch -def posterior(dist: NormalInverseGamma, x: Float[Array, "batch n_dim"], c: Integer[Array, "batch"], max_clusters:Optional[int]=None) -> NormalInverseGamma: - N = jax.ops.segment_sum(jnp.ones(x.shape[0], dtype=jnp.int32), c, num_segments=max_clusters) - masked_x = jnp.nan_to_num(x, 0.) - sum_x = jax.ops.segment_sum(masked_x, c, num_segments=max_clusters) - sum_x_sq = jax.ops.segment_sum(masked_x ** 2, c, num_segments=max_clusters) - - return jax.vmap(posterior, in_axes=(None, 0, 0, 0))(dist, N, sum_x, sum_x_sq) - -@dispatch -def posterior(dist: NormalInverseGamma, x: Float[Array, "batch n_dim"]) -> NormalInverseGamma: - N = x.shape[0] - sum_x = jnp.nansum(x, axis=0) - sum_x_sq = jnp.nansum(x ** 2, axis=0) - - return posterior(dist, N, sum_x, sum_x_sq) - -@dispatch -def posterior(dist: NormalInverseGamma, N: Integer[Array, ""], sum_x: Float[Array, "n_dim"], sum_x_sq: Float[Array, "n_dim"]) -> NormalInverseGamma: - l = dist.l + N - m = (dist.l * dist.m + sum_x) / l - a = dist.a + N / 2 - b = dist.b + 0.5 * (sum_x_sq + dist.l * dist.m ** 2 - l * m ** 2) - - return NormalInverseGamma(m=m, l=l, a=a, b=b) - -@dispatch -def posterior(dist: Dirichlet, x: Integer[Array, "batch n_dim"], c: Integer[Array, "batch"], max_clusters:Optional[int]=None) -> Dirichlet: - one_hot_x = jax.nn.one_hot(x, num_classes=dist.alpha.shape[-1], dtype=jnp.int32) - counts = jax.ops.segment_sum(one_hot_x, c, num_segments=max_clusters) - return jax.vmap(posterior, in_axes=(None, 0))(dist, counts) - -@dispatch -def posterior(dist: Dirichlet, counts: Integer[Array, "n_dim k"]) -> Dirichlet: - return Dirichlet(alpha=dist.alpha + counts) - -@dispatch -def logpdf(dist: Normal, x: Float[Array, "n_dim"]) -> Float[Array, ""]: - logprob = jnp.nansum(-0.5 * jnp.log(2 * jnp.pi) - jnp.log(dist.std) - 0.5 * ((x - dist.mu) / dist.std) ** 2) - - return logprob - -@dispatch -def logpdf(dist: Categorical, x: Integer[Array, "n_dim"]) -> Float[Array, ""]: - return jnp.nansum(dist.logprobs.at[jnp.arange(x.shape[-1]), x].get(mode="fill", fill_value=jnp.nan)) - -@dispatch -def logpdf(dist: Mixed, x: Datapoint) -> Float[Array, ""]: - return sum([logpdf(dist.dists[i], x[i]) for i in range(len(dist.dists))]) - -@dispatch -def logpdf(dist: GEM, pi: Float[Array, "n"], K: Integer[Array, ""]) -> Float[Array, ""]: - betas = jax.vmap(lambda i: 1 - pi[i] / pi[i-1])(jnp.arange(len(pi))) - betas = betas.at[0].set(pi[0]) - logprobs = jax.vmap(jax.scipy.stats.beta.logpdf, in_axes=(0, None, 0))(betas, 1-dist.d, dist.alpha + (1 + jnp.arange(len(pi))) * dist.d) - idx = jnp.arange(logprobs.shape[0]) - logprobs = jnp.where(idx < K, logprobs, 0) - return jnp.sum(logprobs) - -@dispatch -def logpdf(dist: F, x: Datapoint, c: Integer[Array, ""]) -> Float[Array, ""]: - dist = dist[c] - return logpdf(dist, x) - -@dispatch -def logpdf(dist: MixtureModel, x: Datapoint) -> Float[Array, ""]: - logprob = jax.vmap(logpdf, in_axes=(0, None))(dist.f, x) - logprob = logprob + jnp.log(dist.pi) - return jax.scipy.special.logsumexp(logprob) - -@dispatch -def logpdf(dist: MixedConjugate, x: Mixed)-> Float[Array, ""]: - return sum([logpdf(dist.dists[i], x.dists[i]) for i in range(len(dist.dists))]) - -@dispatch -def logpdf(dist: NormalInverseGamma, x: Normal)-> Float[Array, ""]: - """Scores the mu and sigma parameters drawn from an inverse gamma prior. - - Pr[sigma] = Gamma(1/sigma^2; loc=a, scale=1/b) - Pr[mu] = Normal(mu | loc=m, scale=sigma/sqrt(l)) - - """ - std_logpdf = jax.scipy.stats.gamma.logpdf(x.std ** -2, dist.a, scale=1/dist.b) - mu_logpdf = jax.scipy.stats.norm.logpdf(x.mu, loc=dist.m, scale=x.std / jnp.sqrt(dist.l)) - return jnp.sum(mu_logpdf + std_logpdf) - -@dispatch -def logpdf(dist: Dirichlet, x: Categorical)-> Float[Array, ""]: - logprobs = jax.vmap(jax.scipy.stats.dirichlet.logpdf)(jnp.exp(x.logprobs), dist.alpha) - return jnp.sum(logprobs) - -def make_trace( - key: jax.Array, alpha: Real, d: Real, - schema: dict, - data: Datapoint, - max_clusters: int): - - g = make_g(schema) - - n = len(data[0]) if isinstance(data, tuple) else len(data) - c = jnp.zeros(n, dtype=int) - - if not isinstance(data, tuple): - data = (data,) - g_prime = posterior(g, data, c, 2 * max_clusters) - - f = sample(key, g_prime) - pi = jnp.zeros(max_clusters) - pi = pi.at[0].set(.9) - cluster = Cluster(c=c, f=f, pi=pi) - gem = GEM(alpha=alpha, d=d) - - return Trace(gem=gem, g=g, cluster=cluster) - -def make_g(schema: dict): - dists = [] - if schema["types"]["normal"]: - dists.append(make_normal_g(schema)) - if schema["types"]["categorical"]: - dtypes = schema["var_metadata"]["categorical_precisions"] - unique_dtypes = list(set(dtypes)) - for dtype in unique_dtypes: - dists.append(make_categorical_g(schema, dtype)) - - return MixedConjugate(dists=dists) - -def make_normal_g(schema: dict): - n_continuous = len(schema["types"]["normal"]) - - return NormalInverseGamma( - m=jnp.zeros(n_continuous), l=jnp.ones(n_continuous), - a=jnp.ones(n_continuous), b=jnp.ones(n_continuous)) - -def make_categorical_g(schema: dict, dtype: int): - dtypes = schema["var_metadata"]["categorical_precisions"] - n_discrete = len([d for d in dtypes if dtype == d]) - n_categories = jnp.array([len(schema["var_metadata"][col]["levels"]) - for idx, col in enumerate(schema["types"]["categorical"]) - if dtypes[idx] == dtype]) - max_n_categories = jnp.max(n_categories).astype(int) - - cat_alpha = jnp.ones((n_discrete, max_n_categories)) - mask = jnp.tile(jnp.arange(max_n_categories), (n_discrete, 1)) < n_categories[:, None] - cat_alpha = jnp.where(mask, cat_alpha, ZERO) - - return Dirichlet(alpha=cat_alpha) diff --git a/src/genspn/io.py b/src/genspn/io.py deleted file mode 100644 index 2a22597..0000000 --- a/src/genspn/io.py +++ /dev/null @@ -1,177 +0,0 @@ -import polars as pl -import polars.selectors as cs -import numpy as np -import jax -import jax.numpy as jnp -from jaxtyping import Array, Float, Integer, Num -from plum import dispatch -import os -from safetensors import safe_open -from safetensors.flax import save_file - - -def dataframe_to_arrays(df: pl.DataFrame): - schema = make_schema(df) - categorical_df = df.select(schema["types"]["categorical"]) - numerical_df = df.select(schema["types"]["normal"]) - - def normalize(col: pl.Expr): - return (col - schema["var_metadata"][col.name]["mean"]) / schema["var_metadata"][col.name]["std"] - - numerical_df = numerical_df.with_columns( - pl.all().map_batches(normalize) - ) - - numerical_array = None if numerical_df.is_empty() else jnp.array(numerical_df.to_numpy()) - categorical_arrays, schema = (None, schema) if categorical_df.is_empty() else categorical_df_to_integer(categorical_df, schema) - - return schema, (numerical_array, *categorical_arrays) - - -def categorical_df_to_integer(df: pl.DataFrame, schema: dict): - def cast_to_categorical(col: pl.Expr): - return col.cast(pl.Enum(schema["var_metadata"][col.name]["levels"])) - - df = df.with_columns(pl.all().map_batches(cast_to_categorical)) - - array = df.with_columns(pl.all().to_physical()).to_numpy() - array = jnp.array(array) - - all_n_categories = np.nanmax(array, axis=0) - dtypes = [get_dtype(n_categories) for n_categories in all_n_categories] - unique_dtypes = list(set(dtypes)) - - arrays = [] - for dtype in unique_dtypes: - idxs = np.where(np.array(dtypes) == dtype)[0] - arrays.append(jnp.nan_to_num(array[:, idxs], nan=jnp.iinfo(dtype).max).astype(dtype)) - - dtype_idxs = [unique_dtypes.index(dtype) for dtype in dtypes] - schema["var_metadata"]["categorical_precisions"] = dtype_idxs - - return arrays, schema - -def get_dtype(n_categories): - match n_categories: - case n_categories if n_categories < jnp.iinfo(jnp.uint4).max: - dtype = jnp.uint8 # uint4 currently not supported by jax - case n_categories if n_categories < jnp.iinfo(jnp.uint8).max: - dtype = jnp.uint8 - case n_categories if n_categories < jnp.iinfo(jnp.uint16).max: - dtype = jnp.uint16 - case n_categories if n_categories < jnp.iinfo(jnp.uint32).max: - dtype = jnp.uint32 - case n_categories if n_categories < jnp.iinfo(jnp.uint64).max: - dtype = jnp.uint64 - case _: - raise ValueError(n_categories) - - return dtype - -def load_huggingface(dataset_path): - splits = { - "train": f"{dataset_path}/data-train.parquet", - "test": f"{dataset_path}/data-test.parquet" - } - train_df = pl.read_parquet(f"hf://datasets/Large-Population-Model/model-building-evaluation/{splits['train']}") - test_df = pl.read_parquet(f"hf://datasets/Large-Population-Model/model-building-evaluation/{splits['test']}") - - df = pl.concat((train_df, test_df)) - schema, (numerical_array, categorical_array) = dataframe_to_arrays(df) - - n_train = len(train_df) - - if numerical_array is None: - return schema, (categorical_array[:n_train], categorical_array[n_train:]) - elif categorical_array is None: - return schema, (numerical_array[:n_train], numerical_array[n_train:]) - else: - return schema, ((numerical_array[:n_train], categorical_array[:n_train]), (numerical_array[n_train:], categorical_array[n_train:])) - - -def _get_indices(n, seed: int): - """"Create a random permutation of indices using the provided seed.""" - rng = np.random.default_rng(seed) - return rng.permutation(n) - - -@dispatch -def split_data(data: tuple[Float[Array, "n n_c"], Integer[Array, "n n_d"]], test_ratio: float = 0.2, seed: int = 42): - # Unpack the train_data tuple - data_numerical, data_categorical = data - - # Calculate the number of samples for the train set - n_samples = data_numerical.shape[0] - n_train = int((1 - test_ratio) * n_samples) - - # Create a random permutation of indices - indices = _get_indices(n_samples, seed) - - # Split the numerical data - train_numerical, test_numerical = data_numerical[indices[:n_train]], data_numerical[indices[n_train:]] - - # Split the categorical data - train_categorical, test_categorical = data_categorical[indices[:n_train]], data_categorical[indices[n_train:]] - - # Recombine the split data into tuples - train_data = (train_numerical, train_categorical) - test_data = (test_numerical, test_categorical) - - return train_data, test_data - - -@dispatch -def split_data(data: Float[Array, "n n_c"] | Integer[Array, "n n_d"], test_ratio: float = 0.2, seed: int = 42): - # Calculate the number of samples for the train set (80% of the data) - n_samples = data.shape[0] - n_train = int((1 - test_ratio) * n_samples) - - # Create a random permutation of indices - indices = _get_indices(n_samples, seed) - - # Split the numerical data - train_data, test_data = data[indices[:n_train]], data[indices[n_train:]] - - return train_data, test_data - -def make_schema(df: pl.DataFrame): - schema = { - "types":{ - "normal": [], - "categorical": [] - }, - "var_metadata":{} - } - for c in df.columns: - if df[c].dtype == pl.Utf8: - schema["types"]["categorical"].append(c) - schema["var_metadata"][c] = {"levels": df[c].drop_nulls().unique().sort().to_list()} - elif df[c].dtype == pl.Float64: - schema["types"]["normal"].append(c) - schema["var_metadata"][c] = {"mean": df[c].mean(), "std": df[c].std()} - else: - raise ValueError(c) - return schema - - -def _assert_keys_mixture(mixture_parameters): - heterogeneous = {"cluster_weights", "mu", "sigma", "logprobs"} - numerical = {"cluster_weights", "mu", "sigma"} - categorical = {"cluster_weights", "logprobs"} - assert set(mixture_parameters.keys()) == heterogeneous or \ - set(mixture_parameters.keys()) == numerical or \ - set(mixture_parameters.keys()) == categorical, \ - "wrong keys for parameter record. pi cannot be null;" + \ - "either mu and std are not null or logprobs are not null" - -def serialize(mixture_parameters, path): - _assert_keys_mixture(mixture_parameters) - save_file(mixture_parameters, path) - -def deserialize(path): - mixture_parameters = {} - with safe_open(path, framework="flax", device="cpu") as f: - for key in f.keys(): - mixture_parameters[key] = f.get_tensor(key) - _assert_keys_mixture(mixture_parameters) - return mixture_parameters diff --git a/uv.lock b/uv.lock index e19846f..d85f34f 100644 --- a/uv.lock +++ b/uv.lock @@ -60,6 +60,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001 }, ] +[[package]] +name = "babel" +version = "2.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 }, +] + [[package]] name = "beartype" version = "0.18.5" @@ -69,6 +78,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/64/43/7a1259741bd989723272ac7d381a43be932422abcff09a1d9f7ba212cb74/beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089", size = 917762 }, ] +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 }, +] + +[[package]] +name = "bleach" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406 }, +] + [[package]] name = "cachetools" version = "5.5.0" @@ -159,6 +192,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, ] +[[package]] +name = "click" +version = "8.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, +] + [[package]] name = "cloudpickle" version = "3.1.0" @@ -288,6 +333,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 }, ] +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, +] + [[package]] name = "deprecated" version = "1.2.15" @@ -324,6 +378,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", size = 25805 }, ] +[[package]] +name = "fastjsonschema" +version = "2.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 }, +] + [[package]] name = "filelock" version = "3.16.1" @@ -415,6 +478,16 @@ dependencies = [ { name = "pytest" }, ] +[package.dev-dependencies] +dev = [ + { name = "jupytext" }, + { name = "mkdocs" }, + { name = "mkdocs-jupyter" }, + { name = "mkdocs-material" }, + { name = "mkdocstrings" }, + { name = "mkdocstrings-python" }, +] + [package.metadata] requires-dist = [ { name = "altair", specifier = ">=5.5.0" }, @@ -432,6 +505,28 @@ requires-dist = [ { name = "pytest", specifier = ">=8.3.3" }, ] +[package.metadata.requires-dev] +dev = [ + { name = "jupytext", specifier = ">=1.16.4" }, + { name = "mkdocs", specifier = ">=1.6.1" }, + { name = "mkdocs-jupyter", specifier = ">=0.25.1" }, + { name = "mkdocs-material", specifier = ">=9.5.48" }, + { name = "mkdocstrings", specifier = ">=0.27.0" }, + { name = "mkdocstrings-python", specifier = ">=1.12.2" }, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 }, +] + [[package]] name = "google-auth" version = "2.36.0" @@ -446,6 +541,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/9a/3d5087d27865c2f0431b942b5c4500b7d1b744dd3262fdc973a4c39d099e/google_auth-2.36.0-py2.py3-none-any.whl", hash = "sha256:51a15d47028b66fd36e5c64a82d2d57480075bccc7da37cde257fc94177a61fb", size = 209519 }, ] +[[package]] +name = "griffe" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/c9/8167810358ca129839156dc002526e7398b5fad4a9d7b6e88b875e802d0d/griffe-1.5.1.tar.gz", hash = "sha256:72964f93e08c553257706d6cd2c42d1c172213feb48b2be386f243380b405d4b", size = 384113 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/00/e693a155da0a2a72fd2df75b8fe338146cae59d590ad6f56800adde90cb5/griffe-1.5.1-py3-none-any.whl", hash = "sha256:ad6a7980f8c424c9102160aafa3bcdf799df0e75f7829d75af9ee5aef656f860", size = 127132 }, +] + [[package]] name = "huggingface-hub" version = "0.26.2" @@ -726,6 +833,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, ] +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 }, +] + +[[package]] +name = "jupytext" +version = "1.16.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/ba/81097573072b165772b71298c339d5da46dfeec53c1c354ce282109967ea/jupytext-1.16.4.tar.gz", hash = "sha256:28e33f46f2ce7a41fb9d677a4a2c95327285579b64ca104437c4b9eb1e4174e9", size = 3724368 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/a3/285eb1e79dbbd8e9513a3bb1bb2bb3d4c7c22c8a92efb8449baface0b864/jupytext-1.16.4-py3-none-any.whl", hash = "sha256:76989d2690e65667ea6fb411d8056abe7cd0437c07bd774660b83d62acf9490a", size = 153540 }, +] + [[package]] name = "keyring" version = "25.5.0" @@ -798,6 +930,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/a4/df2bdca5270ca85fd25253049eb6708d4127be2ed0e5c2650217450b59e9/kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650", size = 48530 }, ] +[[package]] +name = "markdown" +version = "3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/28/3af612670f82f4c056911fbbbb42760255801b3068c48de792d354ff4472/markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", size = 357086 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803", size = 106349 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + [[package]] name = "markupsafe" version = "3.0.2" @@ -884,6 +1037,178 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, ] +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354 }, +] + +[[package]] +name = "mistune" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/c8/f0173fe3bf85fd891aee2e7bcd8207dfe26c2c683d727c5a6cc3aec7b628/mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8", size = 90840 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/74/c95adcdf032956d9ef6c89a9b8a5152bf73915f8c633f3e3d88d06bd699c/mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205", size = 47958 }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, +] + +[[package]] +name = "mkdocs-autorefs" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/ae/0f1154c614d6a8b8a36fff084e5b82af3a15f7d2060cf0dcdb1c53297a71/mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f", size = 40262 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/26/4d39d52ea2219604053a4d05b98e90d6a335511cc01806436ec4886b1028/mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f", size = 16522 }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 }, +] + +[[package]] +name = "mkdocs-jupyter" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "jupytext" }, + { name = "mkdocs" }, + { name = "mkdocs-material" }, + { name = "nbconvert" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/23/6ffb8d2fd2117aa860a04c6fe2510b21bc3c3c085907ffdd851caba53152/mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe", size = 1626747 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8", size = 1456197 }, +] + +[[package]] +name = "mkdocs-material" +version = "9.5.48" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/e3/925e4c619c03cd538b77d329479f64d75ed9ae35f5d936a19023204de6eb/mkdocs_material-9.5.48.tar.gz", hash = "sha256:a582531e8b34f4c7ed38c29d5c44763053832cf2a32f7409567e0c74749a47db", size = 3936033 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/c2/5cb2482c12d3473c00b6a8b8fe7305613142d418d87871edb83a9eb89981/mkdocs_material-9.5.48-py3-none-any.whl", hash = "sha256:b695c998f4b939ce748adbc0d3bff73fa886a670ece948cf27818fa115dc16f8", size = 8666114 }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 }, +] + +[[package]] +name = "mkdocstrings" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, + { name = "mkdocs-autorefs" }, + { name = "platformdirs" }, + { name = "pymdown-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/5a/5de70538c2cefae7ac3a15b5601e306ef3717290cb2aab11d51cbbc2d1c0/mkdocstrings-0.27.0.tar.gz", hash = "sha256:16adca6d6b0a1f9e0c07ff0b02ced8e16f228a9d65a37c063ec4c14d7b76a657", size = 94830 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/10/4c27c3063c2b3681a4b7942f8dbdeb4fa34fecb2c19b594e7345ebf4f86f/mkdocstrings-0.27.0-py3-none-any.whl", hash = "sha256:6ceaa7ea830770959b55a16203ac63da24badd71325b96af950e59fd37366332", size = 30658 }, +] + +[[package]] +name = "mkdocstrings-python" +version = "1.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffe" }, + { name = "mkdocs-autorefs" }, + { name = "mkdocstrings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/ec/cb6debe2db77f1ef42b25b21d93b5021474de3037cd82385e586aee72545/mkdocstrings_python-1.12.2.tar.gz", hash = "sha256:7a1760941c0b52a2cd87b960a9e21112ffe52e7df9d0b9583d04d47ed2e186f3", size = 168207 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/c1/ac524e1026d9580cbc654b5d19f5843c8b364a66d30f956372cd09fd2f92/mkdocstrings_python-1.12.2-py3-none-any.whl", hash = "sha256:7f7d40d6db3cb1f5d19dbcd80e3efe4d0ba32b073272c0c0de9de2e604eda62a", size = 111759 }, +] + [[package]] name = "ml-dtypes" version = "0.4.1" @@ -942,6 +1267,62 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ba/eb/988fdc5380e263f3f4ce40dd544720edc2ae5bd8f85c019ccdc6668399e5/narwhals-1.14.2-py3-none-any.whl", hash = "sha256:2e784800b87c9e1ff47984da0046d957320f39b64c08f0e5b1b1a1208694935c", size = 225143 }, ] +[[package]] +name = "nbclient" +version = "0.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/db/25929926860ba8a3f6123d2d0a235e558e0e4be7b46e9db063a7dfefa0a2/nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68", size = 62273 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/1a/ed6d1299b1a00c1af4a033fdee565f533926d819e084caf0d2832f6f87c6/nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d", size = 25344 }, +] + +[[package]] +name = "nbconvert" +version = "7.16.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach" }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "tinycss2" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/e8/ba521a033b21132008e520c28ceb818f9f092da5f0261e94e509401b29f9/nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4", size = 854422 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/bb/bb5b6a515d1584aa2fd89965b11db6632e4bdc69495a52374bcc36e56cfa/nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3", size = 257388 }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 }, +] + [[package]] name = "nest-asyncio" version = "1.6.0" @@ -994,6 +1375,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] +[[package]] +name = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746 }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663 }, +] + [[package]] name = "parso" version = "0.8.4" @@ -1003,6 +1402,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, ] +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + [[package]] name = "penzai" version = "0.2.3" @@ -1213,6 +1621,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", size = 1205513 }, ] +[[package]] +name = "pymdown-extensions" +version = "10.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/0b/32f05854cfd432e9286bb41a870e0d1a926b72df5f5cdb6dec962b2e369e/pymdown_extensions-10.12.tar.gz", hash = "sha256:b0ee1e0b2bef1071a47891ab17003bfe5bf824a398e13f49f8ed653b699369a7", size = 840790 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/32/95a164ddf533bd676cbbe878e36e89b4ade3efde8dd61d0148c90cbbe57e/pymdown_extensions-10.12-py3-none-any.whl", hash = "sha256:49f81412242d3527b8b4967b990df395c89563043bc51a3d2d7d500e52123b77", size = 263448 }, +] + [[package]] name = "pyparsing" version = "3.2.0" @@ -1297,6 +1718,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, ] +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/8e/da1c6c58f751b70f8ceb1eb25bc25d524e8f14fe16edcce3f4e3ba08629c/pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb", size = 5631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/66/bbb1dd374f5c870f59c5bb1db0e18cbe7fa739415a24cbd95b2d1f5ae0c4/pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069", size = 3911 }, +] + [[package]] name = "pyzmq" version = "26.2.0" @@ -1354,6 +1787,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de", size = 26684 }, ] +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, +] + [[package]] name = "requests" version = "2.32.3" @@ -1464,6 +1935,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 }, ] +[[package]] +name = "soupsieve" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, +] + [[package]] name = "stack-data" version = "0.6.3" @@ -1495,6 +1975,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/90/4e8c686f2e691f48e40e16a539c61a6e9880743733d8c4dc3f275d12268e/tensorflow_probability-0.23.0-py2.py3-none-any.whl", hash = "sha256:dda5cacfe50cb19ecd96f3ce81e6ff8680d84213bcfe94ca0aaf6e5f51c88061", size = 6915575 }, ] +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, +] + [[package]] name = "tornado" version = "6.4.2" @@ -1564,6 +2056,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, ] +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, +] + [[package]] name = "wcwidth" version = "0.2.13" @@ -1573,6 +2089,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, ] +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, +] + [[package]] name = "wheel" version = "0.45.1"