From 5b4f93d3c970e35a866f5b179320e8b8ee9ddcd2 Mon Sep 17 00:00:00 2001 From: Thomas Neil James Shadwell Date: Sun, 29 Sep 2024 14:30:30 -0700 Subject: [PATCH] Ensure that some deps for ipynb are in the venv --- BUILD.bazel | 1 + py/ipynb/BUILD.bazel | 12 ++++- py/ipynb/lib.py | 5 ++ py/ipynb/quaternion_lookat.ipynb | 81 +++++--------------------------- 4 files changed, 30 insertions(+), 69 deletions(-) create mode 100644 py/ipynb/lib.py diff --git a/BUILD.bazel b/BUILD.bazel index da3c6d740a..2971208a7e 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -256,6 +256,7 @@ py_venv( "//py/ci/postUpgrade:postUpgrade_bin", "//py/hello_world:hello_world_bin", "//py/ibazel:ibazel_bin", + "//py/ipynb", "//py/ipynb:ipynb_bin", "//py/sectxt:sectxt_bin", ], diff --git a/py/ipynb/BUILD.bazel b/py/ipynb/BUILD.bazel index a870e3d19a..183ba6d5cf 100644 --- a/py/ipynb/BUILD.bazel +++ b/py/ipynb/BUILD.bazel @@ -1,5 +1,5 @@ load("//bzl:rules.bzl", "bazel_lint") -load("//py:rules.bzl", "py_binary") +load("//py:rules.bzl", "py_binary", "py_library") py_binary( name = "ipynb_bin", @@ -13,3 +13,13 @@ bazel_lint( name = "bazel_lint", srcs = ["BUILD.bazel"], ) + +py_library( + name = "ipynb", + srcs = ["lib.py"], + visibility = ["//:__subpackages__"], + deps = [ + "@pip//ipykernel", + "@pip//pip", + ], +) diff --git a/py/ipynb/lib.py b/py/ipynb/lib.py new file mode 100644 index 0000000000..ac7028073e --- /dev/null +++ b/py/ipynb/lib.py @@ -0,0 +1,5 @@ +"Ensures that the ipython modules are in the venv before I get gazelle working" +import ipykernel +import pip + +print(ipykernel, pip) diff --git a/py/ipynb/quaternion_lookat.ipynb b/py/ipynb/quaternion_lookat.ipynb index bc7ec06e99..a7015ec0d7 100644 --- a/py/ipynb/quaternion_lookat.ipynb +++ b/py/ipynb/quaternion_lookat.ipynb @@ -2,63 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 31, + "execution_count": 3, "metadata": {}, - "outputs": [ - { - "ename": "RecursionError", - "evalue": "maximum recursion depth exceeded", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mRecursionError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[31], line 33\u001b[0m\n\u001b[1;32m 23\u001b[0m length_of_forward_unchanged \u001b[38;5;241m=\u001b[39m Eq(\n\u001b[1;32m 24\u001b[0m \t(forward\u001b[38;5;241m-\u001b[39mcentre)\u001b[38;5;241m.\u001b[39mnorm(),\n\u001b[1;32m 25\u001b[0m ((forward \u001b[38;5;241m*\u001b[39m rotation) \u001b[38;5;241m-\u001b[39m centre)\u001b[38;5;241m.\u001b[39mnorm()\n\u001b[1;32m 26\u001b[0m )\n\u001b[1;32m 28\u001b[0m up_will_still_be_up \u001b[38;5;241m=\u001b[39m Eq(\n\u001b[1;32m 29\u001b[0m (up \u001b[38;5;241m*\u001b[39m rotation),\n\u001b[1;32m 30\u001b[0m \tup\n\u001b[1;32m 31\u001b[0m )\n\u001b[0;32m---> 33\u001b[0m \u001b[43msolve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 34\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\n\u001b[1;32m 35\u001b[0m \u001b[43m\t\t\u001b[49m\u001b[43mlength_of_forward_unchanged\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 36\u001b[0m \u001b[43m\t\t\u001b[49m\u001b[43mcentre_does_not_rotate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 37\u001b[0m \u001b[43m\t\t\u001b[49m\u001b[43mforward_will_look_at\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 38\u001b[0m \u001b[43m\t\t\u001b[49m\u001b[43mup_will_still_be_up\u001b[49m\n\u001b[1;32m 39\u001b[0m \u001b[43m\t\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\n\u001b[1;32m 40\u001b[0m \u001b[43m \u001b[49m\u001b[43mr_w\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mr_i\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mr_j\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mr_k\u001b[49m\n\u001b[1;32m 41\u001b[0m \u001b[43m\t\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 42\u001b[0m \u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/solvers/solvers.py:1172\u001b[0m, in \u001b[0;36msolve\u001b[0;34m(f, *symbols, **flags)\u001b[0m\n\u001b[1;32m 1170\u001b[0m solution \u001b[38;5;241m=\u001b[39m _solve(f[\u001b[38;5;241m0\u001b[39m], \u001b[38;5;241m*\u001b[39msymbols, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mflags)\n\u001b[1;32m 1171\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1172\u001b[0m linear, solution \u001b[38;5;241m=\u001b[39m \u001b[43m_solve_system\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msymbols\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mflags\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1173\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(solution) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28mlist\u001b[39m\n\u001b[1;32m 1174\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m solution \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mtype\u001b[39m(solution[\u001b[38;5;241m0\u001b[39m]) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28mdict\u001b[39m, solution\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/solvers/solvers.py:1801\u001b[0m, in \u001b[0;36m_solve_system\u001b[0;34m(exprs, symbols, **flags)\u001b[0m\n\u001b[1;32m 1799\u001b[0m subsyms \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msorted\u001b[39m(subsyms, key \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mlambda\u001b[39;00m x: sym_indices[x])\n\u001b[1;32m 1800\u001b[0m flags[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m_split\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m \u001b[38;5;66;03m# skip split step\u001b[39;00m\n\u001b[0;32m-> 1801\u001b[0m _linear, subsol \u001b[38;5;241m=\u001b[39m \u001b[43m_solve_system\u001b[49m\u001b[43m(\u001b[49m\u001b[43msubexpr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msubsyms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mflags\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1802\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m linear:\n\u001b[1;32m 1803\u001b[0m linear \u001b[38;5;241m=\u001b[39m linear \u001b[38;5;129;01mand\u001b[39;00m _linear\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/solvers/solvers.py:2028\u001b[0m, in \u001b[0;36m_solve_system\u001b[0;34m(exprs, symbols, **flags)\u001b[0m\n\u001b[1;32m 2024\u001b[0m result \u001b[38;5;241m=\u001b[39m [r \u001b[38;5;28;01mfor\u001b[39;00m r \u001b[38;5;129;01min\u001b[39;00m result\n\u001b[1;32m 2025\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28many\u001b[39m(checksol(d, r, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mflags) \u001b[38;5;28;01mfor\u001b[39;00m d \u001b[38;5;129;01min\u001b[39;00m dens)]\n\u001b[1;32m 2027\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m check \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m linear:\n\u001b[0;32m-> 2028\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43m[\u001b[49m\u001b[43mr\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mr\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mresult\u001b[49m\n\u001b[1;32m 2029\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43many\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mchecksol\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mflags\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43me\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mexprs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 2031\u001b[0m result \u001b[38;5;241m=\u001b[39m [r \u001b[38;5;28;01mfor\u001b[39;00m r \u001b[38;5;129;01min\u001b[39;00m result \u001b[38;5;28;01mif\u001b[39;00m r]\n\u001b[1;32m 2032\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m linear, result\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/solvers/solvers.py:2029\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 2024\u001b[0m result \u001b[38;5;241m=\u001b[39m [r \u001b[38;5;28;01mfor\u001b[39;00m r \u001b[38;5;129;01min\u001b[39;00m result\n\u001b[1;32m 2025\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28many\u001b[39m(checksol(d, r, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mflags) \u001b[38;5;28;01mfor\u001b[39;00m d \u001b[38;5;129;01min\u001b[39;00m dens)]\n\u001b[1;32m 2027\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m check \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m linear:\n\u001b[1;32m 2028\u001b[0m result \u001b[38;5;241m=\u001b[39m [r \u001b[38;5;28;01mfor\u001b[39;00m r \u001b[38;5;129;01min\u001b[39;00m result\n\u001b[0;32m-> 2029\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28many\u001b[39m(checksol(e, r, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mflags) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m \u001b[38;5;28;01mfor\u001b[39;00m e \u001b[38;5;129;01min\u001b[39;00m exprs)]\n\u001b[1;32m 2031\u001b[0m result \u001b[38;5;241m=\u001b[39m [r \u001b[38;5;28;01mfor\u001b[39;00m r \u001b[38;5;129;01min\u001b[39;00m result \u001b[38;5;28;01mif\u001b[39;00m r]\n\u001b[1;32m 2032\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m linear, result\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/solvers/solvers.py:2029\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 2024\u001b[0m result \u001b[38;5;241m=\u001b[39m [r \u001b[38;5;28;01mfor\u001b[39;00m r \u001b[38;5;129;01min\u001b[39;00m result\n\u001b[1;32m 2025\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28many\u001b[39m(checksol(d, r, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mflags) \u001b[38;5;28;01mfor\u001b[39;00m d \u001b[38;5;129;01min\u001b[39;00m dens)]\n\u001b[1;32m 2027\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m check \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m linear:\n\u001b[1;32m 2028\u001b[0m result \u001b[38;5;241m=\u001b[39m [r \u001b[38;5;28;01mfor\u001b[39;00m r \u001b[38;5;129;01min\u001b[39;00m result\n\u001b[0;32m-> 2029\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28many\u001b[39m(\u001b[43mchecksol\u001b[49m\u001b[43m(\u001b[49m\u001b[43me\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mflags\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m \u001b[38;5;28;01mfor\u001b[39;00m e \u001b[38;5;129;01min\u001b[39;00m exprs)]\n\u001b[1;32m 2031\u001b[0m result \u001b[38;5;241m=\u001b[39m [r \u001b[38;5;28;01mfor\u001b[39;00m r \u001b[38;5;129;01min\u001b[39;00m result \u001b[38;5;28;01mif\u001b[39;00m r]\n\u001b[1;32m 2032\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m linear, result\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/solvers/solvers.py:299\u001b[0m, in \u001b[0;36mchecksol\u001b[0;34m(f, symbol, sol, **flags)\u001b[0m\n\u001b[1;32m 297\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m attempt \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 298\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m val\u001b[38;5;241m.\u001b[39mis_number:\n\u001b[0;32m--> 299\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[43mval\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_constant\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msol\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkeys\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msimplify\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;129;43;01mnot\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mminimal\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 300\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 301\u001b[0m \u001b[38;5;66;03m# there are free symbols -- simple expansion might work\u001b[39;00m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/expr.py:673\u001b[0m, in \u001b[0;36mExpr.is_constant\u001b[0;34m(self, *wrt, **flags)\u001b[0m\n\u001b[1;32m 671\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 672\u001b[0m \u001b[38;5;66;03m# try random complex\u001b[39;00m\n\u001b[0;32m--> 673\u001b[0m b \u001b[38;5;241m=\u001b[39m \u001b[43mexpr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_random\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 674\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m b \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m b \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m S\u001b[38;5;241m.\u001b[39mNaN:\n\u001b[1;32m 675\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m b\u001b[38;5;241m.\u001b[39mequals(a) \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m:\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/expr.py:493\u001b[0m, in \u001b[0;36mExpr._random\u001b[0;34m(self, n, re_min, im_min, re_max, im_max)\u001b[0m\n\u001b[1;32m 490\u001b[0m reps \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28mzip\u001b[39m(free, [random_complex_number(a, b, c, d, rational\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 491\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m zi \u001b[38;5;129;01min\u001b[39;00m free])))\n\u001b[1;32m 492\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 493\u001b[0m nmag \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mabs\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mevalf(\u001b[38;5;241m2\u001b[39m, subs\u001b[38;5;241m=\u001b[39mreps))\n\u001b[1;32m 494\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mValueError\u001b[39;00m, \u001b[38;5;167;01mTypeError\u001b[39;00m):\n\u001b[1;32m 495\u001b[0m \u001b[38;5;66;03m# if an out of range value resulted in evalf problems\u001b[39;00m\n\u001b[1;32m 496\u001b[0m \u001b[38;5;66;03m# then return None -- XXX is there a way to know how to\u001b[39;00m\n\u001b[1;32m 497\u001b[0m \u001b[38;5;66;03m# select a good random number for a given expression?\u001b[39;00m\n\u001b[1;32m 498\u001b[0m \u001b[38;5;66;03m# e.g. when calculating n! negative values for n should not\u001b[39;00m\n\u001b[1;32m 499\u001b[0m \u001b[38;5;66;03m# be used\u001b[39;00m\n\u001b[1;32m 500\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/expr.py:194\u001b[0m, in \u001b[0;36mExpr.__abs__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 192\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__abs__\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Expr:\n\u001b[1;32m 193\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msympy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mfunctions\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01melementary\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcomplexes\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Abs\n\u001b[0;32m--> 194\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mAbs\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/cache.py:72\u001b[0m, in \u001b[0;36m__cacheit..func_wrapper..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 72\u001b[0m retval \u001b[38;5;241m=\u001b[39m \u001b[43mcfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m e\u001b[38;5;241m.\u001b[39margs \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m e\u001b[38;5;241m.\u001b[39margs[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mstartswith(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124munhashable type:\u001b[39m\u001b[38;5;124m'\u001b[39m):\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/function.py:466\u001b[0m, in \u001b[0;36mFunction.__new__\u001b[0;34m(cls, *args, **options)\u001b[0m\n\u001b[1;32m 458\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(temp \u001b[38;5;241m%\u001b[39m {\n\u001b[1;32m 459\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28mcls\u001b[39m,\n\u001b[1;32m 460\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mqual\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexactly\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mnargs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mat least\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 461\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28mmin\u001b[39m(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mnargs),\n\u001b[1;32m 462\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mplural\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m*\u001b[39m(\u001b[38;5;28mmin\u001b[39m(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mnargs) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m),\n\u001b[1;32m 463\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgiven\u001b[39m\u001b[38;5;124m'\u001b[39m: n})\n\u001b[1;32m 465\u001b[0m evaluate \u001b[38;5;241m=\u001b[39m options\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mevaluate\u001b[39m\u001b[38;5;124m'\u001b[39m, global_parameters\u001b[38;5;241m.\u001b[39mevaluate)\n\u001b[0;32m--> 466\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__new__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 467\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m evaluate \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(result, \u001b[38;5;28mcls\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m result\u001b[38;5;241m.\u001b[39margs:\n\u001b[1;32m 468\u001b[0m _should_evalf \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_should_evalf(a) \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m result\u001b[38;5;241m.\u001b[39margs]\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/cache.py:72\u001b[0m, in \u001b[0;36m__cacheit..func_wrapper..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 72\u001b[0m retval \u001b[38;5;241m=\u001b[39m \u001b[43mcfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m e\u001b[38;5;241m.\u001b[39margs \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m e\u001b[38;5;241m.\u001b[39margs[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mstartswith(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124munhashable type:\u001b[39m\u001b[38;5;124m'\u001b[39m):\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/function.py:307\u001b[0m, in \u001b[0;36mApplication.__new__\u001b[0;34m(cls, *args, **options)\u001b[0m\n\u001b[1;32m 304\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUnknown options: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m options)\n\u001b[1;32m 306\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m evaluate:\n\u001b[0;32m--> 307\u001b[0m evaluated \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 308\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m evaluated \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 309\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m evaluated\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/functions/elementary/complexes.py:550\u001b[0m, in \u001b[0;36mAbs.eval\u001b[0;34m(cls, arg)\u001b[0m\n\u001b[1;32m 548\u001b[0m known\u001b[38;5;241m.\u001b[39mappend(Pow(bnew, t\u001b[38;5;241m.\u001b[39mexp))\n\u001b[1;32m 549\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 550\u001b[0m tnew \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(tnew, \u001b[38;5;28mcls\u001b[39m):\n\u001b[1;32m 552\u001b[0m unk\u001b[38;5;241m.\u001b[39mappend(t)\n", - " \u001b[0;31m[... skipping similar frames: __cacheit..func_wrapper..wrapper at line 72 (1 times)]\u001b[0m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/function.py:466\u001b[0m, in \u001b[0;36mFunction.__new__\u001b[0;34m(cls, *args, **options)\u001b[0m\n\u001b[1;32m 458\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(temp \u001b[38;5;241m%\u001b[39m {\n\u001b[1;32m 459\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28mcls\u001b[39m,\n\u001b[1;32m 460\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mqual\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexactly\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mnargs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mat least\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 461\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28mmin\u001b[39m(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mnargs),\n\u001b[1;32m 462\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mplural\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m*\u001b[39m(\u001b[38;5;28mmin\u001b[39m(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mnargs) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m),\n\u001b[1;32m 463\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgiven\u001b[39m\u001b[38;5;124m'\u001b[39m: n})\n\u001b[1;32m 465\u001b[0m evaluate \u001b[38;5;241m=\u001b[39m options\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mevaluate\u001b[39m\u001b[38;5;124m'\u001b[39m, global_parameters\u001b[38;5;241m.\u001b[39mevaluate)\n\u001b[0;32m--> 466\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__new__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 467\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m evaluate \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(result, \u001b[38;5;28mcls\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m result\u001b[38;5;241m.\u001b[39margs:\n\u001b[1;32m 468\u001b[0m _should_evalf \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_should_evalf(a) \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m result\u001b[38;5;241m.\u001b[39margs]\n", - " \u001b[0;31m[... skipping similar frames: __cacheit..func_wrapper..wrapper at line 72 (1 times)]\u001b[0m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/function.py:307\u001b[0m, in \u001b[0;36mApplication.__new__\u001b[0;34m(cls, *args, **options)\u001b[0m\n\u001b[1;32m 304\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUnknown options: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m options)\n\u001b[1;32m 306\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m evaluate:\n\u001b[0;32m--> 307\u001b[0m evaluated \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 308\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m evaluated \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 309\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m evaluated\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/functions/elementary/complexes.py:550\u001b[0m, in \u001b[0;36mAbs.eval\u001b[0;34m(cls, arg)\u001b[0m\n\u001b[1;32m 548\u001b[0m known\u001b[38;5;241m.\u001b[39mappend(Pow(bnew, t\u001b[38;5;241m.\u001b[39mexp))\n\u001b[1;32m 549\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 550\u001b[0m tnew \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(tnew, \u001b[38;5;28mcls\u001b[39m):\n\u001b[1;32m 552\u001b[0m unk\u001b[38;5;241m.\u001b[39mappend(t)\n", - " \u001b[0;31m[... skipping similar frames: __cacheit..func_wrapper..wrapper at line 72 (354 times), Function.__new__ at line 466 (177 times), Application.__new__ at line 307 (177 times), Abs.eval at line 550 (176 times)]\u001b[0m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/functions/elementary/complexes.py:550\u001b[0m, in \u001b[0;36mAbs.eval\u001b[0;34m(cls, arg)\u001b[0m\n\u001b[1;32m 548\u001b[0m known\u001b[38;5;241m.\u001b[39mappend(Pow(bnew, t\u001b[38;5;241m.\u001b[39mexp))\n\u001b[1;32m 549\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 550\u001b[0m tnew \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 551\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(tnew, \u001b[38;5;28mcls\u001b[39m):\n\u001b[1;32m 552\u001b[0m unk\u001b[38;5;241m.\u001b[39mappend(t)\n", - " \u001b[0;31m[... skipping similar frames: __cacheit..func_wrapper..wrapper at line 72 (1 times)]\u001b[0m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/function.py:466\u001b[0m, in \u001b[0;36mFunction.__new__\u001b[0;34m(cls, *args, **options)\u001b[0m\n\u001b[1;32m 458\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(temp \u001b[38;5;241m%\u001b[39m {\n\u001b[1;32m 459\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28mcls\u001b[39m,\n\u001b[1;32m 460\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mqual\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexactly\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mnargs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mat least\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 461\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124margs\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;28mmin\u001b[39m(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mnargs),\n\u001b[1;32m 462\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mplural\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m*\u001b[39m(\u001b[38;5;28mmin\u001b[39m(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mnargs) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m),\n\u001b[1;32m 463\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mgiven\u001b[39m\u001b[38;5;124m'\u001b[39m: n})\n\u001b[1;32m 465\u001b[0m evaluate \u001b[38;5;241m=\u001b[39m options\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mevaluate\u001b[39m\u001b[38;5;124m'\u001b[39m, global_parameters\u001b[38;5;241m.\u001b[39mevaluate)\n\u001b[0;32m--> 466\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__new__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 467\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m evaluate \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(result, \u001b[38;5;28mcls\u001b[39m) \u001b[38;5;129;01mand\u001b[39;00m result\u001b[38;5;241m.\u001b[39margs:\n\u001b[1;32m 468\u001b[0m _should_evalf \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_should_evalf(a) \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m result\u001b[38;5;241m.\u001b[39margs]\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/cache.py:72\u001b[0m, in \u001b[0;36m__cacheit..func_wrapper..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 72\u001b[0m retval \u001b[38;5;241m=\u001b[39m \u001b[43mcfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m e\u001b[38;5;241m.\u001b[39margs \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m e\u001b[38;5;241m.\u001b[39margs[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mstartswith(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124munhashable type:\u001b[39m\u001b[38;5;124m'\u001b[39m):\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/function.py:307\u001b[0m, in \u001b[0;36mApplication.__new__\u001b[0;34m(cls, *args, **options)\u001b[0m\n\u001b[1;32m 304\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUnknown options: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m options)\n\u001b[1;32m 306\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m evaluate:\n\u001b[0;32m--> 307\u001b[0m evaluated \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 308\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m evaluated \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 309\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m evaluated\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/functions/elementary/complexes.py:534\u001b[0m, in \u001b[0;36mAbs.eval\u001b[0;34m(cls, arg)\u001b[0m\n\u001b[1;32m 531\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBad argument type for Abs(): \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m \u001b[38;5;28mtype\u001b[39m(arg))\n\u001b[1;32m 533\u001b[0m \u001b[38;5;66;03m# handle what we can\u001b[39;00m\n\u001b[0;32m--> 534\u001b[0m arg \u001b[38;5;241m=\u001b[39m \u001b[43msignsimp\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mevaluate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 535\u001b[0m n, d \u001b[38;5;241m=\u001b[39m arg\u001b[38;5;241m.\u001b[39mas_numer_denom()\n\u001b[1;32m 536\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m d\u001b[38;5;241m.\u001b[39mfree_symbols \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m n\u001b[38;5;241m.\u001b[39mfree_symbols:\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/simplify/simplify.py:405\u001b[0m, in \u001b[0;36msignsimp\u001b[0;34m(expr, evaluate)\u001b[0m\n\u001b[1;32m 403\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m expr\n\u001b[1;32m 404\u001b[0m \u001b[38;5;66;03m# get rid of an pre-existing unevaluation regarding sign\u001b[39;00m\n\u001b[0;32m--> 405\u001b[0m e \u001b[38;5;241m=\u001b[39m \u001b[43mexpr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreplace\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_Mul\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mand\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m!=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mlambda\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 406\u001b[0m e \u001b[38;5;241m=\u001b[39m sub_post(sub_pre(e))\n\u001b[1;32m 407\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e, (Expr, Relational)) \u001b[38;5;129;01mor\u001b[39;00m e\u001b[38;5;241m.\u001b[39mis_Atom:\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:1749\u001b[0m, in \u001b[0;36mBasic.replace\u001b[0;34m(self, query, value, map, simultaneous, exact)\u001b[0m\n\u001b[1;32m 1746\u001b[0m expr \u001b[38;5;241m=\u001b[39m v\n\u001b[1;32m 1747\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m expr\n\u001b[0;32m-> 1749\u001b[0m rv \u001b[38;5;241m=\u001b[39m \u001b[43mwalk\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrec_replace\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1750\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (rv, mapping) \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mmap\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m rv\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:1724\u001b[0m, in \u001b[0;36mBasic.replace..walk\u001b[0;34m(rv, F)\u001b[0m\n\u001b[1;32m 1722\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1723\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args:\n\u001b[0;32m-> 1724\u001b[0m newargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(\u001b[43m[\u001b[49m\u001b[43mwalk\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mF\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43ma\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m]\u001b[49m)\n\u001b[1;32m 1725\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;241m!=\u001b[39m newargs:\n\u001b[1;32m 1726\u001b[0m rv \u001b[38;5;241m=\u001b[39m rv\u001b[38;5;241m.\u001b[39mfunc(\u001b[38;5;241m*\u001b[39mnewargs)\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:1724\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1722\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1723\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args:\n\u001b[0;32m-> 1724\u001b[0m newargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m([\u001b[43mwalk\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mF\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m args])\n\u001b[1;32m 1725\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;241m!=\u001b[39m newargs:\n\u001b[1;32m 1726\u001b[0m rv \u001b[38;5;241m=\u001b[39m rv\u001b[38;5;241m.\u001b[39mfunc(\u001b[38;5;241m*\u001b[39mnewargs)\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:1724\u001b[0m, in \u001b[0;36mBasic.replace..walk\u001b[0;34m(rv, F)\u001b[0m\n\u001b[1;32m 1722\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1723\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args:\n\u001b[0;32m-> 1724\u001b[0m newargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(\u001b[43m[\u001b[49m\u001b[43mwalk\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mF\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43ma\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m]\u001b[49m)\n\u001b[1;32m 1725\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;241m!=\u001b[39m newargs:\n\u001b[1;32m 1726\u001b[0m rv \u001b[38;5;241m=\u001b[39m rv\u001b[38;5;241m.\u001b[39mfunc(\u001b[38;5;241m*\u001b[39mnewargs)\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:1724\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1722\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1723\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args:\n\u001b[0;32m-> 1724\u001b[0m newargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m([\u001b[43mwalk\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mF\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m args])\n\u001b[1;32m 1725\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;241m!=\u001b[39m newargs:\n\u001b[1;32m 1726\u001b[0m rv \u001b[38;5;241m=\u001b[39m rv\u001b[38;5;241m.\u001b[39mfunc(\u001b[38;5;241m*\u001b[39mnewargs)\n", - " \u001b[0;31m[... skipping similar frames: at line 1724 (1 times), Basic.replace..walk at line 1724 (1 times)]\u001b[0m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:1724\u001b[0m, in \u001b[0;36mBasic.replace..walk\u001b[0;34m(rv, F)\u001b[0m\n\u001b[1;32m 1722\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1723\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args:\n\u001b[0;32m-> 1724\u001b[0m newargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(\u001b[43m[\u001b[49m\u001b[43mwalk\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mF\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43ma\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m]\u001b[49m)\n\u001b[1;32m 1725\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;241m!=\u001b[39m newargs:\n\u001b[1;32m 1726\u001b[0m rv \u001b[38;5;241m=\u001b[39m rv\u001b[38;5;241m.\u001b[39mfunc(\u001b[38;5;241m*\u001b[39mnewargs)\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:1724\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1722\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1723\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args:\n\u001b[0;32m-> 1724\u001b[0m newargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m([\u001b[43mwalk\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mF\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m args])\n\u001b[1;32m 1725\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args \u001b[38;5;241m!=\u001b[39m newargs:\n\u001b[1;32m 1726\u001b[0m rv \u001b[38;5;241m=\u001b[39m rv\u001b[38;5;241m.\u001b[39mfunc(\u001b[38;5;241m*\u001b[39mnewargs)\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:1734\u001b[0m, in \u001b[0;36mBasic.replace..walk\u001b[0;34m(rv, F)\u001b[0m\n\u001b[1;32m 1732\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m rv \u001b[38;5;241m==\u001b[39m e \u001b[38;5;129;01mand\u001b[39;00m e \u001b[38;5;241m!=\u001b[39m newargs[i]:\n\u001b[1;32m 1733\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m rv\n\u001b[0;32m-> 1734\u001b[0m rv \u001b[38;5;241m=\u001b[39m \u001b[43mF\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrv\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1735\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m rv\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:1740\u001b[0m, in \u001b[0;36mBasic.replace..rec_replace\u001b[0;34m(expr)\u001b[0m\n\u001b[1;32m 1739\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrec_replace\u001b[39m(expr):\n\u001b[0;32m-> 1740\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43m_query\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexpr\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1741\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m result \u001b[38;5;129;01mor\u001b[39;00m result \u001b[38;5;241m==\u001b[39m {}:\n\u001b[1;32m 1742\u001b[0m v \u001b[38;5;241m=\u001b[39m _value(expr, result)\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/simplify/simplify.py:405\u001b[0m, in \u001b[0;36msignsimp..\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 403\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m expr\n\u001b[1;32m 404\u001b[0m \u001b[38;5;66;03m# get rid of an pre-existing unevaluation regarding sign\u001b[39;00m\n\u001b[0;32m--> 405\u001b[0m e \u001b[38;5;241m=\u001b[39m expr\u001b[38;5;241m.\u001b[39mreplace(\u001b[38;5;28;01mlambda\u001b[39;00m x: x\u001b[38;5;241m.\u001b[39mis_Mul \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;241m-\u001b[39m(\u001b[38;5;241;43m-\u001b[39;49m\u001b[43mx\u001b[49m) \u001b[38;5;241m!=\u001b[39m x, \u001b[38;5;28;01mlambda\u001b[39;00m x: \u001b[38;5;241m-\u001b[39m(\u001b[38;5;241m-\u001b[39mx))\n\u001b[1;32m 406\u001b[0m e \u001b[38;5;241m=\u001b[39m sub_post(sub_pre(e))\n\u001b[1;32m 407\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e, (Expr, Relational)) \u001b[38;5;129;01mor\u001b[39;00m e\u001b[38;5;241m.\u001b[39mis_Atom:\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/mul.py:181\u001b[0m, in \u001b[0;36mMul.__neg__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 180\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__neg__\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 181\u001b[0m c, args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mas_coeff_mul\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 182\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m S\u001b[38;5;241m.\u001b[39mComplexInfinity:\n\u001b[1;32m 183\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m-\u001b[39mc\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/cache.py:72\u001b[0m, in \u001b[0;36m__cacheit..func_wrapper..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 70\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 71\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 72\u001b[0m retval \u001b[38;5;241m=\u001b[39m \u001b[43mcfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m e\u001b[38;5;241m.\u001b[39margs \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m e\u001b[38;5;241m.\u001b[39margs[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mstartswith(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124munhashable type:\u001b[39m\u001b[38;5;124m'\u001b[39m):\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/basic.py:501\u001b[0m, in \u001b[0;36mBasic.__eq__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 499\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 500\u001b[0m a, b \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_hashable_content(), other\u001b[38;5;241m.\u001b[39m_hashable_content()\n\u001b[0;32m--> 501\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43ma\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m!=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mb\u001b[49m:\n\u001b[1;32m 502\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 503\u001b[0m \u001b[38;5;66;03m# check number *in* an expression\u001b[39;00m\n", - "File \u001b[0;32m~/code/monorepo/.venv/lib/python3.11/site-packages/sympy/core/numbers.py:1112\u001b[0m, in \u001b[0;36mFloat.__eq__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 1110\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(other, \u001b[38;5;28mfloat\u001b[39m):\n\u001b[1;32m 1111\u001b[0m other \u001b[38;5;241m=\u001b[39m Float(other)\n\u001b[0;32m-> 1112\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mBasic\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__eq__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[0;31mRecursionError\u001b[0m: maximum recursion depth exceeded" - ] - } - ], + "outputs": [], "source": [ "\n", "from sympy import Quaternion, solve, symbols, Eq\n", @@ -77,6 +23,16 @@ "look_at = Quaternion(0, *symbols('la_i la_j la_k', real=True))\n", "\n", "centre_does_not_rotate = Eq(centre * rotation, centre)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ "\n", "forward_will_look_at = Eq(\n", "\t((centre - forward) * rotation).normalize(),\n", @@ -91,18 +47,7 @@ "up_will_still_be_up = Eq(\n", " (up * rotation),\n", "\tup\n", - ")\n", - "\n", - "solve(\n", - " [\n", - "\t\tlength_of_forward_unchanged,\n", - "\t\tcentre_does_not_rotate,\n", - "\t\tforward_will_look_at,\n", - "\t\tup_will_still_be_up\n", - "\t], [\n", - " r_w, r_i, r_j, r_k\n", - "\t]\n", - ")\n" + ")" ] } ],