Newer
Older
adaptive-nback / generators / nb_gm_001.py
Morteza Ansarinia on 25 Feb 2019 1 KB refactor benchmark and add visualization
import random
import csv

import heapq


class SequenceGenerator:
    """Generate N-Back sequences with random sampling, but increase matching probability over time."""

    def __init__(
        self,
        choices: list,
        n=2,
        trials=24,
        target_probability_start=0.33,
        target_probability_end=0.50
    ):
        self.n, self.choices, self.trials = n, choices, trials
        self.target_probability_step = target_probability_end - target_probability_start
        self.target_probability = target_probability_start
        self.seq = []

    def generate(self) -> list:
        self.seq = []
        for t in range(self.trials):
            self.seq += self.random_sample()
        return self.seq

    def random_sample(self):
        is_target = (random.random() > self.target_probability)
        self.target_probability += self.target_probability_step
        choices = [item for item in self.choices if len(self.seq)<self.n or item != self.seq[-self.n]]
        return random.choice(choices) if len(self.seq) < self.n or not is_target else self.seq[-self.n]

    def count_targets_and_lures(self):
        n = self.n
        seq = self.seq
        targets = 0
        lures = 0
        for index in range(n, len(seq)):
            if seq[index] == seq[index - n]:
                targets += 1
            elif seq[index] == seq[index - (n-1)] or seq[index] == seq[index - (n+1)]:
                lures += 1
        return targets, lures