From eac837ddeeb2495bc2e04a46e18043fff542d3e8 Mon Sep 17 00:00:00 2001
From: Luke Naylor <l.naylor@sms.ed.ac.uk>
Date: Wed, 26 Jul 2023 16:47:53 +0100
Subject: [PATCH] Copy recurring examples to separate notebook and integrate
 into build

---
 .gitignore     |   2 +
 Makefile       |   9 +-
 examples.ipynb | 324 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 334 insertions(+), 1 deletion(-)
 create mode 100644 examples.ipynb

diff --git a/.gitignore b/.gitignore
index 3cecb67..57a75c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,8 @@ main.*
 !main.tex
 plots_and_expressions.*
 !plots_and_expressions.ipynb
+examples.*
+!examples.ipynb
 filtered_sage.txt
 _minted-main/*
 sage-plots-for-main.tex
diff --git a/Makefile b/Makefile
index 928e47c..164ab58 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ SAGETEXSCRIPT = main.sagetex.sage
 main.pdf: ${TEXFILES}  main.sagetex.sout.tmp
 	latexmk
 
-main.sagetex.sout.tmp: ${SAGETEXSCRIPT} plots_and_expressions.py
+main.sagetex.sout.tmp: ${SAGETEXSCRIPT} plots_and_expressions.py examples.py
 	PYTHONPATH=./sagetexscripts/ sage ${SAGETEXSCRIPT}
 
 ${SAGETEXSCRIPT}: ${TEXFILES}
@@ -21,6 +21,13 @@ plots_and_expressions.py: plots_and_expressions.ipynb
 	sage --preparse plots_and_expressions.sage
 	mv plots_and_expressions.sage.py plots_and_expressions.py
 
+examples.py: plots_and_expressions.py examples.ipynb
+	jupyter nbconvert --to script examples.ipynb
+	mv examples.py examples.sage
+	sed -e "/get_ipython/d" -i examples.sage
+	sage --preparse examples.sage
+	mv examples.sage.py examples.py
+
 .PHONY: clean nosage noappendix
 clean:
 	rm -rf **/__pycache__
diff --git a/examples.ipynb b/examples.ipynb
new file mode 100644
index 0000000..affe546
--- /dev/null
+++ b/examples.ipynb
@@ -0,0 +1,324 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "abe149f0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Requires extra package:\n",
+    "#! sage -pip install \"pseudowalls==0.0.3\" --extra-index-url https://gitlab.com/api/v4/projects/43962374/packages/pypi/simple\n",
+    "%display latex\n",
+    "\n",
+    "from pseudowalls import *\n",
+    "\n",
+    "Δ = lambda v: v.Q_tilt()\n",
+    "mu = stability.Mumford().slope\n",
+    "ts = stability.Tilt\n",
+    "\n",
+    "var(\"beta\", domain=\"real\")\n",
+    "\n",
+    "def beta_minus(v):\n",
+    "  beta = stability.Tilt().beta\n",
+    "  solutions = solve(\n",
+    "    stability.Tilt(alpha=0).degree(v)==0,\n",
+    "    beta)\n",
+    "  return min(map(lambda s: s.rhs(), solutions))\n",
+    "\n",
+    "class Object(object):\n",
+    "  pass"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "77fff07c",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "var(\"m\") # Initialize symbol for variety parameter\n",
+    "recurring = Object()\n",
+    "recurring.chern = Chern_Char(3, 2, -2)\n",
+    "recurring.b = beta_minus(recurring.chern)\n",
+    "recurring.twisted = recurring.chern.twist(recurring.b)\n",
+    "# RENDERED TO LATEX: recurring.b\n",
+    "# RENDERED TO LATEX: recurring.b.denominator()\n",
+    "# RENDERED TO LATEX: recurring.twisted.ch[1]\n",
+    "n = recurring.b.denominator()\n",
+    "m = 2\n",
+    "recurring.loose_bound = (\n",
+    "  m*n^2*recurring.twisted.ch[1]^2\n",
+    ") / gcd(m, 2*n^2)\n",
+    "# RENDERED TO LATEX: loose_bound\n",
+    "extravagant = Object()\n",
+    "extravagant.chern = Chern_Char(29, 13, -3/2)\n",
+    "extravagant.b = beta_minus(extravagant.chern)\n",
+    "extravagant.twisted = extravagant.chern.twist(extravagant.b)\n",
+    "extravagant.actual_rmax = 49313\n",
+    "# RENDERED TO LATEX: extravagant.b\n",
+    "# RENDERED TO LATEX: extravagant.b.denominator()\n",
+    "# RENDERED TO LATEX: extravagant.twisted.ch[1]\n",
+    "n = extravagant.b.denominator()\n",
+    "m = 2\n",
+    "extravagant.loose_bound = (\n",
+    "  m*n^2*extravagant.twisted.ch[1]^2\n",
+    ") / gcd(m, 2*n^2)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "9edbb954",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<html>\\(\\displaystyle 144\\)</html>"
+      ],
+      "text/latex": [
+       "$\\displaystyle 144$"
+      ],
+      "text/plain": [
+       "144"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "recurring.loose_bound"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "21b52c4d",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<html>\\(\\displaystyle 215296\\)</html>"
+      ],
+      "text/latex": [
+       "$\\displaystyle 215296$"
+      ],
+      "text/plain": [
+       "215296"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "extravagant.loose_bound"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "712b7324",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from plots_and_expressions import r_upper_bound_all_q, Delta, nu, n, R"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "ab9a828f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "recurring.n = recurring.b.denominator()\n",
+    "recurring.bgmlv = recurring.chern.Q_tilt()\n",
+    "recurring.corrolary_bound = (\n",
+    "  r_upper_bound_all_q.expand()\n",
+    "  .subs(Delta==recurring.bgmlv)\n",
+    "  .subs(nu==1) ## \\ell^2=1 on P^2\n",
+    "  .subs(R==recurring.chern.ch[0])\n",
+    "  .subs(n==recurring.n)\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "2965357d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "extravagant.n = extravagant.b.denominator()\n",
+    "extravagant.bgmlv = extravagant.chern.Q_tilt()\n",
+    "extravagant.corrolary_bound = (\n",
+    "  r_upper_bound_all_q.expand()\n",
+    "  .subs(Delta==extravagant.bgmlv)\n",
+    "  .subs(nu==1) ## \\ell^2=1 on P^2\n",
+    "  .subs(R==extravagant.chern.ch[0])\n",
+    "  .subs(n==extravagant.n)\n",
+    ")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "5baed51c",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<html>\\(\\displaystyle 53838.5009765625\\)</html>"
+      ],
+      "text/latex": [
+       "$\\displaystyle 53838.5009765625$"
+      ],
+      "text/plain": [
+       "53838.5009765625"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "float(extravagant.corrolary_bound)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "fcc15f60",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<html>\\(\\displaystyle 37.515625\\)</html>"
+      ],
+      "text/latex": [
+       "$\\displaystyle 37.515625$"
+      ],
+      "text/plain": [
+       "37.515625"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "float(recurring.corrolary_bound)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "ef8f09ff",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import numpy as np\n",
+    "\n",
+    "def bound_comparisons(example):\n",
+    "    n = example.b.denominator()\n",
+    "    a_v = example.b.numerator()\n",
+    "\n",
+    "    def theorem_bound(v_twisted, q_val, k):\n",
+    "      return int(min(\n",
+    "        n^2*q_val^2/k\n",
+    "      ,\n",
+    "        v_twisted.ch[0]\n",
+    "        + n^2*(v_twisted.ch[1] - q_val)^2/k\n",
+    "      ))\n",
+    "\n",
+    "    def k(n, a_v, b_q):\n",
+    "      n = int(n)\n",
+    "      a_v = int(a_v)\n",
+    "      b_q = int(b_q)\n",
+    "      k = -a_v*b_q % n\n",
+    "      return k if k > 0 else k + n\n",
+    "\n",
+    "    b_qs = list(range(example.twisted.ch[1]*n+1))\n",
+    "    qs = list(map(lambda x: x/n,b_qs))\n",
+    "    ks = list(map(lambda b_q: k(n, a_v, b_q), b_qs))\n",
+    "    theorem2_bounds = [\n",
+    "        theorem_bound(example.twisted, q_val, 1)\n",
+    "        for q_val in qs\n",
+    "    ]\n",
+    "    theorem3_bounds = [\n",
+    "        theorem_bound(example.twisted, q_val, k)\n",
+    "        for q_val, k in zip(qs,ks)\n",
+    "    ]\n",
+    "    return qs, theorem2_bounds, theorem3_bounds"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "9cd102ac",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<html>\\(\\displaystyle \\begin{array}{l}\n",
+       "\\verb|[[0|\\verb| |\\verb|1/3|\\verb| |\\verb|2/3|\\verb| |\\verb|1|\\verb| |\\verb|4/3|\\verb| |\\verb|5/3|\\verb| |\\verb|2|\\verb| |\\verb|7/3|\\verb| |\\verb|8/3|\\verb| |\\verb|3|\\verb| |\\verb|10/3|\\verb| |\\verb|11/3|\\verb| |\\verb|4]|\\\\\n",
+       "\\verb| |\\verb|[0|\\verb| |\\verb|1|\\verb| |\\verb|4|\\verb| |\\verb|9|\\verb| |\\verb|16|\\verb| |\\verb|25|\\verb| |\\verb|36|\\verb| |\\verb|28|\\verb| |\\verb|19|\\verb| |\\verb|12|\\verb| |\\verb|7|\\verb| |\\verb|4|\\verb| |\\verb|3]|\\\\\n",
+       "\\verb| |\\verb|[0|\\verb| |\\verb|0|\\verb| |\\verb|4|\\verb| |\\verb|3|\\verb| |\\verb|8|\\verb| |\\verb|25|\\verb| |\\verb|12|\\verb| |\\verb|15|\\verb| |\\verb|19|\\verb| |\\verb|6|\\verb| |\\verb|5|\\verb| |\\verb|4|\\verb| |\\verb|3]]|\n",
+       "\\end{array}\\)</html>"
+      ],
+      "text/latex": [
+       "$\\displaystyle \\begin{array}{l}\n",
+       "\\verb|[[0|\\verb| |\\verb|1/3|\\verb| |\\verb|2/3|\\verb| |\\verb|1|\\verb| |\\verb|4/3|\\verb| |\\verb|5/3|\\verb| |\\verb|2|\\verb| |\\verb|7/3|\\verb| |\\verb|8/3|\\verb| |\\verb|3|\\verb| |\\verb|10/3|\\verb| |\\verb|11/3|\\verb| |\\verb|4]|\\\\\n",
+       "\\verb| |\\verb|[0|\\verb| |\\verb|1|\\verb| |\\verb|4|\\verb| |\\verb|9|\\verb| |\\verb|16|\\verb| |\\verb|25|\\verb| |\\verb|36|\\verb| |\\verb|28|\\verb| |\\verb|19|\\verb| |\\verb|12|\\verb| |\\verb|7|\\verb| |\\verb|4|\\verb| |\\verb|3]|\\\\\n",
+       "\\verb| |\\verb|[0|\\verb| |\\verb|0|\\verb| |\\verb|4|\\verb| |\\verb|3|\\verb| |\\verb|8|\\verb| |\\verb|25|\\verb| |\\verb|12|\\verb| |\\verb|15|\\verb| |\\verb|19|\\verb| |\\verb|6|\\verb| |\\verb|5|\\verb| |\\verb|4|\\verb| |\\verb|3]]|\n",
+       "\\end{array}$"
+      ],
+      "text/plain": [
+       "array([[0, 1/3, 2/3, 1, 4/3, 5/3, 2, 7/3, 8/3, 3, 10/3, 11/3, 4],\n",
+       "       [0, 1, 4, 9, 16, 25, 36, 28, 19, 12, 7, 4, 3],\n",
+       "       [0, 0, 4, 3, 8, 25, 12, 15, 19, 6, 5, 4, 3]], dtype=object)"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "np.array(bound_comparisons(recurring))"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "SageMath 9.7",
+   "language": "sage",
+   "name": "sagemath"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.8"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
-- 
GitLab