{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# PSET 1: Bottom-Up Synthesis\n", "\n", "I follow Algorithm 1 in the BUSTLE paper:\n", "\n", "> Odena, A. *et al.* BUSTLE: Bottom-Up Program Synthesis Through Learning-Guided Exploration. in *9th International Conference on Learning Representations*; 2021 May 3-7; Austria.\n", "\n", "First, I import the required libraries." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import itertools\n", "\n", "# argument parser for command line arguments\n", "import argparse\n", "\n", "# import arithmetic module\n", "# from arithmetic import *\n", "from examples import examples\n", "\n", "# import project config file\n", "import sys\n", "sys.path.append('..')\n", "import project_config" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, I define variables as proxies for command-line arguments provided to the synthesizer." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "domain = \"arithmetic\"\n", "examples_key = \"addition\"\n", "examples = examples[examples_key]\n", "max_level = 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I provide examples of arithmetic operations." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "'''\n", "ARTHIMETIC OPERATORS\n", "This file contains Python classes that define the arithmetic operators for program synthesis.\n", "'''\n", "\n", "'''\n", "CLASS DEFINITIONS\n", "''' \n", "\n", "class IntegerValue:\n", " '''\n", " Class to represent an arithmetic value.\n", " '''\n", " def __init__(self, value):\n", " self.value = value\n", " self.type = int\n", "\n", "class Add:\n", " '''\n", " Operator to add two numerical values.\n", " '''\n", " def __init__(self):\n", " self.arity = 2 # number of arguments of function\n", " self.weight = 1 # weight of function\n", " self.return_type = int # return type of function\n", "\n", " def __call__(self, x, y):\n", " return x + y\n", " \n", " def str(x, y):\n", " return f\"{x} + {y}\"\n", "\n", "class Subtract:\n", " '''\n", " Operator to subtract two numerical values.\n", " '''\n", " def __init__(self):\n", " self.arity = 2 # number of arguments of function\n", " self.weight = 1 # weight of function\n", " self.return_type = int # return type of function\n", "\n", " def __call__(self, x, y):\n", " return x - y\n", " \n", " def str(x, y):\n", " return f\"{x} - {y}\"\n", " \n", "class Multiply:\n", " '''\n", " Operator to multiply two numerical values.\n", " '''\n", " def __init__(self):\n", " self.arity = 2 # number of arguments of function\n", " self.weight = 1 # weight of function\n", " self.return_type = int # return type of function\n", "\n", " def __call__(self, x, y):\n", " return x * y\n", " \n", " def str(x, y):\n", " return f\"{x} * {y}\" \n", "\n", "class Divide:\n", " '''\n", " Operator to divide two numerical values.\n", " '''\n", " def __init__(self):\n", " self.arity = 2 # number of arguments of function\n", " self.weight = 1 # weight of function\n", " self.return_type = int # return type of function\n", "\n", " def __call__(self, x, y):\n", " try: # check for division by zero error\n", " return x / y\n", " except ZeroDivisionError:\n", " return None\n", " \n", " def str(x, y):\n", " return f\"{x} / {y}\"\n", "\n", "\n", "'''\n", "FUNCTION DEFINITIONS\n", "''' \n", "\n", "\n", "'''\n", "GLOBAL CONSTANTS\n", "''' \n", "\n", "# define operators\n", "arithmetic_operators = [Add(), Subtract(), Multiply(), Divide()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I define input-output examples." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I define a function to determine observational equivalence." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def observationally_equivalent(a, b):\n", " \"\"\"\n", " Returns True if a and b are observationally equivalent, False otherwise.\n", " \"\"\"\n", "\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, I define the bottom-up synthesis algorithm." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# initialize program bank\n", "program_bank = []\n", "\n", "# iterate over each level\n", "for i in range(1, max_level):\n", "\n", " # define level program bank\n", " level_program_bank = []\n", "\n", " for op in arithmetic_operators():\n", "\n", " break" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 2 }