Spaces:
Sleeping
Sleeping
''' | |
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()] |