diff --git a/py/even_random_generator.py b/py/even_random_generator.py index 1775aaa..925e0e0 100644 --- a/py/even_random_generator.py +++ b/py/even_random_generator.py @@ -1,5 +1,8 @@ from constraint import * +import itertools as it + + class EvenRandomGenerator: """Generate even random sequences according to a predefined TL ration (Ralph, 2014)""" @@ -7,36 +10,29 @@ self.tl, self.trials, self.choices = tl, trials, choices def generate(self): - seq = self._generate_initial_sequence() - return self._optimize_sequence(seq) + seqs = self._generate_initial_sequences() + return self._find_optimal_sequence(seqs, 0.2) - def _generate_initial_sequence(self): + def _generate_initial_sequences(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))] + pool = it.product(self.choices, repeat=self.trials) + return pool - return seq - - def _optimize_sequence(self, seq, tl_ratio): + def _find_optimal_sequence(self, sequences, tl_ratio): """Optimize a sequence to match a desired tl ratio""" p = Problem() # TODO add all possible values for seq (its domain) - p.addVariable("seq", [seq]) + p.addVariable("seq", list(sequences)) p.addConstraint(lambda s: self.calculate_tl_ratio(s) - tl_ratio < 0.05) - return seq + return p.getSolution() @staticmethod def calculate_tl_ratio(seq): @@ -55,6 +51,6 @@ if __name__ == '__main__': - generator = EvenRandomGenerator(['a','b','c']) + generator = EvenRandomGenerator(['a', 'b', 'c'], trials = 4) generated_seq = generator.generate() print('Even Random Sequence: %s' % ''.join(generated_seq))