def run(self): def with_process_abortion(thunk): def f(k): self._abort_process_stack.append(k) thunk() self._abort_process_stack.pop() return callcc(f) def run_alerted(): temp = list(self.alerted_propagators) self.alerted_propagators.clear() for propagator in list(temp): debug("Running {propagator}".format(**vars())) propagator() if self.alerted_propagators: run_alerted() debug("Running scheduler") if len(self.alerted_propagators): self.last_value_of_run = with_process_abortion(run_alerted) debug("Scheduler done") return self.last_value_of_run
def add_content(self, increment): answer = merge(self.content, increment) if answer != self.content: debug("Adding content {1} to {0}".format(self, answer)) self.content = answer scheduler.alert_propagators(self.neighbors)
def run_alerted(): temp = list(self.alerted_propagators) self.alerted_propagators.clear() for propagator in list(temp): debug("Running {propagator}".format(**vars())) propagator() if self.alerted_propagators: run_alerted()
def sqrt_iter_helper(): debug("sqrt_iter_helper: {x}, {g}, {answer}".format(**vars())) done = Cell('done') not_done = Cell('not(done)') x_if_not_done = Cell('x if not(done)') g_if_not_done = Cell('g if not(done)') new_g = Cell('new g') good_enuf(g, x, done) switch(done, g, answer) inverter(done, not_done) switch(not_done, x, x_if_not_done) switch(not_done, g, g_if_not_done) heron_step(x_if_not_done, g_if_not_done, new_g) # Clever recursion: this will call this helper again only if # `x_if_not_done` is not None. # # `x_if_not_done` will not have content if `answer` has content, # so it will stop recursing when an answer is found. sqrt_iter(x_if_not_done, new_g, answer)
def initialize(self): debug("Initializing scheduler") self.alerted_propagators.clear() self.propagators_ever_alerted.clear() self._abort_process_stack.clear() self.last_value_of_run = None
def __init__(self, name=None, content=None): self.neighbors = [] self.name = name self.content = None self.add_content(content) debug("New cell: " + str(self))
def _default_merge(content, increment): debug("Merging {content} and {increment}...".format(**vars())) if content == increment: return content else: return Contradiction('{content} != {increment}'.format(**vars()))