{ "cells": [ { "cell_type": "markdown", "metadata": { "notebookRunGroups": { "groupValue": "2" } }, "source": [ "```{post} 2024-03-20\n", ":author: Saul\n", "```\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "\n", "YouTubeVideo(\"I2ICNT56Rdc\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# [EGRAPHS Community Call Talk](https://egraphs.org/meeting/2024-03-21-lightning-talks)\n", "\n", "**Egglog as a tool for building an optimizing composable type safe DSLs in Python**\n", "\n", "... to help drive theoretical development of e-graphs in conjunction with impacting (large) real world communities.\n" ] }, { "cell_type": "markdown", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "_Now that I have this great e-graph library in Python, what extra mechanisms do I need to make it useful in existing Python code?_\n", "\n", "_This talk will go thorugh a few techniques developed and also point to how by bringing in use cases from scientific Python can help drive further theoretic research_\n", "\n", "![](./2024_03_17_map.svg)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Optimizing Scikit-learn with Numba\n", "\n", "_We are going to work through the different pieces needed to optimize a Scikit-learn pipeline using Numba and egglog._\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from __future__ import annotations\n", "\n", "import sklearn\n", "from sklearn.datasets import make_classification\n", "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n", "\n", "# Tell sklearn to treat arrays as following array API\n", "sklearn.set_config(array_api_dispatch=True)\n", "\n", "X_np, y_np = make_classification(random_state=0, n_samples=1000000)\n", "\n", "\n", "# Assumption: I want to optimize calling this many times on data similar to that above\n", "def run_lda(x, y):\n", " lda = LinearDiscriminantAnalysis()\n", " return lda.fit(x, y).transform(x)" ] }, { "cell_type": "markdown", "metadata": { "notebookRunGroups": { "groupValue": "1" } }, "source": [ "We can do this using egglog to generate Python code and Numba to JIT compile it to LLVM, resulting in a speedup:\n", "\n", "![](https://egglog-python.readthedocs.io/latest/_images/0662bf9dd34caffce5ae8be1110d6b58d82419765f5373441c528a88985e8a28.png)\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# The first thing we need to do is create our symbolic arrays and get back our symbolic output\n", "\n", "from egglog.exp.array_api import *\n", "\n", "X_arr = NDArray.var(\"X\")\n", "assume_dtype(X_arr, X_np.dtype)\n", "assume_shape(X_arr, X_np.shape)\n", "assume_isfinite(X_arr)\n", "\n", "y_arr = NDArray.var(\"y\")\n", "assume_dtype(y_arr, y_np.dtype)\n", "assume_shape(y_arr, y_np.shape)\n", "assume_value_one_of(y_arr, tuple(map(int, np.unique(y_np)))) # type: ignore[arg-type]\n", "\n", "with EGraph():\n", " res = run_lda(X_arr, y_arr)" ] }, { "cell_type": "code", "execution_count": 3, "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 = asarray(reshape(asarray(_NDArray_2), TupleInt(Int(-1))))\n",
       "_NDArray_4 = astype(unique_counts(_NDArray_3)[Int(1)], asarray(_NDArray_1).dtype) / NDArray.scalar(Value.float(Float(1000000.0)))\n",
       "_NDArray_5 = zeros(\n",
       "    TupleInt(unique_inverse(_NDArray_3)[Int(0)].shape[Int(0)]) + TupleInt(asarray(_NDArray_1).shape[Int(1)]),\n",
       "    OptionalDType.some(asarray(_NDArray_1).dtype),\n",
       "    OptionalDevice.some(asarray(_NDArray_1).device),\n",
       ")\n",
       "_MultiAxisIndexKey_1 = MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(Slice()))\n",
       "_IndexKey_1 = IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.int(Int(0))) + _MultiAxisIndexKey_1)\n",
       "_OptionalIntOrTuple_1 = OptionalIntOrTuple.some(IntOrTuple.int(Int(0)))\n",
       "_NDArray_5[_IndexKey_1] = mean(asarray(_NDArray_1)[ndarray_index(unique_inverse(_NDArray_3)[Int(1)] == NDArray.scalar(Value.int(Int(0))))], _OptionalIntOrTuple_1)\n",
       "_IndexKey_2 = IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.int(Int(1))) + _MultiAxisIndexKey_1)\n",
       "_NDArray_5[_IndexKey_2] = mean(asarray(_NDArray_1)[ndarray_index(unique_inverse(_NDArray_3)[Int(1)] == NDArray.scalar(Value.int(Int(1))))], _OptionalIntOrTuple_1)\n",
       "_NDArray_6 = unique_values(concat(TupleNDArray(unique_values(asarray(_NDArray_3)))))\n",
       "_NDArray_7 = concat(\n",
       "    TupleNDArray(asarray(_NDArray_1)[ndarray_index(_NDArray_3 == _NDArray_6[IndexKey.int(Int(0))])] - _NDArray_5[_IndexKey_1])\n",
       "    + TupleNDArray(asarray(_NDArray_1)[ndarray_index(_NDArray_3 == _NDArray_6[IndexKey.int(Int(1))])] - _NDArray_5[_IndexKey_2]),\n",
       "    OptionalInt.some(Int(0)),\n",
       ")\n",
       "_NDArray_8 = std(_NDArray_7, _OptionalIntOrTuple_1)\n",
       "_NDArray_8[ndarray_index(std(_NDArray_7, _OptionalIntOrTuple_1) == NDArray.scalar(Value.int(Int(0))))] = NDArray.scalar(Value.float(Float(1.0)))\n",
       "_TupleNDArray_1 = svd(\n",
       "    sqrt(asarray(NDArray.scalar(Value.float(Float(1.0) / Float.from_int(asarray(_NDArray_1).shape[Int(0)] - _NDArray_6.shape[Int(0)]))))) * (_NDArray_7 / _NDArray_8), FALSE\n",
       ")\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_9 = (_TupleNDArray_1[Int(2)][IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(_Slice_1)) + _MultiAxisIndexKey_1)] / _NDArray_8).T / _TupleNDArray_1[\n",
       "    Int(1)\n",
       "][IndexKey.slice(_Slice_1)]\n",
       "_TupleNDArray_2 = svd(\n",
       "    (\n",
       "        sqrt(\n",
       "            (NDArray.scalar(Value.int(asarray(_NDArray_1).shape[Int(0)])) * _NDArray_4)\n",
       "            * NDArray.scalar(Value.float(Float(1.0) / Float.from_int(_NDArray_6.shape[Int(0)] - Int(1))))\n",
       "        )\n",
       "        * (_NDArray_5 - (_NDArray_4 @ _NDArray_5)).T\n",
       "    ).T\n",
       "    @ _NDArray_9,\n",
       "    FALSE,\n",
       ")\n",
       "(\n",
       "    (asarray(_NDArray_1) - (_NDArray_4 @ _NDArray_5))\n",
       "    @ (\n",
       "        _NDArray_9\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(_NDArray_6.shape[Int(0)] - 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}{asarray}\\PY{p}{(}\\PY{n}{reshape}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}2}\\PY{p}{)}\\PY{p}{,} \\PY{n}{TupleInt}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{o}{\\PYZhy{}}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}4} \\PY{o}{=} \\PY{n}{astype}\\PY{p}{(}\\PY{n}{unique\\PYZus{}counts}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}3}\\PY{p}{)}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{]}\\PY{p}{,} \\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\PY{o}{.}\\PY{n}{dtype}\\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{}5} \\PY{o}{=} \\PY{n}{zeros}\\PY{p}{(}\n", " \\PY{n}{TupleInt}\\PY{p}{(}\\PY{n}{unique\\PYZus{}inverse}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}3}\\PY{p}{)}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{]}\\PY{o}{.}\\PY{n}{shape}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{]}\\PY{p}{)} \\PY{o}{+} \\PY{n}{TupleInt}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\PY{o}{.}\\PY{n}{shape}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{]}\\PY{p}{)}\\PY{p}{,}\n", " \\PY{n}{OptionalDType}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\PY{o}{.}\\PY{n}{dtype}\\PY{p}{)}\\PY{p}{,}\n", " \\PY{n}{OptionalDevice}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\PY{o}{.}\\PY{n}{device}\\PY{p}{)}\\PY{p}{,}\n", "\\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{}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{}5}\\PY{p}{[}\\PY{n}{\\PYZus{}IndexKey\\PYZus{}1}\\PY{p}{]} \\PY{o}{=} \\PY{n}{mean}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\PY{p}{[}\\PY{n}{ndarray\\PYZus{}index}\\PY{p}{(}\\PY{n}{unique\\PYZus{}inverse}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}3}\\PY{p}{)}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\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}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{]}\\PY{p}{,} \\PY{n}{\\PYZus{}OptionalIntOrTuple\\PYZus{}1}\\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{}5}\\PY{p}{[}\\PY{n}{\\PYZus{}IndexKey\\PYZus{}2}\\PY{p}{]} \\PY{o}{=} \\PY{n}{mean}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\PY{p}{[}\\PY{n}{ndarray\\PYZus{}index}\\PY{p}{(}\\PY{n}{unique\\PYZus{}inverse}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}3}\\PY{p}{)}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\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}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{]}\\PY{p}{,} \\PY{n}{\\PYZus{}OptionalIntOrTuple\\PYZus{}1}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}6} \\PY{o}{=} \\PY{n}{unique\\PYZus{}values}\\PY{p}{(}\\PY{n}{concat}\\PY{p}{(}\\PY{n}{TupleNDArray}\\PY{p}{(}\\PY{n}{unique\\PYZus{}values}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}3}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}7} \\PY{o}{=} \\PY{n}{concat}\\PY{p}{(}\n", " \\PY{n}{TupleNDArray}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\PY{p}{[}\\PY{n}{ndarray\\PYZus{}index}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}3} \\PY{o}{==} \\PY{n}{\\PYZus{}NDArray\\PYZus{}6}\\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{o}{\\PYZhy{}} \\PY{n}{\\PYZus{}NDArray\\PYZus{}5}\\PY{p}{[}\\PY{n}{\\PYZus{}IndexKey\\PYZus{}1}\\PY{p}{]}\\PY{p}{)}\n", " \\PY{o}{+} \\PY{n}{TupleNDArray}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\PY{p}{[}\\PY{n}{ndarray\\PYZus{}index}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}3} \\PY{o}{==} \\PY{n}{\\PYZus{}NDArray\\PYZus{}6}\\PY{p}{[}\\PY{n}{IndexKey}\\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}{]} \\PY{o}{\\PYZhy{}} \\PY{n}{\\PYZus{}NDArray\\PYZus{}5}\\PY{p}{[}\\PY{n}{\\PYZus{}IndexKey\\PYZus{}2}\\PY{p}{]}\\PY{p}{)}\\PY{p}{,}\n", " \\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{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}8} \\PY{o}{=} \\PY{n}{std}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}7}\\PY{p}{,} \\PY{n}{\\PYZus{}OptionalIntOrTuple\\PYZus{}1}\\PY{p}{)}\n", "\\PY{n}{\\PYZus{}NDArray\\PYZus{}8}\\PY{p}{[}\\PY{n}{ndarray\\PYZus{}index}\\PY{p}{(}\\PY{n}{std}\\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}{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}{(}\n", " \\PY{n}{sqrt}\\PY{p}{(}\\PY{n}{asarray}\\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}{1.0}\\PY{p}{)} \\PY{o}{/} \\PY{n}{Float}\\PY{o}{.}\\PY{n}{from\\PYZus{}int}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\PY{o}{.}\\PY{n}{shape}\\PY{p}{[}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{0}\\PY{p}{)}\\PY{p}{]} \\PY{o}{\\PYZhy{}} \\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}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)} \\PY{o}{*} \\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}7} \\PY{o}{/} \\PY{n}{\\PYZus{}NDArray\\PYZus{}8}\\PY{p}{)}\\PY{p}{,} \\PY{n}{FALSE}\n", "\\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{}9} \\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{}8}\\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}{(}\n", " \\PY{n}{sqrt}\\PY{p}{(}\n", " \\PY{p}{(}\\PY{n}{NDArray}\\PY{o}{.}\\PY{n}{scalar}\\PY{p}{(}\\PY{n}{Value}\\PY{o}{.}\\PY{n}{int}\\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)}\\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{o}{*} \\PY{n}{\\PYZus{}NDArray\\PYZus{}4}\\PY{p}{)}\n", " \\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{o}{/} \\PY{n}{Float}\\PY{o}{.}\\PY{n}{from\\PYZus{}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{o}{\\PYZhy{}} \\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\n", " \\PY{p}{)}\n", " \\PY{o}{*} \\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}5} \\PY{o}{\\PYZhy{}} \\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}4} \\PY{o}{@} \\PY{n}{\\PYZus{}NDArray\\PYZus{}5}\\PY{p}{)}\\PY{p}{)}\\PY{o}{.}\\PY{n}{T}\n", " \\PY{p}{)}\\PY{o}{.}\\PY{n}{T}\n", " \\PY{o}{@} \\PY{n}{\\PYZus{}NDArray\\PYZus{}9}\\PY{p}{,}\n", " \\PY{n}{FALSE}\\PY{p}{,}\n", "\\PY{p}{)}\n", "\\PY{p}{(}\n", " \\PY{p}{(}\\PY{n}{asarray}\\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}1}\\PY{p}{)} \\PY{o}{\\PYZhy{}} \\PY{p}{(}\\PY{n}{\\PYZus{}NDArray\\PYZus{}4} \\PY{o}{@} \\PY{n}{\\PYZus{}NDArray\\PYZus{}5}\\PY{p}{)}\\PY{p}{)}\n", " \\PY{o}{@} \\PY{p}{(}\n", " \\PY{n}{\\PYZus{}NDArray\\PYZus{}9}\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}{\\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{o}{\\PYZhy{}} \\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 = asarray(reshape(asarray(_NDArray_2), TupleInt(Int(-1))))\n", "_NDArray_4 = astype(unique_counts(_NDArray_3)[Int(1)], asarray(_NDArray_1).dtype) / NDArray.scalar(Value.float(Float(1000000.0)))\n", "_NDArray_5 = zeros(\n", " TupleInt(unique_inverse(_NDArray_3)[Int(0)].shape[Int(0)]) + TupleInt(asarray(_NDArray_1).shape[Int(1)]),\n", " OptionalDType.some(asarray(_NDArray_1).dtype),\n", " OptionalDevice.some(asarray(_NDArray_1).device),\n", ")\n", "_MultiAxisIndexKey_1 = MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(Slice()))\n", "_IndexKey_1 = IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.int(Int(0))) + _MultiAxisIndexKey_1)\n", "_OptionalIntOrTuple_1 = OptionalIntOrTuple.some(IntOrTuple.int(Int(0)))\n", "_NDArray_5[_IndexKey_1] = mean(asarray(_NDArray_1)[ndarray_index(unique_inverse(_NDArray_3)[Int(1)] == NDArray.scalar(Value.int(Int(0))))], _OptionalIntOrTuple_1)\n", "_IndexKey_2 = IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.int(Int(1))) + _MultiAxisIndexKey_1)\n", "_NDArray_5[_IndexKey_2] = mean(asarray(_NDArray_1)[ndarray_index(unique_inverse(_NDArray_3)[Int(1)] == NDArray.scalar(Value.int(Int(1))))], _OptionalIntOrTuple_1)\n", "_NDArray_6 = unique_values(concat(TupleNDArray(unique_values(asarray(_NDArray_3)))))\n", "_NDArray_7 = concat(\n", " TupleNDArray(asarray(_NDArray_1)[ndarray_index(_NDArray_3 == _NDArray_6[IndexKey.int(Int(0))])] - _NDArray_5[_IndexKey_1])\n", " + TupleNDArray(asarray(_NDArray_1)[ndarray_index(_NDArray_3 == _NDArray_6[IndexKey.int(Int(1))])] - _NDArray_5[_IndexKey_2]),\n", " OptionalInt.some(Int(0)),\n", ")\n", "_NDArray_8 = std(_NDArray_7, _OptionalIntOrTuple_1)\n", "_NDArray_8[ndarray_index(std(_NDArray_7, _OptionalIntOrTuple_1) == NDArray.scalar(Value.int(Int(0))))] = NDArray.scalar(Value.float(Float(1.0)))\n", "_TupleNDArray_1 = svd(\n", " sqrt(asarray(NDArray.scalar(Value.float(Float(1.0) / Float.from_int(asarray(_NDArray_1).shape[Int(0)] - _NDArray_6.shape[Int(0)]))))) * (_NDArray_7 / _NDArray_8), FALSE\n", ")\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_9 = (_TupleNDArray_1[Int(2)][IndexKey.multi_axis(MultiAxisIndexKey(MultiAxisIndexKeyItem.slice(_Slice_1)) + _MultiAxisIndexKey_1)] / _NDArray_8).T / _TupleNDArray_1[\n", " Int(1)\n", "][IndexKey.slice(_Slice_1)]\n", "_TupleNDArray_2 = svd(\n", " (\n", " sqrt(\n", " (NDArray.scalar(Value.int(asarray(_NDArray_1).shape[Int(0)])) * _NDArray_4)\n", " * NDArray.scalar(Value.float(Float(1.0) / Float.from_int(_NDArray_6.shape[Int(0)] - Int(1))))\n", " )\n", " * (_NDArray_5 - (_NDArray_4 @ _NDArray_5)).T\n", " ).T\n", " @ _NDArray_9,\n", " FALSE,\n", ")\n", "(\n", " (asarray(_NDArray_1) - (_NDArray_4 @ _NDArray_5))\n", " @ (\n", " _NDArray_9\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(_NDArray_6.shape[Int(0)] - Int(1))))))]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to run this, scikit-learn treated these objects as \"array like\", meaning they conformed to [the Array API](https://data-apis.org/array-api/latest/).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conversions: From Python to egglog\n", "\n", "_Use conversions if you want your egglog API to be called with existing Python objects, without manually upcasting them_\n", "\n", "_We will see this in our example:_\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "class LinearDiscriminantAnalysis:\n", " ...\n", " def fit(self, X, y):\n", " ...\n", " _, cnts = xp.unique_counts(y) # non-negative ints\n", " self.priors_ = xp.astype(cnts, X.dtype) / float(y.shape[0])\n", "```\n", "\n", "Ends up resulting in this expression:\n", "\n", "```python\n", "astype(unique_counts(_NDArray_3)[Int(1)], asarray(_NDArray_1).dtype) / NDArray.scalar(Value.float(Float(1000000.0)))\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How?\n", "\n", "We have exposed a global conversion logic, where if you pass an arg to egglog and it isn't the correct type, it will try to upcast the arg to the required egglog type.\n", "\n", "There is a graph of all conversions and it will find the shortest path from the input to the desired type and automatically upcast to that.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example\n", "\n", "For example, in indexing, if we do a slice (i.e. `1:10:2`), we convert this to our custom egglog `Slice` expressions:\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "class Slice(Expr):\n", " def __init__(\n", " self,\n", " start: OptionalInt = OptionalInt.none,\n", " stop: OptionalInt = OptionalInt.none,\n", " step: OptionalInt = OptionalInt.none,\n", " ) -> None: ...\n", "\n", "\n", "converter(\n", " slice,\n", " Slice,\n", " lambda x: Slice(\n", " convert(x.start, OptionalInt),\n", " convert(x.stop, OptionalInt),\n", " convert(x.step, OptionalInt),\n", " ),\n", ")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class A(Expr):\n", " def __init__(self) -> None: ...\n", " def __getitem__(self, s: Slice) -> Int: ..." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
A()[Slice(OptionalInt.none, OptionalInt.some(Int(1)), OptionalInt.some(Int(2)))]\n",
       "
\n" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", "\\PY{n}{A}\\PY{p}{(}\\PY{p}{)}\\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{n}{OptionalInt}\\PY{o}{.}\\PY{n}{some}\\PY{p}{(}\\PY{n}{Int}\\PY{p}{(}\\PY{l+m+mi}{2}\\PY{p}{)}\\PY{p}{)}\\PY{p}{)}\\PY{p}{]}\n", "\\end{Verbatim}\n" ], "text/plain": [ "A()[Slice(OptionalInt.none, OptionalInt.some(Int(1)), OptionalInt.some(Int(2)))]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "A()[:1:2] # Pytohn desugars this to A()[slice(None, 1, 2)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Preserved Methods\n", "\n", "_If you need your egglog objects to interact with Python control flow, you can use preserved methods to stop, compile, and return an eager result to Python_\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the `fit` function in sklearn, there are complicated analysis that must be done eagerly, like this one, which\n", "depends on knowing the priors, which are based on the counts of the classes in the training data, which we provided:\n", "\n", "```python\n", "class LinearDiscriminantAnalysis:\n", " def fit(self, x, y):\n", " ...\n", " if xp.abs(xp.sum(self.priors_) - 1.0) > 1e-5:\n", " warnings.warn(\"The priors do not sum to 1. Renormalizing\", UserWarning)\n", " self.priors_ = self.priors_ / self.priors_.sum()\n", "```\n", "\n", "That is why we have to provide the metadata about the arrays, so we can reduce this expression to a boolean, using some interval analysis:\n", "\n", "```python\n", "_NDArray_1 = NDArray.var(\"y\")\n", "assume_dtype(_NDArray_1, DType.int64)\n", "assume_shape(_NDArray_1, TupleInt(Int(1000000)))\n", "assume_value_one_of(_NDArray_1, TupleValue(Value.int(Int(0))) + TupleValue(Value.int(Int(1))))\n", "_NDArray_2 = NDArray.var(\"X\")\n", "assume_dtype(_NDArray_2, DType.float64)\n", "assume_shape(_NDArray_2, TupleInt(Int(1000000)) + TupleInt(Int(20)))\n", "assume_isfinite(_NDArray_2)\n", "(\n", " abs(\n", " sum(astype(unique_counts(asarray(reshape(asarray(_NDArray_1), TupleInt(Int(-1)))))[Int(1)], asarray(_NDArray_2).dtype) / NDArray.scalar(Value.float(Float(1000000.0))))\n", " - NDArray.scalar(Value.float(Float(1.0)))\n", " )\n", " > NDArray.scalar(Value.float(Float(1e-05)))\n", ").to_value().to_bool.bool\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But how does it move through the control flow if the expression is lazy? We can implement \"preserved methods\" which can evaluate an expression eagerly by adding it to the EGraph and evalutating it:\n" ] }, { "cell_type": "markdown", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Boolean(True) & Boolean(True)\n",
       "
\n" ], "text/latex": [ "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", "\\PY{n}{Boolean}\\PY{p}{(}\\PY{k+kc}{True}\\PY{p}{)} \\PY{o}{\\PYZam{}} \\PY{n}{Boolean}\\PY{p}{(}\\PY{k+kc}{True}\\PY{p}{)}\n", "\\end{Verbatim}\n" ], "text/plain": [ "Boolean(True) & Boolean(True)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "class Boolean(Expr):\n", " # Can be constructed from and convert to a primitive egglog bool:\n", " def __init__(self, b: BoolLike) -> None: ...\n", " @property\n", " def bool(self) -> Bool: ...\n", "\n", " # support boolean ops\n", " def __and__(self, other: Boolean) -> Boolean: ...\n", "\n", " # Can be treated like a Python bool\n", " @method(preserve=True)\n", " def __bool__(self) -> bool:\n", " egraph = EGraph()\n", " egraph.register(self)\n", " egraph.run(bool_rewrites.saturate())\n", " return egraph.eval(self.bool)\n", "\n", "\n", "x = var(\"x\", Boolean)\n", "y = var(\"y\", Bool)\n", "bool_rewrites = ruleset(\n", " rule(eq(x).to(Boolean(y))).then(set_(x.bool).to(y)),\n", " rewrite(Boolean(True) & Boolean(True)).to(Boolean(True)),\n", ")\n", "\n", "expr = Boolean(True) & Boolean(True)\n", "expr" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "yep it's true\n" ] } ], "source": [ "if expr:\n", " print(\"yep it's true\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Mutations\n", "\n", "_Mark a function or method as mutating the first arg, to translate it to pure function, but which acts imperative._\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another pattern that comes up a lot in Python is methods that mutate their arguments. But egglog is a pure functional language, so how do we support that?\n", "\n", "Well we can convert functions that mutate an arg into one that returns a modified value of that argument. That way, we can keep\n", "using it with existing imperative methods and things work as they should.\n", "\n", "For example, arrays support `__setitem__`, and this is used by scikit-learn:\n", "\n", "```python\n", "class LinearDiscriminantAnalysis:\n", " ...\n", " def _solve_svd(self, X, y):\n", " ...\n", " # 1) within (univariate) scaling by with classes std-dev\n", " std = xp.std(Xc, axis=0)\n", " # avoid division by zero in normalization\n", " std[std == 0] = 1.0\n", "```\n", "\n", "This will be translated to the following expressions, where there will be a new array created in the graph for the modified version:\n", "\n", "```python\n", "_NDArray_8 = std(_NDArray_7, _OptionalIntOrTuple_1)\n", "_NDArray_8[ndarray_index(std(_NDArray_7, _OptionalIntOrTuple_1) == NDArray.scalar(Value.int(Int(0))))] = NDArray.scalar(Value.float(Float(1.0)))\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example\n", "\n", "We can see a simpler example of this below:\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "outer_cluster_i64-5871781006564002453\n", "\n", "\n", "cluster_i64-5871781006564002453\n", "\n", "\n", "\n", "outer_cluster_3\n", "\n", "\n", "cluster_3\n", "\n", "\n", "\n", "outer_cluster_1\n", "\n", "\n", "cluster_1\n", "\n", "\n", "\n", "outer_cluster_2\n", "\n", "\n", "cluster_2\n", "\n", "\n", "\n", "outer_cluster_0\n", "\n", "\n", "cluster_0\n", "\n", "\n", "\n", "outer_cluster_i64-0\n", "\n", "\n", "cluster_i64-0\n", "\n", "\n", "\n", "\n", "ListOfInts___getitem__-1912573936028582372:s->ListOfInts___setitem__-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "ListOfInts___getitem__-1912573936028582372:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "ListOfInts___setitem__-5871781006564002453:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "ListOfInts___setitem__-5871781006564002453:s->Int___init__-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "ListOfInts___setitem__-5871781006564002453:s->ListOfInts___init__-0\n", "\n", "\n", "\n", "\n", "\n", "Int___init__-5871781006564002453:s->i64-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "ListOfInts___getitem__-1912573936028582372\n", "\n", "\n", "·[·]\n", "\n", "\n", "\n", "\n", "\n", "\n", "ListOfInts___setitem__-5871781006564002453\n", "\n", "\n", "·[·] = ·\n", "\n", "\n", "\n", "\n", "\n", "\n", "i64-0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Int___init__-5871781006564002453\n", "\n", "\n", "Int\n", "\n", "\n", "\n", "\n", "\n", "\n", "i64-5871781006564002453\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "ListOfInts___init__-0\n", "\n", "\n", "ListOfInts\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "class ListOfInts(Expr):\n", " def __init__(self) -> None: ...\n", " def __getitem__(self, i: i64Like) -> Int: ...\n", "\n", " def __setitem__(self, i: i64Like, v: Int) -> None: ...\n", "\n", "\n", "xs = ListOfInts()\n", "xs[0] = Int(1)\n", "\n", "egraph = EGraph()\n", "egraph.register(xs[0])\n", "egraph.display()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Subsumption\n", "\n", "_mark a rewrite as subsumed to replace a smaller expression with a larger one_\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have a program, what do we do with it? Well first, we can optimize it, running rewrites, including those to translate from Numba forms to others.\n", "\n", "We have added \"subsumption\" to egglog, to support directional rewrites, so that the left hand side is not extractable and not matchable.\n", "This is handy when we want to extract a value with more expressions or a higher cost, in a particular instance:\n", "\n", "```python\n", "@array_api_numba_ruleset.register\n", "def _mean(y: NDArray, x: NDArray, i: Int):\n", " axis = OptionalIntOrTuple.some(IntOrTuple.int(i))\n", " res = sum(x, axis) / NDArray.scalar(Value.int(x.shape[i]))\n", "\n", " yield rewrite(mean(x, axis, FALSE), subsume=True).to(res)\n", " yield rewrite(mean(x, axis, TRUE), subsume=True).to(expand_dims(res, i))\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can optimize this with the numba rules and we can see this rule take place in the `_NDArray_9` line:\n" ] }, { "cell_type": "code", "execution_count": 10, "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": [ "from egglog.exp.array_api_numba import array_api_numba_schedule\n", "\n", "simplified_res = EGraph().simplify(res, array_api_numba_schedule)\n", "simplified_res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Program Gen\n", "\n", "_Generate an imperative program from your e-graph with replacement rules that walk the graph in a fixed order_\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have a program, what do we do with it?\n", "\n", "Well we showed how we can use eager evaluation to get a result, but what if we don't want to do the computation in egglog, but instead export a program so we can execute that back in Python or in this case feed it to Python?\n", "\n", "Well in this case we have designed a `Program` object which we can use to convert a funtional egglog expression back to imperative Python code:\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from egglog.exp.array_api_program_gen import *\n", "\n", "egraph = EGraph()\n", "fn_program = egraph.let(\n", " \"fn_program\",\n", " ndarray_function_two(simplified_res, NDArray.var(\"X\"), NDArray.var(\"y\")),\n", ")\n", "egraph.run(array_api_program_gen_schedule)\n", "fn = egraph.eval(fn_program.py_object)\n", "\n", "fn" ] }, { "cell_type": "code", "execution_count": 12, "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(fn))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From there we can complete our work, by optimizing with numba and we can call with our original values:\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/xn/05ktz3056kqd9n8frgd6236h0000gn/T/egglog-9b40af4a-3b8a-4996-a78a-fd6284dbf541.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" ] }, { "data": { "text/plain": [ "array([[ 0.64233002],\n", " [ 0.63661245],\n", " [-1.603293 ],\n", " ...,\n", " [-1.1506433 ],\n", " [ 0.71687176],\n", " [-1.51119579]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from numba import njit\n", "\n", "njit(fn)(X_np, y_np)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These program rewrites work by first translating the code into an intermediate IR of just program assignments and statements, and then turning this into source. It does this by walking the graph first top to bottom, recording the first parent that saw every child. Then it goes from bottom to top, building up a larger set of statements as well as an expression representing each node. If a node has already been emitted somewhere else, we record that, and we always wait for all the children to complete before moving forward. That way, we can enforce some ordering and we know that everything will be emitted only once.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example\n", "\n", "Here is a small example, we might want to compile, let's say we want a function like this:\n", "\n", "```python\n", "def __fn(x, y)\n", " x[1] = 10\n", " z = x + x\n", " return sum(z) + y\n", "```\n", "\n", "We can build up a functional program for this and then compile it to Python source:\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "def __fn(x, y):\n", " x[1] = 10\n", " _0 = x + x\n", " return sum(_0) + y\n", "\n" ] } ], "source": [ "from egglog.exp.program_gen import *\n", "\n", "x = Program(\"x\", is_identifier=True)\n", "y = Program(\"y\", is_identifier=True)\n", "# To reference x, we need to first emit the statement\n", "x_modified = Program(\"x\").statement(x + \"[1] = 10\")\n", "\n", "z = (x_modified + \" + \" + x_modified).assign()\n", "res = Program(\"sum(\") + z + \") + \" + y\n", "fn = res.function_two(x, y)\n", "\n", "egraph = EGraph()\n", "egraph.register(fn.compile())\n", "egraph.run(program_gen_ruleset.saturate())\n", "print(egraph.eval(fn.statements))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This happens, by first going top to bottom with the `compile`, which will put a total ordering on all nodes, by defining one, and only one, parent expression for each expression.\n", "\n", "Then, from the bottom up, for each node we compute an expression string and a list of statements string.\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "outer_cluster_9\n", "\n", "\n", "cluster_9\n", "\n", "\n", "\n", "outer_cluster_6\n", "\n", "\n", "cluster_6\n", "\n", "\n", "\n", "outer_cluster_13\n", "\n", "\n", "cluster_13\n", "\n", "\n", "\n", "outer_cluster_2\n", "\n", "\n", "cluster_2\n", "\n", "\n", "\n", "outer_cluster_12\n", "\n", "\n", "cluster_12\n", "\n", "\n", "\n", "outer_cluster_10\n", "\n", "\n", "cluster_10\n", "\n", "\n", "\n", "outer_cluster_5\n", "\n", "\n", "cluster_5\n", "\n", "\n", "\n", "outer_cluster_11\n", "\n", "\n", "cluster_11\n", "\n", "\n", "\n", "outer_cluster_0\n", "\n", "\n", "cluster_0\n", "\n", "\n", "\n", "outer_cluster_4\n", "\n", "\n", "cluster_4\n", "\n", "\n", "\n", "outer_cluster_15\n", "\n", "\n", "cluster_15\n", "\n", "\n", "\n", "outer_cluster_3\n", "\n", "\n", "cluster_3\n", "\n", "\n", "\n", "outer_cluster_16\n", "\n", "\n", "cluster_16\n", "\n", "\n", "\n", "outer_cluster_8\n", "\n", "\n", "cluster_8\n", "\n", "\n", "\n", "outer_cluster_1\n", "\n", "\n", "cluster_1\n", "\n", "\n", "\n", "outer_cluster_7\n", "\n", "\n", "cluster_7\n", "\n", "\n", "\n", "outer_cluster_14\n", "\n", "\n", "cluster_14\n", "\n", "\n", "\n", "outer_cluster_bool-0\n", "\n", "\n", "cluster_bool-0\n", "\n", "\n", "\n", "outer_cluster_i64-0\n", "\n", "\n", "cluster_i64-0\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-9249358851075372135-value\n", "\n", "\n", "cluster_Program_next_sym-9249358851075372135-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-5040379952546458196-value\n", "\n", "\n", "cluster_Program_next_sym-5040379952546458196-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-2546176790493825425-value\n", "\n", "\n", "cluster_Program_next_sym-2546176790493825425-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-8417957797057827878-value\n", "\n", "\n", "cluster_Program_next_sym-8417957797057827878-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-3377577844511369682-value\n", "\n", "\n", "cluster_Program_next_sym-3377577844511369682-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-5871781006564002453-value\n", "\n", "\n", "cluster_Program_next_sym-5871781006564002453-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-4208978898528913939-value\n", "\n", "\n", "cluster_Program_next_sym-4208978898528913939-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-1714775736476281168-value\n", "\n", "\n", "cluster_Program_next_sym-1714775736476281168-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-11743562013128004906-value\n", "\n", "\n", "cluster_Program_expr-11743562013128004906-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-9249358851075372135-value\n", "\n", "\n", "cluster_Program_expr-9249358851075372135-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-17615343019692007359-value\n", "\n", "\n", "cluster_Program_expr-17615343019692007359-value\n", "\n", "\n", "\n", "outer_cluster_String-12969792886956269196\n", "\n", "\n", "cluster_String-12969792886956269196\n", "\n", "\n", "\n", "outer_cluster_String-11226098287981005201\n", "\n", "\n", "cluster_String-11226098287981005201\n", "\n", "\n", "\n", "outer_cluster_Program_expr-10080759905092916392-value\n", "\n", "\n", "cluster_Program_expr-10080759905092916392-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-5871781006564002453-value\n", "\n", "\n", "cluster_Program_expr-5871781006564002453-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-2546176790493825425-value\n", "\n", "\n", "cluster_Program_expr-2546176790493825425-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-14289738803621830331-value\n", "\n", "\n", "cluster_Program_expr-14289738803621830331-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-4208978898528913939-value\n", "\n", "\n", "cluster_Program_expr-4208978898528913939-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-5040379952546458196-value\n", "\n", "\n", "cluster_Program_expr-5040379952546458196-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-1714775736476281168-value\n", "\n", "\n", "cluster_Program_expr-1714775736476281168-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-10912160959110460649-value\n", "\n", "\n", "cluster_Program_expr-10912160959110460649-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-8417957797057827878-value\n", "\n", "\n", "cluster_Program_expr-8417957797057827878-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-16783941965674463102-value\n", "\n", "\n", "cluster_Program_expr-16783941965674463102-value\n", "\n", "\n", "\n", "outer_cluster_String-11355304735691241393\n", "\n", "\n", "cluster_String-11355304735691241393\n", "\n", "\n", "\n", "outer_cluster_Program_expr-3377577844511369682-value\n", "\n", "\n", "cluster_Program_expr-3377577844511369682-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-15121139857639374588-value\n", "\n", "\n", "cluster_Program_expr-15121139857639374588-value\n", "\n", "\n", "\n", "outer_cluster_String-13189374861551619161\n", "\n", "\n", "cluster_String-13189374861551619161\n", "\n", "\n", "\n", "outer_cluster_Program_expr-15952540911656918845-value\n", "\n", "\n", "cluster_Program_expr-15952540911656918845-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-11413373673517832166-value\n", "\n", "\n", "cluster_Program_compile-11413373673517832166-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-6662973804773207269-value\n", "\n", "\n", "cluster_Program_compile-6662973804773207269-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-395596399104602408-value\n", "\n", "\n", "cluster_Program_compile-395596399104602408-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-12930351210441812130-value\n", "\n", "\n", "cluster_Program_compile-12930351210441812130-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-1351883367118893594-value\n", "\n", "\n", "cluster_Program_compile-1351883367118893594-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-8179951341697187233-value\n", "\n", "\n", "cluster_Program_compile-8179951341697187233-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-956286968014291186-value\n", "\n", "\n", "cluster_Program_compile-956286968014291186-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-9896396136593852202-value\n", "\n", "\n", "cluster_Program_compile-9896396136593852202-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-5145996267849227305-value\n", "\n", "\n", "cluster_Program_compile-5145996267849227305-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-5706686836758916083-value\n", "\n", "\n", "cluster_Program_compile-5706686836758916083-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-17845845248991523397-value\n", "\n", "\n", "cluster_Program_compile-17845845248991523397-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-12369660641532123352-value\n", "\n", "\n", "cluster_Program_compile-12369660641532123352-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-7619260772787498455-value\n", "\n", "\n", "cluster_Program_compile-7619260772787498455-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-2868860904042873558-value\n", "\n", "\n", "cluster_Program_compile-2868860904042873558-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-10457086705503540980-value\n", "\n", "\n", "cluster_Program_compile-10457086705503540980-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-1912573936028582372-value\n", "\n", "\n", "cluster_Program_compile-1912573936028582372-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-0-value\n", "\n", "\n", "cluster_Program_is_identifer-0-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-0-value\n", "\n", "\n", "cluster_Program_expr-0-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-0-value\n", "\n", "\n", "cluster_Program_statements-0-value\n", "\n", "\n", "\n", "outer_cluster_String-2096353982008678537\n", "\n", "\n", "cluster_String-2096353982008678537\n", "\n", "\n", "\n", "outer_cluster_Program_compile-0-value\n", "\n", "\n", "cluster_Program_compile-0-value\n", "\n", "\n", "\n", "outer_cluster_bool-5871781006564002453\n", "\n", "\n", "cluster_bool-5871781006564002453\n", "\n", "\n", "\n", "outer_cluster_String-9754068158704536254\n", "\n", "\n", "cluster_String-9754068158704536254\n", "\n", "\n", "\n", "outer_cluster_String-5935442095835774456\n", "\n", "\n", "cluster_String-5935442095835774456\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-0-value\n", "\n", "\n", "cluster_Program_next_sym-0-value\n", "\n", "\n", "\n", "outer_cluster_i64-5871781006564002453\n", "\n", "\n", "cluster_i64-5871781006564002453\n", "\n", "\n", "\n", "outer_cluster_Program_statements-17615343019692007359-value\n", "\n", "\n", "cluster_Program_statements-17615343019692007359-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-16783941965674463102-value\n", "\n", "\n", "cluster_Program_statements-16783941965674463102-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-4208978898528913939-value\n", "\n", "\n", "cluster_Program_statements-4208978898528913939-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-9249358851075372135-value\n", "\n", "\n", "cluster_Program_statements-9249358851075372135-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-14289738803621830331-value\n", "\n", "\n", "cluster_Program_statements-14289738803621830331-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-10080759905092916392-value\n", "\n", "\n", "cluster_Program_statements-10080759905092916392-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-5871781006564002453-value\n", "\n", "\n", "cluster_Program_statements-5871781006564002453-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-10912160959110460649-value\n", "\n", "\n", "cluster_Program_statements-10912160959110460649-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-2546176790493825425-value\n", "\n", "\n", "cluster_Program_statements-2546176790493825425-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-10912160959110460649-value\n", "\n", "\n", "cluster_Program_is_identifer-10912160959110460649-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-16783941965674463102-value\n", "\n", "\n", "cluster_Program_is_identifer-16783941965674463102-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-10080759905092916392-value\n", "\n", "\n", "cluster_Program_is_identifer-10080759905092916392-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-2546176790493825425-value\n", "\n", "\n", "cluster_Program_is_identifer-2546176790493825425-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-3377577844511369682-value\n", "\n", "\n", "cluster_Program_is_identifer-3377577844511369682-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-9249358851075372135-value\n", "\n", "\n", "cluster_Program_is_identifer-9249358851075372135-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-10912160959110460649-value\n", "\n", "\n", "cluster_Program_next_sym-10912160959110460649-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-10080759905092916392-value\n", "\n", "\n", "cluster_Program_next_sym-10080759905092916392-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-15121139857639374588-value\n", "\n", "\n", "cluster_Program_next_sym-15121139857639374588-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-17615343019692007359-value\n", "\n", "\n", "cluster_Program_next_sym-17615343019692007359-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-15952540911656918845-value\n", "\n", "\n", "cluster_Program_next_sym-15952540911656918845-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-8417957797057827878-value\n", "\n", "\n", "cluster_Program_is_identifer-8417957797057827878-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-11743562013128004906-value\n", "\n", "\n", "cluster_Program_is_identifer-11743562013128004906-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-1714775736476281168-value\n", "\n", "\n", "cluster_Program_is_identifer-1714775736476281168-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-14289738803621830331-value\n", "\n", "\n", "cluster_Program_is_identifer-14289738803621830331-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-5040379952546458196-value\n", "\n", "\n", "cluster_Program_is_identifer-5040379952546458196-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-4208978898528913939-value\n", "\n", "\n", "cluster_Program_is_identifer-4208978898528913939-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-5871781006564002453-value\n", "\n", "\n", "cluster_Program_is_identifer-5871781006564002453-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-15952540911656918845-value\n", "\n", "\n", "cluster_Program_is_identifer-15952540911656918845-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-15121139857639374588-value\n", "\n", "\n", "cluster_Program_is_identifer-15121139857639374588-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-17615343019692007359-value\n", "\n", "\n", "cluster_Program_is_identifer-17615343019692007359-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-15952540911656918845-value\n", "\n", "\n", "cluster_Program_statements-15952540911656918845-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-3377577844511369682-value\n", "\n", "\n", "cluster_Program_statements-3377577844511369682-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-1714775736476281168-value\n", "\n", "\n", "cluster_Program_statements-1714775736476281168-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-11743562013128004906-value\n", "\n", "\n", "cluster_Program_statements-11743562013128004906-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-5040379952546458196-value\n", "\n", "\n", "cluster_Program_statements-5040379952546458196-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-8417957797057827878-value\n", "\n", "\n", "cluster_Program_statements-8417957797057827878-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-15121139857639374588-value\n", "\n", "\n", "cluster_Program_statements-15121139857639374588-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-11743562013128004906-value\n", "\n", "\n", "cluster_Program_next_sym-11743562013128004906-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-16783941965674463102-value\n", "\n", "\n", "cluster_Program_next_sym-16783941965674463102-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-14289738803621830331-value\n", "\n", "\n", "cluster_Program_next_sym-14289738803621830331-value\n", "\n", "\n", "\n", "\n", "Program_assign-10080759905092916392:s->Program_parent-4208978898528913939\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-4208978898528913939:s->Program___add__-13095445380246898500\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-10080759905092916392:s->Program_parent-4208978898528913939\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4696794513835434606:s->String-13189374861551619161\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4696794513835434606:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-16291883994304651111:s->String-5935442095835774456\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-16291883994304651111:s->bool-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4485927643096296218:s->bool-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4485927643096296218:s->String-11226098287981005201\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-3377577844511369682:s->Program___add__-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-15952540911656918845:s->Program_parent-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-15952540911656918845:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-853919951260367888:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-853919951260367888:s->String-9754068158704536254\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2651793105796594534:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2651793105796594534:s->Program_parent-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-15952540911656918845:s->Program_assign-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4019982253596759903:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4019982253596759903:s->String-2096353982008678537\n", "\n", "\n", "\n", "\n", "\n", "Program_statement-5996666920560749382:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_statement-5996666920560749382:s->Program_parent-17615343019692007359\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-10357708649660298671:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-10357708649660298671:s->String-11226098287981005201\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-1714775736476281168:s->Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_expr_to_statement-5040379952546458196:s->Program_parent-17615343019692007359\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2671062704490572354:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2671062704490572354:s->Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-14236238857028323759:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-14236238857028323759:s->String-11355304735691241393\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-1081172882011038115:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-1081172882011038115:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-8417957797057827878:s->Program___add__-13761752264459356387\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13761752264459356387:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13761752264459356387:s->Program_parent-9249358851075372135\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443:s->Program___add__-13761752264459356387\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443:s->String-12969792886956269196\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-5040379952546458196:s->Program_parent-17615343019692007359\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13095445380246898500:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13095445380246898500:s->Program_parent-1714775736476281168\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13241269951358007050:s->Program___add__-2671062704490572354\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13241269951358007050:s->Program_parent-16783941965674463102\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-10912160959110460649:s->Program_parent-1714775736476281168\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-15121139857639374588:s->Program___add__-2651793105796594534\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15952540911656918845:s->Program_assign-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-3377577844511369682:s->Program_parent-0\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-1714775736476281168:s->Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10080759905092916392:s->Program_parent-4208978898528913939\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5040379952546458196:s->Program_parent-17615343019692007359\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-8417957797057827878:s->Program___add__-13761752264459356387\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15121139857639374588:s->Program_parent-3377577844511369682\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-14289738803621830331:s->Program_parent-2546176790493825425\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-14289738803621830331:s->Program_function_two-3497168771395161443\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-4208978898528913939:s->Program___add__-13095445380246898500\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5040379952546458196:s->Program___add__-1081172882011038115\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10080759905092916392:s->Program_parent-4208978898528913939\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-1714775736476281168:s->Program_parent-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10912160959110460649:s->Program_parent-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-8417957797057827878:s->Program_parent-15121139857639374588\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10912160959110460649:s->Program_statement-5996666920560749382\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-3377577844511369682:s->Program___add__-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15121139857639374588:s->Program___add__-2651793105796594534\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-4208978898528913939:s->Program_parent-10912160959110460649\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15952540911656918845:s->Program_assign-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-11413373673517832166:s->Program_parent-15121139857639374588\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-11413373673517832166:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-6662973804773207269:s->Program___add__-13241269951358007050\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-6662973804773207269:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-395596399104602408:s->Program___add__-1081172882011038115\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-395596399104602408:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12930351210441812130:s->Program_parent-9249358851075372135\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12930351210441812130:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1351883367118893594:s->Program_parent-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1351883367118893594:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-8179951341697187233:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-8179951341697187233:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-956286968014291186:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-956286968014291186:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-0:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-9896396136593852202:s->Program_parent-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-9896396136593852202:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5145996267849227305:s->Program_parent-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5145996267849227305:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5706686836758916083:s->Program_parent-16783941965674463102\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5706686836758916083:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-17845845248991523397:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-17845845248991523397:s->i64-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12369660641532123352:s->Program_parent-11743562013128004906\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12369660641532123352:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-7619260772787498455:s->Program_parent-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-7619260772787498455:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-2868860904042873558:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-2868860904042873558:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-10457086705503540980:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-10457086705503540980:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1912573936028582372:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1912573936028582372:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-8417957797057827878:s->Program___add__-13761752264459356387\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-1714775736476281168:s->Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-14289738803621830331:s->Program_parent-2546176790493825425\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5040379952546458196:s->Program___add__-1081172882011038115\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-4208978898528913939:s->Program_parent-16783941965674463102\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15952540911656918845:s->Program_parent-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15121139857639374588:s->Program_parent-9249358851075372135\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10912160959110460649:s->Program_parent-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10080759905092916392:s->Program___add__-13241269951358007050\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-3377577844511369682:s->Program_parent-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10912160959110460649:s->Program___add__-2671062704490572354\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10080759905092916392:s->Program___add__-13241269951358007050\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15121139857639374588:s->Program___add__-2651793105796594534\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5040379952546458196:s->Program___add__-1081172882011038115\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-8417957797057827878:s->Program_parent-15121139857639374588\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15952540911656918845:s->Program_parent-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-3377577844511369682:s->Program___add__-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-4208978898528913939:s->Program___add__-13095445380246898500\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-1714775736476281168:s->Program_parent-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-14289738803621830331:s->Program_parent-8417957797057827878\n", "\n", "\n", "\n", "\n", "\n", "Program_assign-10080759905092916392\n", "\n", "\n", "·.assign\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-4208978898528913939\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-10080759905092916392\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4696794513835434606\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-13189374861551619161\n", "\n", "\n", "" + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "bool-0\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-16291883994304651111\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-5935442095835774456\n", "\n", "\n", ""y"\n", "\n", "\n", "\n", "\n", "\n", "\n", "bool-5871781006564002453\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4485927643096296218\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-11226098287981005201\n", "\n", "\n", ""x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-3377577844511369682\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-15952540911656918845\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-9249358851075372135\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-853919951260367888\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2651793105796594534\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-15952540911656918845\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-0\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4019982253596759903\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statement-5996666920560749382\n", "\n", "\n", "·.statement\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-10357708649660298671\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-17615343019692007359\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-5871781006564002453\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-1714775736476281168\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "·.expr_to_statement\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2671062704490572354\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-9754068158704536254\n", "\n", "\n", "") + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-2096353982008678537\n", "\n", "\n", ""sum("\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-14236238857028323759\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-1081172882011038115\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-11743562013128004906\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-2546176790493825425\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-8417957797057827878\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13761752264459356387\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443\n", "\n", "\n", "·.function_two\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-12969792886956269196\n", "\n", "\n", ""__fn"\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-11355304735691241393\n", "\n", "\n", ""[1] = 10"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-5040379952546458196\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13095445380246898500\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13241269951358007050\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-16783941965674463102\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-10912160959110460649\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-15121139857639374588\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15952540911656918845\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15952540911656918845-value\n", "\n", "\n", ""x[1] = 10\n", "_0 = x + x\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-11743562013128004906\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-11743562013128004906-value\n", "\n", "\n", ""x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-9249358851075372135\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-9249358851075372135-value\n", "\n", "\n", "") + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-0\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-0-value\n", "\n", "\n", ""sum("\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-3377577844511369682\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-3377577844511369682-value\n", "\n", "\n", ""x[1] = 10\n", "_0 = x + x\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-1714775736476281168\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-1714775736476281168-value\n", "\n", "\n", ""x[1] = 10\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-11743562013128004906\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-11743562013128004906-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-17615343019692007359\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-17615343019692007359-value\n", "\n", "\n", ""[1] = 10"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10080759905092916392\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10080759905092916392-value\n", "\n", "\n", ""x + x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5040379952546458196\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5040379952546458196-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-8417957797057827878\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-8417957797057827878-value\n", "\n", "\n", ""x[1] = 10\n", "_0 = x + x\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-0\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-0-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15121139857639374588\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15121139857639374588-value\n", "\n", "\n", ""x[1] = 10\n", "_0 = x + x\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5871781006564002453\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5871781006564002453-value\n", "\n", "\n", ""x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-2546176790493825425\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-2546176790493825425-value\n", "\n", "\n", ""y"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-14289738803621830331\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-14289738803621830331-value\n", "\n", "\n", ""__fn"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-14289738803621830331\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-14289738803621830331-value\n", "\n", "\n", ""def __fn(x, y):\n", "    x[1] = 10\n", "    _0 = x + x\n", "    return sum(_0) + y\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-4208978898528913939\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-4208978898528913939-value\n", "\n", "\n", ""x + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5040379952546458196\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5040379952546458196-value\n", "\n", "\n", ""x[1] = 10"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10080759905092916392\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10080759905092916392-value\n", "\n", "\n", ""x[1] = 10\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5871781006564002453\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5871781006564002453-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-1714775736476281168\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-1714775736476281168-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10912160959110460649\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10912160959110460649-value\n", "\n", "\n", ""x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-8417957797057827878\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-8417957797057827878-value\n", "\n", "\n", ""sum(_0) + y"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10912160959110460649\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10912160959110460649-value\n", "\n", "\n", ""x[1] = 10\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-16783941965674463102\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-16783941965674463102-value\n", "\n", "\n", "" + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-2546176790493825425\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-2546176790493825425-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-3377577844511369682\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-3377577844511369682-value\n", "\n", "\n", ""sum(_0"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15121139857639374588\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15121139857639374588-value\n", "\n", "\n", ""sum(_0) + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-17615343019692007359\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-17615343019692007359-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-16783941965674463102\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-16783941965674463102-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-4208978898528913939\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-4208978898528913939-value\n", "\n", "\n", ""x[1] = 10\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-9249358851075372135\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-9249358851075372135-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15952540911656918845\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15952540911656918845-value\n", "\n", "\n", ""_0"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-11413373673517832166\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "i64-0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-11413373673517832166-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-6662973804773207269\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-6662973804773207269-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-395596399104602408\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-395596399104602408-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12930351210441812130\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12930351210441812130-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1351883367118893594\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1351883367118893594-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-8179951341697187233\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-8179951341697187233-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-956286968014291186\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-956286968014291186-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-0\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-0-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-9896396136593852202\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-9896396136593852202-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5145996267849227305\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5145996267849227305-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5706686836758916083\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5706686836758916083-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-17845845248991523397\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "i64-5871781006564002453\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-17845845248991523397-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12369660641532123352\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12369660641532123352-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-7619260772787498455\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-7619260772787498455-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-2868860904042873558\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-2868860904042873558-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-10457086705503540980\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-10457086705503540980-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1912573936028582372\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1912573936028582372-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-8417957797057827878\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-8417957797057827878-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-11743562013128004906\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-11743562013128004906-value\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-1714775736476281168\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-1714775736476281168-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-14289738803621830331\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-14289738803621830331-value\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5040379952546458196\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5040379952546458196-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-4208978898528913939\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-4208978898528913939-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5871781006564002453\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5871781006564002453-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-0\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-0-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15952540911656918845\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15952540911656918845-value\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15121139857639374588\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15121139857639374588-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-17615343019692007359\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-17615343019692007359-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10912160959110460649\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10912160959110460649-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-16783941965674463102\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-16783941965674463102-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10080759905092916392\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10080759905092916392-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-2546176790493825425\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-2546176790493825425-value\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-3377577844511369682\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-3377577844511369682-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-9249358851075372135\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-9249358851075372135-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-9249358851075372135\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-9249358851075372135-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10912160959110460649\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10912160959110460649-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10080759905092916392\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10080759905092916392-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15121139857639374588\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15121139857639374588-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-17615343019692007359\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-17615343019692007359-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5040379952546458196\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5040379952546458196-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-2546176790493825425\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-2546176790493825425-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-8417957797057827878\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-8417957797057827878-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15952540911656918845\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15952540911656918845-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-3377577844511369682\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-3377577844511369682-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-11743562013128004906\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-11743562013128004906-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5871781006564002453\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5871781006564002453-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-4208978898528913939\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-4208978898528913939-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-1714775736476281168\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-1714775736476281168-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-0\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-0-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-16783941965674463102\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-16783941965674463102-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-14289738803621830331\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-14289738803621830331-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-5871781006564002453-value\n", "\n", "\n", "cluster_Program_is_identifer-5871781006564002453-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-5040379952546458196-value\n", "\n", "\n", "cluster_Program_is_identifer-5040379952546458196-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-16783941965674463102-value\n", "\n", "\n", "cluster_Program_is_identifer-16783941965674463102-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-8417957797057827878-value\n", "\n", "\n", "cluster_Program_is_identifer-8417957797057827878-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-14289738803621830331-value\n", "\n", "\n", "cluster_Program_is_identifer-14289738803621830331-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-3377577844511369682-value\n", "\n", "\n", "cluster_Program_is_identifer-3377577844511369682-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-15121139857639374588-value\n", "\n", "\n", "cluster_Program_is_identifer-15121139857639374588-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-10080759905092916392-value\n", "\n", "\n", "cluster_Program_is_identifer-10080759905092916392-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-10912160959110460649-value\n", "\n", "\n", "cluster_Program_is_identifer-10912160959110460649-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-1714775736476281168-value\n", "\n", "\n", "cluster_Program_is_identifer-1714775736476281168-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-10912160959110460649-value\n", "\n", "\n", "cluster_Program_next_sym-10912160959110460649-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-15121139857639374588-value\n", "\n", "\n", "cluster_Program_next_sym-15121139857639374588-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-14289738803621830331-value\n", "\n", "\n", "cluster_Program_next_sym-14289738803621830331-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-10080759905092916392-value\n", "\n", "\n", "cluster_Program_next_sym-10080759905092916392-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-11743562013128004906-value\n", "\n", "\n", "cluster_Program_next_sym-11743562013128004906-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-16783941965674463102-value\n", "\n", "\n", "cluster_Program_next_sym-16783941965674463102-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-17615343019692007359-value\n", "\n", "\n", "cluster_Program_next_sym-17615343019692007359-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-15952540911656918845-value\n", "\n", "\n", "cluster_Program_next_sym-15952540911656918845-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-2546176790493825425-value\n", "\n", "\n", "cluster_Program_statements-2546176790493825425-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-10080759905092916392-value\n", "\n", "\n", "cluster_Program_statements-10080759905092916392-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-9249358851075372135-value\n", "\n", "\n", "cluster_Program_statements-9249358851075372135-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-1714775736476281168-value\n", "\n", "\n", "cluster_Program_statements-1714775736476281168-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-17615343019692007359-value\n", "\n", "\n", "cluster_Program_is_identifer-17615343019692007359-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-4208978898528913939-value\n", "\n", "\n", "cluster_Program_is_identifer-4208978898528913939-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-2546176790493825425-value\n", "\n", "\n", "cluster_Program_is_identifer-2546176790493825425-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-9249358851075372135-value\n", "\n", "\n", "cluster_Program_is_identifer-9249358851075372135-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-15952540911656918845-value\n", "\n", "\n", "cluster_Program_is_identifer-15952540911656918845-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-11743562013128004906-value\n", "\n", "\n", "cluster_Program_is_identifer-11743562013128004906-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-8417957797057827878-value\n", "\n", "\n", "cluster_Program_statements-8417957797057827878-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-5871781006564002453-value\n", "\n", "\n", "cluster_Program_statements-5871781006564002453-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-15952540911656918845-value\n", "\n", "\n", "cluster_Program_statements-15952540911656918845-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-10912160959110460649-value\n", "\n", "\n", "cluster_Program_statements-10912160959110460649-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-17615343019692007359-value\n", "\n", "\n", "cluster_Program_statements-17615343019692007359-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-16783941965674463102-value\n", "\n", "\n", "cluster_Program_statements-16783941965674463102-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-3377577844511369682-value\n", "\n", "\n", "cluster_Program_statements-3377577844511369682-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-5040379952546458196-value\n", "\n", "\n", "cluster_Program_statements-5040379952546458196-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-14289738803621830331-value\n", "\n", "\n", "cluster_Program_statements-14289738803621830331-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-11743562013128004906-value\n", "\n", "\n", "cluster_Program_statements-11743562013128004906-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-4208978898528913939-value\n", "\n", "\n", "cluster_Program_statements-4208978898528913939-value\n", "\n", "\n", "\n", "outer_cluster_Program_statements-15121139857639374588-value\n", "\n", "\n", "cluster_Program_statements-15121139857639374588-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-12369660641532123352-value\n", "\n", "\n", "cluster_Program_compile-12369660641532123352-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-12930351210441812130-value\n", "\n", "\n", "cluster_Program_compile-12930351210441812130-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-10457086705503540980-value\n", "\n", "\n", "cluster_Program_compile-10457086705503540980-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-9896396136593852202-value\n", "\n", "\n", "cluster_Program_compile-9896396136593852202-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-6662973804773207269-value\n", "\n", "\n", "cluster_Program_compile-6662973804773207269-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-1351883367118893594-value\n", "\n", "\n", "cluster_Program_compile-1351883367118893594-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-5145996267849227305-value\n", "\n", "\n", "cluster_Program_compile-5145996267849227305-value\n", "\n", "\n", "\n", "outer_cluster_Program_is_identifer-0-value\n", "\n", "\n", "cluster_Program_is_identifer-0-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-1714775736476281168-value\n", "\n", "\n", "cluster_Program_next_sym-1714775736476281168-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-2546176790493825425-value\n", "\n", "\n", "cluster_Program_next_sym-2546176790493825425-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-9249358851075372135-value\n", "\n", "\n", "cluster_Program_next_sym-9249358851075372135-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-4208978898528913939-value\n", "\n", "\n", "cluster_Program_next_sym-4208978898528913939-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-5040379952546458196-value\n", "\n", "\n", "cluster_Program_next_sym-5040379952546458196-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-8417957797057827878-value\n", "\n", "\n", "cluster_Program_next_sym-8417957797057827878-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-3377577844511369682-value\n", "\n", "\n", "cluster_Program_next_sym-3377577844511369682-value\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-5871781006564002453-value\n", "\n", "\n", "cluster_Program_next_sym-5871781006564002453-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-4208978898528913939-value\n", "\n", "\n", "cluster_Program_expr-4208978898528913939-value\n", "\n", "\n", "\n", "outer_cluster_String-11226098287981005201\n", "\n", "\n", "cluster_String-11226098287981005201\n", "\n", "\n", "\n", "outer_cluster_String-13189374861551619161\n", "\n", "\n", "cluster_String-13189374861551619161\n", "\n", "\n", "\n", "outer_cluster_Program_expr-1714775736476281168-value\n", "\n", "\n", "cluster_Program_expr-1714775736476281168-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-8417957797057827878-value\n", "\n", "\n", "cluster_Program_expr-8417957797057827878-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-2546176790493825425-value\n", "\n", "\n", "cluster_Program_expr-2546176790493825425-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-10080759905092916392-value\n", "\n", "\n", "cluster_Program_expr-10080759905092916392-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-5040379952546458196-value\n", "\n", "\n", "cluster_Program_expr-5040379952546458196-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-14289738803621830331-value\n", "\n", "\n", "cluster_Program_expr-14289738803621830331-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-11743562013128004906-value\n", "\n", "\n", "cluster_Program_expr-11743562013128004906-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-10912160959110460649-value\n", "\n", "\n", "cluster_Program_expr-10912160959110460649-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-5871781006564002453-value\n", "\n", "\n", "cluster_Program_expr-5871781006564002453-value\n", "\n", "\n", "\n", "outer_cluster_String-12969792886956269196\n", "\n", "\n", "cluster_String-12969792886956269196\n", "\n", "\n", "\n", "outer_cluster_Program_expr-17615343019692007359-value\n", "\n", "\n", "cluster_Program_expr-17615343019692007359-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-3377577844511369682-value\n", "\n", "\n", "cluster_Program_expr-3377577844511369682-value\n", "\n", "\n", "\n", "outer_cluster_String-11355304735691241393\n", "\n", "\n", "cluster_String-11355304735691241393\n", "\n", "\n", "\n", "outer_cluster_Program_expr-15121139857639374588-value\n", "\n", "\n", "cluster_Program_expr-15121139857639374588-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-15952540911656918845-value\n", "\n", "\n", "cluster_Program_expr-15952540911656918845-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-16783941965674463102-value\n", "\n", "\n", "cluster_Program_expr-16783941965674463102-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-9249358851075372135-value\n", "\n", "\n", "cluster_Program_expr-9249358851075372135-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-8179951341697187233-value\n", "\n", "\n", "cluster_Program_compile-8179951341697187233-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-956286968014291186-value\n", "\n", "\n", "cluster_Program_compile-956286968014291186-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-11413373673517832166-value\n", "\n", "\n", "cluster_Program_compile-11413373673517832166-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-2868860904042873558-value\n", "\n", "\n", "cluster_Program_compile-2868860904042873558-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-7619260772787498455-value\n", "\n", "\n", "cluster_Program_compile-7619260772787498455-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-17845845248991523397-value\n", "\n", "\n", "cluster_Program_compile-17845845248991523397-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-5706686836758916083-value\n", "\n", "\n", "cluster_Program_compile-5706686836758916083-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-1912573936028582372-value\n", "\n", "\n", "cluster_Program_compile-1912573936028582372-value\n", "\n", "\n", "\n", "outer_cluster_Program_compile-395596399104602408-value\n", "\n", "\n", "cluster_Program_compile-395596399104602408-value\n", "\n", "\n", "\n", "outer_cluster_Program_expr-0-value\n", "\n", "\n", "cluster_Program_expr-0-value\n", "\n", "\n", "\n", "outer_cluster_String-2096353982008678537\n", "\n", "\n", "cluster_String-2096353982008678537\n", "\n", "\n", "\n", "outer_cluster_bool-5871781006564002453\n", "\n", "\n", "cluster_bool-5871781006564002453\n", "\n", "\n", "\n", "outer_cluster_Program_compile-0-value\n", "\n", "\n", "cluster_Program_compile-0-value\n", "\n", "\n", "\n", "outer_cluster_String-9754068158704536254\n", "\n", "\n", "cluster_String-9754068158704536254\n", "\n", "\n", "\n", "outer_cluster_String-5935442095835774456\n", "\n", "\n", "cluster_String-5935442095835774456\n", "\n", "\n", "\n", "outer_cluster_Program_statements-0-value\n", "\n", "\n", "cluster_Program_statements-0-value\n", "\n", "\n", "\n", "outer_cluster_i64-5871781006564002453\n", "\n", "\n", "cluster_i64-5871781006564002453\n", "\n", "\n", "\n", "outer_cluster_Program_next_sym-0-value\n", "\n", "\n", "cluster_Program_next_sym-0-value\n", "\n", "\n", "\n", "outer_cluster_3\n", "\n", "\n", "cluster_3\n", "\n", "\n", "\n", "outer_cluster_13\n", "\n", "\n", "cluster_13\n", "\n", "\n", "\n", "outer_cluster_6\n", "\n", "\n", "cluster_6\n", "\n", "\n", "\n", "outer_cluster_10\n", "\n", "\n", "cluster_10\n", "\n", "\n", "\n", "outer_cluster_14\n", "\n", "\n", "cluster_14\n", "\n", "\n", "\n", "outer_cluster_12\n", "\n", "\n", "cluster_12\n", "\n", "\n", "\n", "outer_cluster_9\n", "\n", "\n", "cluster_9\n", "\n", "\n", "\n", "outer_cluster_15\n", "\n", "\n", "cluster_15\n", "\n", "\n", "\n", "outer_cluster_5\n", "\n", "\n", "cluster_5\n", "\n", "\n", "\n", "outer_cluster_16\n", "\n", "\n", "cluster_16\n", "\n", "\n", "\n", "outer_cluster_11\n", "\n", "\n", "cluster_11\n", "\n", "\n", "\n", "outer_cluster_7\n", "\n", "\n", "cluster_7\n", "\n", "\n", "\n", "outer_cluster_8\n", "\n", "\n", "cluster_8\n", "\n", "\n", "\n", "outer_cluster_0\n", "\n", "\n", "cluster_0\n", "\n", "\n", "\n", "outer_cluster_4\n", "\n", "\n", "cluster_4\n", "\n", "\n", "\n", "outer_cluster_2\n", "\n", "\n", "cluster_2\n", "\n", "\n", "\n", "outer_cluster_1\n", "\n", "\n", "cluster_1\n", "\n", "\n", "\n", "outer_cluster_bool-0\n", "\n", "\n", "cluster_bool-0\n", "\n", "\n", "\n", "outer_cluster_i64-0\n", "\n", "\n", "cluster_i64-0\n", "\n", "\n", "\n", "\n", "Program___init__-14236238857028323759:s->String-11355304735691241393\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-14236238857028323759:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-16291883994304651111:s->String-5935442095835774456\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-16291883994304651111:s->bool-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4696794513835434606:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4696794513835434606:s->String-13189374861551619161\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4019982253596759903:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4019982253596759903:s->String-2096353982008678537\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-15952540911656918845:s->Program_assign-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_assign-10080759905092916392:s->Program_parent-4208978898528913939\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-15952540911656918845:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-15952540911656918845:s->Program_parent-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-10080759905092916392:s->Program_parent-4208978898528913939\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-15121139857639374588:s->Program___add__-2651793105796594534\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2651793105796594534:s->Program_parent-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2651793105796594534:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13761752264459356387:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13761752264459356387:s->Program_parent-9249358851075372135\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-3377577844511369682:s->Program___add__-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-853919951260367888:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-853919951260367888:s->String-9754068158704536254\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-4208978898528913939:s->Program___add__-13095445380246898500\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4485927643096296218:s->bool-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4485927643096296218:s->String-11226098287981005201\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-8417957797057827878:s->Program___add__-13761752264459356387\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443:s->Program___add__-13761752264459356387\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443:s->String-12969792886956269196\n", "\n", "\n", "\n", "\n", "\n", "Program_statement-5996666920560749382:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_statement-5996666920560749382:s->Program_parent-17615343019692007359\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-10357708649660298671:s->bool-0\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-10357708649660298671:s->String-11226098287981005201\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-1714775736476281168:s->Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_expr_to_statement-5040379952546458196:s->Program_parent-17615343019692007359\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2671062704490572354:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2671062704490572354:s->Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-5040379952546458196:s->Program_parent-17615343019692007359\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-10912160959110460649:s->Program_parent-1714775736476281168\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13095445380246898500:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13095445380246898500:s->Program_parent-1714775736476281168\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13241269951358007050:s->Program___add__-2671062704490572354\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13241269951358007050:s->Program_parent-16783941965674463102\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-1081172882011038115:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-1081172882011038115:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-4208978898528913939:s->Program___add__-13095445380246898500\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-8417957797057827878:s->Program___add__-13761752264459356387\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15952540911656918845:s->Program_assign-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10912160959110460649:s->Program_statement-5996666920560749382\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-3377577844511369682:s->Program_parent-0\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-1714775736476281168:s->Program_parent-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5040379952546458196:s->Program_parent-17615343019692007359\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-8417957797057827878:s->Program_parent-15121139857639374588\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10080759905092916392:s->Program_parent-4208978898528913939\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5040379952546458196:s->Program___add__-1081172882011038115\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-14289738803621830331:s->Program_parent-2546176790493825425\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-14289738803621830331:s->Program_function_two-3497168771395161443\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10912160959110460649:s->Program_parent-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-4208978898528913939:s->Program_parent-10912160959110460649\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15121139857639374588:s->Program_parent-3377577844511369682\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-3377577844511369682:s->Program___add__-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10080759905092916392:s->Program_parent-4208978898528913939\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-1714775736476281168:s->Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15121139857639374588:s->Program___add__-2651793105796594534\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15952540911656918845:s->Program_assign-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-8179951341697187233:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-8179951341697187233:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-956286968014291186:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-956286968014291186:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-11413373673517832166:s->Program_parent-15121139857639374588\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-11413373673517832166:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-2868860904042873558:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-2868860904042873558:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-7619260772787498455:s->Program_parent-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-7619260772787498455:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-17845845248991523397:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-17845845248991523397:s->i64-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-0:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5706686836758916083:s->Program_parent-16783941965674463102\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5706686836758916083:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1912573936028582372:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1912573936028582372:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-395596399104602408:s->Program___add__-1081172882011038115\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-395596399104602408:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12369660641532123352:s->Program_parent-11743562013128004906\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12369660641532123352:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12930351210441812130:s->Program_parent-9249358851075372135\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12930351210441812130:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-10457086705503540980:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-10457086705503540980:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-9896396136593852202:s->Program_parent-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-9896396136593852202:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-6662973804773207269:s->Program___add__-13241269951358007050\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-6662973804773207269:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1351883367118893594:s->Program_parent-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1351883367118893594:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5145996267849227305:s->Program_parent-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5145996267849227305:s->i64-0\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-4208978898528913939:s->Program_parent-16783941965674463102\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15952540911656918845:s->Program_parent-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5040379952546458196:s->Program___add__-1081172882011038115\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-8417957797057827878:s->Program___add__-13761752264459356387\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-14289738803621830331:s->Program_parent-2546176790493825425\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-3377577844511369682:s->Program_parent-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15121139857639374588:s->Program_parent-9249358851075372135\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10080759905092916392:s->Program___add__-13241269951358007050\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10912160959110460649:s->Program_parent-5871781006564002453\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-1714775736476281168:s->Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10912160959110460649:s->Program___add__-2671062704490572354\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15121139857639374588:s->Program___add__-2651793105796594534\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-14289738803621830331:s->Program_parent-8417957797057827878\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-1714775736476281168:s->Program_parent-5040379952546458196\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-2546176790493825425:s->Program___init__-16291883994304651111\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10080759905092916392:s->Program___add__-13241269951358007050\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-11743562013128004906:s->Program___init__-4485927643096296218\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-0:s->Program___init__-4019982253596759903\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-9249358851075372135:s->Program___init__-853919951260367888\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-4208978898528913939:s->Program___add__-13095445380246898500\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5040379952546458196:s->Program___add__-1081172882011038115\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-16783941965674463102:s->Program___init__-4696794513835434606\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-17615343019692007359:s->Program___init__-14236238857028323759\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15952540911656918845:s->Program_parent-10080759905092916392\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-8417957797057827878:s->Program_parent-15121139857639374588\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-3377577844511369682:s->Program___add__-15952540911656918845\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5871781006564002453:s->Program___init__-10357708649660298671\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-14236238857028323759\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-11355304735691241393\n", "\n", "\n", ""[1] = 10"\n", "\n", "\n", "\n", "\n", "\n", "\n", "bool-0\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-16291883994304651111\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-5935442095835774456\n", "\n", "\n", ""y"\n", "\n", "\n", "\n", "\n", "\n", "\n", "bool-5871781006564002453\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4696794513835434606\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-13189374861551619161\n", "\n", "\n", "" + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-0\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4019982253596759903\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-15952540911656918845\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_assign-10080759905092916392\n", "\n", "\n", "·.assign\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-15952540911656918845\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-10080759905092916392\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-15121139857639374588\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2651793105796594534\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13761752264459356387\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-9249358851075372135\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-3377577844511369682\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-853919951260367888\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-4208978898528913939\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-11743562013128004906\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-4485927643096296218\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-2546176790493825425\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-8417957797057827878\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_function_two-3497168771395161443\n", "\n", "\n", "·.function_two\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-12969792886956269196\n", "\n", "\n", ""__fn"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statement-5996666920560749382\n", "\n", "\n", "·.statement\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___init__-10357708649660298671\n", "\n", "\n", "Program\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-17615343019692007359\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-5871781006564002453\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-1714775736476281168\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr_to_statement-5040379952546458196\n", "\n", "\n", "·.expr_to_statement\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-2671062704490572354\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-5040379952546458196\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-9754068158704536254\n", "\n", "\n", "") + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-10912160959110460649\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_parent-16783941965674463102\n", "\n", "\n", "·.parent\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13095445380246898500\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-13241269951358007050\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-2096353982008678537\n", "\n", "\n", ""sum("\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program___add__-1081172882011038115\n", "\n", "\n", "(· + ·)\n", "\n", "\n", "\n", "\n", "\n", "\n", "String-11226098287981005201\n", "\n", "\n", ""x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-4208978898528913939\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-4208978898528913939-value\n", "\n", "\n", ""x + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-8417957797057827878\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-8417957797057827878-value\n", "\n", "\n", ""x[1] = 10\n", "_0 = x + x\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5871781006564002453\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5871781006564002453-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15952540911656918845\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15952540911656918845-value\n", "\n", "\n", ""x[1] = 10\n", "_0 = x + x\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10912160959110460649\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10912160959110460649-value\n", "\n", "\n", ""x[1] = 10\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-17615343019692007359\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-17615343019692007359-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-16783941965674463102\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-16783941965674463102-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-3377577844511369682\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-3377577844511369682-value\n", "\n", "\n", ""x[1] = 10\n", "_0 = x + x\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-1714775736476281168\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-1714775736476281168-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5040379952546458196\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-5040379952546458196-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-8417957797057827878\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-8417957797057827878-value\n", "\n", "\n", ""sum(_0) + y"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-2546176790493825425\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-2546176790493825425-value\n", "\n", "\n", ""y"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10080759905092916392\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10080759905092916392-value\n", "\n", "\n", ""x + x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5040379952546458196\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5040379952546458196-value\n", "\n", "\n", ""x[1] = 10"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-0\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-0-value\n", "\n", "\n", ""sum("\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-14289738803621830331\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-14289738803621830331-value\n", "\n", "\n", ""__fn"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-11743562013128004906\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-11743562013128004906-value\n", "\n", "\n", ""x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-14289738803621830331\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-14289738803621830331-value\n", "\n", "\n", ""def __fn(x, y):\n", "    x[1] = 10\n", "    _0 = x + x\n", "    return sum(_0) + y\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10912160959110460649\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-10912160959110460649-value\n", "\n", "\n", ""x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5871781006564002453\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-5871781006564002453-value\n", "\n", "\n", ""x"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-11743562013128004906\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-11743562013128004906-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-4208978898528913939\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-4208978898528913939-value\n", "\n", "\n", ""x[1] = 10\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15121139857639374588\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-15121139857639374588-value\n", "\n", "\n", ""x[1] = 10\n", "_0 = x + x\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-17615343019692007359\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-17615343019692007359-value\n", "\n", "\n", ""[1] = 10"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-3377577844511369682\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-3377577844511369682-value\n", "\n", "\n", ""sum(_0"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-2546176790493825425\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-2546176790493825425-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-0\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-0-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10080759905092916392\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-10080759905092916392-value\n", "\n", "\n", ""x[1] = 10\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-9249358851075372135\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-9249358851075372135-value\n", "\n", "\n", """\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-1714775736476281168\n", "\n", "\n", "·.statements\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_statements-1714775736476281168-value\n", "\n", "\n", ""x[1] = 10\n", ""\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15121139857639374588\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15121139857639374588-value\n", "\n", "\n", ""sum(_0) + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15952540911656918845\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-15952540911656918845-value\n", "\n", "\n", ""_0"\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-16783941965674463102\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-16783941965674463102-value\n", "\n", "\n", "" + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-9249358851075372135\n", "\n", "\n", "·.expr\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_expr-9249358851075372135-value\n", "\n", "\n", "") + "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-8179951341697187233\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "i64-0\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-8179951341697187233-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-956286968014291186\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-956286968014291186-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-11413373673517832166\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-11413373673517832166-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-2868860904042873558\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-2868860904042873558-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-7619260772787498455\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-7619260772787498455-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-17845845248991523397\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "i64-5871781006564002453\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-17845845248991523397-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-0\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-0-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5706686836758916083\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5706686836758916083-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1912573936028582372\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1912573936028582372-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-395596399104602408\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-395596399104602408-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12369660641532123352\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12369660641532123352-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12930351210441812130\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-12930351210441812130-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-10457086705503540980\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-10457086705503540980-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-9896396136593852202\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-9896396136593852202-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-6662973804773207269\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-6662973804773207269-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1351883367118893594\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-1351883367118893594-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5145996267849227305\n", "\n", "\n", "·.compile\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_compile-5145996267849227305-value\n", "\n", "\n", "()\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-17615343019692007359\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-17615343019692007359-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-4208978898528913939\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-4208978898528913939-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-2546176790493825425\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-2546176790493825425-value\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-9249358851075372135\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-9249358851075372135-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15952540911656918845\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15952540911656918845-value\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-11743562013128004906\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-11743562013128004906-value\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-0\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-0-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5871781006564002453\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5871781006564002453-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5040379952546458196\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-5040379952546458196-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-16783941965674463102\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-16783941965674463102-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-8417957797057827878\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-8417957797057827878-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-14289738803621830331\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-14289738803621830331-value\n", "\n", "\n", "true\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-3377577844511369682\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-3377577844511369682-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15121139857639374588\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-15121139857639374588-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10080759905092916392\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10080759905092916392-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10912160959110460649\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-10912160959110460649-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-1714775736476281168\n", "\n", "\n", "·.is_identifer\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_is_identifer-1714775736476281168-value\n", "\n", "\n", "false\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10912160959110460649\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10912160959110460649-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15121139857639374588\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15121139857639374588-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-14289738803621830331\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-14289738803621830331-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-1714775736476281168\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-1714775736476281168-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-2546176790493825425\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-2546176790493825425-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10080759905092916392\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-10080759905092916392-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-11743562013128004906\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-11743562013128004906-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-0\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-0-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-9249358851075372135\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-9249358851075372135-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-4208978898528913939\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-4208978898528913939-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5040379952546458196\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5040379952546458196-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-16783941965674463102\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-16783941965674463102-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-17615343019692007359\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-17615343019692007359-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15952540911656918845\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-15952540911656918845-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-8417957797057827878\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-8417957797057827878-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-3377577844511369682\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-3377577844511369682-value\n", "\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5871781006564002453\n", "\n", "\n", "·.next_sym\n", "\n", "\n", "\n", "\n", "\n", "\n", "Program_next_sym-5871781006564002453-value\n", "\n", "\n", "0\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "EGraph(_flatted_deps=[], default_ruleset=None)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "egraph" ] }, { "cell_type": "markdown", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## PyObject - Python objects in EGraphs\n", "\n", "_We can also add Python objects directly to the e-graph as primitives and run rewrite rules that call back into Python_\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Future Work\n", "\n", "The next milestone use case is to be able to optimize functional array programs and rewrite them.\n", "\n", "To implement this we need to at least support **functions as values** and ideally also **generic types**.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example\n", "\n", "There is a concrete example [provided by Siu from the Numba project](https://gist.github.com/sklam/5e5737137d48d6e5b816d14a90076f1d).\n" ] }, { "cell_type": "markdown", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "We would want users to be able to write code like this:\n", "\n", "```python\n", "def linalg_norm_loopnest_egglog(X: enp.NDArray, axis: enp.TupleInt) -> enp.NDArray:\n", " # peel off the outer shape for result array\n", " outshape = ShapeAPI(X.shape).deselect(axis).to_tuple()\n", " # get only the inner shape for reduction\n", " reduce_axis = ShapeAPI(X.shape).select(axis).to_tuple()\n", "\n", " return enp.NDArray.from_fn(\n", " outshape,\n", " X.dtype,\n", " lambda k: enp.sqrt(\n", " LoopNestAPI.from_tuple(reduce_axis)\n", " .unwrap()\n", " .reduce(lambda carry, i: carry + enp.real(enp.conj(x := X[i + k]) * x), init=0.0)\n", " ).to_value(),\n", " )\n", "```\n", "\n", "Which would then be rewritten to:\n", "\n", "```python\n", "def linalg_norm_array_api(X: enp.NDArray, axis: enp.TupleInt) -> enp.NDArray:\n", " outdim = enp.range_(X.ndim).filter(lambda x: ~axis.contains(x))\n", " outshape = convert(convert(X.shape, enp.NDArray)[outdim], enp.TupleInt)\n", " row_axis, col_axis = axis\n", " return enp.NDArray.from_fn(\n", " outshape,\n", " X.dtype,\n", " lambda k: enp.sqrt(\n", " enp.int_product(enp.range_(X.shape[row_axis]), enp.range_(X.shape[col_axis]))\n", " .map_to_ndarray(lambda rc: enp.real(enp.conj(x := X[rc + k]) * x))\n", " .sum()\n", " ).to_value(),\n", " )\n", "```\n", "\n", "And finally could be lowered to Python as:\n", "\n", "```python\n", "def linalg_norm_low_level(\n", " X: np.ndarray[tuple, np.dtype[np.float64]], axis: tuple[int, int]\n", ") -> np.ndarray[tuple, np.dtype[np.float64]]:\n", " # # If X ndim>=3 and axis is a 2-tuple\n", " assert X.ndim >= 3\n", " assert len(axis) == 2\n", " # Y - 2\n", " outdim = [dim for dim in range(X.ndim) if dim not in axis]\n", "\n", " outshape = tuple(np.asarray(X.shape)[outdim])\n", "\n", " res = np.zeros(outshape, dtype=X.dtype)\n", " row_axis, col_axis = axis\n", " for k in np.ndindex(outshape):\n", " tmp = 0.0\n", " for row in range(X.shape[row_axis]):\n", " for col in range(X.shape[col_axis]):\n", " idx = (row, col, *k)\n", " x = X[idx]\n", " tmp += (x.conj() * x).real\n", " res[k] = np.sqrt(tmp)\n", " return res\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this talk I have gone through some details of what is needed to connect data science users to egglog:\n", "\n", "![](./2024_03_17_map.svg)\n", "\n", "Overall, the idea is that if we can get egglog in more users hands, in particular for data intensive workloads where the tradeoff of time for pre-computation is worth it, than this can help drive exciting future research directions and also build meaningful useful tools for the scientific open source ecosystem in Python.\n", "\n", "**If you are building DSLs in Python, or more generally want to play with e-graphs, try out `egglog-python`!**\n", "\n", "Around on the e-graphs Zulip for any questions.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.1" } }, "nbformat": 4, "nbformat_minor": 4 }