code: def build(self, corpus, state_size):
          
  
          # Using a DefaultDict here would be a lot more convenient, however the memory
          # usage is far higher.
          model = {}
  
          for run in corpus:
              items = ([ BEGIN ] * state_size) + run + [ END ]
              for i in range(len(run) + 1):
                  state = tuple(items[i:i+state_size])
                  follow = items[i+state_size]
                  if state not in model:
                      model[state] = {}
  
                  if follow not in model[state]:
                      model[state][follow] = 0
  
                  model[state][follow] += 1
          return model
docs: Build a Python representation of the Markov model. Returns a dict
          of dicts where the keys of the outer dict represent all possible states,
          and point to the inner dicts. The inner dicts represent all possibilities
          for the "next" item in the chain, along with the count of times it
          appears.