From 5b51f79665c6e091d23faa3921bb71308b705e79 Mon Sep 17 00:00:00 2001 From: Mack Sweeney Date: Sun, 21 Jul 2019 18:37:41 -0400 Subject: [PATCH] add examples notebook and some docstrings --- daft_builder/pgm.py | 11 +- daft_builder/utils.py | 6 + notebooks/examples.ipynb | 242 +++++++++++++++++++++++++++++++++++++++ tests/test_utils.py | 2 + 4 files changed, 257 insertions(+), 4 deletions(-) create mode 100644 notebooks/examples.ipynb diff --git a/daft_builder/pgm.py b/daft_builder/pgm.py index a6645c5..6558e73 100644 --- a/daft_builder/pgm.py +++ b/daft_builder/pgm.py @@ -1,7 +1,10 @@ +""" +Core builder interfaces. + +""" import logging import itertools -import matplotlib; matplotlib.use('Agg') import daft from toposort import toposort @@ -131,8 +134,8 @@ def add_kwarg_defaults(self, symbol, kwargs): kwargs['name'] = name kwargs.setdefault('scale', 2) - if 'fixed' in kwargs: - kwargs['offset'] = (0, 10) + if 'fixed' in kwargs and 'offset' not in kwargs: + kwargs['offset'] = (0, -25) if self.placement.startswith('below') else (0, 10) return kwargs @@ -436,7 +439,7 @@ def place(self): x_units = x + width y_units = y + height - # Need to expand further to accomodate plates, if present + # Need to expand further to accommodate plates, if present # Right now, we just assume plates are present all around. # TODO: actually figure out if plates are present and only expand if so. x_units += 0.3 diff --git a/daft_builder/utils.py b/daft_builder/utils.py index 43221f4..dac84f1 100644 --- a/daft_builder/utils.py +++ b/daft_builder/utils.py @@ -1,3 +1,9 @@ +""" +Utility functions. + +""" + + def name_from_symbol(symbol): starts_with_modifier = symbol.startswith('$\\') symbol = symbol.strip('$').replace('\\', '') diff --git a/notebooks/examples.ipynb b/notebooks/examples.ipynb new file mode 100644 index 0000000..e80ebd6 --- /dev/null +++ b/notebooks/examples.ipynb @@ -0,0 +1,242 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "\n", + "from daft_builder import PGM, Plate, Node, Data, Param, HyperParam\n", + "\n", + "logging.basicConfig(level=logging.INFO)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Latent Dirichlet Allocation" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pgm = (PGM()\n", + " .with_plate(Plate(r\"$M$\")\n", + " .with_nodes(\n", + " Data(r\"$W$\", xy=(3, 0.7)),\n", + " Param(r\"$Z$\", left_of=\"W\")))\n", + " .with_plate(Plate(r\"$N$\")\n", + " .with_nodes(\n", + " Param(r\"$\\theta$\", left_of=\"Z\"),\n", + " \"Z\", \"W\"))\n", + " .with_nodes(\n", + " Param(r\"$\\alpha$\", left_of=\"theta\"),\n", + " Param(r\"$\\psi$\", above=\"W\"),\n", + " Param(r\"$\\beta$\", left_of=\"psi\"))\n", + ").build()\n", + "pgm.render();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Hierarchical Heteroskedastic Linear Regression" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeYAAAG4CAYAAACQF0RIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3Xd4XNW19/Hvb+RuwIADIWCw6dW4UWJq6BBa6CUQer/0FiAEbhJKgISE0FuoIeGSQuDFQOjNmGDTHDo2phOqsXHXrPePvYXHQrLamVNm1ud59Egajc5ZGs2ZNXufddaWmeGcc865fChlHYBzzjnn5vLE7JxzzuWIJ2bnnHMuRzwxO+ecczniidk555zLEU/MzjnnXI54YnbOOedyxBOzc845lyOemJ1zzrkc8cTsnHPO5YgnZueccy5HPDE755xzOeKJ2TnnnMsRT8zOOedcjnhids4553LEE7NzzjmXI56YnXPOuRzxxOycc87liCdm55xzLkc8MTvnnHM54onZOeecyxFPzM4551yOeGJ2zjnncsQTs3POOZcjnpidc865HPHE7JxzzuWIJ2bnnHMuRzwxO+ecczniidk555zLEU/MzjnnXI54YnbOOedyxBOzc845lyOemJ1zzrkc8cTsnHPO5YgnZueccy5HPDE755xzOeKJ2TnnnMsRT8zOOedcjnhids4553LEE7NzzjmXI56YnXPOuRzxxOycc87liCdm55xzLkc8MTvnnHM54onZOeecyxFPzM4551yOeGJ2zjnncsQTs3POOZcjnpidc865HPHE7JxzzuWIJ2bnnHMuRzwxO+ecczniidk555zLEU/MzjnnXI54YnbOOedyxBOzc845lyOemJ1zzrkc8cTsnHPO5YgnZpcbkp6W9GrWcTjnXJY8MbtckNQArAm8kHUszrlvk7SuJJN0WNax1DpPzC4vVgZ644nZubwaEj8/l2kUdcATs8uLofGzJ2bn8mlNoBF4KetAap0n5oxIWlTSL+J51U8kTZP0qqRTJdXj/2VY/PyOpEskvS/pK0kPSlo908iccxBGzK+Z2fSsA6l19ZgA8mILYDfgCeDnwGnA58D5wEkZxpWVocAs4DagP3A2cBWwAfCQpIWyC83VOknfkXSupP9Imi7pc0mPSdox69jSJmmIpH9ImizpS0lX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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pgm = (PGM()\n", + " .with_plate(Plate(r\"$n = 1, \\ldots, N$\")\n", + " .with_nodes(\n", + " Data(r\"$y_n$\", xy=(2, 0.5), scale=2),\n", + " Data(r\"$X_n$\", above=\"y_n\")\n", + " .with_edges_to(\"y_n\"),\n", + " Param(r\"$\\sigma_n^2$\", right_of=\"X_n\", of=\"y_n\")))\n", + " .with_plate(Plate(r\"$m = 0, \\ldots, M$\")\n", + " .with_nodes(\n", + " Param(r\"$\\beta_m$\", left_of=\"X_n\", of=\"y_n\")))\n", + " .with_nodes(\n", + " HyperParam(r\"$a_\\sigma$\", above_l=\"sigma_n_sq\"),\n", + " Param(r\"$b_\\sigma$\", above_r=\"sigma_n_sq\"),\n", + " HyperParam(r\"$c_\\sigma$\", above_l=\"b_sigma\", shift_y=-0.5),\n", + " HyperParam(r\"$d_\\sigma$\", above_r=\"b_sigma\", shift_y=-0.5))\n", + " .with_plate(Plate(r\"$g = 1, \\ldots, G$\")\n", + " .with_nodes(\n", + " Param(r\"$\\rho_g^2$\", above=\"beta_m\")))\n", + " .with_nodes(\n", + " HyperParam(r\"$a_\\rho$\", above_l=\"rho_g_sq\", shift_y=-0.5),\n", + " HyperParam(r\"$b_\\rho$\", above_r=\"rho_g_sq\", shift_y=-0.5))\n", + ").build()\n", + "pgm.render();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Probabilistic Matrix Factorization" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pgm = (PGM()\n", + " .with_plate(Plate(r\"$m = 1, \\ldots, M$\")\n", + " .with_nodes(\n", + " Data(r\"$R_{i, j}$\", xy=(1.5, 1.5)),\n", + " Param(r\"$V_j$\", above_l=\"R_ij\", shift_x=-0.4)))\n", + " .with_plate(Plate(r\"$n = 1, \\ldots, N$\")\n", + " .with_nodes(\n", + " \"R_ij\",\n", + " Param(r\"$U_i$\", above_r=\"R_ij\", shift_x=0.4)))\n", + " .with_nodes(\n", + " HyperParam(r\"$\\sigma_V$\", above=\"V_j\"),\n", + " HyperParam(r\"$\\sigma_U$\", above=\"U_i\"),\n", + " HyperParam(r\"$\\sigma$\", below=\"R_ij\"))\n", + ").build()\n", + "pgm.render();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Classic Cloudy/Rain/Sprinkler/Wet Graph" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pgm = (PGM(node_ec=\"none\")\n", + " .with_nodes(\n", + " Node(\"grass wet\", xy=(1.0, 0.5)),\n", + " Param(\"rain\", above_l=\"grass wet\", shift_x=-0.5),\n", + " Param(\"sprinkler\", above_r=\"grass wet\", shift_x=0.5),\n", + " Param(\"cloudy\", above_r=\"rain\", shift_x=0.5, of=[\"rain\", \"sprinkler\"]))\n", + ").build()\n", + "pgm.render();" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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BkVnnXVWZpVVinH+iPx7+eWXueKKK7LV1dVZd9/d3Z9OuyYpDgrHAmdma2QymckVFRXrX3zxxZktttgi7ZKKThRFXH755dELL7xgwHnufnnaNUnhUzgWMDMbbGYTunfv3u6qq66q6Nq1a9olFbUHHniAUaNGAfzX3X/W2skwpDwoHAuUmZ0MXLv99tv7iBEjMpmMZpdrC2+99Rbnn39+lM1mZ0VR1M/dFzT9KClHCscCFM+gc8ORRx5phx12WNrllJxvvvmGX//619kFCxZ8GUXRhu6+OO2apPAoHAuMmR0B3KZgzK3q6mqOO+64bHV19adRFG3s7kvTrkkKi/bVCoiZ/RC47aCDDlIw5linTp244YYbKiorK3tmMpkX065HCo/CsUCYWaWZTejfv390zDHHpF1OWejSpQtXXnllJp6x6IK065HConAsEJlM5smOHTt2vOCCCyrSrqWc9OzZk5NOOsmAP5rZdmnXI4VD4VgAzGxYFEVDLrvssopSm0GnGOy999707dvXM5nMmLRrkcKhcCwAmUzm1gEDBkS9e/dOu5Sydd5552WiKNrAzHSwVwCFY+rM7Ofuvu7ZZ5+t/4scueOOO3jxxcZ7Lt27d2eHHXbwTCZzTZ7KkgKnX8iUZTKZ87fYYgtfffXV0y6lZI0ePZqJEyc2ud3w4cMtiqJuZrZNHsqSAqdwTJGZVUZRtOVhhx2W0/+H6urqXD59yejSpQtrr712Frgg7VokfToJPEVmdkr79u2vvvfeexvtUM+ZM4dRo0YxefJkAAYMGMDxxx/P+eefz1prrcWll36/BPU+++zDsGHDGDZsGLfffjsffPABm2yyCZdeeilfffUV999/P1VVVXz++ecsWbKEddZZh2HDhnHAAQdQUfF9GUuWLOGee+7hmWee4YsvvqB9+/asueaabLvtthx77LHLtnv55ZcZM2YMM2fOZPHixXTp0oVNN92Uo48+mp49ezb4PV111VU888wz3HnnncuWcZg+fTpnn302q622Grfffju1l0y+8sorXHjhhZxzzjnsuOOOy57j2WefZdy4cXz44Ydks1k22mgjDjzwQIYMGbLs53b88ccnvv64ceMS77/77ru5/fbbv8tms6s19n8ipa9d2gWUuZ+stdZajW7wzTffcO655zJv3jz23HNPevXqxbRp0zj//PNZtGhR4mNmzJjBiy++yO67784uu+yy7P4PP/yQF154gR/96Eesu+661NTU8Nprr3HzzTfz2Wefceqppy7b9vrrr+fxxx9n2LBh7LfffkRRxKeffsqUKVOWbTN16lQuvvhiNthgAw455BBWXXVV5s6dy+TJk5k9e3aj4ThgwACefPJJ3nrrLbbaaisAqqqqyGQyfPvtt7z//vtssskmAEyZMgUzo3///ssef+utt3L33Xez7bbbcuSRR2JmTJw4kcsuu4yTTz6Zvffem65du3LGGWcwcuRI+vXrxx577NHozxpgyJAh3HrrrauamWliivKmcExRJpPZunfv3o2OGseMGcOXX37JmWeeyU9+8hMA9tprL2688UbuvffexMfMnDmTiy66iK233nq5+7fcckv+9a9/ESYTD/bbbz+uuOIKHn/8cY444gi6desGwIsvvsgPf/hDTj/99AZrmzRpElEUcdFFF1H3mGlzru6pG4i1/54yZQrbb789U6ZMoaqqarlw3GCDDZa9xowZM7j77rs55JBD+OUvf7nsOffdd18uvvhibr75ZoYOHUqnTp0YOnQoI0eOZO2112bo0KFN1tWzZ0/iXBwCPNfkA6Rk6ZhjutZq6vSdl156iW7durHTTjstd/8BBxzQ4GN69+69QjACVFZWLgvGpUuXsmDBAubPn8+2225LFEXMmDFj2badOnVi5syZfPTRRw2+zqqrrgrACy+8QDbbstVRu3fvTs+ePZeNRJcsWcL06dPZZptt2HLLLamqqgLCsgcffPABAwYMWPbYp59+GjNj2LBhzJ8/f7nboEGDWLhwIdOnT29RPXVVVlZGwPatfgIpCRo5pquisrKy0Q3mzJnDZpttRv0py1ZfffVl4VTfeuutl3h/NpvlnnvuYfz48cyePZv6e43ffvvtsn+fcMIJjBw5klNPPZV11lmH/v37M3DgQAYOHLislr333puJEydy3XXXcdNNN7HFFluw7bbbsvPOO9OcuScHDBjAY489RnV1Ne+++y5LlixhwIABLF26lNtuu42lS5cydepUoihaLhw//vhj3J3hw4c3+Nzz5s1r8vUbkslkHOjY6ieQkqBwTFe0ZMmSNn/ShgL3X//6Fw8++CA77rgjhx56KF27dqVdu3a899573HTTTURRtGzbwYMHM2rUKF555RXeeOMNJk+ezOOPP06/fv246KKLaN++PV26dGHkyJG8+eabvP7660ybNo1Ro0Zxxx13cMEFF7D55ps3WueAAQN4+OGHmTZtGtOnT6dbt2706tWLmpoaRo0axdtvv82UKVPIZDJsueWWyx7n7pgZF1xwwQp/NGptsMEGrfjJff/8QNv/x0hRUTimyMzmz549u3Nj26y11lrMnj2bKIqWC4J58+bx3Xfftej1nnrqKfr168c555yz3P2zZ89O3L5z584MHTqUoUOH4u7cfPPNjBkzhkmTJrHDDjsAUFFRQf/+/Zc1Sz744ANOP/107rrrLv70pz81Wk///v0xM6qqqpg+ffqy0eFGG21Ely5dqKqqYurUqfTp04fVVvu+ebzeeuvx2muv0aNHD3r16tWin0FzLF68OAO80+ZPLEVFxxxTlM1mp86YMSNqbJuBAwcyd+5cnnnmmeXuv++++1r8ekmjrEWLFvHAAw/Ur2u5XWwAM6NPnz4ALFgQJs+eP3/+Cs+3/vrr06FDh2XbNKZr165suOGGvPzyy8yYMWNZY6a2M/38888zc+bMZffXqm2s3HLLLYnHOr/++uvlPu/YseMK309D5s2bRxRFGeDRZj1ASpZGjul68bPPPtuNRv5IHXTQQTz99NNcffXVvPPOO6y//vrLdkO7dOmyXOe5KUOGDOGRRx7h8ssvZ+utt2bevHk8/vjjdO68/OB14cKFHH300QwcOJA+ffqw+uqrM2fOHP773/+y2mqrMXDgQAD+/ve/8+WXX7LNNtuw1lprsWTJEp599lkWLlzIsGHDmlXTgAEDGDt27LJ/19pqq614/vnnV7gfYLPNNuOII47gjjvu4He/+x1DhgyhW7dufP3118yYMYNXX311uT8effv2ZfLkydxzzz306NEDM1uhwVVr4sSJmNmSKIo0O3iZUzim6x8LFy7888cff9zg7mHXrl25/PLL+fe//80TTzwBhLC45JJLOOOMM2jJLD7HHXccHTt25LnnnmPSpEmsueaa7LHHHmy22WaMGDFi2XaVlZXsu+++VFVVUVVVxcKFC+nWrRuDBg3ikEMOoXv37kAYwT355JOMHz+e+fPn06lTJ3r16sW555677ETspmy11VaMHTuWddZZh7rnfNaOFtu1a0fSiouHH344m2yyCePGjWPs2LEsWrSI1VdfnQ022IATTzxxuW2HDx/Oddddx913383ChWHp6obC8ZFHHomA15pVvJQ0XSGTsnbt2s0cPHjw+ueee27zh4CEk8OPPPJI9txzT0455ZRclVdWlixZwsEHH+zuvp+7J19CI2VDxxxTls1mr500aZLX1NQ0uM3ixSvu4d1zzz0AieczSuvcddddAEsUjALarS4El2ez2T9cf/31HU899dTE0eOFF15Ijx492HjjjXF3qqqqePnll/nBD37A4MGD811vSVqyZAljxoyJ3P1/065FCoN2qwuAmQ03s2tuu+0269Klywpfv++++xg/fvyyySK6d+/Oj370Iw4//HA6deqUQsWlZ+TIkf70009/F0VRF11TLaBwLBgVFRWf9OzZc51rr71Wa8jk2bRp0zj33HMBfuHut6ddjxQGHXMsEFEUDfn4448ZNWpU2qWUlerqav74xz9GZvagglHqUjgWCHf/CDju/vvvb3JKf2kbURRx5plnZmtqaua6+75p1yOFReFYQNz9ZuDvl156qb/2mk61y6UoijjrrLOys2bNWhpF0XY6zij16ZhjAcpkMjcCR19yySVWd4JXaRtRFPH73/8+++abb2bdvZ+7z2j6UVJuFI4FKpPJ3O7uRxx33HHsv//+aZdTMr799ltOO+207Oeff551923dfVraNUlhUjgWMDM7C/jfwYMH+3nnnZdpaHouaZ533nmH8847L6qpqfksiqKt3f2LtGuSwqVwLHBmtqOZPdGjR4+KK6+8siLpPEhp2kMPPcQNN9zgZvZYFEU/1TFGaYrCsQiYWY9MJvN6JpNZ94QTTsjstddeaZdUNObPn88ll1wSvfXWWwb8yd0vSrsmKQ4KxyJhYW6yK4Hf9OjRw0eMGFFRO7+irCiKIm688UYeeOABN7NPoyja391fSbsuKR4KxyJjZmtnMplxURRtv+WWW0ZnnXVWpnYKMQkeffRRRo0alV20aFHk7ue4+1Vp1yTFR+FYpMxsaCaTuSmKog2222676PTTT8+U+/HIZ555huuvvz67YMECA24Fhrv7wrTrkuKkcCxyZrZ/JpO5Poqitfv06ZM95JBDKmrXdykH8+fP54477mDChAnZ6urqDHAfcKy7r7iGg0gLKBxLhJntaWZ/dPdB7dq1Y7vttrNf/OIXtuGGG6ZdWpurqanh4YcfZuzYsdnPPvusIpPJfB1F0a3ABe7+dZNPINIMCscSY2YVwOmZTObUKIo27Ny5c3aXXXapKIXpzaqqqhg9enT01ltvmbvXuPujwB/d/fW0a5PSo3AsYWa2LnBRJpM5NIqizl27dq3p27dvxaBBg2yHHXYo+LB8//33eeqpp6iqqsp+8sknLF26NJPJZN6IougyYLTOVZRcUjiWCTPbDjgmk8kMc/eN3b1DZWVldsMNN7Rtttkms8suu7DuuuumVl9NTQ0vvfQSzz//PG+++WbN3LlzK6IoskwmMzeKoleAccCN7t6yxbpFWknhWKbMrCdwlJn91My2jqKoS0VFRdS5c+dojTXWsB49elSss8469OrVi969e9O7d+8WrXSY5Msvv2TGjBnMnDmTWbNmMWfOHL766qua+fPns3DhwnZmljWzj6Moehr4D/CIu6+4MLVIHigcBQAzqwQOAAYDG2cymQ3MbB137xJFUWXYxLx9+/ZRp06dvH379lRUVJDJZGjXrp1VVFTg7mSzWWpqajybzRJFEdXV1SxevDiTzWYz8evUmFm1mc3NZrOfAB8C7wBj3P3NtL5/kfoUjtIsZtYR2AoYAPwA6ExYoK1DnVsWWAosqXObBUwDXgVm6jihFAuFo4hIAs2BJSKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKSQOEoIpJA4SgikkDhKCKS4P8Dl59WLcMC50YAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pgm = (PGM()\n", + " .with_nodes(\n", + " Data(\"grass wet\", xy=(1.2, 0.5), aspect=1.8),\n", + " Param(\"rain\", above_l=\"grass wet\", shift_x=-0.5, aspect=1.2),\n", + " Param(\"sprinkler\", above_r=\"grass wet\", shift_x=0.5, aspect=1.5),\n", + " Param(\"cloudy\", above_r=\"rain\", shift_x=0.5,\n", + " of=[\"rain\", \"sprinkler\"], aspect=1.2))\n", + ").build()\n", + "pgm.render();" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/test_utils.py b/tests/test_utils.py index 98b083b..1fa9cf5 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,9 +1,11 @@ +import matplotlib; matplotlib.use('Agg') import pytest from daft_builder import utils @pytest.mark.parametrize('symbol,expected', [ + ("test", "test"), (r"$X$", "X"), (r"$\theta$", "theta"), (r"$\Sigma$", "Sigma"),