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) )
Exemple #2
0
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)]