class EvenRandomGenerator: """Generate even random sequences according to a predefined TL ration (Ralph, 2014)""" def __init__(self, choices, trials=64, tl=1): self.tl, self.trials, self.choices = tl, trials, choices def generate(self): seq = self._generate_initial_sequence() return self._optimize_sequence(seq) def _generate_initial_sequence(self): """ Generates initial sequence of items based on choices and number of desired trials. In EvenRandom sequences, all stimuli have same number of appearances. """ num_of_each_choice = int(self.trials / len(self.choices)) seq = [] for c in self.choices: seq.append([c for t in range(num_of_each_choice)]) # if it's too short, add some new items if len(seq) < self.trials: seq += [self.choices[-1] for t in range(self.trials-len(seq))] return seq def _optimize_sequence(self, seq): """Optimize a sequence based on a desired tl ratio""" # TODO optimize sequence according to the fitness function w/ Branch&Bound or evolutionary algorithms. return seq @staticmethod def calculate_tl_ratio(seq): """Calculates the T:L ratio of a sequence.""" # TODO targets = 0 for index, item in seq: if item == seq[index-2]: targets += 1 return 1.0