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()]