From ec70d310c8aa40f8dbd9e929d5c6b6a996bc197c Mon Sep 17 00:00:00 2001 From: Mark Koch <48097969+mark-koch@users.noreply.github.com> Date: Mon, 9 Oct 2023 09:06:35 -0600 Subject: [PATCH] [fix] Update demo notebook (#42) --- examples/demo.ipynb | 10471 ++++++++++++++++++++++++++++++------------ 1 file changed, 7484 insertions(+), 2987 deletions(-) diff --git a/examples/demo.ipynb b/examples/demo.ipynb index 39328f16..b4352a62 100644 --- a/examples/demo.ipynb +++ b/examples/demo.ipynb @@ -7,7 +7,7 @@ "source": [ "# Guppy Demo\n", "\n", - "This demo notebook gives an overview of currently implemented Guppy features. For further details see the [Guppy Confluence page](https://cqc.atlassian.net/wiki/spaces/TKET/pages/2617933825/GUPPY+Draft)." + "This demo notebook gives an overview of currently implemented Guppy features." ] }, { @@ -21,8 +21,9 @@ "sys.path.append(\"..\")\n", "\n", "from guppy.hugr.hugr import Hugr\n", - "from guppy.visualise import hugr_to_graphviz\n", + "from guppy.hugr.visualise import hugr_to_graphviz\n", "from guppy.compiler import GuppyModule, guppy\n", + "from typing import Callable\n", "\n", "setattr(\n", " Hugr,\n", @@ -56,575 +57,802 @@ "\n", "\n", - "\n", - "\n", + "\n", + "\n", "module\n", - "\n", + "\n", "\n", "cluster0\n", - "\n", + "\n", "\n", "\n", "cluster1\n", - "\n", + "\n", "\n", "\n", "cluster3\n", - "\n", - "\n", - "\n", - "cluster4\n", - "\n", + "\n", "\n", "\n", "cluster11\n", - "\n", + "\n", "\n", "\n", - "cluster13\n", - "\n", + "cluster18\n", + "\n", "\n", "\n", - "cluster15\n", - "\n", + "cluster19\n", + "\n", + "\n", + "\n", + "cluster23\n", + "\n", + "\n", + "\n", + "cluster28\n", + "\n", + "\n", + "\n", + "cluster37\n", + "\n", + "\n", + "\n", + "cluster4\n", + "\n", "\n", "\n", "\n", "2\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "3\n", - "\n", - "\n", - "\n", - "0\n", - "CFG\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", "\n", "2:out.0->3:in.0\n", - "\n", - "int\n", + "\n", + "int\n", "\n", "\n", "\n", "5\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "10\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "2\n", - "Output\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Output\n", + "\n", "\n", "\n", "\n", "5:out.0->10:in.2\n", - "\n", - "int\n", + "\n", + "int\n", "\n", - "\n", + "\n", "\n", + "6\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", "7\n", - "\n", - ""Constant: 1"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "6:out.0->7:in.0\n", + "\n", + "int\n", "\n", "\n", - "\n", + "\n", "7:out.0->10:in.1\n", - "\n", - "int\n", + "\n", + "int\n", "\n", "\n", - "\n", + "\n", "8\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "9\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "8:out.0->9:in.0\n", - "\n", - "()\n", + "\n", + "()\n", "\n", "\n", - "\n", + "\n", "9:out.0->10:in.0\n", - "\n", - "Sum(())\n", + "\n", + "Sum(())\n", "\n", "\n", - "\n", + "\n", "4\n", - "\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "11\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", "\n", "\n", - "4:out.0->11:in.0\n", - "\n", - "\n", - "\n", - "\n", - "6\n", - "\n", - "\n", - "\n", - "0\n", - "Exit\n", - "\n", + "4:out.0->11\n", + "\n", "\n", "\n", "\n", "12\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "\n", - "\n", - "18\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""igt"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "12:out.1->18:in.0\n", - "\n", - "int\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", - "\n", + "\n", "\n", - "19\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "2\n", - "Output\n", - "\n", - "\n", - "\n", + "15\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "igt_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "12:out.0->19:in.1\n", - "\n", - "int\n", + "12:out.1->15:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "16\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", "\n", - "12:out.1->19:in.2\n", - "\n", - "int\n", + "12:out.0->16:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "12:out.1->16:in.1\n", + "\n", + "int\n", "\n", "\n", - "\n", + "\n", "17\n", - "\n", - ""Constant: 0"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "17:out.0->18:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "18:out.0->19:in.0\n", - "\n", - "bool\n", + "\n", + "\n", + "\n", + "0\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "12:out.0->17:in.0\n", + "\n", + "int\n", "\n", "\n", - "\n", + "\n", "13\n", - "\n", - "\n", - "\n", - "0\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "11:out.0->13:in.0\n", - "\n", - "\n", - "\n", - "\n", - "15\n", - "\n", - "\n", - "\n", - "0\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "11:out.1->15:in.0\n", - "\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "14\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "\n", - "\n", - "20\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""imul"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "14:out.0->20:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", "\n", - "14:out.1->20:in.1\n", - "\n", - "int\n", + "13:out.0->14:in.0\n", + "\n", + "int\n", "\n", - "\n", - "\n", - "22\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""isub"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", + "\n", "\n", - "14:out.1->22:in.0\n", - "\n", - "int\n", + "14:out.0->15:in.1\n", + "\n", + "int\n", "\n", - "\n", - "\n", - "25\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "2\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "20:out.0->25:in.1\n", - "\n", - "int\n", + "\n", + "\n", + "18\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Conditional\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "15:out.0->18:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "16:out.0->18:in.1\n", + "\n", + "(int, int)\n", + "\n", + "\n", + "\n", + "17:out.0->18:in.2\n", + "\n", + "(int)\n", + "\n", + "\n", + "\n", + "20\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", "\n", "\n", "21\n", - "\n", - ""Constant: 1"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "20:out.0->21:in.0\n", + "\n", + "(int, int)\n", + "\n", + "\n", + "\n", + "22\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", "\n", "\n", "\n", - "21:out.0->22:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "22:out.0->25:in.2\n", - "\n", - "int\n", + "21:out.0->22:in.0\n", + "\n", + "Sum((int, int), (int))\n", "\n", - "\n", + "\n", "\n", - "23\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", + "19\n", + "\n", + "Case\n", + "\n", "\n", "\n", "\n", "24\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", - "\n", - "\n", - "23:out.0->24:in.0\n", - "\n", - "()\n", + "\n", + "\n", + "25\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", - "24:out.0->25:in.0\n", - "\n", - "Sum(())\n", + "\n", + "24:out.1->25:in.0\n", + "\n", + "(int)\n", "\n", - "\n", - "\n", - "13:out.0->11:in.1\n", - "\n", + "\n", + "\n", + "26\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", "\n", - "\n", + "\n", + "\n", + "25:out.0->26:in.0\n", + "\n", + "Sum((int, int), (int))\n", + "\n", + "\n", "\n", - "16\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", + "23\n", + "\n", + "Case\n", + "\n", + "\n", + "\n", + "\n", + "27\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "18:out.0->27:in.0\n", + "\n", + "Sum((int, int), (int))\n", "\n", "\n", - "\n", + "\n", "28\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "16:out.0->28:in.1\n", - "\n", - "int\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "11:out.0->28\n", + "\n", "\n", - "\n", - "\n", - "26\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "37\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "11:out.1->37\n", + "\n", "\n", - "\n", - "\n", - "27\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "29\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", - "\n", + "\n", + "\n", + "30\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "imul\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "26:out.0->27:in.0\n", - "\n", - "()\n", + "29:out.0->30:in.0\n", + "\n", + "int\n", "\n", - "\n", + "\n", "\n", - "27:out.0->28:in.0\n", - "\n", - "Sum(())\n", + "29:out.1->30:in.1\n", + "\n", + "int\n", "\n", - "\n", - "\n", - "15:out.0->6:in.0\n", - "\n", + "\n", + "\n", + "33\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "sub\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", + "\n", + "29:out.1->33:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "36\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "30:out.0->36:in.1\n", + "\n", + "int\n", + "\n", + "\n", "\n", - "29\n", - "\n", - "\n", - "\n", - "0\n", - "Output\n", - "\n", - "\n", - "\n", + "31\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "32\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "31:out.0->32:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "32:out.0->33:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "33:out.0->36:in.2\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "34\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "35\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "34:out.0->35:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "35:out.0->36:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "28:out.0->11\n", + "\n", + "\n", + "\n", + "\n", + "38\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "41\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "38:out.0->41:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "39\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "40\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "39:out.0->40:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "40:out.0->41:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "42\n", + "\n", + "Exit\n", + "\n", + "\n", + "\n", + "\n", + "37:out.0->42\n", + "\n", + "\n", + "\n", + "\n", + "43\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", "\n", - "3:out.0->29:in.0\n", - "\n", - "int\n", + "3:out.0->43:in.0\n", + "\n", + "int\n", "\n", "\n", - "\n", + "\n", "1\n", - "\n", - "Def\n", - "name: factorial\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "FuncDefn\n", + "name: factorial\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "0\n", - "\n", - "Root\n", - "name: module\n", - "\n", + "\n", + "Module\n", + "name: module\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -668,7 +896,7 @@ " if x > 0:\n", " a = 10\n", " else:\n", - " a = \"test\"\n", + " a = True\n", " return x" ] }, @@ -690,13 +918,13 @@ "name": "stderr", "output_type": "stream", "text": [ - "Guppy compilation failed. Error in file \"/var/folders/tw/395bz2tx0nv7wnltsw_zk7740000gn/T/ipykernel_41926/1961601748.py\", line 7, in __main__\n", + "Guppy compilation failed. Error in file /var/folders/tw/395bz2tx0nv7wnltsw_zk7740000gn/T/ipykernel_40197/219269089.py:7\n", "\n", "5: else:\n", - "6: a = \"test\"\n", - "7: x += a\n", - " ^\n", - "GuppyError: Variable `a` can refer to different types: `int` (at 4:8) vs `str` (at 6:8)\n" + "6: a = True\n", + "7: return a\n", + " ^\n", + "GuppyError: Variable `a` can refer to different types: `int` (at 4:8) vs `bool` (at 6:8)\n" ] } ], @@ -706,9 +934,8 @@ " if x > 0:\n", " a = 10\n", " else:\n", - " a = \"test\"\n", - " x += a\n", - " return x" + " a = True\n", + " return a" ] }, { @@ -736,481 +963,702 @@ "\n", "\n", - "\n", - "\n", + "\n", + "\n", "module\n", - "\n", + "\n", "\n", "cluster0\n", - "\n", + "\n", "\n", "\n", "cluster1\n", - "\n", + "\n", "\n", "\n", "cluster3\n", - "\n", + "\n", + "\n", + "\n", + "cluster21\n", + "\n", + "\n", + "\n", + "cluster28\n", + "\n", "\n", "\n", "cluster4\n", - "\n", + "\n", "\n", "\n", - "cluster10\n", - "\n", + "cluster11\n", + "\n", "\n", "\n", + "cluster12\n", + "\n", + "\n", + "\n", "cluster16\n", - "\n", + "\n", "\n", "\n", "\n", "2\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "3\n", - "\n", - "\n", - "\n", - "0\n", - "CFG\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", "\n", "2:out.0->3:in.0\n", - "\n", - "int\n", + "\n", + "int\n", "\n", "\n", "\n", "5\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "8\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""eq"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "ieq\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", "\n", "5:out.0->8:in.0\n", - "\n", - "int\n", + "\n", + "int\n", "\n", - "\n", - "\n", - "9\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "10\n", + "\n", + "\n", + "\n", + "0\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "5:out.0->9:in.1\n", - "\n", - "int\n", + "5:out.0->10:in.0\n", + "\n", + "int\n", "\n", - "\n", + "\n", "\n", - "7\n", - "\n", - ""Constant: 0"\n", - "\n", - "\n", - "0\n", - "\n", + "6\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", + "\n", + "7\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "7:out.0->8:in.1\n", - "\n", - "int\n", + "6:out.0->7:in.0\n", + "\n", + "int\n", "\n", - "\n", + "\n", "\n", - "8:out.0->9:in.0\n", - "\n", - "bool\n", - "\n", - "\n", - "\n", - "4\n", - "\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "\n", - "\n", - "10\n", - "\n", - "\n", - "\n", - "0\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "4:out.0->10:in.0\n", - "\n", - "\n", - "\n", - "\n", - "16\n", - "\n", - "\n", - "\n", - "0\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "4:out.1->16:in.0\n", - "\n", - "\n", - "\n", - "\n", - "6\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Exit\n", - "\n", + "7:out.0->8:in.1\n", + "\n", + "int\n", "\n", "\n", - "\n", + "\n", "11\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "12\n", - "\n", - ""Constant: 1"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Conditional\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "15\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", + "\n", + "\n", + "8:out.0->11:in.0\n", + "\n", + "bool\n", "\n", - "\n", + "\n", + "\n", + "9\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "12:out.0->15:in.1\n", - "\n", - "int\n", + "9:out.0->11:in.1\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "10:out.0->11:in.2\n", + "\n", + "(int)\n", "\n", "\n", - "\n", + "\n", "13\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", "\n", - "\n", + "\n", "14\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "13:out.0->14:in.0\n", - "\n", - "()\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "15\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", "\n", "\n", - "\n", + "\n", "14:out.0->15:in.0\n", - "\n", - "Sum(())\n", + "\n", + "Sum((), (int))\n", "\n", - "\n", - "\n", - "10:out.0->6:in.0\n", - "\n", + "\n", + "\n", + "12\n", + "\n", + "Case\n", + "\n", "\n", "\n", - "\n", + "\n", "17\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "19\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""isub"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", - "\n", - "\n", - "17:out.0->19:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "18\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "21\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""imul"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", + "\n", "\n", - "17:out.0->21:in.1\n", - "\n", - "int\n", + "17:out.1->18:in.0\n", + "\n", + "(int)\n", "\n", - "\n", - "\n", - "18\n", - "\n", - ""Constant: 1"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "19\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", "\n", "\n", "\n", - "18:out.0->19:in.1\n", - "\n", - "int\n", + "18:out.0->19:in.0\n", + "\n", + "Sum((), (int))\n", + "\n", + "\n", + "\n", + "16\n", + "\n", + "Case\n", + "\n", "\n", "\n", "\n", "20\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Call\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "19:out.0->20:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "11:out.0->20:in.0\n", + "\n", + "Sum((), (int))\n", "\n", - "\n", - "\n", - "20:out.0->21:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "4\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", - "\n", - "\n", - "24\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", + "\n", + "\n", + "21\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "4:out.0->21\n", + "\n", "\n", - "\n", - "\n", - "21:out.0->24:in.1\n", - "\n", - "int\n", + "\n", + "\n", + "28\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "4:out.1->28\n", + "\n", "\n", "\n", "\n", "22\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", "\n", "\n", "\n", "23\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "22:out.0->23:in.0\n", - "\n", - "()\n", + "\n", + "\n", + "24\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "23:out.0->24:in.0\n", - "\n", - "Sum(())\n", + "\n", + "int\n", "\n", - "\n", - "\n", - "16:out.0->6:in.1\n", - "\n", + "\n", + "\n", + "27\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "24:out.0->27:in.1\n", + "\n", + "int\n", "\n", "\n", - "\n", + "\n", "25\n", - "\n", - "\n", - "\n", - "0\n", - "Output\n", - "\n", - "\n", - "\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "26\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "25:out.0->26:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "26:out.0->27:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "38\n", + "\n", + "Exit\n", + "\n", + "\n", + "\n", + "\n", + "21:out.0->38\n", + "\n", + "\n", + "\n", + "\n", + "29\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "32\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "sub\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "29:out.0->32:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "34\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "imul\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "29:out.0->34:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "30\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "31\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "30:out.0->31:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "31:out.0->32:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "33\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Call\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "32:out.0->33:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "33:out.0->34:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "37\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "34:out.0->37:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "35\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "36\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "35:out.0->36:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "36:out.0->37:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "28:out.0->38\n", + "\n", + "\n", + "\n", + "\n", + "39\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", "\n", - "3:out.0->25:in.0\n", - "\n", - "int\n", + "3:out.0->39:in.0\n", + "\n", + "int\n", "\n", "\n", - "\n", + "\n", "1\n", - "\n", - "Def\n", - "name: factorial2\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", + "\n", + "FuncDefn\n", + "name: factorial2\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "1:out.0->20:in.1\n", - "\n", - "int -> int\n", + "1:out.0->33:in.1\n", + "\n", + "int -> int\n", "\n", "\n", - "\n", + "\n", "0\n", - "\n", - "Root\n", - "name: module\n", - "\n", + "\n", + "Module\n", + "name: module\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -1230,18 +1678,18 @@ }, { "cell_type": "markdown", - "id": "84058d30", + "id": "0484365d", "metadata": {}, "source": [ - "## Functional Statements\n", + "## Arithmetic\n", "\n", - "Every Guppy statement can be annotated with the pseudo-decorator `_@functional`. At the moment, this only affects `if` and `while` statements and forces them to be compiled using `gamma` and `theta` nodes instead of `kappa`:" + "Guppy supports all arithmetic operations and has implicit `int` to `float` coercion when applying those operations:" ] }, { "cell_type": "code", "execution_count": 6, - "id": "43e2299d", + "id": "d898ed31", "metadata": {}, "outputs": [ { @@ -1253,561 +1701,244 @@ "\n", "\n", - "\n", - "\n", + "\n", + "\n", "module\n", - "\n", + "\n", "\n", "cluster0\n", - "\n", + "\n", "\n", "\n", "cluster1\n", - "\n", + "\n", "\n", "\n", "cluster3\n", - "\n", + "\n", "\n", "\n", "cluster4\n", - "\n", + "\n", "\n", - "\n", - "cluster10\n", - "\n", - "\n", - "\n", - "cluster13\n", - "\n", - "\n", - "\n", - "cluster11\n", - "\n", - "\n", - "\n", - "cluster16\n", - "\n", - "\n", - "\n", - "\n", - "2\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "2\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", "\n", - "\n", + "\n", "3\n", - "\n", - "\n", - "\n", - "0\n", - "CFG\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", "\n", "2:out.0->3:in.0\n", - "\n", - "int\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "2:out.1->3:in.1\n", + "\n", + "float\n", "\n", "\n", "\n", "5\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "9\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""igt"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "5:out.0->9:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "10\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "2\n", - "Conditional\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", - "\n", + "\n", + "\n", + "6\n", + "\n", + "\n", + "\n", + "0\n", + "convert_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "5:out.0->10:in.2\n", - "\n", - "int\n", + "5:out.0->6:in.0\n", + "\n", + "int\n", "\n", "\n", - "\n", + "\n", "7\n", - "\n", - ""Constant: 1"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "fadd\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", "\n", - "7:out.0->10:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "8\n", - "\n", - ""Constant: 0"\n", - "\n", - "\n", - "0\n", - "\n", + "5:out.1->7:in.1\n", + "\n", + "float\n", "\n", - "\n", + "\n", "\n", - "8:out.0->9:in.1\n", - "\n", - "int\n", + "6:out.0->7:in.0\n", + "\n", + "float\n", "\n", - "\n", + "\n", + "\n", + "10\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", "\n", - "9:out.0->10:in.0\n", - "\n", - "bool\n", + "7:out.0->10:in.1\n", + "\n", + "float\n", "\n", - "\n", + "\n", + "\n", + "8\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "12\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", + "9\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "16\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "TailLoop\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", + "\n", + "\n", + "8:out.0->9:in.0\n", + "\n", + "()\n", "\n", - "\n", + "\n", "\n", - "12:out.0->16:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "12:out.1->16:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "17\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", + "9:out.0->10:in.0\n", + "\n", + "Sum(())\n", "\n", - "\n", + "\n", "\n", - "18\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""imul"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "17:out.0->18:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "17:out.1->18:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "20\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""isub"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "17:out.1->20:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "21\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "2\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "18:out.0->21:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "19\n", - "\n", - ""Constant: 1"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "19:out.0->20:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "20:out.0->21:in.2\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "24\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""igt"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "20:out.0->24:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "23\n", - "\n", - ""Constant: 0"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "23:out.0->24:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "24:out.0->21:in.0\n", - "\n", - "bool\n", - "\n", - "\n", - "\n", - "22\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "16:out.0->22:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "16:out.1->22:in.1\n", - "\n", - "int\n", + "4\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "11\n", - "\n", - "CaseOp\n", - "\n", - "\n", - "\n", - "\n", - "14\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "\n", - "\n", - "15\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "14:out.0->15:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "14:out.1->15:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "13\n", - "\n", - "CaseOp\n", - "\n", - "\n", - "\n", - "\n", - "27\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "10:out.0->27:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "25\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "26\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "25:out.0->26:in.0\n", - "\n", - "()\n", + "\n", + "Exit\n", + "\n", "\n", - "\n", - "\n", - "26:out.0->27:in.0\n", - "\n", - "Sum(())\n", + "\n", + "\n", + "4:out.0->11\n", + "\n", "\n", - "\n", - "\n", - "4\n", - "\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "12\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", "\n", - "\n", - "\n", - "6\n", - "\n", - "\n", - "\n", - "0\n", - "Exit\n", - "\n", - "\n", - "\n", + "\n", "\n", - "4:out.0->6:in.0\n", - "\n", - "\n", - "\n", - "\n", - "28\n", - "\n", - "\n", - "\n", - "0\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "3:out.0->28:in.0\n", - "\n", - "int\n", + "3:out.0->12:in.0\n", + "\n", + "float\n", "\n", "\n", - "\n", + "\n", "1\n", - "\n", - "Def\n", - "name: factorial3\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "FuncDefn\n", + "name: arith1\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "0\n", - "\n", - "Root\n", - "name: module\n", - "\n", + "\n", + "Module\n", + "name: module\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 6, @@ -1817,68 +1948,16 @@ ], "source": [ "@guppy\n", - "def factorial3(x: int) -> int:\n", - " acc = 1\n", - " _@functional\n", - " while x > 0:\n", - " acc *= x\n", - " x -= 1\n", - " return acc\n", + "def arith1(x: int, y: float) -> float:\n", + " return x + y\n", "\n", - "factorial3" - ] - }, - { - "cell_type": "markdown", - "id": "22acf08c", - "metadata": {}, - "source": [ - "At the moment `return`, `break`, and `continue` are not allowed inside of functional statements:" + "arith1" ] }, { "cell_type": "code", "execution_count": 7, - "id": "cdb82336", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Guppy compilation failed. Error in file \"/var/folders/tw/395bz2tx0nv7wnltsw_zk7740000gn/T/ipykernel_41926/1156639282.py\", line 5, in __main__\n", - "\n", - "3: _@functional\n", - "4: if x > 5:\n", - "5: return 5\n", - " ^^^^^^^^\n", - "GuppyError: Return is not allowed in a functional statement\n" - ] - } - ], - "source": [ - "@guppy\n", - "def bad_functional(x: int) -> int:\n", - " _@functional\n", - " if x > 5:\n", - " return 5\n", - " return x" - ] - }, - { - "cell_type": "markdown", - "id": "0484365d", - "metadata": {}, - "source": [ - "## Arithmetic\n", - "\n", - "Guppy supports all arithmetic operations and has implicit `int` to `float` coercion when applying those operations:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "d898ed31", + "id": "b895450b", "metadata": {}, "outputs": [ { @@ -1890,1085 +1969,4795 @@ "\n", "\n", - "\n", - "\n", + "\n", + "\n", "module\n", - "\n", + "\n", "\n", "cluster0\n", - "\n", + "\n", "\n", "\n", "cluster1\n", - "\n", + "\n", "\n", "\n", "cluster3\n", - "\n", - "\n", - "\n", - "cluster4\n", - "\n", + "\n", "\n", - "\n", - "\n", - "2\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", + "\n", + "cluster20\n", + "\n", "\n", - "\n", - "\n", - "3\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "CFG\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "2:out.0->3:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "2:out.1->3:in.1\n", - "\n", - "float\n", - "\n", - "\n", - "\n", - "5\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "\n", - "\n", - "7\n", - "\n", - "\n", - "\n", - "0\n", - ""int_to_float"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "5:out.0->7:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "8\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""fadd"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "5:out.1->8:in.1\n", - "\n", - "float\n", - "\n", - "\n", - "\n", - "7:out.0->8:in.0\n", - "\n", - "float\n", - "\n", - "\n", - "\n", - "11\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "8:out.0->11:in.1\n", - "\n", - "float\n", - "\n", - "\n", - "\n", - "9\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "10\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "9:out.0->10:in.0\n", - "\n", - "()\n", - "\n", - "\n", - "\n", - "10:out.0->11:in.0\n", - "\n", - "Sum(())\n", + "\n", + "cluster28\n", + "\n", "\n", - "\n", - "\n", - "4\n", - "\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "cluster29\n", + "\n", "\n", - "\n", - "\n", - "6\n", - "\n", - "\n", - "\n", - "0\n", - "Exit\n", - "\n", - "\n", - "\n", - "\n", - "4:out.0->6:in.0\n", - "\n", + "\n", + "cluster33\n", + "\n", "\n", - "\n", - "\n", - "12\n", - "\n", - "\n", - "\n", - "0\n", - "Output\n", - "\n", + "\n", + "cluster38\n", + "\n", "\n", - "\n", - "\n", - "3:out.0->12:in.0\n", - "\n", - "float\n", + "\n", + "cluster48\n", + "\n", "\n", - "\n", - "\n", - "1\n", - "\n", - "Def\n", - "name: arith1\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "cluster49\n", + "\n", "\n", - "\n", - "\n", - "0\n", - "\n", - "Root\n", - "name: module\n", - "\n", + "\n", + "cluster53\n", + "\n", "\n", + "\n", + "cluster58\n", + "\n", "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "@guppy\n", - "def arith1(x: int, y: float) -> float:\n", - " return x + y\n", - "\n", - "arith1" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "b895450b", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "module\n", - "\n", - "\n", - "cluster0\n", - "\n", + "\n", + "cluster65\n", + "\n", "\n", - "\n", - "cluster1\n", - "\n", + "\n", + "cluster77\n", + "\n", "\n", - "\n", - "cluster3\n", - "\n", + "\n", + "cluster84\n", + "\n", "\n", "\n", "cluster4\n", - "\n", + "\n", "\n", "\n", "\n", "2\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "2\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", "\n", "\n", - "\n", + "\n", "3\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "2\n", - "CFG\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", "\n", "2:out.0->3:in.0\n", - "\n", - "int\n", + "\n", + "int\n", "\n", "\n", "\n", "2:out.1->3:in.1\n", - "\n", - "float\n", + "\n", + "float\n", "\n", "\n", "\n", "2:out.2->3:in.2\n", - "\n", - "int\n", + "\n", + "int\n", "\n", "\n", "\n", "5\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "2\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", "\n", - "\n", + "\n", "\n", - "7\n", - "\n", - "\n", - "\n", - "0\n", - ""int_to_float"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "5:out.0->7:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "8\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""fpow"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", + "6\n", + "\n", + "\n", + "\n", + "0\n", + "convert_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "5:out.1->8:in.1\n", - "\n", - "float\n", + "5:out.0->6:in.0\n", + "\n", + "int\n", "\n", - "\n", - "\n", - "10\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""imul"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "7\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "fdiv\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", "\n", - "5:out.2->10:in.1\n", - "\n", - "int\n", + "5:out.1->7:in.1\n", + "\n", + "float\n", "\n", - "\n", - "\n", - "21\n", - "\n", - "\n", - "\n", - "0\n", - ""int_to_float"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "5:out.0->21:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "11\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "imul\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "22\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""fmul"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "5:out.2->11:in.1\n", + "\n", + "int\n", "\n", - "\n", + "\n", + "\n", + "19\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "3\n", + "Output\n", + "\n", + "\n", + "\n", "\n", - "5:out.1->22:in.1\n", - "\n", - "float\n", + "5:out.0->19:in.2\n", + "\n", + "int\n", "\n", - "\n", - "\n", - "28\n", - "\n", - "\n", - "\n", - "0\n", - ""int_to_float"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", + "\n", "\n", - "5:out.0->28:in.0\n", - "\n", - "int\n", + "5:out.1->19:in.3\n", + "\n", + "float\n", "\n", - "\n", + "\n", "\n", - "7:out.0->8:in.0\n", - "\n", - "float\n", + "6:out.0->7:in.0\n", + "\n", + "float\n", "\n", - "\n", - "\n", - "12\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""fadd"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "8\n", + "\n", + "\n", + "\n", + "0\n", + "ffloor\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "8:out.0->12:in.0\n", - "\n", - "float\n", + "7:out.0->8:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "13\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "fadd\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "8:out.0->13:in.0\n", + "\n", + "float\n", "\n", "\n", - "\n", + "\n", "9\n", - "\n", - ""Constant: 3"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "9:out.0->10:in.0\n", - "\n", - "int\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", "\n", - "11\n", - "\n", - "\n", - "\n", - "0\n", - ""int_to_float"\n", - "\n", - "\n", - "0\n", - "\n", + "10\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", "\n", - "10:out.0->11:in.0\n", - "\n", - "int\n", + "9:out.0->10:in.0\n", + "\n", + "int\n", "\n", - "\n", + "\n", "\n", - "11:out.0->12:in.1\n", - "\n", - "int\n", + "10:out.0->11:in.0\n", + "\n", + "int\n", "\n", - "\n", - "\n", - "16\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""fgeg"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "12\n", + "\n", + "\n", + "\n", + "0\n", + "convert_s\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", "\n", - "12:out.0->16:in.1\n", - "\n", - "float\n", + "11:out.0->12:in.0\n", + "\n", + "int\n", "\n", - "\n", - "\n", - "19\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""fgt"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", + "\n", "\n", - "12:out.0->19:in.0\n", - "\n", - "float\n", + "12:out.0->13:in.1\n", + "\n", + "float\n", "\n", - "\n", - "\n", - "27\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""fmod"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "18\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "fge\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", "\n", - "12:out.0->27:in.0\n", - "\n", - "float\n", + "13:out.0->18:in.1\n", + "\n", + "float\n", "\n", - "\n", - "\n", - "13\n", - "\n", - ""Constant: 8"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "13:out.0->19:in.1\n", + "\n", + "float\n", "\n", "\n", - "\n", + "\n", "14\n", - "\n", - "\n", - "\n", - "0\n", - ""ineg"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "13:out.0->14:in.0\n", - "\n", - "int\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "15\n", - "\n", - "\n", - "\n", - "0\n", - ""int_to_float"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", "\n", "14:out.0->15:in.0\n", - "\n", - "int\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "16\n", + "\n", + "\n", + "\n", + "0\n", + "ineg\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", "\n", "15:out.0->16:in.0\n", - "\n", - "float\n", - "\n", - "\n", - "\n", - "20\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""and"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "16:out.0->20:in.0\n", - "\n", - "bool\n", + "\n", + "int\n", "\n", "\n", - "\n", - "17\n", - "\n", - ""Constant: 5"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", "\n", - "18\n", - "\n", - "\n", - "\n", - "0\n", - ""int_to_float"\n", - "\n", - "\n", - "0\n", - "\n", + "17\n", + "\n", + "\n", + "\n", + "0\n", + "convert_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "16:out.0->17:in.0\n", + "\n", + "int\n", "\n", "\n", "\n", "17:out.0->18:in.0\n", - "\n", - "int\n", + "\n", + "float\n", "\n", "\n", "\n", - "18:out.0->19:in.1\n", - "\n", - "int\n", + "18:out.0->19:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "4\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "20\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "4:out.0->20\n", + "\n", + "\n", + "\n", + "\n", + "38\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "4:out.1->38\n", + "\n", + "\n", + "\n", + "\n", + "21\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "\n", + "25\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "fgt\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "21:out.0->25:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "27\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "21:out.0->27:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "21:out.1->27:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "21:out.2->27:in.2\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "22\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "23\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "22:out.0->23:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "24\n", + "\n", + "\n", + "\n", + "0\n", + "convert_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "23:out.0->24:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "24:out.0->25:in.1\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "28\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Conditional\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "25:out.0->28:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "26\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "26:out.0->28:in.1\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "27:out.0->28:in.2\n", + "\n", + "(float, int, float)\n", + "\n", + "\n", + "\n", + "30\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "31\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "30:out.0->31:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "32\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "31:out.0->32:in.0\n", + "\n", + "Sum((), (float, int, float))\n", + "\n", + "\n", + "\n", + "29\n", + "\n", + "Case\n", + "\n", + "\n", + "\n", + "\n", + "34\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "35\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "34:out.1->35:in.0\n", + "\n", + "(float, int, float)\n", + "\n", + "\n", + "\n", + "36\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "35:out.0->36:in.0\n", + "\n", + "Sum((), (float, int, float))\n", + "\n", + "\n", + "\n", + "33\n", + "\n", + "Case\n", + "\n", + "\n", + "\n", + "\n", + "37\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "28:out.0->37:in.0\n", + "\n", + "Sum((), (float, int, float))\n", + "\n", + "\n", + "\n", + "20:out.1->38\n", + "\n", + "\n", + "\n", + "\n", + "58\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "20:out.0->58\n", + "\n", + "\n", + "\n", + "\n", + "39\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "\n", + "40\n", + "\n", + "\n", + "\n", + "0\n", + "convert_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "39:out.1->40:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "41\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "fmul\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "39:out.2->41:in.1\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "46\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "39:out.0->46:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "39:out.1->46:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "40:out.0->41:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "45\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "feq\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "41:out.0->45:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "42\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "43\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "42:out.0->43:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "44\n", + "\n", + "\n", + "\n", + "0\n", + "convert_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "43:out.0->44:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "44:out.0->45:in.1\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "48\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Conditional\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "45:out.0->48:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "46:out.0->48:in.1\n", + "\n", + "(float, int)\n", + "\n", + "\n", + "\n", + "47\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "47:out.0->48:in.2\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "50\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "51\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "50:out.0->51:in.0\n", + "\n", + "(float, int)\n", + "\n", + "\n", + "\n", + "52\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "51:out.0->52:in.0\n", + "\n", + "Sum((float, int), ())\n", + "\n", + "\n", + "\n", + "49\n", + "\n", + "Case\n", + "\n", + "\n", + "\n", + "\n", + "54\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "55\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "54:out.1->55:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "56\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "55:out.0->56:in.0\n", + "\n", + "Sum((float, int), ())\n", + "\n", + "\n", + "\n", + "53\n", + "\n", + "Case\n", + "\n", + "\n", + "\n", + "\n", + "57\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "48:out.0->57:in.0\n", + "\n", + "Sum((float, int), ())\n", + "\n", + "\n", + "\n", + "65\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "38:out.0->65\n", + "\n", + "\n", + "\n", + "\n", + "77\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "38:out.1->77\n", + "\n", + "\n", + "\n", + "\n", + "59\n", + "\n", + "Input\n", + "\n", + "\n", + "\n", + "\n", + "60\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "61\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "60:out.0->61:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "64\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "61:out.0->64:in.1\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "62\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "63\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "62:out.0->63:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "63:out.0->64:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "84\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "58:out.0->84\n", + "\n", + "\n", + "\n", + "\n", + "66\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "70\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "fdiv\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "66:out.0->70:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "74\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "fsub\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "66:out.0->74:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "75\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "ilt_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "66:out.1->75:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "67\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "68\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "67:out.0->68:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "69\n", + "\n", + "\n", + "\n", + "0\n", + "convert_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "68:out.0->69:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "72\n", + "\n", + "\n", + "\n", + "0\n", + "convert_s\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "68:out.0->72:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "69:out.0->70:in.1\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "71\n", + "\n", + "\n", + "\n", + "0\n", + "ffloor\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "70:out.0->71:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "73\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "fmul\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "71:out.0->73:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "72:out.0->73:in.1\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "73:out.0->74:in.1\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "74:out.0->75:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "76\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "75:out.0->76:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "65:out.0->58\n", + "\n", + "\n", + "\n", + "\n", + "65:out.1->77\n", + "\n", + "\n", + "\n", + "\n", + "78\n", + "\n", + "Input\n", + "\n", + "\n", + "\n", + "\n", + "79\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "80\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "79:out.0->80:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "83\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "80:out.0->83:in.1\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "81\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "82\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "81:out.0->82:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "82:out.0->83:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "77:out.0->84\n", + "\n", + "\n", + "\n", + "\n", + "85\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "88\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "85:out.0->88:in.1\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "86\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "87\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "86:out.0->87:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "87:out.0->88:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "89\n", + "\n", + "Exit\n", + "\n", + "\n", + "\n", + "\n", + "84:out.0->89\n", + "\n", + "\n", + "\n", + "\n", + "90\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "3:out.0->90:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "FuncDefn\n", + "name: arith2\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "Module\n", + "name: module\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@guppy\n", + "def arith2(x: int, y: float, z: int) -> bool:\n", + " a = x//y + 3*z\n", + " b = -8 >= a > 5 or (x*y == 0 and a % 3 < x)\n", + " return b\n", + "\n", + "arith2" + ] + }, + { + "cell_type": "markdown", + "id": "6bb7860a", + "metadata": {}, + "source": [ + "## Nested Functions and Higher-Order\n", + "\n", + "Guppy supports nested function definitions with variables captured from outer scopes." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "dabd6c13", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "module\n", + "\n", + "\n", + "cluster0\n", + "\n", + "\n", + "\n", + "cluster1\n", + "\n", + "\n", + "\n", + "cluster3\n", + "\n", + "\n", + "\n", + "cluster4\n", + "\n", + "\n", + "\n", + "cluster6\n", + "\n", + "\n", + "\n", + "cluster8\n", + "\n", + "\n", + "\n", + "cluster9\n", + "\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "\n", + "\n", + "0\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "2:out.0->3:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "5\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "18\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + ""partial"\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "5:out.0->18:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "7\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "8\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "7:out.0->8:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "7:out.1->8:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "10\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "11\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "iadd\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "10:out.0->11:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "10:out.1->11:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "14\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "11:out.0->14:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "12\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "13\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "12:out.0->13:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "13:out.0->14:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "9\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "15\n", + "\n", + "Exit\n", + "\n", + "\n", + "\n", + "\n", + "9:out.0->15\n", + "\n", + "\n", + "\n", + "\n", + "16\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "8:out.0->16:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "6\n", + "\n", + "FuncDefn\n", + "name: nested\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "17\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "6:out.0->17:in.0\n", + "\n", + "(int, int) -> int\n", + "\n", + "\n", + "\n", + "17:out.0->18:in.1\n", + "\n", + "(int, int) -> int\n", + "\n", + "\n", + "\n", + "21\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "CallIndirect\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "18:out.0->21:in.0\n", + "\n", + "int -> int\n", + "\n", + "\n", + "\n", + "19\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "20\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "19:out.0->20:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "20:out.0->21:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "24\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "21:out.0->24:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "22\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "23\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "22:out.0->23:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "23:out.0->24:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "4\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "25\n", + "\n", + "Exit\n", + "\n", + "\n", + "\n", + "\n", + "4:out.0->25\n", + "\n", + "\n", + "\n", + "\n", + "26\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "3:out.0->26:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "FuncDefn\n", + "name: outer\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "Module\n", + "name: module\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@guppy\n", + "def outer(x: int) -> int:\n", + " def nested(y: int) -> int:\n", + " return x + y\n", + " return nested(42)\n", + "\n", + "outer" + ] + }, + { + "cell_type": "markdown", + "id": "c5107da5", + "metadata": {}, + "source": [ + "However, similar to regular Python, variables from enclosing functions scopes may not be modified. Python's `global` and `nonlocal` statements are not supported by Guppy." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "677840d8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Guppy compilation failed. Error in file /var/folders/tw/395bz2tx0nv7wnltsw_zk7740000gn/T/ipykernel_40197/2923744560.py:4\n", + "\n", + "2: def outer(x: int) -> int:\n", + "3: def nested() -> None:\n", + "4: x += 1\n", + " ^^^^^^\n", + "GuppyError: Variable `x` defined in an outer scope (at 2:10) may not be assigned to\n" + ] + } + ], + "source": [ + "@guppy\n", + "def outer(x: int) -> int:\n", + " def nested() -> None:\n", + " x += 1\n", + " nested()\n", + " return x" + ] + }, + { + "cell_type": "markdown", + "id": "d56b34af", + "metadata": {}, + "source": [ + "## Modules\n", + "\n", + "In order to use call other Guppy functions, they must be placed in the same module:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f7b511d3", + "metadata": {}, + "outputs": [], + "source": [ + "module = GuppyModule(\"mutual_rec_module\")\n", + "\n", + "@module\n", + "def is_even(x: int) -> bool:\n", + " if x == 0:\n", + " return True\n", + " return is_odd(x-1)\n", + "\n", + "@module\n", + "def is_odd(x: int) -> bool:\n", + " if x == 0:\n", + " return False\n", + " return is_even(x-1)" + ] + }, + { + "cell_type": "markdown", + "id": "806db4a6", + "metadata": {}, + "source": [ + "Compilation of modules needs to be triggered separately, after all functions are defined (in order to support mutual recursion):" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f2d3309c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "mutual_rec_module\n", + "\n", + "\n", + "cluster0\n", + "\n", + "\n", + "\n", + "cluster2\n", + "\n", + "\n", + "\n", + "cluster41\n", + "\n", + "\n", + "\n", + "cluster42\n", + "\n", + "\n", + "\n", + "cluster49\n", + "\n", + "\n", + "\n", + "cluster50\n", + "\n", + "\n", + "\n", + "cluster54\n", + "\n", + "\n", + "\n", + "cluster59\n", + "\n", + "\n", + "\n", + "cluster66\n", + "\n", + "\n", + "\n", + "cluster1\n", + "\n", + "\n", + "\n", + "cluster4\n", + "\n", + "\n", + "\n", + "cluster22\n", + "\n", + "\n", + "\n", + "cluster29\n", + "\n", + "\n", + "\n", + "cluster5\n", + "\n", + "\n", + "\n", + "cluster12\n", + "\n", + "\n", + "\n", + "cluster13\n", + "\n", + "\n", + "\n", + "cluster17\n", + "\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "4\n", + "\n", + "\n", + "\n", + "0\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "3:out.0->4:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "6\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "9\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "ieq\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "6:out.0->9:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "11\n", + "\n", + "\n", + "\n", + "0\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "6:out.0->11:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "7\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "8\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "7:out.0->8:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "8:out.0->9:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "12\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Conditional\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "9:out.0->12:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "10\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "10:out.0->12:in.1\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "11:out.0->12:in.2\n", + "\n", + "(int)\n", + "\n", + "\n", + "\n", + "14\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "15\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "14:out.0->15:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "16\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "15:out.0->16:in.0\n", + "\n", + "Sum((), (int))\n", + "\n", + "\n", + "\n", + "13\n", + "\n", + "Case\n", + "\n", + "\n", + "\n", + "\n", + "18\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "19\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "18:out.1->19:in.0\n", + "\n", + "(int)\n", + "\n", + "\n", + "\n", + "20\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "19:out.0->20:in.0\n", + "\n", + "Sum((), (int))\n", + "\n", + "\n", + "\n", + "17\n", + "\n", + "Case\n", + "\n", + "\n", + "\n", + "\n", + "21\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "12:out.0->21:in.0\n", + "\n", + "Sum((), (int))\n", + "\n", + "\n", + "\n", + "5\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "22\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "5:out.0->22\n", + "\n", + "\n", + "\n", + "\n", + "29\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "5:out.1->29\n", + "\n", + "\n", + "\n", + "\n", + "23\n", + "\n", + "Input\n", + "\n", + "\n", + "\n", + "\n", + "24\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "25\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "24:out.0->25:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "28\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "25:out.0->28:in.1\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "26\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "27\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "26:out.0->27:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "27:out.0->28:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "38\n", + "\n", + "Exit\n", + "\n", + "\n", + "\n", + "\n", + "22:out.0->38\n", + "\n", + "\n", + "\n", + "\n", + "30\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "33\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "sub\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "30:out.0->33:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "31\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "32\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "31:out.0->32:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "32:out.0->33:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "34\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Call\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "33:out.0->34:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "37\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "34:out.0->37:in.1\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "35\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "36\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "35:out.0->36:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "36:out.0->37:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "29:out.0->38\n", + "\n", + "\n", + "\n", + "\n", + "39\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "4:out.0->39:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "FuncDefn\n", + "name: is_even\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "71\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Call\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "1:out.0->71:in.1\n", + "\n", + "int -> bool\n", + "\n", + "\n", + "\n", + "40\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "41\n", + "\n", + "\n", + "\n", + "0\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "40:out.0->41:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "43\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "46\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "ieq\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "43:out.0->46:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "48\n", + "\n", + "\n", + "\n", + "0\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "43:out.0->48:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "44\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "45\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "44:out.0->45:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "45:out.0->46:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "49\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Conditional\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "46:out.0->49:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "47\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "47:out.0->49:in.1\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "48:out.0->49:in.2\n", + "\n", + "(int)\n", + "\n", + "\n", + "\n", + "51\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "52\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "51:out.0->52:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "53\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "52:out.0->53:in.0\n", + "\n", + "Sum((), (int))\n", + "\n", + "\n", + "\n", + "50\n", + "\n", + "Case\n", + "\n", + "\n", + "\n", + "\n", + "55\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "56\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "55:out.1->56:in.0\n", + "\n", + "(int)\n", + "\n", + "\n", + "\n", + "57\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "56:out.0->57:in.0\n", + "\n", + "Sum((), (int))\n", + "\n", + "\n", + "\n", + "54\n", + "\n", + "Case\n", + "\n", + "\n", + "\n", + "\n", + "58\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "49:out.0->58:in.0\n", + "\n", + "Sum((), (int))\n", + "\n", + "\n", + "\n", + "42\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "59\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "42:out.0->59\n", + "\n", + "\n", + "\n", + "\n", + "66\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "42:out.1->66\n", + "\n", + "\n", + "\n", + "\n", + "60\n", + "\n", + "Input\n", + "\n", + "\n", + "\n", + "\n", + "61\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "62\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "61:out.0->62:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "65\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "62:out.0->65:in.1\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "63\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "64\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "63:out.0->64:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "64:out.0->65:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "75\n", + "\n", + "Exit\n", + "\n", + "\n", + "\n", + "\n", + "59:out.0->75\n", + "\n", + "\n", + "\n", + "\n", + "67\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "70\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "sub\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "67:out.0->70:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "68\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "69\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "68:out.0->69:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "69:out.0->70:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "70:out.0->71:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "74\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "71:out.0->74:in.1\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "72\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "73\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "72:out.0->73:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "73:out.0->74:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "66:out.0->75\n", + "\n", + "\n", + "\n", + "\n", + "76\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "41:out.0->76:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "FuncDefn\n", + "name: is_odd\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "2:out.0->34:in.1\n", + "\n", + "int -> bool\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "Module\n", + "name: mutual_rec_module\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "module.compile()" + ] + }, + { + "cell_type": "markdown", + "id": "74ddb8cb", + "metadata": {}, + "source": [ + "## Higher-Order\n", + "\n", + "Functions can be used as higher-order values." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "92d4e69c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "higher_order\n", + "\n", + "\n", + "cluster0\n", + "\n", + "\n", + "\n", + "cluster1\n", + "\n", + "\n", + "\n", + "cluster4\n", + "\n", + "\n", + "\n", + "cluster5\n", + "\n", + "\n", + "\n", + "cluster7\n", + "\n", + "\n", + "\n", + "cluster9\n", + "\n", + "\n", + "\n", + "cluster10\n", + "\n", + "\n", + "\n", + "cluster2\n", + "\n", + "\n", + "\n", + "cluster26\n", + "\n", + "\n", + "\n", + "cluster27\n", + "\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "4\n", + "\n", + "\n", + "\n", + "0\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "3:out.0->4:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "6\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "19\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + ""partial"\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "6:out.0->19:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "8\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "9\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "8:out.0->9:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "8:out.1->9:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "11\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "12\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "iadd\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "11:out.1->12:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "11:out.0->12:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "15\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "12:out.0->15:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "13\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "19:out.0->20:in.1\n", - "\n", - "bool\n", + "\n", + "\n", + "14\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "31\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""or"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "20:out.0->31:in.0\n", - "\n", - "bool\n", + "\n", + "\n", + "13:out.0->14:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "14:out.0->15:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "10\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "16\n", + "\n", + "Exit\n", + "\n", + "\n", + "\n", + "\n", + "10:out.0->16\n", + "\n", + "\n", + "\n", + "\n", + "17\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "9:out.0->17:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "7\n", + "\n", + "FuncDefn\n", + "name: closure\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "18\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "7:out.0->18:in.0\n", + "\n", + "(int, int) -> int\n", + "\n", + "\n", + "\n", + "18:out.0->19:in.1\n", + "\n", + "(int, int) -> int\n", + "\n", + "\n", + "\n", + "22\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "19:out.0->22:in.1\n", + "\n", + "int -> int\n", + "\n", + "\n", + "\n", + "20\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "21\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "20:out.0->21:in.0\n", + "\n", + "()\n", "\n", "\n", - "\n", + "\n", "21:out.0->22:in.0\n", - "\n", - "float\n", + "\n", + "Sum(())\n", "\n", - "\n", - "\n", - "24\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""eq"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "22:out.0->24:in.0\n", - "\n", - "float\n", + "\n", + "\n", + "5\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "23\n", - "\n", - ""Constant: 0"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Exit\n", + "\n", "\n", - "\n", - "\n", - "23:out.0->24:in.1\n", - "\n", - "int\n", + "\n", + "\n", + "5:out.0->23\n", + "\n", "\n", - "\n", - "\n", - "30\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""and"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "24:out.0->30:in.0\n", - "\n", - "bool\n", + "\n", + "\n", + "24\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "4:out.0->24:in.0\n", + "\n", + "int -> int\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "FuncDefn\n", + "name: increment_by\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "31\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Call\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "1:out.0->31:in.1\n", + "\n", + "int -> int -> int\n", "\n", "\n", - "\n", + "\n", "25\n", - "\n", - ""Constant: 3"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "26\n", - "\n", - "\n", - "\n", - "0\n", - ""int_to_float"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "25:out.0->26:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "28\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "32\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "CallIndirect\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "28:out.0->32:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "29\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "30\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "29:out.0->30:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "30:out.0->31:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "31:out.0->32:in.0\n", + "\n", + "int -> int\n", + "\n", + "\n", + "\n", + "35\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "32:out.0->35:in.1\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "33\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "34\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "33:out.0->34:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "34:out.0->35:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "27\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "36\n", + "\n", + "Exit\n", + "\n", + "\n", + "\n", + "\n", + "27:out.0->36\n", + "\n", + "\n", + "\n", + "\n", + "37\n", + "\n", + "\n", + "\n", + "0\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "26:out.0->37:in.0\n", + "\n", + "int\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "FuncDefn\n", + "name: main\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "Module\n", + "name: higher_order\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "module = GuppyModule(\"higher_order\")\n", + "\n", + "@module\n", + "def increment_by(inc: int) -> Callable[[int], int]:\n", + " def closure(x: int) -> int:\n", + " return x + inc\n", + " return closure\n", + "\n", + "@module\n", + "def main(x: int) -> int:\n", + " inc5 = increment_by(5)\n", + " return inc5(x)\n", + "\n", + "module.compile()" + ] + }, + { + "cell_type": "markdown", + "id": "ab54e568", + "metadata": {}, + "source": [ + "# Quantum Programs\n", + "\n", + "In order to write quantum programs, the quantum extension needs to be loaded." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c9c6faae", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "test\n", + "\n", + "\n", + "cluster0\n", + "\n", + "\n", + "\n", + "cluster1\n", + "\n", + "\n", + "\n", + "cluster3\n", + "\n", + "\n", + "\n", + "cluster4\n", + "\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "3\n", + "\n", + "\n", + "\n", + "0\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "2:out.0->3:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "5\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "8\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "RzF64\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "5:out.0->8:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "6\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "7\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "6:out.0->7:in.0\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "7:out.0->8:in.1\n", + "\n", + "float\n", + "\n", + "\n", + "\n", + "9\n", + "\n", + "\n", + "\n", + "0\n", + "Measure\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", - "\n", - "\n", - "25:out.0->26:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "8:out.0->9:in.0\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "26:out.0->27:in.1\n", - "\n", - "int\n", + "\n", + "\n", + "10\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "29\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""flt"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "27:out.0->29:in.0\n", - "\n", - "float\n", + "\n", + "\n", + "9:out.0->10:in.0\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "28:out.0->29:in.1\n", - "\n", - "int\n", + "\n", + "\n", + "9:out.1->10:in.1\n", + "\n", + "bool\n", "\n", - "\n", - "\n", - "29:out.0->30:in.1\n", - "\n", - "bool\n", + "\n", + "\n", + "11\n", + "\n", + "\n", + "\n", + "0\n", + "UnpackTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", - "\n", - "\n", - "30:out.0->31:in.1\n", - "\n", - "bool\n", + "\n", + "\n", + "10:out.0->11:in.0\n", + "\n", + "(Qubit, bool)\n", "\n", - "\n", - "\n", - "34\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "31:out.0->34:in.1\n", - "\n", - "bool\n", + "\n", + "\n", + "14\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "11:out.0->14:in.1\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "32\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "11:out.1->14:in.2\n", + "\n", + "bool\n", "\n", - "\n", - "\n", - "33\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "12\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "32:out.0->33:in.0\n", - "\n", - "()\n", + "\n", + "\n", + "13\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "12:out.0->13:in.0\n", + "\n", + "()\n", "\n", - "\n", - "\n", - "33:out.0->34:in.0\n", - "\n", - "Sum(())\n", + "\n", + "\n", + "13:out.0->14:in.0\n", + "\n", + "Sum(())\n", "\n", "\n", - "\n", + "\n", "4\n", - "\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "6\n", - "\n", - "\n", - "\n", - "0\n", - "Exit\n", - "\n", - "\n", - "\n", - "\n", - "4:out.0->6:in.0\n", - "\n", + "\n", + "\n", + "15\n", + "\n", + "Exit\n", + "\n", "\n", - "\n", - "\n", - "35\n", - "\n", - "\n", - "\n", - "0\n", - "Output\n", - "\n", - "\n", - "\n", + "\n", "\n", - "3:out.0->35:in.0\n", - "\n", - "bool\n", + "4:out.0->15\n", + "\n", + "\n", + "\n", + "\n", + "16\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "3:out.0->16:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "3:out.1->16:in.1\n", + "\n", + "bool\n", "\n", "\n", - "\n", + "\n", "1\n", - "\n", - "Def\n", - "name: arith2\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "FuncDefn\n", + "name: main\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "0\n", - "\n", - "Root\n", - "name: module\n", - "\n", + "\n", + "Module\n", + "name: test\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 9, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "@guppy\n", - "def arith2(x: int, y: float, z: int) -> bool:\n", - " a = x**y + 3*z\n", - " b = -8 >= a > 5 or (x*y == 0 and a % 3 < x)\n", - " return b\n", - "\n", - "arith2" - ] - }, - { - "cell_type": "markdown", - "id": "d56b34af", - "metadata": {}, - "source": [ - "## Modules\n", + "import guppy.prelude.quantum as quantum\n", + "from guppy.prelude.quantum import Qubit\n", "\n", - "In order to use call other Guppy functions, they must be placed in the same module:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "f7b511d3", - "metadata": {}, - "outputs": [], - "source": [ - "module = GuppyModule(\"mutual_rec_module\")\n", + "module = GuppyModule(\"test\")\n", + "module.load(quantum)\n", "\n", "@module\n", - "def is_even(x: int) -> bool:\n", - " if x == 0:\n", - " return True\n", - " return is_odd(x-1)\n", + "def main(q: Qubit) -> tuple[Qubit, bool]:\n", + " q = rz(q, 3.1415)\n", + " return measure(q)\n", "\n", - "@module\n", - "def is_odd(x: int) -> bool:\n", - " if x == 0:\n", - " return False\n", - " return is_even(x-1)" + "module.compile()" ] }, { "cell_type": "markdown", - "id": "806db4a6", + "id": "73d6ddae", "metadata": {}, "source": [ - "Compilation of modules needs to be triggered separately, after all functions are defined (in order to support mutual recursion):" + "Below is a more involved example with control flow, implementing the $V_3 = \\exp(i*\\arctan(2)*Z)$ gate via the repeat-until-success algorithm from arXiv:1311.1074 (Fig 1c)." ] }, { "cell_type": "code", - "execution_count": 11, - "id": "f2d3309c", + "execution_count": 14, + "id": "ccd1f3fb", "metadata": {}, "outputs": [ { @@ -2979,887 +6768,1595 @@ " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", "\n", - "\n", - "\n", - "\n", - "mutual_rec_module\n", - "\n", + "\n", + "\n", + "\n", + "rus\n", + "\n", "\n", "cluster0\n", - "\n", + "\n", "\n", "\n", "cluster1\n", - "\n", + "\n", "\n", "\n", - "cluster4\n", - "\n", - "\n", - "\n", - "cluster5\n", - "\n", - "\n", - "\n", - "cluster11\n", - "\n", + "cluster3\n", + "\n", "\n", "\n", - "cluster17\n", - "\n", + "cluster14\n", + "\n", "\n", "\n", - "cluster2\n", - "\n", + "cluster27\n", + "\n", "\n", "\n", - "cluster27\n", - "\n", + "cluster34\n", + "\n", "\n", "\n", - "cluster28\n", - "\n", + "cluster46\n", + "\n", "\n", "\n", - "cluster34\n", - "\n", + "cluster55\n", + "\n", "\n", "\n", - "cluster40\n", - "\n", + "cluster60\n", + "\n", "\n", - "\n", + "\n", + "cluster9\n", + "\n", + "\n", + "\n", + "cluster4\n", + "\n", + "\n", + "\n", "\n", + "2\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "\n", "3\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "CFG\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", "\n", - "\n", - "\n", - "4\n", - "\n", - "\n", - "\n", - "0\n", - "CFG\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "2:out.0->3:in.0\n", + "\n", + "Qubit\n", "\n", - "\n", + "\n", + "\n", + "2:out.1->3:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", "\n", - "3:out.0->4:in.0\n", - "\n", - "int\n", + "2:out.2->3:in.2\n", + "\n", + "Qubit\n", "\n", - "\n", + "\n", "\n", + "5\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "\n", + "8\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "3\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "5:out.1->8:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "5:out.2->8:in.2\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "5:out.0->8:in.3\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", "6\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", + "\n", "\n", - "9\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""eq"\n", - "\n", - "\n", - "0\n", - "\n", + "7\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "6:out.0->7:in.0\n", + "\n", + "()\n", "\n", - "\n", + "\n", + "\n", + "7:out.0->8:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "4\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "9\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", "\n", - "6:out.0->9:in.0\n", - "\n", - "int\n", + "4:out.0->9\n", + "\n", "\n", "\n", - "\n", + "\n", "10\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "6:out.0->10:in.1\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "8\n", - "\n", - ""Constant: 0"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", "\n", - "\n", - "\n", - "8:out.0->9:in.1\n", - "\n", - "int\n", + "\n", + "\n", + "13\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "3\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "10:out.0->13:in.1\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "9:out.0->10:in.0\n", - "\n", - "bool\n", + "\n", + "\n", + "10:out.1->13:in.2\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "5\n", - "\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", + "\n", + "\n", + "10:out.2->13:in.3\n", + "\n", + "Qubit\n", "\n", "\n", - "\n", + "\n", "11\n", - "\n", - "\n", - "\n", - "0\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "5:out.0->11:in.0\n", - "\n", - "\n", - "\n", - "\n", - "17\n", - "\n", - "\n", - "\n", - "0\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "5:out.1->17:in.0\n", - "\n", - "\n", - "\n", - "\n", - "7\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Exit\n", - "\n", + "\n", + "Const\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "12\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "LoadConstant\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "13\n", - "\n", - ""Constant: True"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "11:out.0->12:in.0\n", + "\n", + "bool\n", "\n", - "\n", - "\n", - "16\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "13:out.0->16:in.1\n", - "\n", - "bool\n", + "\n", + "\n", + "12:out.0->13:in.0\n", + "\n", + "bool\n", "\n", "\n", - "\n", + "\n", "14\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "9:out.0->14\n", + "\n", + "\n", + "\n", + "\n", + "27\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "9:out.1->27\n", + "\n", "\n", "\n", - "\n", + "\n", "15\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", "\n", - "\n", - "\n", - "14:out.0->15:in.0\n", - "\n", - "()\n", + "\n", + "\n", + "16\n", + "\n", + "\n", + "\n", + "0\n", + "H\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "15:out.0->16:in.0\n", - "\n", - "Sum(())\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "11:out.0->7:in.0\n", - "\n", + "\n", + "\n", + "17\n", + "\n", + "\n", + "\n", + "0\n", + "H\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "15:out.1->17:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "26\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "3\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "15:out.2->26:in.3\n", + "\n", + "Qubit\n", "\n", "\n", - "\n", + "\n", "18\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "Tdg\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "16:out.0->18:in.0\n", + "\n", + "Qubit\n", "\n", - "\n", + "\n", "\n", + "19\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "CX\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "17:out.0->19:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "18:out.0->19:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", "20\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""isub"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "18:out.0->20:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "19\n", - "\n", - ""Constant: 1"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "19:out.0->20:in.0\n", + "\n", + "Qubit\n", "\n", "\n", - "\n", - "19:out.0->20:in.1\n", - "\n", - "int\n", + "\n", + "19:out.1->20:in.1\n", + "\n", + "Qubit\n", "\n", "\n", - "\n", + "\n", "21\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Call\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "UnpackTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", "\n", - "\n", + "\n", "20:out.0->21:in.0\n", - "\n", - "int\n", - "\n", - "\n", - "\n", - "24\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "21:out.0->24:in.1\n", - "\n", - "bool\n", + "\n", + "(Qubit, Qubit)\n", "\n", "\n", - "\n", + "\n", "22\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "T\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "21:out.1->22:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "21:out.0->26:in.2\n", + "\n", + "Qubit\n", "\n", "\n", - "\n", + "\n", "23\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "Measure\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", "\n", - "\n", + "\n", "22:out.0->23:in.0\n", - "\n", - "()\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "24\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "23:out.0->24:in.0\n", - "\n", - "Sum(())\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "17:out.0->7:in.1\n", - "\n", + "\n", + "\n", + "23:out.1->24:in.1\n", + "\n", + "bool\n", "\n", "\n", - "\n", + "\n", "25\n", - "\n", - "\n", - "\n", - "0\n", - "Output\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "UnpackTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", - "\n", - "\n", - "4:out.0->25:in.0\n", - "\n", - "bool\n", + "\n", + "\n", + "24:out.0->25:in.0\n", + "\n", + "(Qubit, bool)\n", "\n", - "\n", - "\n", - "1\n", - "\n", - "Def\n", - "name: is_even\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "25:out.1->26:in.0\n", + "\n", + "bool\n", "\n", - "\n", - "\n", - "44\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Call\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "1:out.0->44:in.1\n", - "\n", - "int -> bool\n", + "\n", + "\n", + "25:out.0->26:in.1\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "26\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "34\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "14:out.0->34\n", + "\n", "\n", - "\n", - "\n", - "27\n", - "\n", - "\n", - "\n", - "0\n", - "CFG\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "46\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "14:out.1->46\n", + "\n", "\n", - "\n", - "\n", - "26:out.0->27:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "28\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", "\n", "\n", "\n", "29\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "32\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""eq"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "28:out.2->29:in.0\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "29:out.0->32:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "28:out.0->29:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "28:out.1->29:in.2\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "30\n", + "\n", + "\n", + "\n", + "0\n", + "UnpackTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "\n", + "29:out.0->30:in.0\n", + "\n", + "(Qubit, Qubit, Qubit)\n", "\n", "\n", - "\n", + "\n", "33\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "29:out.0->33:in.1\n", - "\n", - "int\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "3\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "30:out.0->33:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "30:out.1->33:in.2\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "30:out.2->33:in.3\n", + "\n", + "Qubit\n", "\n", "\n", - "\n", + "\n", "31\n", - "\n", - ""Constant: 0"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "32\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", - "31:out.0->32:in.1\n", - "\n", - "int\n", + "\n", + "31:out.0->32:in.0\n", + "\n", + "()\n", "\n", "\n", - "\n", + "\n", "32:out.0->33:in.0\n", - "\n", - "bool\n", - "\n", - "\n", - "\n", - "28\n", - "\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "\n", - "\n", - "\n", - "\n", - "34\n", - "\n", - "\n", - "\n", - "0\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "28:out.0->34:in.0\n", - "\n", + "\n", + "Sum(())\n", "\n", - "\n", - "\n", - "40\n", - "\n", - "\n", - "\n", - "0\n", - "Block\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "28:out.1->40:in.0\n", - "\n", + "\n", + "\n", + "54\n", + "\n", + "Exit\n", + "\n", "\n", - "\n", - "\n", - "30\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Exit\n", - "\n", + "\n", + "\n", + "27:out.0->54\n", + "\n", "\n", "\n", "\n", "35\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", "\n", "\n", "\n", "36\n", - "\n", - ""Constant: False"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "T\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "35:out.2->36:in.0\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "39\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "36:out.0->39:in.1\n", - "\n", - "bool\n", + "\n", + "\n", + "38\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "CX\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "35:out.1->38:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "45\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "3\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "35:out.0->45:in.1\n", + "\n", + "Qubit\n", "\n", "\n", "\n", "37\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "38\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "Z\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "36:out.0->37:in.0\n", + "\n", + "Qubit\n", "\n", "\n", - "\n", + "\n", "37:out.0->38:in.0\n", - "\n", - "()\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "39\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "38:out.0->39:in.0\n", - "\n", - "Sum(())\n", + "\n", + "Qubit\n", "\n", - "\n", - "\n", - "34:out.0->30:in.0\n", - "\n", + "\n", + "\n", + "38:out.1->39:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "40\n", + "\n", + "\n", + "\n", + "0\n", + "UnpackTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "39:out.0->40:in.0\n", + "\n", + "(Qubit, Qubit)\n", "\n", "\n", "\n", "41\n", - "\n", - "Input\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "T\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "40:out.1->41:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "40:out.0->45:in.3\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "42\n", + "\n", + "\n", + "\n", + "0\n", + "Measure\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "41:out.0->42:in.0\n", + "\n", + "Qubit\n", "\n", "\n", "\n", "43\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - ""isub"\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "41:out.0->43:in.0\n", - "\n", - "int\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", "\n", - "\n", - "\n", - "42\n", - "\n", - ""Constant: 1"\n", - "\n", - "\n", - "0\n", - "\n", + "\n", + "\n", + "42:out.0->43:in.0\n", + "\n", + "Qubit\n", "\n", "\n", - "\n", - "42:out.0->43:in.1\n", - "\n", - "int\n", + "\n", + "42:out.1->43:in.1\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "44\n", + "\n", + "\n", + "\n", + "0\n", + "UnpackTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", "\n", "\n", - "\n", + "\n", "43:out.0->44:in.0\n", - "\n", - "int\n", + "\n", + "(Qubit, bool)\n", + "\n", + "\n", + "\n", + "44:out.1->45:in.0\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "44:out.0->45:in.2\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "55\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "34:out.0->55\n", + "\n", + "\n", + "\n", + "\n", + "60\n", + "\n", + "DFB\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "34:out.1->60\n", + "\n", "\n", "\n", "\n", "47\n", - "\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "1\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "44:out.0->47:in.1\n", - "\n", - "bool\n", - "\n", - "\n", - "\n", - "45\n", - "\n", - "MakeTuple\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "46\n", - "\n", - "\n", - "\n", - "0\n", - "Tag\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "45:out.0->46:in.0\n", - "\n", - "()\n", - "\n", - "\n", - "\n", - "46:out.0->47:in.0\n", - "\n", - "Sum(())\n", - "\n", - "\n", - "\n", - "40:out.0->30:in.1\n", - "\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", "\n", "\n", - "\n", + "\n", "48\n", - "\n", - "\n", - "\n", - "0\n", - "Output\n", - "\n", - "\n", - "\n", - "\n", - "27:out.0->48:in.0\n", - "\n", - "bool\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "0\n", + "Measure\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "47:out.1->48:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "53\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "3\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "47:out.0->53:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "47:out.2->53:in.3\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "49\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "48:out.0->49:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "48:out.1->49:in.1\n", + "\n", + "bool\n", + "\n", + "\n", + "\n", + "50\n", + "\n", + "\n", + "\n", + "0\n", + "UnpackTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "\n", + "\n", + "49:out.0->50:in.0\n", + "\n", + "(Qubit, bool)\n", + "\n", + "\n", + "\n", + "50:out.0->53:in.2\n", + "\n", + "Qubit\n", + "\n", + "\n", "\n", - "2\n", - "\n", - "Def\n", - "name: is_odd\n", - "\n", - "\n", - "0\n", - "\n", - "\n", - "\n", - "\n", - "2:out.0->21:in.1\n", - "\n", - "int -> bool\n", + "51\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "52\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "51:out.0->52:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "52:out.0->53:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "46:out.0->9\n", + "\n", + "\n", + "\n", + "\n", + "56\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "\n", + "59\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "3\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "56:out.0->59:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "56:out.1->59:in.2\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "56:out.2->59:in.3\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "57\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "58\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "57:out.0->58:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "58:out.0->59:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "55:out.0->27\n", + "\n", + "\n", + "\n", + "\n", + "61\n", + "\n", + "Input\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "\n", + "\n", + "62\n", + "\n", + "\n", + "\n", + "0\n", + "X\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "61:out.2->62:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "65\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "\n", + "\n", + "3\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "61:out.0->65:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "61:out.1->65:in.2\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "62:out.0->65:in.3\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "63\n", + "\n", + "MakeTuple\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "64\n", + "\n", + "\n", + "\n", + "0\n", + "Tag\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "\n", + "\n", + "63:out.0->64:in.0\n", + "\n", + "()\n", + "\n", + "\n", + "\n", + "64:out.0->65:in.0\n", + "\n", + "Sum(())\n", + "\n", + "\n", + "\n", + "60:out.0->9\n", + "\n", + "\n", + "\n", + "\n", + "66\n", + "\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "2\n", + "Output\n", + "\n", + "\n", + "\n", + "\n", + "3:out.0->66:in.0\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "3:out.1->66:in.1\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "3:out.2->66:in.2\n", + "\n", + "Qubit\n", + "\n", + "\n", + "\n", + "1\n", + "\n", + "FuncDefn\n", + "name: apply_v3\n", + "\n", + "\n", + "0\n", + "\n", "\n", "\n", - "\n", + "\n", "0\n", - "\n", - "Root\n", - "name: mutual_rec_module\n", - "\n", + "\n", + "Module\n", + "name: rus\n", + "\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 11, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "module = GuppyModule(\"rus\")\n", + "module.load(quantum)\n", + "\n", + "@module\n", + "def apply_v3(q: Qubit, a: Qubit, b: Qubit) -> tuple[Qubit, Qubit, Qubit]:\n", + " while True:\n", + " a, b = h(a), h(b)\n", + "\n", + " b, a = cx(b, tdg(a))\n", + " a = t(a)\n", + " a, res = measure(a)\n", + " if not res:\n", + " b, _ = measure(b) # Discard b\n", + " continue\n", + "\n", + " q, b = cx(z(t(q)), b)\n", + " b = t(b)\n", + " b, res = measure(b)\n", + " if res:\n", + " break\n", + "\n", + " q = x(q) # Apply correction\n", + " \n", + " return q, a, b\n", + "\n", "module.compile()" ] }