Spaces:
Running
Running
File size: 3,186 Bytes
6b5a85b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
'''
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()] |