def extract_inequality(prev, next, input): state = State(prev) currents = list(reversed(map(lambda i: input[i], state.unstables()))) if next == state.transition(State.left).state: return ( (-1, currents[0]), (1, currents[1]), (1, prev) ) elif next == state.transition(State.right).state: return ( (1, currents[0]), (-1, currents[1]), (-1, prev) )
class Theta: def __init__(self, state): self.state = State(state) self.left = [] self.right = [] def add(self, to, input): currents = map(lambda i: input[i], self.state.unstables()) currents.reverse() if to == self.state.transition(State.left).state: if currents not in self.left: self.left.append(currents) elif to == self.state.transition(State.right).state: if currents not in self.right: self.right.append(currents) else: raise "hell" def add_constraints_to(self, program): for left in self.left: program.add_constraint( program[left[0]]-program[left[1]]+1 <= program["T"+self.state.state] ) for right in self.right: program.add_constraint( program[right[0]]-program[right[1]]-1 >= program["T"+self.state.state] ) def switch(self, input, params): currents = map(lambda i: params[input[i]], self.state.unstables()) delta = currents[1] - currents[0] boundary = params.get("T"+self.state.state, 0) if delta < boundary: return [self.state.transition(State.left)] elif delta > boundary: return [self.state.transition(State.right)] else: return [self.state.transition(State.left), self.state.transition(State.right)]