docs: def generate_or_fail(self):
          """
          Attempts to generate a random acyclic graph, raising an
          InvariantError if unable to.
          """
  
          t1 = self.generate_random_table()
          t2 = self.generate_random_table()
          f1 = self.generate_func(t1)
          f2 = self.generate_func(t2)
          edges = [(f1(word), f2(word)) for word in self.words]
  
          # Try to generate that graph, mack!
          # Note that failure to generate the graph here should be caught
          # by the caller.
          graph = forest.ForestGraph(edges=edges)
  
          # Associate each edge with its corresponding word.
          associations = {}
          for num in range(len(self.words)):
              edge = edges[num]
              word = self.words[num]
              associations[graph.canonical_order(edge)] = (num, word)
  
          # Assign all of these to the object.
          for name in ('t1', 't2', 'f1', 'f2', 'graph', 'associations'):
              self.__dict__[name] = locals()[name]