randpool v1

master
bel 2022-09-18 18:46:03 -06:00
parent 1455a93b40
commit 7f8c87c7bc
2 changed files with 38 additions and 8 deletions

View File

@ -10,6 +10,7 @@ import time
def main(): def main():
ap = argparse.ArgumentParser() ap = argparse.ArgumentParser()
ap.add_argument("--stdin", default=False, action="store_true") ap.add_argument("--stdin", default=False, action="store_true")
ap.add_argument("--stdout", default=False, action="store_true")
ap.add_argument("--interval", default=250, type=int) ap.add_argument("--interval", default=250, type=int)
ap.add_argument("--max-keys-down", default=2, type=int) ap.add_argument("--max-keys-down", default=2, type=int)
ap.add_argument("--startup", default=3, type=int) ap.add_argument("--startup", default=3, type=int)
@ -24,6 +25,8 @@ def main():
w_translation = json.loads(args.translation) if args.translation else None w_translation = json.loads(args.translation) if args.translation else None
w = writer.Writer(writer.PyAutoGUIWriter(w_translation)) w = writer.Writer(writer.PyAutoGUIWriter(w_translation))
if args.stdout:
w = writer.Writer(writer.StdoutWriter())
if args.controller_setup: if args.controller_setup:
stdin = reader.StdinReader() stdin = reader.StdinReader()

View File

@ -69,16 +69,43 @@ class StdinReader:
class RandomReader: class RandomReader:
def __init__(self, keys={"a":{"weight":1}, "b":{"weight":1}}): def __init__(self, keys={"a":{"weight":1}, "b":{"weight":1}}):
self.keys = keys self.keys = keys
self.weighted_keys = [] self.pool = RandomPool(keys)
for k in self.keys:
weight = int(self.keys[k]["weight"] * 1000)
self.weighted_keys.extend([k] * weight)
log.info("weighted keys", self.weighted_keys)
def read(self): def read(self):
return self.weighted_keys[ return self.pool.pop()
random.randint(0, len(self.weighted_keys)-1)
] class RandomPool:
def __init__(self, values):
self.values = {k:1000*v["weight"] for k,v in values.items()}
self.total = sum(self.values.values())
self.consumed = set()
def reset(self):
self.consumed = set()
def pop(self):
k = self._pop()
for i in range(0, 3-1):
if k in self.consumed:
k = self._pop()
else:
break
self.consumed.add(k)
if self.should_reset():
self.reset()
return k
def _pop(self):
idx = random.randint(0, self.total-1)
idx_offset = 0
for k in sorted(self.values.keys()):
if self.values[k] > idx+idx_offset:
return k
idx_offset -= self.values[k]
raise Exception(":(")
def should_reset(self):
return len(self.consumed) >= len(self.values)/2
class FileReader: class FileReader:
def __init__(self, path): def __init__(self, path):