Browse Source

Bugfix in mutator + enhance __main__

Yann Weber 6 years ago
parent
commit
37d82e992d
3 changed files with 19 additions and 9 deletions
  1. 13
    6
      gte/__main__.py
  2. 3
    2
      gte/mutator.py
  3. 3
    1
      gte/rpnlib.py

+ 13
- 6
gte/__main__.py View File

@@ -43,7 +43,7 @@ parser_evolve.add_argument('--pool-size', '-p', type=int, metavar='N',
43 43
                            default=10)
44 44
 
45 45
 parser_evolve.add_argument('--pool-div', '-D', type=int, metavar='N',
46
-                           default=5,
46
+                           default=2,
47 47
                            help='Each generation keep 1/N of the pool')
48 48
 
49 49
 parser_evolve.add_argument('--prog-size', type=int, metavar='SIZE',
@@ -112,12 +112,15 @@ if 'pool_size' in args:
112 112
         logger.info(msg % (generation, args.repeat_eval, args.turmit_count,
113 113
                            args.steps, args.pool_size))
114 114
         genstart = time.time()
115
-
115
+        
116
+        # Preparing work
116 117
         works = []
117 118
         for pid, prog in enumerate(progs):
118 119
             for i in range(args.repeat_eval):
119 120
                 works.append((generation, pid, prog, i, args))
121
+        # running jobs
120 122
         res = pool.imap(eval_prog, works)
123
+        # Processing results
121 124
         scores = [0 for _ in range(len(progs))]
122 125
         for pid, score in res:
123 126
             scores[pid] += score
@@ -125,6 +128,7 @@ if 'pool_size' in args:
125 128
                   for i in range(len(progs))]
126 129
 
127 130
         genstop = time.time()
131
+        # Displaying eval results
128 132
         logger.info('Generation evaluating ended in %.2fs' % (genstop - genstart))
129 133
 
130 134
         scores = sorted(scores, key=lambda x: x[0], reverse=True)
@@ -138,16 +142,19 @@ if 'pool_size' in args:
138 142
                     logprogs.flush()
139 143
                 logprogs.write('\n')
140 144
 
141
-        keep_div = 2
145
+        # Split pool & mutate the one we kept
146
+        keep_div = args.pool_div
142 147
         progs = []
143 148
         for prog in [ prog for _, prog in scores[:len(scores)//keep_div]]:
144 149
             progs.append(prog)
145
-            for _ in range(keep_div - 1):
146
-                progs.append(mutate(prog, force=True))
150
+            for cur_mut in range(keep_div - 1):
151
+                progs.append(mutate(prog, force=True, mutcount= 2**cur_mut))
147 152
                 if len(progs) >= args.pool_size:
148 153
                     break
149 154
             if len(progs) >= args.pool_size:
150 155
                 break
156
+        for pid, prog in enumerate(progs):
157
+            logger.debug('P%d : %s' % (pid, str(prog)))
151 158
         generation += 1
152 159
     exit(0)
153 160
 else:
@@ -173,7 +180,7 @@ else:
173 180
     msg = 'Fractdim %.3f after %d steps in %.2fs (%dus per step)'
174 181
     msg %= (w.fractdim(), args.steps,
175 182
             stop - start,
176
-            ((stop - start)*1000000)//args.steps)
183
+            ((stop - start)*1000000)//args.steps//args.turmit_count)
177 184
     logger.info(msg)
178 185
 
179 186
     w.save(args.output)

+ 3
- 2
gte/mutator.py View File

@@ -15,10 +15,11 @@ def mutate(expr, force = True, mutcount = 1):
15 15
         @param mutcount int : count of time
16 16
         @return a muatated copy of expr
17 17
     '''
18
+    res = copy.copy(expr)
19
+
18 20
     if force:
19
-        return mutatef(expr, mutcount)
21
+        return mutatef(res, mutcount)
20 22
 
21
-    res = copy.copy(expr)
22 23
     for _ in range(mutcount):
23 24
         rep = randint(*ADD)
24 25
         if rep <= ADD[0]:

+ 3
- 1
gte/rpnlib.py View File

@@ -171,6 +171,9 @@ class RpnSymbol(object):
171 171
             return False
172 172
         return b.optype == self.optype and b.value == self.value
173 173
 
174
+    def __copy__(self):
175
+        return self.__class__(self.value, self.optype)
176
+
174 177
     @classmethod
175 178
     def from_string(cls, val):
176 179
         try:
@@ -184,7 +187,6 @@ class RpnSymbol(object):
184 187
             return cls(val, cls.VARIABLE)
185 188
             
186 189
         raise ValueError('Unrecognized symbol "%s"' % val)
187
-            
188 190
 
189 191
     @classmethod
190 192
     def random(cls, optype=None):

Loading…
Cancel
Save