Browse Source

Add some options and a disabled diagonals mode

Yann Weber 6 years ago
parent
commit
6ca855a955
2 changed files with 39 additions and 12 deletions
  1. 31
    7
      gte/__main__.py
  2. 8
    5
      gte/world.py

+ 31
- 7
gte/__main__.py View File

@@ -46,6 +46,10 @@ parser_evolve.add_argument('--pool-div', '-D', type=int, metavar='N',
46 46
                            default=2,
47 47
                            help='Each generation keep 1/N of the pool')
48 48
 
49
+parser_evolve.add_argument('--max', '-m', action='store_const',
50
+                           default=False, const=True,
51
+                           help="Keep maximum score instead of average")
52
+
49 53
 parser_evolve.add_argument('--prog-size', type=int, metavar='SIZE',
50 54
                            default=5)
51 55
 
@@ -72,6 +76,12 @@ parser_evolve.add_argument('--mod-steps', '-M', action='store_const',
72 76
 parser_evolve.add_argument('--quiet', '-q', action='store_const',
73 77
                            default=False, const=True)
74 78
 
79
+parser_evolve.add_argument('--no-diagonals', '-d', action='store_const',
80
+                           default=False, const=True)
81
+
82
+parser_evolve.add_argument('--target', '-t', type=float, metavar="FLOAT",
83
+                           default=None,
84
+                           help="0 < Float <= 2.0 for targeted score")
75 85
 
76 86
 parser_gen = subparsers.add_parser('generate', help='evolving help')
77 87
 
@@ -87,6 +97,8 @@ parser_gen.add_argument('--steps', '-s', type=int, metavar='N',
87 97
                         default=30000)
88 98
 parser_gen.add_argument('--gray', '-G', action='store_const',
89 99
                         default=False, const=True)
100
+parser_gen.add_argument('--no-diagonals', '-d', action='store_const',
101
+                        default=False, const=True)
90 102
 
91 103
 
92 104
 args = parser.parse_args()
@@ -133,17 +145,26 @@ if 'pool_size' in args:
133 145
         # running jobs
134 146
         res = pool.imap(eval_prog, works)
135 147
         # Processing results
136
-        scores = [0 for _ in range(len(progs))]
137
-        for pid, score in res:
138
-            scores[pid] += score
139
-        scores = [(scores[i] / args.repeat_eval, progs[i])
140
-                  for i in range(len(progs))]
148
+        if args.max:
149
+            scores = [ [] for _ in range(len(progs))]
150
+            for pid, score in res:
151
+                scores[pid].append(score)
152
+            scores = [(max(scores[i]), progs[i]) for i in range(len(progs))]
153
+        else:
154
+            scores = [0 for _ in range(len(progs))]
155
+            for pid, score in res:
156
+                scores[pid] += score
157
+            scores = [(scores[i] / args.repeat_eval, progs[i])
158
+                      for i in range(len(progs))]
141 159
 
142 160
         genstop = time.time()
143 161
         # Displaying eval results
144 162
         logger.info('Generation evaluating ended in %.2fs' % (genstop - genstart))
145 163
 
146
-        scores = sorted(scores, key=lambda x: x[0], reverse=True)
164
+        if args.target is None:
165
+            scores = sorted(scores, key=lambda x: x[0], reverse=True)
166
+        else:
167
+            scores = sorted(scores, key=lambda x: abs(x[0] - args.target),)
147 168
         for i, (score, prog) in enumerate(scores):
148 169
             logger.info('P%d %.3f : "%s"' % (i, score, str(prog)))
149 170
         if args.log_progs is not None:
@@ -176,7 +197,7 @@ else:
176 197
     # Generate
177 198
     w = World(args.world_height, args.world_width, gray=args.gray)
178 199
     prog = rpnlib.RpnExpr.from_string(args.prog)
179
-    turmits = [LivingTurmit(world=w, prog=prog)
200
+    turmits = [LivingTurmit(world=w, prog=prog, diag=not args.no_diagonals)
180 201
                for _ in range(args.turmit_count)]
181 202
     msg = 'Generating image for program %s with %d steps and %d turmits'
182 203
     logger.info(msg % (str(prog), args.steps, args.turmit_count))
@@ -190,6 +211,9 @@ else:
190 211
             logger.info(msg)
191 212
         for turmit in turmits:
192 213
             turmit()
214
+        #if step % 2 == 0:
215
+        #    #w.save('/tmp/anim/GTE_ANIM_%d.png' % (step/10))
216
+        #    w.save('/tmp/anim/GTE_ANIM_%d.png' % (step/2))
193 217
     stop = time.time()
194 218
 
195 219
     msg = 'Fractdim %.3f after %d steps in %.2fs (%dus per step)'

+ 8
- 5
gte/world.py View File

@@ -19,7 +19,7 @@ def eval_prog(args):
19 19
     w = World(args.world_height, args.world_width, gray=True)
20 20
     logger.debug('Running P%d run#%d %s' % (progid, trynum, prog))
21 21
     w.raz()
22
-    turmits = [LivingTurmit(world=w, prog=prog)
22
+    turmits = [LivingTurmit(world=w, prog=prog, diag=not args.no_diagonals)
23 23
                for _ in range(args.turmit_count)]
24 24
 
25 25
     start = time.time()
@@ -150,7 +150,7 @@ class World(object):
150 150
 class LivingTurmit(Turmit):
151 151
     ''' @brief Represent a Turmit with coordinates in a world '''
152 152
 
153
-    def __init__(self, world, color = None, x=None, y=None, **kwargs):
153
+    def __init__(self, world, color = None, x=None, y=None, diag=True, **kwargs):
154 154
         super().__init__(**kwargs)
155 155
         
156 156
         if not isinstance(world, World):
@@ -159,6 +159,8 @@ class LivingTurmit(Turmit):
159 159
         if color is not None and len(color) != 3:
160 160
             msg = 'Color expected to be a tuple(R,G,B) but %s found'
161 161
             raise TypeError(msg % color)
162
+        ## @brief If true direction contains diagonals
163
+        self._diag = bool(diag)
162 164
         ## @brief Stores Turmit color
163 165
         rand_hue = randint(0,255) / 255
164 166
         rand_lvl = randint(127,255) / 255
@@ -210,11 +212,12 @@ class LivingTurmit(Turmit):
210 212
         if setcol:
211 213
             self._world[self._y][self._x] = self._col
212 214
 
213
-        tdir %= 8
215
+        tdir %= 8 if self._diag else 4
216
+
214 217
         if tdir == 0 or tdir == 4 or tdir == 5:
215 218
             self._x += 1
216 219
             self._x %= self._world.width
217
-        elif tdir == 2 or tdir == 6 or tdir == 7:
220
+        elif tdir == 2 or tdir == 7 or tdir == 6:
218 221
             if self._x == 0:
219 222
                 self._x = self._world.width -1
220 223
             else:
@@ -222,7 +225,7 @@ class LivingTurmit(Turmit):
222 225
         if tdir == 1 or tdir == 4 or tdir == 6:
223 226
             self._y += 1
224 227
             self._y %= self._world.height
225
-        elif tdir == 3 or tdir == 5 or tdir == 7:
228
+        elif tdir == 3 or tdir == 7 or tdir == 5:
226 229
             if self._y == 0:
227 230
                 self._y = self._world.height - 1
228 231
             else:

Loading…
Cancel
Save