program-synthesis / arithmetic.py
ayushnoori's picture
Working AST representation
c9abdca
raw
history blame
3.13 kB
'''
ARTHIMETIC OPERATORS
This file contains Python classes that define the arithmetic operators for program synthesis.
'''
'''
CLASS DEFINITIONS
'''
class IntegerVariable:
'''
Class to represent an integer variable. Note that position is the position of the variable in the input.
For example, if the input is [4, 5, 6] and the variable is the third element (i.e., 6), then position = 2.
'''
def __init__(self, position):
self.value = None # value of the variable, initially None
self.position = position # position of the variable in the arguments to program
self.type = int # type of the variable
def assign(self, value):
self.value = value
def evaluate(self):
return self.value
def str(self):
return f"x{self.position}"
class IntegerConstant:
'''
Class to represent an integer constant.
'''
def __init__(self, value):
self.value = value # value of the constant
self.type = int # type of the constant
def evaluate(self):
return self.value
def str(self):
return str(self.value)
class Add:
'''
Operator to add two numerical values.
'''
def __init__(self):
self.arity = 2 # number of arguments
self.arg_types = [int, int] # argument types
self.return_type = int # return type
self.weight = 1 # weight
def evaluate(self, x, y):
return x + y
def str(self, x, y):
return f"({x} + {y})"
class Subtract:
'''
Operator to subtract two numerical values.
'''
def __init__(self):
self.arity = 2 # number of arguments
self.arg_types = [int, int] # argument types
self.return_type = int # return type
self.weight = 1 # weight
def evaluate(self, x, y):
return x - y
def str(self, x, y):
return f"({x} - {y})"
class Multiply:
'''
Operator to multiply two numerical values.
'''
def __init__(self):
self.arity = 2 # number of arguments
self.arg_types = [int, int] # argument types
self.return_type = int # return type
self.weight = 1 # weight
def evaluate(self, x, y):
return x * y
def str(self, x, y):
return f"({x} * {y})"
class Divide:
'''
Operator to divide two numerical values.
'''
def __init__(self):
self.arity = 2 # number of arguments
self.arg_types = [int, int] # argument types
self.return_type = int # return type
self.weight = 1 # weight
def evaluate(self, x, y):
try: # check for division by zero error
return x / y
except ZeroDivisionError:
return None
def str(self, x, y):
return f"({x} / {y})"
'''
GLOBAL CONSTANTS
'''
# define operators
arithmetic_operators = [Add(), Subtract(), Multiply(), Divide()]