code: def _advance_pattern_generators(self,p):
          
  
          valid_generators = []
          for g in p.generators:
  
              for trial in range(self.max_trials):
                  # Generate a new position and add generator if it's ok
  
                  if np.alltrue([self.__distance_valid(g,v,p) for v in valid_generators]):
                      valid_generators.append(g)
                      break
  
                  g.force_new_dynamic_value('x')
                  g.force_new_dynamic_value('y')
  
              else:
                  self.warning("Unable to place pattern %s subject to given constraints" %
                               g.name)
  
          return valid_generators
docs: Advance the parameters for each generator for this
          presentation.
  
          Picks a position for each generator that is accepted by
          __distance_valid for all combinations.  Returns a new list of
          the generators, with some potentially omitted due to failure
          to meet the constraints.