def make_transition_tuples(pattern):
    p_len = len(pattern)
    num_states = p_len + sum(pattern)

    tuples = pywrapcp.IntTupleSet(3)

    # this is for handling 0-clues. It generates
    # just the minimal state
    if num_states == 0:
        tuples.Insert3(1, 0, 1)
        return (tuples, 1)

    # convert pattern to a 0/1 pattern for easy handling of
    # the states
    tmp = [0]
    c = 0
    for pattern_index in range(p_len):
        tmp.extend([1] * pattern[pattern_index])
        tmp.append(0)

    for i in range(num_states):
        state = i + 1
        if tmp[i] == 0:
            tuples.Insert3(state, 0, state)
            tuples.Insert3(state, 1, state + 1)
        else:
            if i < num_states - 1:
                if tmp[i + 1] == 1:
                    tuples.Insert3(state, 1, state + 1)
                else:
                    tuples.Insert3(state, 0, state + 1)
    tuples.Insert3(num_states, 0, num_states)
    return (tuples, num_states)
def main(base=10, start=1, len1=1, len2=4):

    # Create the solver.
    solver = pywrapcp.Solver('Traffic lights')

    #
    # data
    #
    n = 4
    r, ry, g, y = range(n)
    lights = ["r", "ry", "g", "y"]

    # The allowed combinations
    allowed = pywrapcp.IntTupleSet(4)
    allowed.InsertAll([(r, r, g, g), (ry, r, y, r), (g, g, r, r),
                       (y, r, ry, r)])

    #
    # declare variables
    #
    V = [solver.IntVar(0, n - 1, 'V[%i]' % i) for i in range(n)]
    P = [solver.IntVar(0, n - 1, 'P[%i]' % i) for i in range(n)]

    #
    # constraints
    #
    for i in range(n):
        for j in range(n):
            if j == (1 + i) % n:
                solver.Add(
                    solver.AllowedAssignments((V[i], P[i], V[j], P[j]),
                                              allowed))

    #
    # Search and result
    #
    db = solver.Phase(V + P, solver.INT_VAR_SIMPLE, solver.INT_VALUE_DEFAULT)

    solver.NewSearch(db)
    num_solutions = 0
    while solver.NextSolution():
        for i in range(n):
            print "%+2s %+2s" % (lights[V[i].Value()], lights[P[i].Value()]),
        print
        num_solutions += 1

    solver.EndSearch()

    print
    print "num_solutions:", num_solutions
    print "failures:", solver.Failures()
    print "branches:", solver.Branches()
    print "WallTime:", solver.WallTime()
    print
def regular(x, Q, S, d, q0, F):

    solver = x[0].solver()

    assert Q > 0, 'regular: "Q" must be greater than zero'
    assert S > 0, 'regular: "S" must be greater than zero'

    # d2 is the same as d, except we add one extra transition for
    # each possible input;  each extra transition is from state zero
    # to state zero.  This allows us to continue even if we hit a
    # non-accepted input.

    d2 = pywrapcp.IntTupleSet(3)
    for i in range(Q + 1):
        for j in range(1, S + 1):
            if i == 0:
                d2.Insert3(0, j, 0)
            else:
                d2.Insert3(i, j, d[i - 1][j - 1])

    solver.Add(solver.TransitionConstraint(x, d2, q0, F))
def regular(x, Q, S, d, q0, F):

  solver = x[0].solver()

  assert Q > 0, 'regular: "Q" must be greater than zero'
  assert S > 0, 'regular: "S" must be greater than zero'

  # d2 is the same as d, except we add one extra transition for
  # each possible input;  each extra transition is from state zero
  # to state zero.  This allows us to continue even if we hit a
  # non-accepted input.

  d2 = pywrapcp.IntTupleSet(3);
  for i in range(Q + 1):
    for j in range(S):
      if i == 0:
        d2.Insert3(0, j, 0)
      else:
        d2.Insert3(i, j, d[i - 1][j])

  # If x hasindex set m..n, then a[m-1] holds the initial state
  # (q0), and a[i+1] holds the state we're in after processing
  # x[i].  If a[n] is in F, then we succeed (ie. accept the
  # string).
  x_range = range(0,len(x))
  m = 0
  n = len(x)

  a = [solver.IntVar(0, Q, 'a[%i]' % i) for i in range(m, n+1)]

    # Check that the final state is in F
  solver.Add(solver.MemberCt(a[-1], F))
    # First state is q0
  solver.Add(a[m] == q0)
  for i in x_range:
    solver.Add(x[i] >= 1)
    solver.Add(x[i] <= S)
    # Determine a[i+1]: a[i+1] == d2[a[i], x[i]]
    solver.Add(solver.AllowedAssignments((a[i], x[i] - 1, a[i + 1]), d2))