Browse Source

Add op alias and jmp method

Yann Weber 6 years ago
parent
commit
c1ab518252
3 changed files with 40 additions and 9 deletions
  1. 6
    5
      gte/__main__.py
  2. 23
    2
      gte/rpnlib.py
  3. 11
    2
      gte/turmit.py

+ 6
- 5
gte/__main__.py View File

@@ -25,8 +25,8 @@ subparsers = parser.add_subparsers(help='sub-commands help')
25 25
 
26 26
 parser_evolve = subparsers.add_parser('evolve', help='evolving help')
27 27
 
28
-parser_evolve.add_argument('--steps', '-s', type=int, metavar='N', default=1024,
29
-                    help="Number of steps")
28
+parser_evolve.add_argument('--steps', '-s', type=int, metavar='N',
29
+                           default=4000, help="Number of steps")
30 30
 
31 31
 parser_evolve.add_argument('--repeat-eval', type=int, metavar='N', default=5)
32 32
 
@@ -36,13 +36,13 @@ parser_evolve.add_argument('--world-width', '-x', type=int, metavar='WIDTH',
36 36
                            default=256)
37 37
 
38 38
 parser_evolve.add_argument('--turmit-count', '-T', type=int, metavar='N',
39
-                           default=10)
39
+                           default=3)
40 40
 
41 41
 parser_evolve.add_argument('--pool-size', '-p', type=int, metavar='N',
42 42
                            default=10)
43 43
 
44 44
 parser_evolve.add_argument('--prog-size', type=int, metavar='SIZE',
45
-                           default=10)
45
+                           default=5)
46 46
 
47 47
 parser_evolve.add_argument('--prog', '-P', type=str, metavar='EXPR',
48 48
                            default=None)
@@ -94,7 +94,8 @@ if 'pool_size' in args:
94 94
     if args.log_progs is not None:
95 95
         logprogs = open(args.log_progs, 'a')
96 96
         logprogs.write('%s Run args %s\n' % (datetime.datetime.now(),
97
-                                             args))
97
+                                             sys.argv))
98
+        logprogs.write('%s\n' % args)
98 99
         logprogs.close()
99 100
     else:
100 101
         logger.warning('No log specified (--log-progs or -L)')

+ 23
- 2
gte/rpnlib.py View File

@@ -5,6 +5,18 @@ import random
5 5
 _op_list = collections.OrderedDict()
6 6
 _var_list = collections.OrderedDict()
7 7
 
8
+_op_alias = collections.OrderedDict()
9
+_op_alias['add'] = '+'
10
+_op_alias['sub'] = '-'
11
+_op_alias['mul'] = '*'
12
+_op_alias['div'] = '/'
13
+_op_alias['bin_and'] = '&'
14
+_op_alias['bin_or'] = '|'
15
+_op_alias['bin_xor'] = '^'
16
+_op_alias['lshift'] = '<<'
17
+_op_alias['rshift'] = '>>'
18
+_op_alias['pow'] = '**'
19
+
8 20
 _var_list['x'] = 0
9 21
 _var_list['y'] = 0
10 22
 _var_list['r'] = 0
@@ -60,7 +72,12 @@ class RpnExpr(list):
60 72
             raise TypeError('RpnSymbol expected but got %s' % type(val))
61 73
         super().__setitem__(idx, val)
62 74
 
63
-    def __str__(self):
75
+    def __str__(self, small=True):
76
+        if small:
77
+            return ' '.join([_op_alias[str(sym).lower()]
78
+                        if str(sym).lower() in _op_alias
79
+                        else str(sym)
80
+                        for sym in self])
64 81
         return ' '.join([str(sym) for sym in self])
65 82
 
66 83
     @classmethod
@@ -97,6 +114,9 @@ class RpnSymbol(object):
97 114
         err_type = 'Unknown'
98 115
         if optype == self.OPERATION:
99 116
             if isinstance(value, str):
117
+                if self.value.lower() in _op_alias.values():
118
+                    idx = list(_op_alias.values()).index(self.value.lower())
119
+                    self.value = list(_op_alias.keys())[idx]
100 120
                 if not value in _op_list:
101 121
                     err = True
102 122
                     err_type = 'operation'
@@ -145,10 +165,11 @@ class RpnSymbol(object):
145 165
             return cls(val, cls.VALUE)
146 166
         except Exception:
147 167
             pass
148
-        if val.lower() in _op_list.keys():
168
+        if val.lower() in _op_list.keys() or val.lower() in _op_alias.values():
149 169
             return cls(val, cls.OPERATION)
150 170
         elif val.lower() in _var_list.keys():
151 171
             return cls(val, cls.VARIABLE)
172
+            
152 173
         raise ValueError('Unrecognized symbol "%s"' % val)
153 174
             
154 175
 

+ 11
- 2
gte/turmit.py View File

@@ -75,13 +75,16 @@ class Turmit(object):
75 75
             @param context dict : dict with variable values (see @ref rpnlib._var_list)
76 76
             @return stack head after RPN
77 77
         '''
78
-        for sym in self._prog:
78
+        self.__ip = 0
79
+        while self.__ip < len(self._prog):
80
+            sym = self._prog[self.__ip]
79 81
             if sym.optype == RpnSymbol.VALUE:
80 82
                 self._push(sym.value)
81 83
             elif sym.optype == RpnSymbol.VARIABLE:
82 84
                 self._push(context[sym.value.lower()])
83 85
             elif sym.optype == RpnSymbol.OPERATION:
84 86
                 getattr(self, sym.value.lower())()
87
+            self.__ip += 1
85 88
         return self.shead
86 89
 
87 90
     @property
@@ -112,7 +115,7 @@ class Turmit(object):
112 115
             @param val int : value to push
113 116
         '''
114 117
         self._cur += 1
115
-        if self._cur >= len(self._stack):
118
+        if self._cur >= len(self._stack) or abs(self._cur) > len(self._stack):
116 119
             self._cur = 0
117 120
         self._stack[self._cur] = self._cast_int(val)
118 121
 
@@ -233,3 +236,9 @@ class Turmit(object):
233 236
             @param a int : value
234 237
         '''
235 238
         pass
239
+    
240
+    @RpnOp
241
+    def jmp(self, a):
242
+        ''' @brief Increments IP
243
+        '''
244
+        self.__ip += a

Loading…
Cancel
Save