program-synthesis / strings.py
ayushnoori's picture
Complete for string DSL
6b5a85b
raw
history blame
3.19 kB
'''
STRING OPERATORS
This file contains Python classes that define the string operators for program synthesis.
'''
'''
CLASS DEFINITIONS
'''
class StringVariable:
'''
Class to represent an string variable. Note that position is the position of the variable in the input.
For example, if the input is ["a", "b", "c"] and the variable is the third element (i.e., "c"), then position = 2.
'''
def __init__(self, position):
self.position = position # zero-indexed position of the variable in the arguments to program
self.type = str # type of the variable
self.weight = 1 # weight of the variable
def evaluate(self, input = None):
# check that input is not None
if input is None:
raise ValueError("Input is None.")
# check that input is a list
if type(input) != list:
raise ValueError("Input is not a list.")
# check that input is not empty
if len(input) == 0:
raise ValueError("Input is empty.")
# check that position is valid
if self.position >= len(input):
raise ValueError(f"Position {self.position} is out of range for input of length {len(input)}.")
return input[self.position]
def str(self):
return f"x{self.position}"
class StringConstant:
'''
Class to represent an string constant.
'''
def __init__(self, value):
self.value = value # value of the constant
self.type = str # type of the constant
self.weight = 1 # weight of the constant
def evaluate(self, input = None):
return self.value
def str(self):
return str(self.value)
class Concatenate:
'''
Operator to concatenate two string values.
'''
def __init__(self):
self.arity = 2 # number of arguments
self.arg_types = [str, str] # argument types
self.return_type = str # return type
self.weight = 1 # weight
def evaluate(self, x, y, input = None):
return x + y
def str(self, x, y):
return f"Concat({x}, {y})"
class Left:
'''
Operator to get left substring.
'''
def __init__(self):
self.arity = 2 # number of arguments
self.arg_types = [str, int] # argument types
self.return_type = str # return type
self.weight = 1 # weight
def evaluate(self, x, y, input = None):
return x[:y]
def str(self, x, y):
return f"Left({x}, {y})"
class Right:
'''
Operator to get right substring.
'''
def __init__(self):
self.arity = 2 # number of arguments
self.arg_types = [str, int] # argument types
self.return_type = str # return type
self.weight = 1 # weight
def evaluate(self, x, y, input = None):
return x[(y * -1):]
def str(self, x, y):
return f"Right({x}, {y})"
'''
GLOBAL CONSTANTS
'''
# define operators
string_operators = [Concatenate(), Left(), Right()]