Compare commits

..

No commits in common. "7019f11e507903d9b067503194e0422e68d2aaa8" and "839b7197e79809d11870c5e5a50403733c944d96" have entirely different histories.

2 changed files with 74 additions and 44 deletions

@ -1,6 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import itertools
import functools import functools
import json import json
import os.path import os.path
@ -88,24 +87,22 @@ class Explore:
return path return path
def explore(self, paths, probes=None, mark=Path()): def explore(self, path=Path(), probes=None, mark=Path()):
probes = probes or self.probes probes = probes or self.probes
num_marks = mark.path.count("[")
expaths = [] path = self._path(path)
for path in paths: paths = [mark + path + probe for probe in probes]
path = self._path(path)
expaths.extend(mark + path + probe for probe in probes) num_marks = mark.path.count("[")
prefix_len = len(mark) - 2 * num_marks + len(path)
print("explore", paths) print("explore", paths)
response = api.explore([p.path for p in expaths]) response = api.explore([p.path for p in paths])
results = response["results"] results = response["results"]
self.score = response["queryCount"] self.score = response["queryCount"]
for path, presults in zip(paths, itertools.batched(results, len(probes))): print("id", path, results)
prefix_len = len(mark) - 2 * num_marks + len(path) return [res[prefix_len:] for res in results]
print("id", path, results)
self.update(path, [res[prefix_len:] for res in presults])
def _add_room(self, path, results): def _add_room(self, path, results):
label = results[0][0] label = results[0][0]
@ -244,13 +241,10 @@ class Explore:
break break
def unexplored(self): def unexplored(self):
unexplored = []
for path, ns in self.neighbors.items(): for path, ns in self.neighbors.items():
for d, (p, rid) in enumerate(ns): for d, (p, rid) in enumerate(ns):
if not rid: if not rid:
unexplored.append((d, path)) yield d, path
if unexplored:
yield unexplored
def is_explored(self): def is_explored(self):
return next(self.unexplored(), None) is None and all(len(p) == 1 for p in self.room_ids.values()) return next(self.unexplored(), None) is None and all(len(p) == 1 for p in self.room_ids.values())
@ -373,19 +367,19 @@ def mark_solve(problem, nrooms):
ex = Explore(problem, probes) ex = Explore(problem, probes)
exs.append(ex) exs.append(ex)
ex.explore([Path()], mark=mark_loop) res = ex.explore(Path(), mark=mark_loop)
ex.update(Path(), res)
ex.dump() ex.dump()
while True: while True:
unexplored = next(ex.unexplored(), None) door, unexplored = next(ex.unexplored(), (None, None))
if unexplored is None: if unexplored is None:
break break
paths = [] print("explore", door, unexplored)
for door, path in unexplored: path = unexplored + Path([door])
paths.append(path + Path([door])) res = ex.explore(path, mark=mark_loop)
print("explore", unexplored) ex.update(path, res)
ex.explore(paths, mark=mark_loop)
ex.unify_all() ex.unify_all()
ex.dump() ex.dump()
@ -430,7 +424,7 @@ def mark_solve(problem, nrooms):
if t == Path(): if t == Path():
start = s start = s
print("use as start", start) print("use as start", start)
assert start is not None assert start
layout = ex.layout(orig=orig, start=starts[0]) layout = ex.layout(orig=orig, start=starts[0])
guess_ok = api.guess(layout) guess_ok = api.guess(layout)
@ -439,6 +433,60 @@ def mark_solve(problem, nrooms):
return guess_ok return guess_ok
def path_solve(problem, nrooms, plen):
maxlen = 18 * nrooms
probe = Path([random.randrange(6) for _ in range(plen)])
print("probe path", probe)
ex = Explore(problem, probe)
api.select(ex.problem)
def extendpath(path, maxlen):
while len(path) < maxlen - plen - 1:
path = path + Path([random.randrange(6)]) + probe
return path
def target(door, path):
print("target", door, path)
probe0 = extendpath(probe, maxlen - len(path))
probe1 = extendpath(Path([door]) + probe, maxlen - len(path))
res0, res1 = ex.explore(path, [probe0, probe1])
ex.update_path(path, door, res0[: plen + 1], res1[: plen + 2])
ex.dump()
ex.unify_all()
ex.dump()
i = plen + 1
while i + plen < len(res0):
ex.update(path + probe0[:i], [res0[i : i + 1], res0[i : i + plen + 1]])
ex.unify_all()
i += plen + 1
i = plen + 2
while i + plen < len(res1):
ex.update(path + probe1[:i], [res1[i : i + 1], res1[i : i + plen + 1]])
ex.unify_all()
i += plen + 1
target(0, Path())
ex.dump()
while True:
door, unexplored = next(ex.unexplored(), (None, None))
print("unexplored", door, unexplored)
if unexplored is None:
break
target(door, unexplored)
ex.dump()
print("explored", ex.is_explored())
if ex.is_explored():
print("guess", ex.guess())
print("score", ex.score)
if __name__ == "__main__": if __name__ == "__main__":
problem = sys.argv[1] problem = sys.argv[1]
@ -456,9 +504,9 @@ if __name__ == "__main__":
api.clean_explore_cache() api.clean_explore_cache()
except ExploreError as exc: except ExploreError as exc:
api.clean_explore_cache() api.clean_explore_cache()
raise exc print(exc)
except Exception as exc: except Exception as exc:
api.write_explore_cache() api.write_explore_cache()
raise exc print(exc)
sys.exit(0 if ok else 1) sys.exit(0 if ok else 1)

@ -1,18 +0,0 @@
#! /bin/bash
PROBLEMS="$*"
if [ -z "$PROBLEMS" ] ; then
PROBLEMS=$(jq -r '.[]|.problem' ../problems.json)
fi
TRIES=${TRIES:-10}
for problem in $PROBLEMS; do
for t in $(seq $TRIES); do
./explore.py $problem
if [ $? -eq 0 ]; then
break
fi
done
done