{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "```{post} 2023-11-04\n", ":author: Saul\n", "```\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/jpeg": "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", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "\n", "YouTubeVideo(\"TEkLFmqi-Bw\")" ] }, { "cell_type": "markdown", "id": "630dd85b", "metadata": {}, "source": [ "# PyData NYC '23\n", "\n", "E-graphs in Python with **`egglog`**\n", "\n", "_Saul Shanabrook_\n" ] }, { "cell_type": "markdown", "id": "ed1705d7", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Aims:\n", "\n", "- Faithful bindings for `egglog` rust library.\n", "- \"Pythonic\" interface, using standard type definitions.\n", "- Usable as base for optimizing/translating expressions for data science libraries in Python\n" ] }, { "cell_type": "markdown", "id": "03921dd5", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## What is an e-graph?\n", "\n", "> E-graphs are these super wonderful data structures for managing equality and equivalence information. They are traditionally **used inside of constraint solvers and automated theorem provers** to implement congruence closure, an efficient algorithm for equational reasoning---but they can also be used to implement **rewrite systems**.\n", ">\n", "> [Talia Ringer - \"Proof Automation\" course](https://dependenttyp.es/classes/readings/17-egraphs.html)\n" ] }, { "cell_type": "markdown", "id": "aae7dc39", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "1. Define types and functions/operators\n", "2. Define rewrite rules\n", "3. Add expressions to graph\n", "4. Run rewrite rules on expressions until saturated (addtional applications have no effect)\n", "5. Extract out lowest cost expression\n", "\n", "## Example\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "4c51c48a", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "from __future__ import annotations\n", "from egglog import *\n", "\n", "egraph = EGraph()\n", "\n", "\n", "@egraph.class_\n", "class NDArray(Expr):\n", " def __init__(self, i: i64Like) -> None:\n", " ...\n", "\n", " def __add__(self, other: NDArray) -> NDArray:\n", " ...\n", "\n", " def __mul__(self, other: NDArray) -> NDArray:\n", " ...\n", "\n", "\n", "@egraph.function(cost=2)\n", "def arange(i: i64Like) -> NDArray:\n", " ...\n", "\n", "\n", "# Register rewrite rule that asserts for all values x of type NDArray\n", "# x + x = x * 2\n", "x = var(\"x\", NDArray)\n", "egraph.register(rewrite(x + x).to(x * NDArray(2)))" ] }, { "cell_type": "code", "execution_count": 2, "id": "388be69c", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9cb3dc4f76bd41e4bdffb4334dfce2fa", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(IntSlider(value=0, max=1), GraphvizWidget(dots=['digraph {stylesheet=\"/var/folders/xn/05ktz305…" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res = arange(10) + arange(10)\n", "egraph.register(res)\n", "egraph.saturate()" ] }, { "cell_type": "code", "execution_count": 3, "id": "946a4121", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
arange(10) * NDArray(2)\n",
       "
\n" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", "\\PY{n}{arange}\\PY{p}{(}\\PY{l+m+mi}{10}\\PY{p}{)} \\PY{o}{*} \\PY{n}{NDArray}\\PY{p}{(}\\PY{l+m+mi}{2}\\PY{p}{)}\n", "\\end{Verbatim}\n" ], "text/plain": [ "arange(10) * NDArray(2)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "egraph.extract(res)" ] }, { "cell_type": "markdown", "id": "1e492c45", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Example with Scikit-learn\n", "\n", "Optimize Scikit-learn function with Numba by building an e-graph that implements the Array API.\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "a4fa4e56", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.64233002],\n", " [ 0.63661245],\n", " [-1.603293 ],\n", " ...,\n", " [-1.1506433 ],\n", " [ 0.71687176],\n", " [-1.51119579]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn import config_context\n", "from sklearn.datasets import make_classification\n", "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n", "\n", "\n", "def run_lda(x, y):\n", " with config_context(array_api_dispatch=True):\n", " lda = LinearDiscriminantAnalysis()\n", " return lda.fit(x, y).transform(x)\n", "\n", "\n", "X_np, y_np = make_classification(random_state=0, n_samples=1000000)\n", "run_lda(X_np, y_np)" ] }, { "cell_type": "code", "execution_count": 5, "id": "02d6c70d", "metadata": {}, "outputs": [], "source": [ "from egglog.exp.array_api import *\n", "from egglog.exp.array_api_jit import jit\n", "\n", "\n", "@jit\n", "def optimized_fn(X, y):\n", " # Add metadata about input shapes and dtypes, so that abstract array\n", " # can pass scikit-learn runtime checks\n", " assume_dtype(X, X_np.dtype)\n", " assume_shape(X, X_np.shape)\n", " assume_isfinite(X)\n", "\n", " assume_dtype(y, y_np.dtype)\n", " assume_shape(y, y_np.shape)\n", " assume_value_one_of(y, (0, 1))\n", "\n", " return run_lda(X, y)" ] }, { "cell_type": "markdown", "id": "60e8bbe0", "metadata": {}, "source": [ "Here is an example of a rewrite rule we used to generate Numba compatible code:\n", "\n", "```python\n", "rewrite(\n", " std(x, axis)\n", ").to(\n", " sqrt(mean(square(x - mean(x, axis, keepdims=TRUE)), axis))\n", ")\n", "```\n" ] }, { "cell_type": "markdown", "id": "b8e65d32", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "We can see the optimized expr:\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "4585be0b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
_NDArray_1 = NDArray.var("X")\n",
       "assume_dtype(_NDArray_1, DType.float64)\n",
       "assume_shape(_NDArray_1, TupleInt(Int(1000000)) + TupleInt(Int(20)))\n",
       "assume_isfinite(_NDArray_1)\n",
       "_NDArray_2 = NDArray.var("y")\n",
       "assume_dtype(_NDArray_2, DType.int64)\n",
       "assume_shape(_NDArray_2, TupleInt(Int(1000000)))\n",
       "assume_value_one_of(_NDArray_2, TupleValue(Value.int(Int(0))) + TupleValue(Value.int(Int(1))))\n",
       "_NDArray_3 = astype(\n",
       "    NDArray.vector(TupleValue(sum(_NDArray_2 == NDArray.scalar(Value.int(Int(0)))).to_value()) + TupleValue(sum(_NDArray_2 == NDArray.scalar(Value.int(Int(1)))).to_value())),\n",
       "    DType.float64,\n",
       ") / NDArray.scalar(Value.float(Float(1000000.0)))\n",
       "_NDArray_4 = zeros(TupleInt(Int(2)) + TupleInt(Int(20)), OptionalDType.some(DType.float64), OptionalDevice.some(_NDArray_1.device))\n",
       "_MultiAxisIndexKey_1 = MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(Slice()))\n",
       "_IndexKey_1 = IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.int(Int(0))) + _MultiAxisIndexKey_1)\n",
       "_NDArray_5 = _NDArray_1[ndarray_index(_NDArray_2 == NDArray.scalar(Value.int(Int(0))))]\n",
       "_OptionalIntOrTuple_1 = OptionalIntOrTuple.some(IntOrTuple.int(Int(0)))\n",
       "_NDArray_4[_IndexKey_1] = sum(_NDArray_5, _OptionalIntOrTuple_1) / NDArray.scalar(Value.int(_NDArray_5.shape[Int(0)]))\n",
       "_IndexKey_2 = IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.int(Int(1))) + _MultiAxisIndexKey_1)\n",
       "_NDArray_6 = _NDArray_1[ndarray_index(_NDArray_2 == NDArray.scalar(Value.int(Int(1))))]\n",
       "_NDArray_4[_IndexKey_2] = sum(_NDArray_6, _OptionalIntOrTuple_1) / NDArray.scalar(Value.int(_NDArray_6.shape[Int(0)]))\n",
       "_NDArray_7 = concat(TupleNDArray(_NDArray_5 - _NDArray_4[_IndexKey_1]) + TupleNDArray(_NDArray_6 - _NDArray_4[_IndexKey_2]), OptionalInt.some(Int(0)))\n",
       "_NDArray_8 = square(_NDArray_7 - expand_dims(sum(_NDArray_7, _OptionalIntOrTuple_1) / NDArray.scalar(Value.int(_NDArray_7.shape[Int(0)]))))\n",
       "_NDArray_9 = sqrt(sum(_NDArray_8, _OptionalIntOrTuple_1) / NDArray.scalar(Value.int(_NDArray_8.shape[Int(0)])))\n",
       "_NDArray_10 = copy(_NDArray_9)\n",
       "_NDArray_10[ndarray_index(_NDArray_9 == NDArray.scalar(Value.int(Int(0))))] = NDArray.scalar(Value.float(Float(1.0)))\n",
       "_TupleNDArray_1 = svd(sqrt(NDArray.scalar(Value.float(Float.rational(Rational(1, 999998))))) * (_NDArray_7 / _NDArray_10), FALSE)\n",
       "_Slice_1 = Slice(OptionalInt.none, OptionalInt.some(sum(astype(_TupleNDArray_1[Int(1)] > NDArray.scalar(Value.float(Float(0.0001))), DType.int32)).to_value().to_int))\n",
       "_NDArray_11 = (_TupleNDArray_1[Int(2)][IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(_Slice_1)) + _MultiAxisIndexKey_1)] / _NDArray_10).T / _TupleNDArray_1[\n",
       "    Int(1)\n",
       "][IndexKey.slice(_Slice_1)]\n",
       "_TupleNDArray_2 = svd(\n",
       "    (sqrt((NDArray.scalar(Value.int(Int(1000000))) * _NDArray_3) * NDArray.scalar(Value.float(Float(1.0)))) * (_NDArray_4 - (_NDArray_3 @ _NDArray_4)).T).T @ _NDArray_11, FALSE\n",
       ")\n",
       "(\n",
       "    (_NDArray_1 - (_NDArray_3 @ _NDArray_4))\n",
       "    @ (\n",
       "        _NDArray_11\n",
       "        @ _TupleNDArray_2[Int(2)].T[\n",
       "            IndexKey.multi_axis(\n",
       "                _MultiAxisIndexKey_1\n",
       "                + MultiAxisIndexKey(\n",
       "                    MultiAxisIndexKeyItem.slice(\n",
       "                        Slice(\n",
       "                            OptionalInt.none,\n",
       "                            OptionalInt.some(\n",
       "                                sum(astype(_TupleNDArray_2[Int(1)] > (NDArray.scalar(Value.float(Float(0.0001))) * _TupleNDArray_2[Int(1)][IndexKey.int(Int(0))]), DType.int32))\n",
       "                                .to_value()\n",
       "                                .to_int\n",
       "                            ),\n",
       "                        )\n",
       "                    )\n",
       "                )\n",
       "            )\n",
       "        ]\n",
       "    )\n",
       ")[IndexKey.multi_axis(_MultiAxisIndexKey_1 + MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(Slice(OptionalInt.none, OptionalInt.some(Int(1))))))]\n",
       "
\n" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}1} \\PY{o}{=} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{var}\\PY{p}{(}\\PY{l+s+s2}{\\PYZdq{}}\\PY{l+s+s2}{X}\\PY{l+s+s2}{\\PYZdq{}}\\PY{p}{)}\n", "\\PY{n}{assume\\PYZus{}dtype}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{,} \\PY{n}{DType}\\PY{o}{.}\\PY{n}{float64}\\PY{p}{)}\n", "\\PY{n}{assume\\PYZus{}shape}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{,} \\PY{n}{TupleInt}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1000000}\\PY{p}{)}\\PY{p}{)} \\PY{o}{+} \\PY{n}{TupleInt}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{20}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{assume\\PYZus{}isfinite}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}2} \\PY{o}{=} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{var}\\PY{p}{(}\\PY{l+s+s2}{\\PYZdq{}}\\PY{l+s+s2}{y}\\PY{l+s+s2}{\\PYZdq{}}\\PY{p}{)}\n", "\\PY{n}{assume\\PYZus{}dtype}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}2}\\PY{p}{,} \\PY{n}{DType}\\PY{o}{.}\\PY{n}{int64}\\PY{p}{)}\n", "\\PY{n}{assume\\PYZus{}shape}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}2}\\PY{p}{,} \\PY{n}{TupleInt}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1000000}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{assume\\PYZus{}value\\PYZus{}one\\PYZus{}of}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}2}\\PY{p}{,} \\PY{n}{TupleValue}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)} \\PY{o}{+} \\PY{n}{TupleValue}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}3} \\PY{o}{=} \\PY{n}{astype}\\PY{p}{(}\n", " \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{vector}\\PY{p}{(}\\PY{n}{TupleValue}\\PY{p}{(}\\PY{n+nb}{sum}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}2} \\PY{o}{==} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{o}{.}\\PY{n}{to\\PYZus{}value}\\PY{p}{(}\\PY{p}{)}\\PY{p}{)} \\PY{o}{+} \\PY{n}{TupleValue}\\PY{p}{(}\\PY{n+nb}{sum}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}2} \\PY{o}{==} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{o}{.}\\PY{n}{to\\PYZus{}value}\\PY{p}{(}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{,}\n", " \\PY{n}{DType}\\PY{o}{.}\\PY{n}{float64}\\PY{p}{,}\n", "\\PY{p}{)} \\PY{o}{/} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{float}\\PY{p}{(}\\PY{n}{Float}\\PY{p}{(}\\PY{l+m+mf}{1000000.0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}4} \\PY{o}{=} \\PY{n}{zeros}\\PY{p}{(}\\PY{n}{TupleInt}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{2}\\PY{p}{)}\\PY{p}{)} \\PY{o}{+} \\PY{n}{TupleInt}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{20}\\PY{p}{)}\\PY{p}{)}\\PY{p}{,} \\PY{n}{OptionalDType}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\\PY{n}{DType}\\PY{o}{.}\\PY{n}{float64}\\PY{p}{)}\\PY{p}{,} \\PY{n}{OptionalDevice}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{o}{.}\\PY{n}{device}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}MultiAxisIndexKey\\PYZus{}1} \\PY{o}{=} \\PY{n}{MultiAxisIndexKey}\\PY{p}{(}\\PY{n}{MultiAxisIndexKeyItem}\\PY{o}{.}\\PY{n}{slice}\\PY{p}{(}\\PY{n}{Slice}\\PY{p}{(}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}IndexKey\\PYZus{}1} \\PY{o}{=} \\PY{n}{IndexKey}\\PY{o}{.}\\PY{n}{multi\\PYZus{}axis}\\PY{p}{(}\\PY{n}{MultiAxisIndexKey}\\PY{p}{(}\\PY{n}{MultiAxisIndexKeyItem}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)} \\PY{o}{+} \\PY{n}{\\PYZus{}MultiAxisIndexKey\\PYZus{}1}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}5} \\PY{o}{=} \\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{[}\\PY{n}{ndarray\\PYZus{}index}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}2} \\PY{o}{==} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{]}\n", "\\PY{n}{\\PYZus{}OptionalIntOrTuple\\PYZus{}1} \\PY{o}{=} \\PY{n}{OptionalIntOrTuple}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\\PY{n}{IntOrTuple}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}4}\\PY{p}{[}\\PY{n}{\\PYZus{}IndexKey\\PYZus{}1}\\PY{p}{]} \\PY{o}{=} \\PY{n+nb}{sum}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}5}\\PY{p}{,} \\PY{n}{\\PYZus{}OptionalIntOrTuple\\PYZus{}1}\\PY{p}{)} \\PY{o}{/} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}5}\\PY{o}{.}\\PY{n}{shape}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{]}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}IndexKey\\PYZus{}2} \\PY{o}{=} \\PY{n}{IndexKey}\\PY{o}{.}\\PY{n}{multi\\PYZus{}axis}\\PY{p}{(}\\PY{n}{MultiAxisIndexKey}\\PY{p}{(}\\PY{n}{MultiAxisIndexKeyItem}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)} \\PY{o}{+} \\PY{n}{\\PYZus{}MultiAxisIndexKey\\PYZus{}1}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}6} \\PY{o}{=} \\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{[}\\PY{n}{ndarray\\PYZus{}index}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}2} \\PY{o}{==} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{]}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}4}\\PY{p}{[}\\PY{n}{\\PYZus{}IndexKey\\PYZus{}2}\\PY{p}{]} \\PY{o}{=} \\PY{n+nb}{sum}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}6}\\PY{p}{,} \\PY{n}{\\PYZus{}OptionalIntOrTuple\\PYZus{}1}\\PY{p}{)} \\PY{o}{/} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}6}\\PY{o}{.}\\PY{n}{shape}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{]}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}7} \\PY{o}{=} \\PY{n}{concat}\\PY{p}{(}\\PY{n}{TupleNDArray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}5} \\PY{o}{\\PYZhy{}} \\PY{n}{\\PYZus{}NDArray\\PYZus{}4}\\PY{p}{[}\\PY{n}{\\PYZus{}IndexKey\\PYZus{}1}\\PY{p}{]}\\PY{p}{)} \\PY{o}{+} \\PY{n}{TupleNDArray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}6} \\PY{o}{\\PYZhy{}} \\PY{n}{\\PYZus{}NDArray\\PYZus{}4}\\PY{p}{[}\\PY{n}{\\PYZus{}IndexKey\\PYZus{}2}\\PY{p}{]}\\PY{p}{)}\\PY{p}{,} \\PY{n}{OptionalInt}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}8} \\PY{o}{=} \\PY{n}{square}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}7} \\PY{o}{\\PYZhy{}} \\PY{n}{expand\\PYZus{}dims}\\PY{p}{(}\\PY{n+nb}{sum}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}7}\\PY{p}{,} \\PY{n}{\\PYZus{}OptionalIntOrTuple\\PYZus{}1}\\PY{p}{)} \\PY{o}{/} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}7}\\PY{o}{.}\\PY{n}{shape}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{]}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}9} \\PY{o}{=} \\PY{n}{sqrt}\\PY{p}{(}\\PY{n+nb}{sum}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}8}\\PY{p}{,} \\PY{n}{\\PYZus{}OptionalIntOrTuple\\PYZus{}1}\\PY{p}{)} \\PY{o}{/} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}8}\\PY{o}{.}\\PY{n}{shape}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{]}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}10} \\PY{o}{=} \\PY{n}{copy}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}9}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}10}\\PY{p}{[}\\PY{n}{ndarray\\PYZus{}index}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}9} \\PY{o}{==} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{]} \\PY{o}{=} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{float}\\PY{p}{(}\\PY{n}{Float}\\PY{p}{(}\\PY{l+m+mf}{1.0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}TupleNDArray\\PYZus{}1} \\PY{o}{=} \\PY{n}{svd}\\PY{p}{(}\\PY{n}{sqrt}\\PY{p}{(}\\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{float}\\PY{p}{(}\\PY{n}{Float}\\PY{o}{.}\\PY{n}{rational}\\PY{p}{(}\\PY{n}{Rational}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{,} \\PY{l+m+mi}{999998}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)} \\PY{o}{*} \\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}7} \\PY{o}{/} \\PY{n}{\\PYZus{}NDArray\\PYZus{}10}\\PY{p}{)}\\PY{p}{,} \\PY{n}{FALSE}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}Slice\\PYZus{}1} \\PY{o}{=} \\PY{n}{Slice}\\PY{p}{(}\\PY{n}{OptionalInt}\\PY{o}{.}\\PY{n}{none}\\PY{p}{,} \\PY{n}{OptionalInt}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\\PY{n+nb}{sum}\\PY{p}{(}\\PY{n}{astype}\\PY{p}{(}\\PY{n}{\\PYZus{}TupleNDArray\\PYZus{}1}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{]} \\PY{o}{\\PYZgt{}} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{float}\\PY{p}{(}\\PY{n}{Float}\\PY{p}{(}\\PY{l+m+mf}{0.0001}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{,} \\PY{n}{DType}\\PY{o}{.}\\PY{n}{int32}\\PY{p}{)}\\PY{p}{)}\\PY{o}{.}\\PY{n}{to\\PYZus{}value}\\PY{p}{(}\\PY{p}{)}\\PY{o}{.}\\PY{n}{to\\PYZus{}int}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}11} \\PY{o}{=} \\PY{p}{(}\\PY{n}{\\PYZus{}TupleNDArray\\PYZus{}1}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{2}\\PY{p}{)}\\PY{p}{]}\\PY{p}{[}\\PY{n}{IndexKey}\\PY{o}{.}\\PY{n}{multi\\PYZus{}axis}\\PY{p}{(}\\PY{n}{MultiAxisIndexKey}\\PY{p}{(}\\PY{n}{MultiAxisIndexKeyItem}\\PY{o}{.}\\PY{n}{slice}\\PY{p}{(}\\PY{n}{\\PYZus{}Slice\\PYZus{}1}\\PY{p}{)}\\PY{p}{)} \\PY{o}{+} \\PY{n}{\\PYZus{}MultiAxisIndexKey\\PYZus{}1}\\PY{p}{)}\\PY{p}{]} \\PY{o}{/} \\PY{n}{\\PYZus{}NDArray\\PYZus{}10}\\PY{p}{)}\\PY{o}{.}\\PY{n}{T} \\PY{o}{/} \\PY{n}{\\PYZus{}TupleNDArray\\PYZus{}1}\\PY{p}{[}\n", " \\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\n", "\\PY{p}{]}\\PY{p}{[}\\PY{n}{IndexKey}\\PY{o}{.}\\PY{n}{slice}\\PY{p}{(}\\PY{n}{\\PYZus{}Slice\\PYZus{}1}\\PY{p}{)}\\PY{p}{]}\n", "\\PY{n}{\\PYZus{}TupleNDArray\\PYZus{}2} \\PY{o}{=} \\PY{n}{svd}\\PY{p}{(}\n", " \\PY{p}{(}\\PY{n}{sqrt}\\PY{p}{(}\\PY{p}{(}\\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1000000}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)} \\PY{o}{*} \\PY{n}{\\PYZus{}NDArray\\PYZus{}3}\\PY{p}{)} \\PY{o}{*} \\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{float}\\PY{p}{(}\\PY{n}{Float}\\PY{p}{(}\\PY{l+m+mf}{1.0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)} \\PY{o}{*} \\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}4} \\PY{o}{\\PYZhy{}} \\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}3} \\PY{o}{@} \\PY{n}{\\PYZus{}NDArray\\PYZus{}4}\\PY{p}{)}\\PY{p}{)}\\PY{o}{.}\\PY{n}{T}\\PY{p}{)}\\PY{o}{.}\\PY{n}{T} \\PY{o}{@} \\PY{n}{\\PYZus{}NDArray\\PYZus{}11}\\PY{p}{,} \\PY{n}{FALSE}\n", "\\PY{p}{)}\n", "\\PY{p}{(}\n", " \\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1} \\PY{o}{\\PYZhy{}} \\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}3} \\PY{o}{@} \\PY{n}{\\PYZus{}NDArray\\PYZus{}4}\\PY{p}{)}\\PY{p}{)}\n", " \\PY{o}{@} \\PY{p}{(}\n", " \\PY{n}{\\PYZus{}NDArray\\PYZus{}11}\n", " \\PY{o}{@} \\PY{n}{\\PYZus{}TupleNDArray\\PYZus{}2}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{2}\\PY{p}{)}\\PY{p}{]}\\PY{o}{.}\\PY{n}{T}\\PY{p}{[}\n", " \\PY{n}{IndexKey}\\PY{o}{.}\\PY{n}{multi\\PYZus{}axis}\\PY{p}{(}\n", " \\PY{n}{\\PYZus{}MultiAxisIndexKey\\PYZus{}1}\n", " \\PY{o}{+} \\PY{n}{MultiAxisIndexKey}\\PY{p}{(}\n", " \\PY{n}{MultiAxisIndexKeyItem}\\PY{o}{.}\\PY{n}{slice}\\PY{p}{(}\n", " \\PY{n}{Slice}\\PY{p}{(}\n", " \\PY{n}{OptionalInt}\\PY{o}{.}\\PY{n}{none}\\PY{p}{,}\n", " \\PY{n}{OptionalInt}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\n", " \\PY{n+nb}{sum}\\PY{p}{(}\\PY{n}{astype}\\PY{p}{(}\\PY{n}{\\PYZus{}TupleNDArray\\PYZus{}2}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{]} \\PY{o}{\\PYZgt{}} \\PY{p}{(}\\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{float}\\PY{p}{(}\\PY{n}{Float}\\PY{p}{(}\\PY{l+m+mf}{0.0001}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)} \\PY{o}{*} \\PY{n}{\\PYZus{}TupleNDArray\\PYZus{}2}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{]}\\PY{p}{[}\\PY{n}{IndexKey}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{]}\\PY{p}{)}\\PY{p}{,} \\PY{n}{DType}\\PY{o}{.}\\PY{n}{int32}\\PY{p}{)}\\PY{p}{)}\n", " \\PY{o}{.}\\PY{n}{to\\PYZus{}value}\\PY{p}{(}\\PY{p}{)}\n", " \\PY{o}{.}\\PY{n}{to\\PYZus{}int}\n", " \\PY{p}{)}\\PY{p}{,}\n", " \\PY{p}{)}\n", " \\PY{p}{)}\n", " \\PY{p}{)}\n", " \\PY{p}{)}\n", " \\PY{p}{]}\n", " \\PY{p}{)}\n", "\\PY{p}{)}\\PY{p}{[}\\PY{n}{IndexKey}\\PY{o}{.}\\PY{n}{multi\\PYZus{}axis}\\PY{p}{(}\\PY{n}{\\PYZus{}MultiAxisIndexKey\\PYZus{}1} \\PY{o}{+} \\PY{n}{MultiAxisIndexKey}\\PY{p}{(}\\PY{n}{MultiAxisIndexKeyItem}\\PY{o}{.}\\PY{n}{slice}\\PY{p}{(}\\PY{n}{Slice}\\PY{p}{(}\\PY{n}{OptionalInt}\\PY{o}{.}\\PY{n}{none}\\PY{p}{,} \\PY{n}{OptionalInt}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{]}\n", "\\end{Verbatim}\n" ], "text/plain": [ "_NDArray_1 = NDArray.var(\"X\")\n", "assume_dtype(_NDArray_1, DType.float64)\n", "assume_shape(_NDArray_1, TupleInt(Int(1000000)) + TupleInt(Int(20)))\n", "assume_isfinite(_NDArray_1)\n", "_NDArray_2 = NDArray.var(\"y\")\n", "assume_dtype(_NDArray_2, DType.int64)\n", "assume_shape(_NDArray_2, TupleInt(Int(1000000)))\n", "assume_value_one_of(_NDArray_2, TupleValue(Value.int(Int(0))) + TupleValue(Value.int(Int(1))))\n", "_NDArray_3 = astype(\n", " NDArray.vector(TupleValue(sum(_NDArray_2 == NDArray.scalar(Value.int(Int(0)))).to_value()) + TupleValue(sum(_NDArray_2 == NDArray.scalar(Value.int(Int(1)))).to_value())),\n", " DType.float64,\n", ") / NDArray.scalar(Value.float(Float(1000000.0)))\n", "_NDArray_4 = zeros(TupleInt(Int(2)) + TupleInt(Int(20)), OptionalDType.some(DType.float64), OptionalDevice.some(_NDArray_1.device))\n", "_MultiAxisIndexKey_1 = MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(Slice()))\n", "_IndexKey_1 = IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.int(Int(0))) + _MultiAxisIndexKey_1)\n", "_NDArray_5 = _NDArray_1[ndarray_index(_NDArray_2 == NDArray.scalar(Value.int(Int(0))))]\n", "_OptionalIntOrTuple_1 = OptionalIntOrTuple.some(IntOrTuple.int(Int(0)))\n", "_NDArray_4[_IndexKey_1] = sum(_NDArray_5, _OptionalIntOrTuple_1) / NDArray.scalar(Value.int(_NDArray_5.shape[Int(0)]))\n", "_IndexKey_2 = IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.int(Int(1))) + _MultiAxisIndexKey_1)\n", "_NDArray_6 = _NDArray_1[ndarray_index(_NDArray_2 == NDArray.scalar(Value.int(Int(1))))]\n", "_NDArray_4[_IndexKey_2] = sum(_NDArray_6, _OptionalIntOrTuple_1) / NDArray.scalar(Value.int(_NDArray_6.shape[Int(0)]))\n", "_NDArray_7 = concat(TupleNDArray(_NDArray_5 - _NDArray_4[_IndexKey_1]) + TupleNDArray(_NDArray_6 - _NDArray_4[_IndexKey_2]), OptionalInt.some(Int(0)))\n", "_NDArray_8 = square(_NDArray_7 - expand_dims(sum(_NDArray_7, _OptionalIntOrTuple_1) / NDArray.scalar(Value.int(_NDArray_7.shape[Int(0)]))))\n", "_NDArray_9 = sqrt(sum(_NDArray_8, _OptionalIntOrTuple_1) / NDArray.scalar(Value.int(_NDArray_8.shape[Int(0)])))\n", "_NDArray_10 = copy(_NDArray_9)\n", "_NDArray_10[ndarray_index(_NDArray_9 == NDArray.scalar(Value.int(Int(0))))] = NDArray.scalar(Value.float(Float(1.0)))\n", "_TupleNDArray_1 = svd(sqrt(NDArray.scalar(Value.float(Float.rational(Rational(1, 999998))))) * (_NDArray_7 / _NDArray_10), FALSE)\n", "_Slice_1 = Slice(OptionalInt.none, OptionalInt.some(sum(astype(_TupleNDArray_1[Int(1)] > NDArray.scalar(Value.float(Float(0.0001))), DType.int32)).to_value().to_int))\n", "_NDArray_11 = (_TupleNDArray_1[Int(2)][IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(_Slice_1)) + _MultiAxisIndexKey_1)] / _NDArray_10).T / _TupleNDArray_1[\n", " Int(1)\n", "][IndexKey.slice(_Slice_1)]\n", "_TupleNDArray_2 = svd(\n", " (sqrt((NDArray.scalar(Value.int(Int(1000000))) * _NDArray_3) * NDArray.scalar(Value.float(Float(1.0)))) * (_NDArray_4 - (_NDArray_3 @ _NDArray_4)).T).T @ _NDArray_11, FALSE\n", ")\n", "(\n", " (_NDArray_1 - (_NDArray_3 @ _NDArray_4))\n", " @ (\n", " _NDArray_11\n", " @ _TupleNDArray_2[Int(2)].T[\n", " IndexKey.multi_axis(\n", " _MultiAxisIndexKey_1\n", " + MultiAxisIndexKey(\n", " MultiAxisIndexKeyItem.slice(\n", " Slice(\n", " OptionalInt.none,\n", " OptionalInt.some(\n", " sum(astype(_TupleNDArray_2[Int(1)] > (NDArray.scalar(Value.float(Float(0.0001))) * _TupleNDArray_2[Int(1)][IndexKey.int(Int(0))]), DType.int32))\n", " .to_value()\n", " .to_int\n", " ),\n", " )\n", " )\n", " )\n", " )\n", " ]\n", " )\n", ")[IndexKey.multi_axis(_MultiAxisIndexKey_1 + MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(Slice(OptionalInt.none, OptionalInt.some(Int(1))))))]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "optimized_fn.expr" ] }, { "cell_type": "markdown", "id": "2904e3d2", "metadata": {}, "source": [ "And the generated code:\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "c606c1bf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "def __fn(X, y):\n", " assert X.dtype == np.dtype(np.float64)\n", " assert X.shape == (1000000, 20,)\n", " assert np.all(np.isfinite(X))\n", " assert y.dtype == np.dtype(np.int64)\n", " assert y.shape == (1000000,)\n", " assert set(np.unique(y)) == set((0, 1,))\n", " _0 = y == np.array(0)\n", " _1 = np.sum(_0)\n", " _2 = y == np.array(1)\n", " _3 = np.sum(_2)\n", " _4 = np.array((_1, _3,)).astype(np.dtype(np.float64))\n", " _5 = _4 / np.array(1000000.0)\n", " _6 = np.zeros((2, 20,), dtype=np.dtype(np.float64))\n", " _7 = np.sum(X[_0], axis=0)\n", " _8 = _7 / np.array(X[_0].shape[0])\n", " _6[0, :] = _8\n", " _9 = np.sum(X[_2], axis=0)\n", " _10 = _9 / np.array(X[_2].shape[0])\n", " _6[1, :] = _10\n", " _11 = _5 @ _6\n", " _12 = X - _11\n", " _13 = np.sqrt(np.array(float(1 / 999998)))\n", " _14 = X[_0] - _6[0, :]\n", " _15 = X[_2] - _6[1, :]\n", " _16 = np.concatenate((_14, _15,), axis=0)\n", " _17 = np.sum(_16, axis=0)\n", " _18 = _17 / np.array(_16.shape[0])\n", " _19 = np.expand_dims(_18, 0)\n", " _20 = _16 - _19\n", " _21 = np.square(_20)\n", " _22 = np.sum(_21, axis=0)\n", " _23 = _22 / np.array(_21.shape[0])\n", " _24 = np.sqrt(_23)\n", " _25 = _24 == np.array(0)\n", " _24[_25] = np.array(1.0)\n", " _26 = _16 / _24\n", " _27 = _13 * _26\n", " _28 = np.linalg.svd(_27, full_matrices=False)\n", " _29 = _28[1] > np.array(0.0001)\n", " _30 = _29.astype(np.dtype(np.int32))\n", " _31 = np.sum(_30)\n", " _32 = _28[2][:_31, :] / _24\n", " _33 = _32.T / _28[1][:_31]\n", " _34 = np.array(1000000) * _5\n", " _35 = _34 * np.array(1.0)\n", " _36 = np.sqrt(_35)\n", " _37 = _6 - _11\n", " _38 = _36 * _37.T\n", " _39 = _38.T @ _33\n", " _40 = np.linalg.svd(_39, full_matrices=False)\n", " _41 = np.array(0.0001) * _40[1][0]\n", " _42 = _40[1] > _41\n", " _43 = _42.astype(np.dtype(np.int32))\n", " _44 = np.sum(_43)\n", " _45 = _33 @ _40[2].T[:, :_44]\n", " _46 = _12 @ _45\n", " return _46[:, :1]\n", "\n" ] } ], "source": [ "import inspect\n", "\n", "print(inspect.getsource(optimized_fn))" ] }, { "cell_type": "markdown", "id": "d6862c1b", "metadata": {}, "source": [ "As well as the e-graph:\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "f64148d6", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "outer_cluster_32\n", "\n", "\n", "cluster_32\n", "\n", "\n", "\n", "outer_cluster_48\n", "\n", "\n", "cluster_48\n", "\n", "\n", "\n", "outer_cluster_92\n", "\n", "\n", "cluster_92\n", "\n", "\n", "\n", "outer_cluster_91\n", "\n", "\n", "cluster_91\n", "\n", "\n", "\n", "outer_cluster_34\n", "\n", "\n", "cluster_34\n", "\n", "\n", "\n", "outer_cluster_155\n", "\n", "\n", "cluster_155\n", "\n", "\n", "\n", "outer_cluster_190\n", "\n", "\n", "cluster_190\n", "\n", "\n", "\n", "outer_cluster_58\n", "\n", "\n", "cluster_58\n", "\n", "\n", "\n", "outer_cluster_72\n", "\n", "\n", "cluster_72\n", "\n", "\n", "\n", "outer_cluster_105\n", "\n", "\n", "cluster_105\n", "\n", "\n", "\n", "outer_cluster_147\n", "\n", "\n", "cluster_147\n", "\n", "\n", "\n", "outer_cluster_108\n", "\n", "\n", "cluster_108\n", "\n", "\n", "\n", "outer_cluster_181\n", "\n", "\n", "cluster_181\n", "\n", "\n", "\n", "outer_cluster_100\n", "\n", "\n", "cluster_100\n", "\n", "\n", "\n", "outer_cluster_118\n", "\n", "\n", "cluster_118\n", "\n", "\n", "\n", "outer_cluster_143\n", "\n", "\n", "cluster_143\n", "\n", "\n", "\n", "outer_cluster_153\n", "\n", "\n", "cluster_153\n", "\n", "\n", "\n", "outer_cluster_44\n", "\n", "\n", "cluster_44\n", "\n", "\n", "\n", "outer_cluster_175\n", "\n", "\n", "cluster_175\n", "\n", "\n", "\n", "outer_cluster_137\n", "\n", "\n", "cluster_137\n", "\n", "\n", "\n", "outer_cluster_89\n", "\n", "\n", "cluster_89\n", "\n", "\n", "\n", "outer_cluster_243\n", "\n", "\n", "cluster_243\n", "\n", "\n", "\n", "outer_cluster_253\n", "\n", "\n", "cluster_253\n", "\n", "\n", "\n", "outer_cluster_90\n", "\n", "\n", "cluster_90\n", "\n", "\n", "\n", "outer_cluster_82\n", "\n", "\n", "cluster_82\n", "\n", "\n", "\n", "outer_cluster_219\n", "\n", "\n", "cluster_219\n", "\n", "\n", "\n", "outer_cluster_225\n", "\n", "\n", "cluster_225\n", "\n", "\n", "\n", "outer_cluster_188\n", "\n", "\n", "cluster_188\n", "\n", "\n", "\n", "outer_cluster_142\n", "\n", "\n", "cluster_142\n", "\n", "\n", "\n", "outer_cluster_71\n", "\n", "\n", "cluster_71\n", "\n", "\n", "\n", "outer_cluster_57\n", "\n", "\n", "cluster_57\n", "\n", "\n", "\n", "outer_cluster_189\n", "\n", "\n", "cluster_189\n", "\n", "\n", "\n", "outer_cluster_52\n", "\n", "\n", "cluster_52\n", "\n", "\n", "\n", "outer_cluster_180\n", "\n", "\n", "cluster_180\n", "\n", "\n", "\n", "outer_cluster_179\n", "\n", "\n", "cluster_179\n", "\n", "\n", "\n", "outer_cluster_56\n", "\n", "\n", "cluster_56\n", "\n", "\n", "\n", "outer_cluster_141\n", "\n", "\n", "cluster_141\n", "\n", "\n", "\n", "outer_cluster_70\n", "\n", "\n", "cluster_70\n", "\n", "\n", "\n", "outer_cluster_69\n", "\n", "\n", "cluster_69\n", "\n", "\n", "\n", "outer_cluster_140\n", "\n", "\n", "cluster_140\n", "\n", "\n", "\n", "outer_cluster_187\n", "\n", "\n", "cluster_187\n", "\n", "\n", "\n", "outer_cluster_178\n", "\n", "\n", "cluster_178\n", "\n", "\n", "\n", "outer_cluster_167\n", "\n", "\n", "cluster_167\n", "\n", "\n", "\n", "outer_cluster_96\n", "\n", "\n", "cluster_96\n", "\n", "\n", "\n", "outer_cluster_223\n", "\n", "\n", "cluster_223\n", "\n", "\n", "\n", "outer_cluster_107\n", "\n", "\n", "cluster_107\n", "\n", "\n", "\n", "outer_cluster_79\n", "\n", "\n", "cluster_79\n", "\n", "\n", "\n", "outer_cluster_251\n", "\n", "\n", "cluster_251\n", "\n", "\n", "\n", "outer_cluster_145\n", "\n", "\n", "cluster_145\n", "\n", "\n", "\n", "outer_cluster_16\n", "\n", "\n", "cluster_16\n", "\n", "\n", "\n", "outer_cluster_110\n", "\n", "\n", "cluster_110\n", "\n", "\n", "\n", "outer_cluster_166\n", "\n", "\n", "cluster_166\n", "\n", "\n", "\n", "outer_cluster_31\n", "\n", "\n", "cluster_31\n", "\n", "\n", "\n", "outer_cluster_191\n", "\n", "\n", "cluster_191\n", "\n", "\n", "\n", "outer_cluster_163\n", "\n", "\n", "cluster_163\n", "\n", "\n", "\n", "outer_cluster_159\n", "\n", "\n", "cluster_159\n", "\n", "\n", "\n", "outer_cluster_99\n", "\n", "\n", "cluster_99\n", "\n", "\n", "\n", "outer_cluster_269\n", "\n", "\n", "cluster_269\n", "\n", "\n", "\n", "outer_cluster_109\n", "\n", "\n", "cluster_109\n", "\n", "\n", "\n", "outer_cluster_77\n", "\n", "\n", "cluster_77\n", "\n", "\n", "\n", "outer_cluster_33\n", "\n", "\n", "cluster_33\n", "\n", "\n", "\n", "outer_cluster_184\n", "\n", "\n", "cluster_184\n", "\n", "\n", "\n", "outer_cluster_8\n", "\n", "\n", "cluster_8\n", "\n", "\n", "\n", "outer_cluster_122\n", "\n", "\n", "cluster_122\n", "\n", "\n", "\n", "outer_cluster_2\n", "\n", "\n", "cluster_2\n", "\n", "\n", "\n", "outer_cluster_246\n", "\n", "\n", "cluster_246\n", "\n", "\n", "\n", "outer_cluster_131\n", "\n", "\n", "cluster_131\n", "\n", "\n", "\n", "outer_cluster_230\n", "\n", "\n", "cluster_230\n", "\n", "\n", "\n", "outer_cluster_171\n", "\n", "\n", "cluster_171\n", "\n", "\n", "\n", "outer_cluster_151\n", "\n", "\n", "cluster_151\n", "\n", "\n", "\n", "outer_cluster_221\n", "\n", "\n", "cluster_221\n", "\n", "\n", "\n", "outer_cluster_37\n", "\n", "\n", "cluster_37\n", "\n", "\n", "\n", "outer_cluster_227\n", "\n", "\n", "cluster_227\n", "\n", "\n", "\n", "outer_cluster_152\n", "\n", "\n", "cluster_152\n", "\n", "\n", "\n", "outer_cluster_68\n", "\n", "\n", "cluster_68\n", "\n", "\n", "\n", "outer_cluster_80\n", "\n", "\n", "cluster_80\n", "\n", "\n", "\n", "outer_cluster_172\n", "\n", "\n", "cluster_172\n", "\n", "\n", "\n", "outer_cluster_158\n", "\n", "\n", "cluster_158\n", "\n", "\n", "\n", "outer_cluster_12\n", "\n", "\n", "cluster_12\n", "\n", "\n", "\n", "outer_cluster_101\n", "\n", "\n", "cluster_101\n", "\n", "\n", "\n", "outer_cluster_173\n", "\n", "\n", "cluster_173\n", "\n", "\n", "\n", "outer_cluster_133\n", "\n", "\n", "cluster_133\n", "\n", "\n", "\n", "outer_cluster_87\n", "\n", "\n", "cluster_87\n", "\n", "\n", "\n", "outer_cluster_130\n", "\n", "\n", "cluster_130\n", "\n", "\n", "\n", "outer_cluster_83\n", "\n", "\n", "cluster_83\n", "\n", "\n", "\n", "outer_cluster_168\n", "\n", "\n", "cluster_168\n", "\n", "\n", "\n", "outer_cluster_272\n", "\n", "\n", "cluster_272\n", "\n", "\n", "\n", "outer_cluster_116\n", "\n", "\n", "cluster_116\n", "\n", "\n", "\n", "outer_cluster_233\n", "\n", "\n", "cluster_233\n", "\n", "\n", "\n", "outer_cluster_282\n", "\n", "\n", "cluster_282\n", "\n", "\n", "\n", "outer_cluster_144\n", "\n", "\n", "cluster_144\n", "\n", "\n", "\n", "outer_cluster_103\n", "\n", "\n", "cluster_103\n", "\n", "\n", "\n", "outer_cluster_164\n", "\n", "\n", "cluster_164\n", "\n", "\n", "\n", "outer_cluster_126\n", "\n", "\n", "cluster_126\n", "\n", "\n", "\n", "outer_cluster_146\n", "\n", "\n", "cluster_146\n", "\n", "\n", "\n", "outer_cluster_102\n", "\n", "\n", "cluster_102\n", "\n", "\n", "\n", "outer_cluster_127\n", "\n", "\n", "cluster_127\n", "\n", "\n", "\n", "outer_cluster_217\n", "\n", "\n", "cluster_217\n", "\n", "\n", "\n", "outer_cluster_123\n", "\n", "\n", "cluster_123\n", "\n", "\n", "\n", "outer_cluster_117\n", "\n", "\n", "cluster_117\n", "\n", "\n", "\n", "outer_cluster_36\n", "\n", "\n", "cluster_36\n", "\n", "\n", "\n", "outer_cluster_245\n", "\n", "\n", "cluster_245\n", "\n", "\n", "\n", "outer_cluster_162\n", "\n", "\n", "cluster_162\n", "\n", "\n", "\n", "outer_cluster_98\n", "\n", "\n", "cluster_98\n", "\n", "\n", "\n", "outer_cluster_135\n", "\n", "\n", "cluster_135\n", "\n", "\n", "\n", "outer_cluster_157\n", "\n", "\n", "cluster_157\n", "\n", "\n", "\n", "outer_cluster_241\n", "\n", "\n", "cluster_241\n", "\n", "\n", "\n", "outer_cluster_160\n", "\n", "\n", "cluster_160\n", "\n", "\n", "\n", "outer_cluster_115\n", "\n", "\n", "cluster_115\n", "\n", "\n", "\n", "outer_cluster_67\n", "\n", "\n", "cluster_67\n", "\n", "\n", "\n", "outer_cluster_232\n", "\n", "\n", "cluster_232\n", "\n", "\n", "\n", "outer_cluster_182\n", "\n", "\n", "cluster_182\n", "\n", "\n", "\n", "outer_cluster_255\n", "\n", "\n", "cluster_255\n", "\n", "\n", "\n", "outer_cluster_170\n", "\n", "\n", "cluster_170\n", "\n", "\n", "\n", "outer_cluster_148\n", "\n", "\n", "cluster_148\n", "\n", "\n", "\n", "outer_cluster_231\n", "\n", "\n", "cluster_231\n", "\n", "\n", "\n", "outer_cluster_106\n", "\n", "\n", "cluster_106\n", "\n", "\n", "\n", "outer_cluster_78\n", "\n", "\n", "cluster_78\n", "\n", "\n", "\n", "outer_cluster_183\n", "\n", "\n", "cluster_183\n", "\n", "\n", "\n", "outer_cluster_111\n", "\n", "\n", "cluster_111\n", "\n", "\n", "\n", "outer_cluster_121\n", "\n", "\n", "cluster_121\n", "\n", "\n", "\n", "outer_cluster_59\n", "\n", "\n", "cluster_59\n", "\n", "\n", "\n", "outer_cluster_161\n", "\n", "\n", "cluster_161\n", "\n", "\n", "\n", "outer_cluster_50\n", "\n", "\n", "cluster_50\n", "\n", "\n", "\n", "outer_cluster_95\n", "\n", "\n", "cluster_95\n", "\n", "\n", "\n", "outer_cluster_149\n", "\n", "\n", "cluster_149\n", "\n", "\n", "\n", "outer_cluster_169\n", "\n", "\n", "cluster_169\n", "\n", "\n", "\n", "outer_cluster_47\n", "\n", "\n", "cluster_47\n", "\n", "\n", "\n", "outer_cluster_49\n", "\n", "\n", "cluster_49\n", "\n", "\n", "\n", "outer_cluster_185\n", "\n", "\n", "cluster_185\n", "\n", "\n", "\n", "outer_cluster_138\n", "\n", "\n", "cluster_138\n", "\n", "\n", "\n", "outer_cluster_176\n", "\n", "\n", "cluster_176\n", "\n", "\n", "\n", "outer_cluster_65\n", "\n", "\n", "cluster_65\n", "\n", "\n", "\n", "outer_cluster_Int_to_py-12938778466233897741-value\n", "\n", "\n", "cluster_Int_to_py-12938778466233897741-value\n", "\n", "\n", "\n", "outer_cluster_Int_to_py-7586556743040283621-value\n", "\n", "\n", "cluster_Int_to_py-7586556743040283621-value\n", "\n", "\n", "\n", "outer_cluster_Int_to_py-11951456526892775522-value\n", "\n", "\n", "cluster_Int_to_py-11951456526892775522-value\n", "\n", "\n", "\n", "outer_cluster_Int_to_py-5092353580987650850-value\n", "\n", "\n", "cluster_Int_to_py-5092353580987650850-value\n", "\n", "\n", "\n", "outer_cluster_Boolean_to_py-155920885323577962-value\n", "\n", "\n", "cluster_Boolean_to_py-155920885323577962-value\n", "\n", "\n", "\n", "outer_cluster_Int_to_py-6079675520328773069-value\n", "\n", "\n", "cluster_Int_to_py-6079675520328773069-value\n", "\n", "\n", "\n", "outer_cluster_Boolean_to_py-16472277196068845385-value\n", "\n", "\n", "cluster_Boolean_to_py-16472277196068845385-value\n", "\n", "\n", "\n", "outer_cluster_Int_to_py-1870696621799859130-value\n", "\n", "\n", "cluster_Int_to_py-1870696621799859130-value\n", "\n", "\n", "\n", "outer_cluster_Int_to_py-103947256882385308-value\n", "\n", "\n", "cluster_Int_to_py-103947256882385308-value\n", "\n", "\n", "\n", "outer_cluster_177\n", "\n", "\n", "cluster_177\n", "\n", "\n", "\n", "outer_cluster_186\n", "\n", "\n", "cluster_186\n", "\n", "\n", "\n", "outer_cluster_139\n", "\n", "\n", "cluster_139\n", "\n", "\n", "\n", "outer_cluster_218\n", "\n", "\n", "cluster_218\n", "\n", "\n", "\n", "outer_cluster_45\n", "\n", "\n", "cluster_45\n", "\n", "\n", "\n", "outer_cluster_203\n", "\n", "\n", "cluster_203\n", "\n", "\n", "\n", "outer_cluster_242\n", "\n", "\n", "cluster_242\n", "\n", "\n", "\n", "outer_cluster_215\n", "\n", "\n", "cluster_215\n", "\n", "\n", "\n", "outer_cluster_46\n", "\n", "\n", "cluster_46\n", "\n", "\n", "\n", "outer_cluster_224\n", "\n", "\n", "cluster_224\n", "\n", "\n", "\n", "outer_cluster_252\n", "\n", "\n", "cluster_252\n", "\n", "\n", "\n", "outer_cluster_43\n", "\n", "\n", "cluster_43\n", "\n", "\n", "\n", "outer_cluster_42\n", "\n", "\n", "cluster_42\n", "\n", "\n", "\n", "outer_cluster_85\n", "\n", "\n", "cluster_85\n", "\n", "\n", "\n", "outer_cluster_165\n", "\n", "\n", "cluster_165\n", "\n", "\n", "\n", "outer_cluster_113\n", "\n", "\n", "cluster_113\n", "\n", "\n", "\n", "outer_cluster_38\n", "\n", "\n", "cluster_38\n", "\n", "\n", "\n", "outer_cluster_30\n", "\n", "\n", "cluster_30\n", "\n", "\n", "\n", "outer_cluster_104\n", "\n", "\n", "cluster_104\n", "\n", "\n", "\n", "outer_cluster_112\n", "\n", "\n", "cluster_112\n", "\n", "\n", "\n", "outer_cluster_124\n", "\n", "\n", "cluster_124\n", "\n", "\n", "\n", "outer_cluster_273\n", "\n", "\n", "cluster_273\n", "\n", "\n", "\n", "outer_cluster_211\n", "\n", "\n", "cluster_211\n", "\n", "\n", "\n", "outer_cluster_271\n", "\n", "\n", "cluster_271\n", "\n", "\n", "\n", "outer_cluster_201\n", "\n", "\n", "cluster_201\n", "\n", "\n", "\n", "outer_cluster_19\n", "\n", "\n", "cluster_19\n", "\n", "\n", "\n", "outer_cluster_22\n", "\n", "\n", "cluster_22\n", "\n", "\n", "\n", "outer_cluster_198\n", "\n", "\n", "cluster_198\n", "\n", "\n", "\n", "outer_cluster_greater_zero-2598150418935018079-value\n", "\n", "\n", "cluster_greater_zero-2598150418935018079-value\n", "\n", "\n", "\n", "outer_cluster_greater_zero-1143242824664700181-value\n", "\n", "\n", "cluster_greater_zero-1143242824664700181-value\n", "\n", "\n", "\n", "outer_cluster_greater_zero-14809475088033756871-value\n", "\n", "\n", "cluster_greater_zero-14809475088033756871-value\n", "\n", "\n", "\n", "outer_cluster_greater_zero-13770179520251441998-value\n", "\n", "\n", "cluster_greater_zero-13770179520251441998-value\n", "\n", "\n", "\n", "outer_cluster_greater_zero-12107377412216353484-value\n", "\n", "\n", "cluster_greater_zero-12107377412216353484-value\n", "\n", "\n", "\n", "outer_cluster_93\n", "\n", "\n", "cluster_93\n", "\n", "\n", "\n", "outer_cluster_150\n", "\n", "\n", "cluster_150\n", "\n", "\n", "\n", "outer_cluster_244\n", "\n", "\n", "cluster_244\n", "\n", "\n", "\n", "outer_cluster_156\n", "\n", "\n", "cluster_156\n", "\n", "\n", "\n", "outer_cluster_197\n", "\n", "\n", "cluster_197\n", "\n", "\n", "\n", "outer_cluster_283\n", "\n", "\n", "cluster_283\n", "\n", "\n", "\n", "outer_cluster_200\n", "\n", "\n", "cluster_200\n", "\n", "\n", "\n", "outer_cluster_220\n", "\n", "\n", "cluster_220\n", "\n", "\n", "\n", "outer_cluster_237\n", "\n", "\n", "cluster_237\n", "\n", "\n", "\n", "outer_cluster_235\n", "\n", "\n", "cluster_235\n", "\n", "\n", "\n", "outer_cluster_226\n", "\n", "\n", "cluster_226\n", "\n", "\n", "\n", "outer_cluster_136\n", "\n", "\n", "cluster_136\n", "\n", "\n", "\n", "outer_cluster_239\n", "\n", "\n", "cluster_239\n", "\n", "\n", "\n", "outer_cluster_270\n", "\n", "\n", "cluster_270\n", "\n", "\n", "\n", "outer_cluster_35\n", "\n", "\n", "cluster_35\n", "\n", "\n", "\n", "outer_cluster_254\n", "\n", "\n", "cluster_254\n", "\n", "\n", "\n", "outer_cluster_174\n", "\n", "\n", "cluster_174\n", "\n", "\n", "\n", "\n", "NDArray_dtype-15121139857639374588:s->assume_isfinite-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "assume_isfinite-10080759905092916392:s->assume_shape-14591484260056516843\n", "\n", "\n", "\n", "\n", "\n", "NDArray_dtype-10080759905092916392:s->assume_shape-14591484260056516843\n", "\n", "\n", "\n", "\n", "\n", "assume_shape-14591484260056516843:s->assume_dtype-3429551472952562336\n", "\n", "\n", "\n", "\n", "\n", "assume_shape-14591484260056516843:s->NDArray_shape-15121139857639374588\n", "\n", "\n", "\n", "\n", "\n", "NDArray_dtype-11743562013128004906:s->assume_dtype-3429551472952562336\n", "\n", "\n", "\n", "\n", "\n", "assume_dtype-3429551472952562336:s->DType_float64-0\n", "\n", "\n", "\n", "\n", "\n", "NDArray_device-15121139857639374588:s->assume_isfinite-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Float___truediv__-12808993487988576005:s->Float_from_int-12938778466233897741\n", "\n", "\n", "\n", "\n", "\n", "Float___truediv__-12808993487988576005:s->Float_rational-17615343019692007359\n", "\n", "\n", "\n", "\n", "\n", "Float_from_int-12938778466233897741:s->TupleValue_length-883374682458736911\n", "\n", "\n", "\n", "\n", "\n", "Float_from_int-11951456526892775522:s->Int___sub__-2601583573127157282\n", "\n", "\n", "\n", "\n", "\n", "Int___sub__-2601583573127157282:s->Int___init__-11743562013128004906\n", "\n", "\n", "\n", "\n", "\n", "Int___sub__-2601583573127157282:s->Int___init__-16347205588787662656\n", "\n", "\n", "\n", "\n", "\n", "TupleValue_length-883374682458736911:s->TupleValue___init__-1403110966870663451\n", "\n", "\n", "\n", "\n", "\n", "Float___truediv__-5949890542083451333:s->Float___truediv__-5949890542083451333\n", "\n", "\n", "\n", "\n", "\n", "Float___truediv__-5949890542083451333:s->Float___init__-10858178701590265856\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-2961965818023366657:s->MultiAxisIndexKey___add__-9019874688858188702\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-9019874688858188702:s->MultiAxisIndexKey___init__-9665147878604913367\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-9019874688858188702:s->MultiAxisIndexKey___init__-9353306107957757443\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-2650124047376210733:s->MultiAxisIndexKey___add__-4155431249018709085\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-4155431249018709085:s->MultiAxisIndexKey___init__-9353306107957757443\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-4155431249018709085:s->MultiAxisIndexKey___init__-4312926155411299247\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-11068081844434038611:s->MultiAxisIndexKey___add__-7546443524583315781\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-7546443524583315781:s->MultiAxisIndexKey___init__-9353306107957757443\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-7546443524583315781:s->MultiAxisIndexKey___init__-17771263905015585321\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_int-12938778466233897741:s->TupleInt_length-8054319399011017507\n", "\n", "\n", "\n", "\n", "\n", "TupleInt_length-8054319399011017507:s->NDArray_shape-7742477628363861583\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_slice-4520820669176069863:s->Slice___init__-15501507093852132239\n", "\n", "\n", "\n", "\n", "\n", "Slice___init__-15501507093852132239:s->OptionalInt_some-11224002729757616573\n", "\n", "\n", "\n", "\n", "\n", "ndarray_index-1091269196223507527:s->NDArray___eq__-14314110614928331155\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-14314110614928331155:s->assume_value_one_of-5323778840018127892\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-14314110614928331155:s->NDArray___getitem__-16424482750509214731\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-5456168980075999428:s->MultiAxisIndexKey___add__-8188473634840644445\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-8188473634840644445:s->MultiAxisIndexKey___init__-9353306107957757443\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-8188473634840644445:s->MultiAxisIndexKey___init__-12159351040657546138\n", "\n", "\n", "\n", "\n", "\n", "ndarray_index-9457253364840142751:s->NDArray___eq__-5948126446311695931\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-5948126446311695931:s->reshape-4112525690760736104\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-5948126446311695931:s->NDArray___getitem__-6343722845416298339\n", "\n", "\n", "\n", "\n", "\n", "ndarray_index-4468847040734877209:s->NDArray___eq__-3677844317228415595\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-3677844317228415595:s->ndarray-sqrt-3065913074905751965\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-3677844317228415595:s->NDArray_scalar-1403110966870663451\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-3689419615158525606:s->MultiAxisIndexKey___add__-10696952293987308628\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-10696952293987308628:s->MultiAxisIndexKey___init__-10392601675740072316\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-10696952293987308628:s->MultiAxisIndexKey___init__-9353306107957757443\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___init__-1403110966870663451:s->NDArray_index-16788298149597563309\n", "\n", "\n", "\n", "\n", "\n", "TupleValue_length-51973628441192654:s->TupleValue___init__-14809475088033756871\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___init__-14809475088033756871:s->NDArray_index-3381934028434469889\n", "\n", "\n", "\n", "\n", "\n", "Int___sub__-11477953740632672431:s->Int___sub__-11477953740632672431\n", "\n", "\n", "\n", "\n", "\n", "Int___sub__-11477953740632672431:s->Int___add__-17495654355659155035\n", "\n", "\n", "\n", "\n", "\n", "Int___add__-17495654355659155035:s->TupleValue_length-51973628441192654\n", "\n", "\n", "\n", "\n", "\n", "Int___add__-17495654355659155035:s->Int___sub__-11477953740632672431\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-7742477628363861583:s->asarray-17776165865978447989\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-12686509587440430679:s->TupleInt___init__-103947256882385308\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___init__-103947256882385308:s->TupleInt___getitem__-7967890718712059612\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-7967890718712059612:s->TupleInt_length-8054319399011017507\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-7967890718712059612:s->TupleInt___add__-10948488217752557888\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___add__-10948488217752557888:s->TupleInt___init__-103947256882385308\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___add__-10948488217752557888:s->NDArray_shape-1714775736476281168\n", "\n", "\n", "\n", "\n", "\n", "Value_to_int-7118971088111087942:s->NDArray_index-6690955771313385503\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-6690955771313385503:s->sum-1681433789052220133\n", "\n", "\n", "\n", "\n", "\n", "Value_to_int-5352221723193614120:s->NDArray_index-3712217405396014230\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-3712217405396014230:s->sum-1955564354691009820\n", "\n", "\n", "\n", "\n", "\n", "TupleValue_length-18083105675662741245:s->possible_values-12211324669098738792\n", "\n", "\n", "\n", "\n", "\n", "possible_values-12211324669098738792:s->NDArray_index-12579319251068649370\n", "\n", "\n", "\n", "\n", "\n", "TupleValue_length-467762655970733886:s->possible_values-13042725723116283049\n", "\n", "\n", "\n", "\n", "\n", "possible_values-13042725723116283049:s->NDArray_index-17067340853146132798\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-14078601210367663714:s->TupleInt___init__-6079675520328773069\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___init__-6079675520328773069:s->Int___add__-17495654355659155035\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-11929974989452939301:s->NDArray_shape-11172029101316423919\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-11172029101316423919:s->concat-9071020324919791953\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-4501008190156617443:s->NDArray_shape-15640876142051301128\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-15640876142051301128:s->square-9769095135487298675\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-11605336705429392564:s->NDArray_shape-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-10080759905092916392:s->assume_shape-14591484260056516843\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-11375119588183991329:s->NDArray_shape-12834831209351512433\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-12834831209351512433:s->NDArray___getitem__-18178625676753040942\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-4381957443800611320:s->NDArray_shape-2754071304258596041\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-2754071304258596041:s->NDArray___getitem__-9812641508136405718\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-9665147878604913367:s->MultiAxisIndexKeyItem_slice-3793366872040910914\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKeyItem_slice-3793366872040910914:s->Slice___init__-1162291712589082458\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-10392601675740072316:s->MultiAxisIndexKeyItem_slice-4520820669176069863\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-17771263905015585321:s->MultiAxisIndexKeyItem_int-12938778466233897741\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-12159351040657546138:s->MultiAxisIndexKeyItem_slice-6287570034093543685\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKeyItem_slice-6287570034093543685:s->Slice___init__-14445438978175812750\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKeyItem_slice-4520820669176069863:s->Slice___init__-15501507093852132239\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKeyItem_int-12938778466233897741:s->Int___init__-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Slice___init__-1162291712589082458:s->OptionalInt_some-12938778466233897741\n", "\n", "\n", "\n", "\n", "\n", "Slice___init__-14445438978175812750:s->OptionalInt_some-12990752094675090395\n", "\n", "\n", "\n", "\n", "\n", "NDArray_T-15484955256727723166:s->TupleNDArray___getitem__-10680274783444675613\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-10680274783444675613:s->TupleInt___getitem__-14078601210367663714\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-10680274783444675613:s->svd-2189404700831293460\n", "\n", "\n", "\n", "\n", "\n", "ndarray-sqrt-4416873412293684555:s->NDArray_scalar-11120055472875231265\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-11120055472875231265:s->Value_float-5248274466311228812\n", "\n", "\n", "\n", "\n", "\n", "sum-13028558337034828233:s->NDArray___getitem__-9812641508136405718\n", "\n", "\n", "\n", "\n", "\n", "sum-13028558337034828233:s->OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-9812641508136405718:s->ndarray_index-9457253364840142751\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-9812641508136405718:s->asarray-9510298863856844727\n", "\n", "\n", "\n", "\n", "\n", "assume_value_one_of-5323778840018127892:s->possible_values-13042725723116283049\n", "\n", "\n", "\n", "\n", "\n", "assume_value_one_of-5323778840018127892:s->assume_shape-3276222675780329179\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-16424482750509214731:s->IndexKey_int-12938778466233897741\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-16424482750509214731:s->concat-430064524623572644\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-7887474207095380730:s->TupleNDArray___getitem__-10045558824545728354\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-7887474207095380730:s->NDArray_scalar-14809475088033756871\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-10045558824545728354:s->TupleInt_length-8054319399011017507\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-10045558824545728354:s->unique_inverse-7742477628363861583\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-14809475088033756871:s->TupleValue___getitem__-9658389681233211557\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-9557034512502171054:s->NDArray___truediv__-15656725660214344740\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-9557034512502171054:s->NDArray___setitem__-18325169333216085054\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-15656725660214344740:s->astype-6261542238027864055\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-15656725660214344740:s->NDArray_scalar-2598150418935018079\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-18325169333216085054:s->IndexKey_multi_axis-11068081844434038611\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-18325169333216085054:s->NDArray___truediv__-234125458194398443\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-18325169333216085054:s->NDArray___setitem__-7453141863274628760\n", "\n", "\n", "\n", "\n", "\n", "sum-3614295390857112930:s->OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "\n", "\n", "\n", "sum-3614295390857112930:s->square-9769095135487298675\n", "\n", "\n", "\n", "\n", "\n", "square-9769095135487298675:s->NDArray___sub__-5319530767107604281\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-11279504549742320031:s->NDArray___getitem__-9914932780259612220\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-11279504549742320031:s->NDArray___setitem__-5767087113385015795\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-9914932780259612220:s->IndexKey_multi_axis-3689419615158525606\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-9914932780259612220:s->TupleNDArray___getitem__-1818913068061409678\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-5767087113385015795:s->ndarray_index-4468847040734877209\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-5767087113385015795:s->NDArray_scalar-12107377412216353484\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-5767087113385015795:s->std-4851945112178408602\n", "\n", "\n", "\n", "\n", "\n", "assume_shape-3276222675780329179:s->NDArray_shape-1714775736476281168\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-1714775736476281168:s->assume_shape-3276222675780329179\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-2205987174022554874:s->IndexKey_multi_axis-11068081844434038611\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-2205987174022554874:s->NDArray___setitem__-18325169333216085054\n", "\n", "\n", "\n", "\n", "\n", "svd-2189404700831293460:s->NDArray___matmul__-13392291772433010205\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-15957548086918070248:s->Int___sub__-11477953740632672431\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-15957548086918070248:s->unique_counts-7742477628363861583\n", "\n", "\n", "\n", "\n", "\n", "unique_counts-7742477628363861583:s->reshape-4112525690760736104\n", "\n", "\n", "\n", "\n", "\n", "NDArray_vector-3013939446464559311:s->TupleValue___add__-16590608061057838701\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___add__-16590608061057838701:s->TupleValue___init__-1507058223753048759\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___add__-16590608061057838701:s->TupleValue___init__-17407625506968774950\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-11026489642259430172:s->IndexKey_multi_axis-2961965818023366657\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-11026489642259430172:s->NDArray___matmul__-7132500556515696557\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-7132500556515696557:s->NDArray___sub__-8877293197236476153\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-7132500556515696557:s->NDArray___matmul__-10968585808826125111\n", "\n", "\n", "\n", "\n", "\n", "NDArray_T-10444575304181264970:s->NDArray___mul__-7696624279617524538\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-7696624279617524538:s->ndarray-sqrt-5404195351634806774\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-7696624279617524538:s->NDArray_T-17147757364762811680\n", "\n", "\n", "\n", "\n", "\n", "ndarray-sqrt-5404195351634806774:s->NDArray___mul__-3756686807776082277\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-3756686807776082277:s->NDArray___mul__-4099386548708531027\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-3756686807776082277:s->NDArray_scalar-12107377412216353484\n", "\n", "\n", "\n", "\n", "\n", "reshape-4112525690760736104:s->reshape-4112525690760736104\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-6343722845416298339:s->NDArray_vector-467762655970733886\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-17968234112188297122:s->TupleNDArray___getitem__-10045558824545728354\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-17968234112188297122:s->NDArray___getitem__-6343722845416298339\n", "\n", "\n", "\n", "\n", "\n", "sum-4880387995353894830:s->NDArray___eq__-17968234112188297122\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-18178625676753040942:s->assume_isfinite-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-18178625676753040942:s->ndarray_index-1091269196223507527\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-234125458194398443:s->sum-7116569074662486339\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-234125458194398443:s->NDArray_scalar-519736284411926540\n", "\n", "\n", "\n", "\n", "\n", "sum-7116569074662486339:s->OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "\n", "\n", "\n", "sum-7116569074662486339:s->NDArray___getitem__-18178625676753040942\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-519736284411926540:s->Value_int-13094699351557475703\n", "\n", "\n", "\n", "\n", "\n", "mean-8154083004666556102:s->OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "\n", "\n", "\n", "mean-8154083004666556102:s->NDArray___getitem__-18178625676753040942\n", "\n", "\n", "\n", "\n", "\n", "astype-6261542238027864055:s->NDArray_dtype-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "astype-6261542238027864055:s->NDArray_vector-3013939446464559311\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-8877293197236476153:s->NDArray___matmul__-9557034512502171054\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-8877293197236476153:s->asarray-9510298863856844727\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-10968585808826125111:s->NDArray___truediv__-3215265837560371319\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-10968585808826125111:s->NDArray___getitem__-13476223401931994896\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-15121139857639374588:s->asarray-9510298863856844727\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-9788377807842481490:s->NDArray___setitem__-5767087113385015795\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-9788377807842481490:s->concat-9071020324919791953\n", "\n", "\n", "\n", "\n", "\n", "concat-9071020324919791953:s->TupleNDArray___add__-17612194977553982959\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-14091397723744054527:s->sum-4851945112178408602\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-14091397723744054527:s->NDArray_scalar-12315271925981124100\n", "\n", "\n", "\n", "\n", "\n", "sum-4851945112178408602:s->OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "\n", "\n", "\n", "sum-4851945112178408602:s->concat-9071020324919791953\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-12315271925981124100:s->Value_int-6443490919417121647\n", "\n", "\n", "\n", "\n", "\n", "NDArray___gt__-15651908559655936539:s->TupleNDArray___getitem__-18135092377765138894\n", "\n", "\n", "\n", "\n", "\n", "NDArray___gt__-15651908559655936539:s->NDArray_scalar-1143242824664700181\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-18135092377765138894:s->Int___init__-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-18135092377765138894:s->svd-7253966389981509278\n", "\n", "\n", "\n", "\n", "\n", "expand_dims-6453790381993539256:s->NDArray___truediv__-14091397723744054527\n", "\n", "\n", "\n", "\n", "\n", "mean-393645649769772465:s->OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "\n", "\n", "\n", "mean-393645649769772465:s->concat-9071020324919791953\n", "\n", "\n", "\n", "\n", "\n", "NDArray___gt__-8664676620264668937:s->TupleNDArray___getitem__-17539377729349800285\n", "\n", "\n", "\n", "\n", "\n", "NDArray___gt__-8664676620264668937:s->NDArray___mul__-8440009558605893705\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-17539377729349800285:s->TupleValue_length-883374682458736911\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-17539377729349800285:s->svd-2189404700831293460\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-8440009558605893705:s->NDArray_scalar-1143242824664700181\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-8440009558605893705:s->NDArray_scalar-8106293027452210161\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-13770179520251441998:s->Value_int-1870696621799859130\n", "\n", "\n", "\n", "\n", "\n", "Value_int-1870696621799859130:s->Int___init__-16347205588787662656\n", "\n", "\n", "\n", "\n", "\n", "Value_int-13094699351557475703:s->TupleInt___getitem__-11375119588183991329\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-2598150418935018079:s->Value_float-15173113486080567242\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-17303678250086389642:s->Value_int-11431897243522387189\n", "\n", "\n", "\n", "\n", "\n", "Value_int-11431897243522387189:s->TupleInt___getitem__-4381957443800611320\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-4099386548708531027:s->NDArray___truediv__-15656725660214344740\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-4099386548708531027:s->NDArray_scalar-13770179520251441998\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-7453141863274628760:s->IndexKey_multi_axis-2650124047376210733\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-7453141863274628760:s->zeros-16505489609336576318\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-7453141863274628760:s->NDArray___truediv__-15273179745796710348\n", "\n", "\n", "\n", "\n", "\n", "zeros-16505489609336576318:s->TupleInt___add__-10752996994297486686\n", "\n", "\n", "\n", "\n", "\n", "zeros-16505489609336576318:s->OptionalDType_some-3429551472952562336\n", "\n", "\n", "\n", "\n", "\n", "zeros-16505489609336576318:s->OptionalDevice_some-5144327209428843504\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-15273179745796710348:s->sum-13028558337034828233\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-15273179745796710348:s->NDArray_scalar-17303678250086389642\n", "\n", "\n", "\n", "\n", "\n", "asarray-9510298863856844727:s->asarray-9510298863856844727\n", "\n", "\n", "\n", "\n", "\n", "astype-12468708834165933853:s->NDArray___gt__-8664676620264668937\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-12107377412216353484:s->Value_float-6235596405652351031\n", "\n", "\n", "\n", "\n", "\n", "sum-1681433789052220133:s->astype-12468708834165933853\n", "\n", "\n", "\n", "\n", "\n", "astype-14592420363448682842:s->NDArray___gt__-15651908559655936539\n", "\n", "\n", "\n", "\n", "\n", "concat-430064524623572644:s->TupleNDArray___init__-12782857580910319779\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___init__-12782857580910319779:s->unique_values-12782857580910319779\n", "\n", "\n", "\n", "\n", "\n", "unique_values-12782857580910319779:s->TupleNDArray___getitem__-13683004811263061306\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-13683004811263061306:s->unique_inverse-7742477628363861583\n", "\n", "\n", "\n", "\n", "\n", "unique_values-7742477628363861583:s->asarray-17776165865978447989\n", "\n", "\n", "\n", "\n", "\n", "asarray-17776165865978447989:s->assume_value_one_of-5323778840018127892\n", "\n", "\n", "\n", "\n", "\n", "unique_inverse-7742477628363861583:s->asarray-17776165865978447989\n", "\n", "\n", "\n", "\n", "\n", "NDArray_vector-18083105675662741245:s->possible_values-12211324669098738792\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_vector-467762655970733886:s->TupleValue___add__-15259460202689358531\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___add__-15259460202689358531:s->TupleValue___init__-1403110966870663451\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___add__-15259460202689358531:s->TupleValue___init__-14809475088033756871\n", "\n", "\n", "\n", "\n", "\n", "NDArray_vector-51973628441192654:s->TupleValue___init__-14809475088033756871\n", "\n", "\n", "\n", "\n", "\n", "ndarray-sqrt-3065913074905751965:s->mean-15379324652549391956\n", "\n", "\n", "\n", "\n", "\n", "mean-15379324652549391956:s->OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "\n", "\n", "\n", "mean-15379324652549391956:s->square-9769095135487298675\n", "\n", "\n", "\n", "\n", "\n", "std-4851945112178408602:s->OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "\n", "\n", "\n", "std-4851945112178408602:s->concat-9071020324919791953\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-13053771214382123455:s->sum-3614295390857112930\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-13053771214382123455:s->NDArray_scalar-15692849770492493782\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-15692849770492493782:s->Value_int-9821068763928491329\n", "\n", "\n", "\n", "\n", "\n", "sum-8113810327174539763:s->NDArray___eq__-7887474207095380730\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-1818913068061409678:s->TupleValue_length-467762655970733886\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-1818913068061409678:s->svd-7253966389981509278\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-10430407918099810154:s->NDArray___getitem__-9812641508136405718\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-10430407918099810154:s->NDArray___getitem__-17483047916985507424\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-17483047916985507424:s->IndexKey_multi_axis-2650124047376210733\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-17483047916985507424:s->NDArray___setitem__-18325169333216085054\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-13392291772433010205:s->NDArray_T-10444575304181264970\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-13392291772433010205:s->NDArray___truediv__-3215265837560371319\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-3215265837560371319:s->NDArray_T-2858018561140981349\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-3215265837560371319:s->NDArray___getitem__-11494903289568215254\n", "\n", "\n", "\n", "\n", "\n", "svd-7253966389981509278:s->NDArray___mul__-8455018010728142919\n", "\n", "\n", "\n", "\n", "\n", "NDArray_T-2858018561140981349:s->NDArray___truediv__-11279504549742320031\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-8455018010728142919:s->ndarray-sqrt-4416873412293684555\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-8455018010728142919:s->NDArray___truediv__-9788377807842481490\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-1403110966870663451:s->TupleValue___getitem__-1353837537593392198\n", "\n", "\n", "\n", "\n", "\n", "Value_float-15173113486080567242:s->Float___init__-15726603433882419200\n", "\n", "\n", "\n", "\n", "\n", "Value_int-6443490919417121647:s->TupleInt___getitem__-11929974989452939301\n", "\n", "\n", "\n", "\n", "\n", "NDArray_T-17147757364762811680:s->NDArray___sub__-1374586120005010617\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-1353837537593392198:s->possible_values-12211324669098738792\n", "\n", "\n", "\n", "\n", "\n", "sum-1955564354691009820:s->astype-14592420363448682842\n", "\n", "\n", "\n", "\n", "\n", "Value_float-6235596405652351031:s->Float___truediv__-5949890542083451333\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-1374586120005010617:s->NDArray___matmul__-9557034512502171054\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-1374586120005010617:s->NDArray___setitem__-18325169333216085054\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___add__-17612194977553982959:s->TupleNDArray___init__-14497633317386600947\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___add__-17612194977553982959:s->TupleNDArray___init__-6131649148769965723\n", "\n", "\n", "\n", "\n", "\n", "mean-14339184933604096132:s->NDArray___getitem__-9812641508136405718\n", "\n", "\n", "\n", "\n", "\n", "mean-14339184933604096132:s->OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-5319530767107604281:s->concat-9071020324919791953\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-5319530767107604281:s->mean-393645649769772465\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-13476223401931994896:s->IndexKey_multi_axis-5456168980075999428\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-13476223401931994896:s->NDArray_T-15484955256727723166\n", "\n", "\n", "\n", "\n", "\n", "Value_int-9821068763928491329:s->TupleInt___getitem__-4501008190156617443\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-8106293027452210161:s->NDArray_index-1182067134106770624\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-11494903289568215254:s->IndexKey_slice-4520820669176069863\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-11494903289568215254:s->TupleNDArray___getitem__-18135092377765138894\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-9658389681233211557:s->TupleValue___init__-14809475088033756871\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-9558798608273926456:s->NDArray___getitem__-2205987174022554874\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-9558798608273926456:s->NDArray___getitem__-18178625676753040942\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___add__-10752996994297486686:s->TupleInt___init__-103947256882385308\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___add__-10752996994297486686:s->NDArray_shape-12782857580910319779\n", "\n", "\n", "\n", "\n", "\n", "OptionalDType_some-3429551472952562336:s->NDArray_dtype-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "OptionalDevice_some-5144327209428843504:s->NDArray_device-15121139857639374588\n", "\n", "\n", "\n", "\n", "\n", "Value_float-5248274466311228812:s->Float___truediv__-12808993487988576005\n", "\n", "\n", "\n", "\n", "\n", "asarray-7902703286805427734:s->asarray-7902703286805427734\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-1182067134106770624:s->TupleNDArray___getitem__-17539377729349800285\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-17758114586016463110:s->TupleNDArray___getitem__-17539377729349800285\n", "\n", "\n", "\n", "\n", "\n", "OptionalInt_some-12938778466233897741:s->Int___sub__-11477953740632672431\n", "\n", "\n", "\n", "\n", "\n", "OptionalInt_some-11224002729757616573:s->Value_to_int-5352221723193614120\n", "\n", "\n", "\n", "\n", "\n", "OptionalInt_some-12990752094675090395:s->Value_to_int-7118971088111087942\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-12938778466233897741:s->Int___sub__-11477953740632672431\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-11951456526892775522:s->Int___init__-4603643575659657750\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-6079675520328773069:s->Int___init__-11743562013128004906\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-1870696621799859130:s->TupleInt___getitem__-11605336705429392564\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-103947256882385308:s->TupleInt___getitem__-12686509587440430679\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___init__-12938778466233897741:s->TupleInt_length-8054319399011017507\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___init__-1870696621799859130:s->Int___init__-16347205588787662656\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-12782857580910319779:s->TupleNDArray___getitem__-13683004811263061306\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___init__-14497633317386600947:s->NDArray___sub__-10430407918099810154\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___init__-6131649148769965723:s->NDArray___sub__-9558798608273926456\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___init__-1507058223753048759:s->NDArray_to_value-14082021290898597922\n", "\n", "\n", "\n", "\n", "\n", "NDArray_to_value-14082021290898597922:s->sum-8113810327174539763\n", "\n", "\n", "\n", "\n", "\n", "count_values-15665070952316263745:s->assume_value_one_of-5323778840018127892\n", "\n", "\n", "\n", "\n", "\n", "count_values-15665070952316263745:s->NDArray_vector-51973628441192654\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___init__-17407625506968774950:s->NDArray_to_value-11535844500404772497\n", "\n", "\n", "\n", "\n", "\n", "count_values-180292696630078786:s->reshape-4112525690760736104\n", "\n", "\n", "\n", "\n", "\n", "count_values-180292696630078786:s->unique_values-7742477628363861583\n", "\n", "\n", "\n", "\n", "\n", "NDArray_to_value-11535844500404772497:s->sum-4880387995353894830\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-12579319251068649370:s->NDArray_vector-467762655970733886\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-16788298149597563309:s->NDArray_vector-18083105675662741245\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-3381934028434469889:s->TupleNDArray___getitem__-13683004811263061306\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-3381934028434469889:s->TupleInt___init__-12938778466233897741\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-17067340853146132798:s->assume_shape-3276222675780329179\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-2598150418935018079:s->Value_float-15173113486080567242\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-14809475088033756871:s->TupleValue___getitem__-14448359888109329694\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-14448359888109329694:s->Int___init__-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-14448359888109329694:s->possible_values-12211324669098738792\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-13770179520251441998:s->Value_int-1870696621799859130\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-12107377412216353484:s->Value_float-6235596405652351031\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-15769018209198649053:s->asarray-17776165865978447989\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-5805179075406046989:s->sum-8113810327174539763\n", "\n", "\n", "\n", "\n", "\n", "Value_int-12938778466233897741:s->TupleValue_length-51973628441192654\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-4148863126349750477:s->TupleValue_length-883374682458736911\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-4148863126349750477:s->TupleValue___add__-15259460202689358531\n", "\n", "\n", "\n", "\n", "\n", "NDArray_to_value-17927184790339163283:s->sum-1955564354691009820\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-7786309113067083429:s->possible_values-13042725723116283049\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-9066298261712755353:s->sum-4880387995353894830\n", "\n", "\n", "\n", "\n", "\n", "NDArray_to_value-1247190081547085489:s->sum-1681433789052220133\n", "\n", "\n", "\n", "\n", "\n", "NDArray_dtype-15121139857639374588\n", "\n", "\n", "NDArray_dtype\n", "\n", "\n", "\n", "\n", "\n", "\n", "assume_isfinite-10080759905092916392\n", "\n", "\n", "assume_isfinite\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_dtype-10080759905092916392\n", "\n", "\n", "NDArray_dtype\n", "\n", "\n", "\n", "\n", "\n", "\n", "assume_shape-14591484260056516843\n", "\n", "\n", "assume_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_dtype-11743562013128004906\n", "\n", "\n", "NDArray_dtype\n", "\n", "\n", "\n", "\n", "\n", "\n", "assume_dtype-3429551472952562336\n", "\n", "\n", "assume_dtype(NDArray_var("X"), ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "DType_float64-0\n", "\n", "\n", "DType_float64\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_device-15121139857639374588\n", "\n", "\n", "NDArray_device\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float___truediv__-12808993487988576005\n", "\n", "\n", "Float___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float_from_int-12938778466233897741\n", "\n", "\n", "Float_from_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float_rational-17615343019692007359\n", "\n", "\n", "Float_rational((rational 999998 1))\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float_rational-5040379952546458196\n", "\n", "\n", "Float_rational((rational 1 999998))\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float_from_int-11951456526892775522\n", "\n", "\n", "Float_from_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int___sub__-2601583573127157282\n", "\n", "\n", "Int___sub__\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float_rational-0\n", "\n", "\n", "Float_rational((rational 1000000 1))\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float___init__-15726603433882419200\n", "\n", "\n", "Float___init__(1000000.0)\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue_length-883374682458736911\n", "\n", "\n", "TupleValue_length\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float___truediv__-5949890542083451333\n", "\n", "\n", "Float___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float___init__-10858178701590265856\n", "\n", "\n", "Float___init__(1.0)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Float_rational-5871781006564002453\n", "\n", "\n", "Float_rational((rational 1 1))\n", "\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-2961965818023366657\n", "\n", "\n", "IndexKey_multi_axis\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-9019874688858188702\n", "\n", "\n", "MultiAxisIndexKey___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-2650124047376210733\n", "\n", "\n", "IndexKey_multi_axis\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-4155431249018709085\n", "\n", "\n", "MultiAxisIndexKey___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-11068081844434038611\n", "\n", "\n", "IndexKey_multi_axis\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-7546443524583315781\n", "\n", "\n", "MultiAxisIndexKey___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_int-12938778466233897741\n", "\n", "\n", "IndexKey_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt_length-8054319399011017507\n", "\n", "\n", "TupleInt_length\n", "\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_slice-4520820669176069863\n", "\n", "\n", "IndexKey_slice\n", "\n", "\n", "\n", "\n", "\n", "\n", "Slice___init__-15501507093852132239\n", "\n", "\n", "Slice___init__(OptionalInt_none, ·, OptionalInt_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "ndarray_index-1091269196223507527\n", "\n", "\n", "ndarray_index\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-14314110614928331155\n", "\n", "\n", "NDArray___eq__\n", "\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-5456168980075999428\n", "\n", "\n", "IndexKey_multi_axis\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-8188473634840644445\n", "\n", "\n", "MultiAxisIndexKey___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "ndarray_index-9457253364840142751\n", "\n", "\n", "ndarray_index\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-5948126446311695931\n", "\n", "\n", "NDArray___eq__\n", "\n", "\n", "\n", "\n", "\n", "\n", "ndarray_index-4468847040734877209\n", "\n", "\n", "ndarray_index\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-3677844317228415595\n", "\n", "\n", "NDArray___eq__\n", "\n", "\n", "\n", "\n", "\n", "\n", "IndexKey_multi_axis-3689419615158525606\n", "\n", "\n", "IndexKey_multi_axis\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___add__-10696952293987308628\n", "\n", "\n", "MultiAxisIndexKey___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___init__-1403110966870663451\n", "\n", "\n", "TupleValue___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue_length-51973628441192654\n", "\n", "\n", "TupleValue_length\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___init__-14809475088033756871\n", "\n", "\n", "TupleValue___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int___sub__-11477953740632672431\n", "\n", "\n", "Int___sub__\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int___add__-17495654355659155035\n", "\n", "\n", "Int___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-7742477628363861583\n", "\n", "\n", "NDArray_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int___init__-5871781006564002453\n", "\n", "\n", "Int___init__(1)\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-12686509587440430679\n", "\n", "\n", "TupleInt___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___init__-103947256882385308\n", "\n", "\n", "TupleInt___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-7967890718712059612\n", "\n", "\n", "TupleInt___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___add__-10948488217752557888\n", "\n", "\n", "TupleInt___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int___init__-6755155689022739364\n", "\n", "\n", "Int___init__(20)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_to_int-7118971088111087942\n", "\n", "\n", "Value_to_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-6690955771313385503\n", "\n", "\n", "NDArray_index(·, TupleInt_EMPTY)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_to_int-5352221723193614120\n", "\n", "\n", "Value_to_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-3712217405396014230\n", "\n", "\n", "NDArray_index(·, TupleInt_EMPTY)\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue_length-18083105675662741245\n", "\n", "\n", "TupleValue_length\n", "\n", "\n", "\n", "\n", "\n", "\n", "possible_values-12211324669098738792\n", "\n", "\n", "possible_values\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue_length-467762655970733886\n", "\n", "\n", "TupleValue_length\n", "\n", "\n", "\n", "\n", "\n", "\n", "possible_values-13042725723116283049\n", "\n", "\n", "possible_values\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-14078601210367663714\n", "\n", "\n", "TupleInt___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___init__-6079675520328773069\n", "\n", "\n", "TupleInt___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int___init__-11743562013128004906\n", "\n", "\n", "Int___init__(2)\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-11929974989452939301\n", "\n", "\n", "TupleInt___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-11172029101316423919\n", "\n", "\n", "NDArray_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-4501008190156617443\n", "\n", "\n", "TupleInt___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-15640876142051301128\n", "\n", "\n", "NDArray_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int___init__-16347205588787662656\n", "\n", "\n", "Int___init__(1000000)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int___init__-4603643575659657750\n", "\n", "\n", "Int___init__(999998)\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-11605336705429392564\n", "\n", "\n", "TupleInt___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-10080759905092916392\n", "\n", "\n", "NDArray_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-11375119588183991329\n", "\n", "\n", "TupleInt___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-12834831209351512433\n", "\n", "\n", "NDArray_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___getitem__-4381957443800611320\n", "\n", "\n", "TupleInt___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-2754071304258596041\n", "\n", "\n", "NDArray_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-9665147878604913367\n", "\n", "\n", "MultiAxisIndexKey___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKeyItem_slice-3793366872040910914\n", "\n", "\n", "MultiAxisIndexKeyItem_slice\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-10392601675740072316\n", "\n", "\n", "MultiAxisIndexKey___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-9353306107957757443\n", "\n", "\n", "MultiAxisIndexKey___init__(MultiAxisIndexKeyItem_slice(Slice___init__(OptionalInt_none, OptionalInt_none, OptionalInt_none)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-17771263905015585321\n", "\n", "\n", "MultiAxisIndexKey___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-4312926155411299247\n", "\n", "\n", "MultiAxisIndexKey___init__(MultiAxisIndexKeyItem_int(Int___init__(0)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKey___init__-12159351040657546138\n", "\n", "\n", "MultiAxisIndexKey___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKeyItem_slice-6287570034093543685\n", "\n", "\n", "MultiAxisIndexKeyItem_slice\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKeyItem_slice-4520820669176069863\n", "\n", "\n", "MultiAxisIndexKeyItem_slice\n", "\n", "\n", "\n", "\n", "\n", "\n", "MultiAxisIndexKeyItem_int-12938778466233897741\n", "\n", "\n", "MultiAxisIndexKeyItem_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "Slice___init__-1162291712589082458\n", "\n", "\n", "Slice___init__(OptionalInt_none, ·, OptionalInt_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Slice___init__-14445438978175812750\n", "\n", "\n", "Slice___init__(OptionalInt_none, ·, OptionalInt_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_T-15484955256727723166\n", "\n", "\n", "NDArray_T\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-10680274783444675613\n", "\n", "\n", "TupleNDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "ndarray-sqrt-4416873412293684555\n", "\n", "\n", "ndarray-sqrt\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-11120055472875231265\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "sum-13028558337034828233\n", "\n", "\n", "sum\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-9812641508136405718\n", "\n", "\n", "NDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "OptionalIntOrTuple_some-6859102945905124672\n", "\n", "\n", "OptionalIntOrTuple_some(IntOrTuple_int(Int___init__(0)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "assume_value_one_of-5323778840018127892\n", "\n", "\n", "assume_value_one_of\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-16424482750509214731\n", "\n", "\n", "NDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-7887474207095380730\n", "\n", "\n", "NDArray___eq__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-10045558824545728354\n", "\n", "\n", "TupleNDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-14809475088033756871\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-9557034512502171054\n", "\n", "\n", "NDArray___matmul__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-15656725660214344740\n", "\n", "\n", "NDArray___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-18325169333216085054\n", "\n", "\n", "NDArray___setitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "sum-3614295390857112930\n", "\n", "\n", "sum\n", "\n", "\n", "\n", "\n", "\n", "\n", "square-9769095135487298675\n", "\n", "\n", "square\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-11279504549742320031\n", "\n", "\n", "NDArray___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-9914932780259612220\n", "\n", "\n", "NDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-5767087113385015795\n", "\n", "\n", "NDArray___setitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "assume_shape-3276222675780329179\n", "\n", "\n", "assume_shape(assume_dtype(NDArray_var("y"), DType_int64), ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-1714775736476281168\n", "\n", "\n", "NDArray_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-2205987174022554874\n", "\n", "\n", "NDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "svd-2189404700831293460\n", "\n", "\n", "svd(·, FALSE)\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-15957548086918070248\n", "\n", "\n", "TupleNDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "unique_counts-7742477628363861583\n", "\n", "\n", "unique_counts\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_vector-3013939446464559311\n", "\n", "\n", "NDArray_vector\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___add__-16590608061057838701\n", "\n", "\n", "TupleValue___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-11026489642259430172\n", "\n", "\n", "NDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-7132500556515696557\n", "\n", "\n", "NDArray___matmul__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_T-10444575304181264970\n", "\n", "\n", "NDArray_T\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-7696624279617524538\n", "\n", "\n", "NDArray___mul__\n", "\n", "\n", "\n", "\n", "\n", "\n", "ndarray-sqrt-5404195351634806774\n", "\n", "\n", "ndarray-sqrt\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-3756686807776082277\n", "\n", "\n", "NDArray___mul__\n", "\n", "\n", "\n", "\n", "\n", "\n", "reshape-4112525690760736104\n", "\n", "\n", "reshape(·, TupleInt___init__(Int___init__(-1)), OptionalBool_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-6343722845416298339\n", "\n", "\n", "NDArray___getitem__(·, IndexKey_int(Int___init__(0)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___eq__-17968234112188297122\n", "\n", "\n", "NDArray___eq__\n", "\n", "\n", "\n", "\n", "\n", "\n", "sum-4880387995353894830\n", "\n", "\n", "sum(·, OptionalIntOrTuple_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-18178625676753040942\n", "\n", "\n", "NDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-234125458194398443\n", "\n", "\n", "NDArray___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "sum-7116569074662486339\n", "\n", "\n", "sum\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-519736284411926540\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "mean-8154083004666556102\n", "\n", "\n", "mean(·, ·, FALSE)\n", "\n", "\n", "\n", "\n", "\n", "\n", "astype-6261542238027864055\n", "\n", "\n", "astype\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-8877293197236476153\n", "\n", "\n", "NDArray___sub__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-10968585808826125111\n", "\n", "\n", "NDArray___matmul__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-15121139857639374588\n", "\n", "\n", "NDArray_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-9788377807842481490\n", "\n", "\n", "NDArray___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "concat-9071020324919791953\n", "\n", "\n", "concat(·, OptionalInt_some(Int___init__(0)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-14091397723744054527\n", "\n", "\n", "NDArray___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "sum-4851945112178408602\n", "\n", "\n", "sum\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-12315271925981124100\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___gt__-15651908559655936539\n", "\n", "\n", "NDArray___gt__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-18135092377765138894\n", "\n", "\n", "TupleNDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-1143242824664700181\n", "\n", "\n", "NDArray_scalar(Value_float(Float___init__(0.0001)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "expand_dims-6453790381993539256\n", "\n", "\n", "expand_dims(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "mean-393645649769772465\n", "\n", "\n", "mean(·, ·, TRUE)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___gt__-8664676620264668937\n", "\n", "\n", "NDArray___gt__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-17539377729349800285\n", "\n", "\n", "TupleNDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-8440009558605893705\n", "\n", "\n", "NDArray___mul__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-13770179520251441998\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_int-1870696621799859130\n", "\n", "\n", "Value_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_int-13094699351557475703\n", "\n", "\n", "Value_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-2598150418935018079\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-17303678250086389642\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_int-11431897243522387189\n", "\n", "\n", "Value_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-4099386548708531027\n", "\n", "\n", "NDArray___mul__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___setitem__-7453141863274628760\n", "\n", "\n", "NDArray___setitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "zeros-16505489609336576318\n", "\n", "\n", "zeros\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-15273179745796710348\n", "\n", "\n", "NDArray___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "asarray-9510298863856844727\n", "\n", "\n", "asarray(·, OptionalDType_none, OptionalBool_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "astype-12468708834165933853\n", "\n", "\n", "astype(·, DType_int32)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-12107377412216353484\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "sum-1681433789052220133\n", "\n", "\n", "sum(·, OptionalIntOrTuple_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "astype-14592420363448682842\n", "\n", "\n", "astype(·, DType_int32)\n", "\n", "\n", "\n", "\n", "\n", "\n", "concat-430064524623572644\n", "\n", "\n", "concat(·, OptionalInt_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___init__-12782857580910319779\n", "\n", "\n", "TupleNDArray___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "unique_values-12782857580910319779\n", "\n", "\n", "unique_values\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-13683004811263061306\n", "\n", "\n", "TupleNDArray___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "unique_values-7742477628363861583\n", "\n", "\n", "unique_values\n", "\n", "\n", "\n", "\n", "\n", "\n", "asarray-17776165865978447989\n", "\n", "\n", "asarray(·, OptionalDType_none, OptionalBool_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "unique_inverse-7742477628363861583\n", "\n", "\n", "unique_inverse\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_vector-18083105675662741245\n", "\n", "\n", "NDArray_vector\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_vector-467762655970733886\n", "\n", "\n", "NDArray_vector\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___add__-15259460202689358531\n", "\n", "\n", "TupleValue___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_vector-51973628441192654\n", "\n", "\n", "NDArray_vector\n", "\n", "\n", "\n", "\n", "\n", "\n", "ndarray-sqrt-3065913074905751965\n", "\n", "\n", "ndarray-sqrt\n", "\n", "\n", "\n", "\n", "\n", "\n", "mean-15379324652549391956\n", "\n", "\n", "mean(·, ·, FALSE)\n", "\n", "\n", "\n", "\n", "\n", "\n", "std-4851945112178408602\n", "\n", "\n", "std\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-13053771214382123455\n", "\n", "\n", "NDArray___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-15692849770492493782\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "sum-8113810327174539763\n", "\n", "\n", "sum(·, OptionalIntOrTuple_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___getitem__-1818913068061409678\n", "\n", "\n", "TupleNDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-10430407918099810154\n", "\n", "\n", "NDArray___sub__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-17483047916985507424\n", "\n", "\n", "NDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___matmul__-13392291772433010205\n", "\n", "\n", "NDArray___matmul__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___truediv__-3215265837560371319\n", "\n", "\n", "NDArray___truediv__\n", "\n", "\n", "\n", "\n", "\n", "\n", "svd-7253966389981509278\n", "\n", "\n", "svd(·, FALSE)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_T-2858018561140981349\n", "\n", "\n", "NDArray_T\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___mul__-8455018010728142919\n", "\n", "\n", "NDArray___mul__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-1403110966870663451\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_float-15173113486080567242\n", "\n", "\n", "Value_float\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_int-6443490919417121647\n", "\n", "\n", "Value_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_T-17147757364762811680\n", "\n", "\n", "NDArray_T\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-1353837537593392198\n", "\n", "\n", "TupleValue___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "sum-1955564354691009820\n", "\n", "\n", "sum(·, OptionalIntOrTuple_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_float-6235596405652351031\n", "\n", "\n", "Value_float\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-1374586120005010617\n", "\n", "\n", "NDArray___sub__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___add__-17612194977553982959\n", "\n", "\n", "TupleNDArray___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "mean-14339184933604096132\n", "\n", "\n", "mean(·, ·, FALSE)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-5319530767107604281\n", "\n", "\n", "NDArray___sub__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-13476223401931994896\n", "\n", "\n", "NDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_int-9821068763928491329\n", "\n", "\n", "Value_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_scalar-8106293027452210161\n", "\n", "\n", "NDArray_scalar\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-11494903289568215254\n", "\n", "\n", "NDArray___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-9658389681233211557\n", "\n", "\n", "TupleValue___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___sub__-9558798608273926456\n", "\n", "\n", "NDArray___sub__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___add__-10752996994297486686\n", "\n", "\n", "TupleInt___add__\n", "\n", "\n", "\n", "\n", "\n", "\n", "OptionalDType_some-3429551472952562336\n", "\n", "\n", "OptionalDType_some\n", "\n", "\n", "\n", "\n", "\n", "\n", "OptionalDevice_some-5144327209428843504\n", "\n", "\n", "OptionalDevice_some\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_float-5248274466311228812\n", "\n", "\n", "Value_float\n", "\n", "\n", "\n", "\n", "\n", "\n", "asarray-7902703286805427734\n", "\n", "\n", "asarray(·, OptionalDType_none, OptionalBool_none)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-1182067134106770624\n", "\n", "\n", "NDArray_index(·, TupleInt___init__(Int___init__(0)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray___getitem__-17758114586016463110\n", "\n", "\n", "NDArray___getitem__(·, IndexKey_int(Int___init__(0)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "OptionalInt_some-12938778466233897741\n", "\n", "\n", "OptionalInt_some\n", "\n", "\n", "\n", "\n", "\n", "\n", "OptionalInt_some-11224002729757616573\n", "\n", "\n", "OptionalInt_some\n", "\n", "\n", "\n", "\n", "\n", "\n", "OptionalInt_some-12990752094675090395\n", "\n", "\n", "OptionalInt_some\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-12938778466233897741\n", "\n", "\n", "Int_to_py\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-12938778466233897741-value\n", "\n", "\n", "(py-object -9223372036574422025 1)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-7586556743040283621-value\n", "\n", "\n", "(py-object -9223372036574422025 0)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-7586556743040283621\n", "\n", "\n", "Int_to_py(Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-11951456526892775522\n", "\n", "\n", "Int_to_py\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-11951456526892775522-value\n", "\n", "\n", "(py-object -9223372036574422025 999998)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-5092353580987650850-value\n", "\n", "\n", "(py-object -9223372036574422025 -2)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-5092353580987650850\n", "\n", "\n", "Int_to_py(Int___init__(-1))\n", "\n", "\n", "\n", "\n", "\n", "\n", "Boolean_to_py-155920885323577962-value\n", "\n", "\n", "(py-object 280353635 0)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Boolean_to_py-155920885323577962\n", "\n", "\n", "Boolean_to_py(FALSE)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-6079675520328773069\n", "\n", "\n", "Int_to_py\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-6079675520328773069-value\n", "\n", "\n", "(py-object -9223372036574422025 2)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Boolean_to_py-16472277196068845385-value\n", "\n", "\n", "(py-object 280353635 1)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Boolean_to_py-16472277196068845385\n", "\n", "\n", "Boolean_to_py(TRUE)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-1870696621799859130\n", "\n", "\n", "Int_to_py\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-1870696621799859130-value\n", "\n", "\n", "(py-object -9223372036574422025 1000000)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-103947256882385308\n", "\n", "\n", "Int_to_py\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int_to_py-103947256882385308-value\n", "\n", "\n", "(py-object -9223372036574422025 20)\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___init__-12938778466233897741\n", "\n", "\n", "TupleInt___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleInt___init__-1870696621799859130\n", "\n", "\n", "TupleInt___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_shape-12782857580910319779\n", "\n", "\n", "NDArray_shape\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___init__-14497633317386600947\n", "\n", "\n", "TupleNDArray___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleNDArray___init__-6131649148769965723\n", "\n", "\n", "TupleNDArray___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___init__-1507058223753048759\n", "\n", "\n", "TupleValue___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_to_value-14082021290898597922\n", "\n", "\n", "NDArray_to_value\n", "\n", "\n", "\n", "\n", "\n", "\n", "count_values-15665070952316263745\n", "\n", "\n", "count_values\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___init__-17407625506968774950\n", "\n", "\n", "TupleValue___init__\n", "\n", "\n", "\n", "\n", "\n", "\n", "count_values-180292696630078786\n", "\n", "\n", "count_values\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_to_value-11535844500404772497\n", "\n", "\n", "NDArray_to_value\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-12579319251068649370\n", "\n", "\n", "NDArray_index(·, ALL_INDICES)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-16788298149597563309\n", "\n", "\n", "NDArray_index(·, TupleInt___init__(Int___init__(0)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-3381934028434469889\n", "\n", "\n", "NDArray_index\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-17067340853146132798\n", "\n", "\n", "NDArray_index(·, ALL_INDICES)\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-2598150418935018079\n", "\n", "\n", "greater_zero\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-2598150418935018079-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-1143242824664700181-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-1143242824664700181\n", "\n", "\n", "greater_zero(Value_float(Float___init__(0.0001)))\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-14809475088033756871\n", "\n", "\n", "greater_zero\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-14448359888109329694\n", "\n", "\n", "TupleValue___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-14809475088033756871-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-13770179520251441998\n", "\n", "\n", "greater_zero\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-13770179520251441998-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-12107377412216353484\n", "\n", "\n", "greater_zero\n", "\n", "\n", "\n", "\n", "\n", "\n", "greater_zero-12107377412216353484-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-15769018209198649053\n", "\n", "\n", "NDArray_index(·, ALL_INDICES)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-5822399466274154604\n", "\n", "\n", "NDArray_index(assume_dtype(NDArray_var("y"), DType_int64), ALL_INDICES)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-7547271516962905184\n", "\n", "\n", "NDArray_index(NDArray_var("y"), ALL_INDICES)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-5805179075406046989\n", "\n", "\n", "NDArray_index(·, TupleInt_EMPTY)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_int-12938778466233897741\n", "\n", "\n", "Value_int\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-4148863126349750477\n", "\n", "\n", "TupleValue___getitem__\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_to_value-17927184790339163283\n", "\n", "\n", "NDArray_to_value\n", "\n", "\n", "\n", "\n", "\n", "\n", "TupleValue___getitem__-7786309113067083429\n", "\n", "\n", "TupleValue___getitem__(·, Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "Value_int-7586556743040283621\n", "\n", "\n", "Value_int(Int___init__(0))\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_index-9066298261712755353\n", "\n", "\n", "NDArray_index(·, TupleInt_EMPTY)\n", "\n", "\n", "\n", "\n", "\n", "\n", "NDArray_to_value-1247190081547085489\n", "\n", "\n", "NDArray_to_value\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimized_fn.egraph" ] }, { "cell_type": "code", "execution_count": 9, "id": "a6425e79", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/xn/05ktz3056kqd9n8frgd6236h0000gn/T/egglog-82012193-cafe-439c-94d4-48ec846ca9e6.py:56: NumbaPerformanceWarning: '@' is faster on contiguous arrays, called on (Array(float64, 2, 'C', False, aligned=True), Array(float64, 2, 'A', False, aligned=True))\n", " _45 = _33 @ _40[2].T[:, :_44]\n" ] } ], "source": [ "import numba\n", "import numpy as np\n", "\n", "numba_fn = numba.njit(fastmath=True)(optimized_fn)\n", "assert np.allclose(run_lda(X_np, y_np), numba_fn(X_np, y_np))" ] }, { "cell_type": "code", "execution_count": 10, "id": "2963cba8", "metadata": { "tags": [ "remove-input" ] }, "outputs": [], "source": [ "import timeit\n", "import pandas as pd\n", "\n", "stmts = {\n", " \"original\": \"run_lda(X_np, y_np)\",\n", " \"numba\": \"numba_fn(X_np, y_np)\",\n", "}\n", "df = pd.DataFrame.from_dict(\n", " {\n", " name: timeit.repeat(stmt, globals=globals(), number=1, repeat=10)\n", " for name, stmt in stmts.items()\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "6afa0cdc", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# ~30% speedup\n", "\n", "_on my machine, not a scientific benchmark_\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "80f4f4a5", "metadata": {}, "outputs": [ { "data": { "image/png": "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q9ra2jZ780ePHtXNN9+sq6++WhUVFfr5z3+uX/7yl61Wg3r22Wc1cOBA7dq1SytXrtTDDz+sLVu2XNwfDBDmGPoGegi3262YmJgLGnaePn267rjjDknSj370I/3sZz/TO++8o5tuuklr166V2+3WCy+8oL59+0qSUlNTA8f2799fjY2NHX5mYWGhPB6P1qxZI8uyNHLkSH388cdavHixHnzwQfXpc6bPMHr0aC1btkzSmbXF16xZoz/84Q+64YYbgvo+QE9CjxqARo8eHfjvgQMHKjY2VseOHZMklZeX67rrrguE9IX44IMPNGHCBFmWFWibOHGi/H6/jhw50mYdkjRkyJBAHUBvRVADPVifPn10/o0dp06darXf+SFsWZaam5slnekxh0pHdQC9FUEN9GCDBw9WbW1tYNvn86mmpiaoc4wePVpvvvlmmwEvSVFRUWpqaurwHKNGjdLbb7/d4h8NO3fuVExMjIYNGxZUPUBvQ1ADPdj111+vDRs26M0339S+ffs0bdo0RUREBHWOuXPnyufz6fbbb9fu3bt14MABbdiwQR9++KEkafjw4frTn/6kDz/8UJ988kmbgT579mwdPnxY9957r/785z/r5Zdf1rJly7RgwYLA9WkAbeMXAvRg+fn5mjRpkr75zW/qlltu0W233aYRI0YEdY5LLrlEW7duld/v16RJk5SRkaFf/OIXgWHq//zP/9SVV16pcePGafDgwdq5c2erc1x66aX6/e9/r3feeUfp6emaNWuWvvvd72rJkiVd8j2BnownkwEAYDB61AAAGIygBgDAYAQ1AAAGI6gBADAYQQ0AgMEIagAADEZQAwBgMIIaAACDEdQAABiMoAYAwGAENQAABvt/FvOgnm2Yq8QAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "\n", "df_melt = pd.melt(df, var_name=\"function\", value_name=\"time\")\n", "_ = sns.catplot(data=df_melt, x=\"function\", y=\"time\", kind=\"swarm\")" ] }, { "cell_type": "markdown", "id": "005478ee", "metadata": {}, "source": [ "## Conclusions\n", "\n", "- `egglog` is a Python interface to e-graphs, which respects the underlying semantics but provides a Python interface.\n", "- Flexible enough to represent Array API and translate this back to Python source\n", "- If you have a Python library which optimizes/translates expressions, try it out!\n", "- Goals\n", "\n", " - support the ecosystem in collaborating better between libraries, to encourage experimentation and innovation\n", " - dont reimplement the world: build on academic programming language research\n", "\n", "- `pip install egglog`\n", "- https://github.com/metadsl/egglog-python\n", "- Say hello: https://egraphs.zulipchat.com/\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "file_format": "mystnb", "kernelspec": { "display_name": "egglog-python", "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.10.12" }, "mystnb": { "execution_mode": "off" } }, "nbformat": 4, "nbformat_minor": 5 }