diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/results/nb_gm_004_profile.csv b/benchmarks/results/nb_gm_004_profile.csv new file mode 100644 index 0000000..656adff --- /dev/null +++ b/benchmarks/results/nb_gm_004_profile.csv @@ -0,0 +1,101 @@ +,alg,n,trials,time,targets,lures,skewed,sequence +0,nb_gm_004,2,64,5.629104852676392,20,10,False,DBFBFAFEAECACFDCDABADBDCFCBCABACECAEDEADAFAEDEFBFEBABFDCECDEBEFB +1,nb_gm_004,2,18,1.5522487163543701,6,3,True,EACADCDCACBABFCBCA +2,nb_gm_004,7,36,3.1199769973754883,12,6,False,ABEABFDABBAEBDAABFDBFDAFFACFCDECACBF +3,nb_gm_004,2,37,3.655029773712158,12,6,False,BFDFEDEDCECDCABADBDFADAFEFBEBCACFAFEC +4,nb_gm_004,4,39,3.4385950565338135,13,6,False,AFBDAFFDEACDCAECBAEBAFABCBAACFDECDFEDEF +5,nb_gm_004,7,54,4.757416009902954,18,9,False,BFAECBDBFFACEDBBDACBEAEDAFDBADCAEFCAFCEADCEFDEDACFBFBD +6,nb_gm_004,7,22,1.847884178161621,7,3,False,EDCBFAAEDBCFFAECBDCFDB +7,nb_gm_004,4,32,2.5619711875915527,10,5,False,DBFEDBFCEDFAECABACACFEBDCEDBAFDB +8,nb_gm_004,5,45,3.880707025527954,15,7,False,BCDEDBBDEECBDBFACDBEDADEDCAAFDEBAFBDADFEBAEFC +9,nb_gm_004,7,18,1.5218820571899414,5,3,False,FEBCDADFEBACAFDECB +10,nb_gm_004,5,43,3.712139129638672,14,7,False,AEFFCABEFFABDFAADBEACDCBDCECFBBEDCEDEACFBDA +11,nb_gm_004,7,60,5.11740517616272,19,10,False,FDEDCEBFDDECEDFFDCCFEBFCBAFEDBBEAAEBFBAEACADBBCACFAADCABDFCE +12,nb_gm_004,7,48,4.116453170776367,16,8,False,ADBADCCADFBDDCADCFDEFEACCDBFDCECFBEFBEFEABABEFCE +13,nb_gm_004,4,17,1.3661417961120605,4,2,False,CBEACBBDCBFCDAEEF +14,nb_gm_004,4,61,5.220706224441528,20,10,False,CEDACEDCACDBEBDDEAFAEAEFBDECFDEDBFBDCFABEFAEDEACBFABCFCBFFDCC +15,nb_gm_004,3,52,4.4212260246276855,17,8,False,EBCDBCDEBFDBFBCEFCBFECDEADCEDAEFBDEBDBAABFDAFCADFAEE +16,nb_gm_004,7,27,2.323706865310669,9,4,False,EACFDBBEAAFDDCEBCFFECABDCFA +17,nb_gm_004,3,32,2.64604115486145,10,5,False,CBACEBCDBFCBCEBFCBACDDFCEFAFEAFA +18,nb_gm_004,6,26,2.1442930698394775,7,4,False,ECBADFECBBAFEADDCFDFABCEFC +19,nb_gm_004,2,44,3.7390267848968506,14,7,False,EDCECACAFADFDAEACECDBDCBCEFEAFFDAFADBDCBCFCB +20,nb_gm_004,4,62,5.2222230434417725,20,10,False,EACFEACDFADCCAFDFAFCAADFADBFCABCDADBFBDBCFABFEDAFDADFAEDBACEBD +21,nb_gm_004,5,61,5.658479928970337,20,10,False,BAEFCBBEFFBCCAFEBCEFABECBAEEFCDECFBCBAFFDBDFAFADAEFABDEADBEDD +22,nb_gm_004,5,32,2.645524024963379,10,5,False,ECDBCEEDBBFEFBAFAEDACDAFBCADFCEA +23,nb_gm_004,7,62,5.216619968414307,20,10,False,EADDFBDEAADFFCEEBDFADCDBAFEDFCADFFDBABDDFACAEACDABEAFCACBCEFCB +24,nb_gm_004,3,24,2.0706608295440674,8,3,False,EBAEBFAEFDECBDCADBACFCDF +25,nb_gm_004,3,36,3.1037821769714355,12,6,False,BCFEBFECFEFCDFBDEFDBCDEBFEDBECEDCEFD +26,nb_gm_004,6,61,5.195503234863281,20,10,False,CADBEACADDBACEBDFBEFBBFCADBABCBDABFCBECBDFFEBBEDDEFFBDEBFEFDA +27,nb_gm_004,6,11,0.8340439796447754,3,0,False,AEFBCDABFEC +28,nb_gm_004,4,39,3.390317916870117,13,6,False,ACBFACBCFABEBAECEAEDBCADFDADAFFDECFBEFC +29,nb_gm_004,2,56,4.782411098480225,18,9,False,BCDBDCDCFDFBCBEBFEFABFBECEAEDADBCDCEFEBFBEDACDCFEFBEBACA +30,nb_gm_004,2,53,4.454513788223267,17,8,False,CEDEDBEBABDADECDCECDBCBDBCABADAFCDCFCEFFCECFEFADFDAEA +31,nb_gm_004,5,41,3.454822063446045,13,6,False,BEFACBBFAAEBCBAADCDAFDECFEDFCADEAEBDFCEED +32,nb_gm_004,2,53,4.557706117630005,17,8,False,BDEDEBDBEBAECEFEDFAFCFECACBABECEAEFDFCDDAEAFEFADFDBCB +33,nb_gm_004,3,57,4.94400691986084,19,9,False,FCEFBEDFEDBFBEFBCEECAEDCFDAFADFEBCFBADBACDAEFCAFCFEACEDCA +34,nb_gm_004,5,13,1.0586318969726562,4,2,False,FAEDBCFEDBACE +35,nb_gm_004,3,43,3.702164888381958,14,7,False,ACEADCADFCDABEAAEBAFCBFDEFBDFECFBEDBFCBEDCE +36,nb_gm_004,4,40,3.446906089782715,13,6,False,EDCAEDCBAEABCBAAEBCADBACBCACFDAECDEBEDCF +37,nb_gm_004,7,60,5.721850156784058,20,10,False,FABAFDBFAABFDAFFCBCDBAFDBECFADDABFDAADBFADAFCDFBBACBCFDCACAB +38,nb_gm_004,2,40,3.326483964920044,13,6,False,DEAEACAFCFDCDFEDEAFADFDBEBABFCBCACEBECBF +39,nb_gm_004,5,45,3.9018988609313965,15,7,False,CABEACCBEFACDEBAECEDFAFEBEACFBCAECBDBDCCDFDBE +40,nb_gm_004,3,18,1.55079984664917,6,3,False,EBADBAABFCAFCEDCBE +41,nb_gm_004,6,34,2.884040355682373,11,5,False,ECBABFECBBAFEADBDACFDBEDBFCEFDDACA +42,nb_gm_004,2,48,4.0855629444122314,14,7,False,AFEFAEAEFAFDBDCDBCBFEFCECDBDABACBCEDFDEBCACDABEF +43,nb_gm_004,6,50,4.191677093505859,16,8,False,FDEFACFDEEFCEDFDECFDBADCBDCBDABFECEADABEBABACECBFA +44,nb_gm_004,3,25,2.081367015838623,8,3,False,EBDEABEACBAFDCFCDFCFAEDBE +45,nb_gm_004,5,15,1.2862391471862793,5,2,False,ABDCEAFBCEDFFDE +46,nb_gm_004,4,19,1.6599581241607666,6,3,False,BFCABFFACBDABEDFAEC +47,nb_gm_004,5,61,5.23445987701416,20,10,True,CEFEFCCFEECDFDADCFDEFCEFCFBFECABCEBCCFEEACAEFABCEADAFECDFABCA +48,nb_gm_004,4,51,4.420213937759399,17,8,False,FDABFDDEFFDBFDEABDEDFDCEEACCEDDAEEDBEDFEBDCEDBFEABC +49,nb_gm_004,2,61,5.241312026977539,20,10,True,FDEDCECEDCDEDBCDCECBFBEFDFEFCEDECDCEAECEFCBCACEAFACFCBCAECEBF +50,nb_gm_004,7,53,4.433992147445679,17,8,False,CFABEFECFFBEFCECEBEDAEDCFADACECABEFCEDCDABFBDADBADBDF +51,nb_gm_004,3,40,3.2851059436798096,13,6,False,BDFCDFCFDFBDABCACBFDBFADFBEFEAFBECDEEDAD +52,nb_gm_004,6,19,1.5269551277160645,6,3,False,CBADEFCBAFDEEBAFCDC +53,nb_gm_004,7,33,2.7817859649658203,11,5,False,FADAECBFAADECBDFEDCDBBAEFCBFECAFC +54,nb_gm_004,2,60,5.081879138946533,20,10,False,ADFDFAFBAFAEACFAFEFBCBDCDABACBABCECFCEACAFACFDFBABEBDEFEDFDB +55,nb_gm_004,3,13,1.0153288841247559,3,1,False,DECBAFCAFDBED +56,nb_gm_004,7,52,4.270846843719482,17,8,False,ADBDCFCADDBCBCAADCEFCCAFEBFFEAFACBCEBEADBEFEDCDBEBFF +57,nb_gm_004,5,34,2.718968152999878,11,5,False,BEDFEBBDFFDBAFDDCBFACDBEBCACEACEAF +58,nb_gm_004,2,59,4.88099479675293,19,9,True,BDFDFADACDCBFBCFCECBACABEBCBACFCBABFAFBFECFBDBCABACAFBABCBE +59,nb_gm_004,7,15,1.2424840927124023,5,2,False,CDFEBAACDFBEBAC +60,nb_gm_004,4,45,3.7462897300720215,15,7,False,FBECFBDEFBCDCBEDACEAFECADEADAEBDFEABFDCCBDFCA +61,nb_gm_004,7,49,3.994555950164795,16,8,False,BDECFEFBDDEFECBBDCCEBCEDCEFECBACFFAEEFCCBAEACFABF +62,nb_gm_004,5,42,3.4888839721679688,13,7,False,CDFFBCEDFFCECFDCDEADBFDAABCBEABEAAEBECBAFD +63,nb_gm_004,7,61,5.040170907974243,20,10,False,DEBFBCFDEEFBECDDEBCEFCFECFEEAFBCEFEBFAECAEAFEACFEDCAECDECCDAD +64,nb_gm_004,7,43,3.566600799560547,14,7,False,CEDEAFBCEEDADBCCEAACFBFEAEBCDFCBEFBDFDABFDA +65,nb_gm_004,5,48,3.976670980453491,16,8,False,BFDDFBBEDEFBEDAAFECDADBCBEDDFBBDFEABDBFFEDEAFFAE +66,nb_gm_004,6,17,1.2704148292541504,5,2,False,DFBACEDFBCAEECDFA +67,nb_gm_004,3,11,0.8034019470214844,2,1,False,ECAFDBADBCF +68,nb_gm_004,7,43,3.4832749366760254,14,7,False,FAEBDFEFAAEDFECFADFCEDCABECCDBBFEEBDBCAFDBA +69,nb_gm_004,2,12,1.0047342777252197,2,0,False,FCABEDEDFABC +70,nb_gm_004,4,49,4.085228681564331,16,8,False,DCAADCCAFDCBDACDBADFBABDDEBBDFABEFEACBEEFBEFBFECD +71,nb_gm_004,5,49,3.932910680770874,16,8,False,DFABEDDABBDACBDADCFDBCDFEBDCBEBEFCEACFBEFABAEFCAF +72,nb_gm_004,4,12,0.9949767589569092,3,1,False,EAFDBCADBCFE +73,nb_gm_004,5,43,3.502958059310913,14,7,False,EABBCEEDBDCEDBCBCDFCEDCFAEFECABFAEAFDAFCADF +74,nb_gm_004,3,44,3.5608408451080322,13,7,False,EFCFECFEBCDBFEBFCEFABEAFCADACDFBDDEADABDEACB +75,nb_gm_004,2,61,4.981963157653809,20,10,False,ABFBDFDFBFABAEFAFDFACADCECFCAFBFCBCFEFDFEDBDEBEDECACEAEDBDCBE +76,nb_gm_004,2,61,5.044064044952393,20,10,False,DFBFCBCBEBDEDCBDBEAECEDCBCECAEABFBDFDEAEBABCFCAFDFAFBADAFDFEE +77,nb_gm_004,3,26,2.024602174758911,8,4,False,FCAFBCFBEDFEDCADBCECABEABD +78,nb_gm_004,6,16,1.2625012397766113,5,2,False,CDEBFACDEBAFCBDF +79,nb_gm_004,2,14,1.071295976638794,4,2,False,CFBCBDBEAEDAFA +80,nb_gm_004,5,33,2.739096164703369,11,5,False,ADFFEAAFCEFAFECECFCBEEACDEBBADCBD +81,nb_gm_004,2,61,4.994161128997803,20,10,False,AFBABDBDEBEDECBCFBEBCBACAFEFCEDEBEABDBCDCAEABACBCFDFBDEDFEFAC +82,nb_gm_004,2,24,2.010740041732788,7,3,False,DEAEFAFACFCBEBDBCDCEABFD +83,nb_gm_004,7,10,0.7493958473205566,3,0,False,FACBEDBFAC +84,nb_gm_004,2,63,5.357555150985718,21,10,False,ECFCFBCBEBDEAECEDCDEBEDBDCADAEACBABCECACDADBFBAFEFCECBFBEFECDCF +85,nb_gm_004,2,44,3.593871831893921,14,7,False,BAEAFEFECEDCBCFCEFEBAEACDCFDFABCDBDFDBADABFB +86,nb_gm_004,3,17,1.3206660747528076,5,2,False,FDCFECAFCBFDABEAC +87,nb_gm_004,6,18,1.50052809715271,6,3,False,DCFEABDCFEBADACFBE +88,nb_gm_004,4,29,2.3075549602508545,8,4,False,FACEFAABFFDBCEDCDEDBCBAECEBDA +89,nb_gm_004,3,11,0.8077938556671143,2,1,False,ADEBCFECFDA +90,nb_gm_004,3,55,4.561264276504517,18,9,True,BACBCADCAEDACBADCABCEACDBCABDCFDBCEBFECBACBEDCADEACDFCB +91,nb_gm_004,3,62,5.1214518547058105,20,10,False,DFEBDECDEEDCADEABDAFEAEFDCFFCAACBABCDBEBDEBFACAFCFBCBFDBEFCAFC +92,nb_gm_004,7,63,5.354221820831299,21,10,False,ECDEACDECCEAABEECACDBBEDAEBDCEDEBABCBFEBCAADFFBAECDDFEADFCEFCAF +93,nb_gm_004,2,42,3.4913809299468994,13,7,False,FEAEBABADACDEDCDBCBFCFDEDAFAEFBFCBCEBEDFAC +94,nb_gm_004,4,58,4.802886962890625,19,9,False,ABDCABDACADBFBDBEFDFCEDCAFDCFAECAADEEABDEFDFEFCBBECEBDFCBF +95,nb_gm_004,6,14,1.061150074005127,4,2,False,ABCEDFABCFEDDB +96,nb_gm_004,4,41,3.3158693313598633,13,6,False,DEFADEFEADFAABEFAECFEACEADCEDBDABBACABECE +97,nb_gm_004,4,24,2.0305070877075195,8,4,False,DEBCDEFBDEAFCDABCAEFCBAF +98,nb_gm_004,6,35,2.8204848766326904,10,5,False,FDCEFBFDCCEBDECDCBAEDFCAFACBDAEABEB +99,nb_gm_004,3,32,2.5904409885406494,10,4,False,AFBEABFABBAECDECFDDFCCDEDAEFCBFC diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/results/nb_gm_004_profile.csv b/benchmarks/results/nb_gm_004_profile.csv new file mode 100644 index 0000000..656adff --- /dev/null +++ b/benchmarks/results/nb_gm_004_profile.csv @@ -0,0 +1,101 @@ +,alg,n,trials,time,targets,lures,skewed,sequence +0,nb_gm_004,2,64,5.629104852676392,20,10,False,DBFBFAFEAECACFDCDABADBDCFCBCABACECAEDEADAFAEDEFBFEBABFDCECDEBEFB +1,nb_gm_004,2,18,1.5522487163543701,6,3,True,EACADCDCACBABFCBCA +2,nb_gm_004,7,36,3.1199769973754883,12,6,False,ABEABFDABBAEBDAABFDBFDAFFACFCDECACBF +3,nb_gm_004,2,37,3.655029773712158,12,6,False,BFDFEDEDCECDCABADBDFADAFEFBEBCACFAFEC +4,nb_gm_004,4,39,3.4385950565338135,13,6,False,AFBDAFFDEACDCAECBAEBAFABCBAACFDECDFEDEF +5,nb_gm_004,7,54,4.757416009902954,18,9,False,BFAECBDBFFACEDBBDACBEAEDAFDBADCAEFCAFCEADCEFDEDACFBFBD +6,nb_gm_004,7,22,1.847884178161621,7,3,False,EDCBFAAEDBCFFAECBDCFDB +7,nb_gm_004,4,32,2.5619711875915527,10,5,False,DBFEDBFCEDFAECABACACFEBDCEDBAFDB +8,nb_gm_004,5,45,3.880707025527954,15,7,False,BCDEDBBDEECBDBFACDBEDADEDCAAFDEBAFBDADFEBAEFC +9,nb_gm_004,7,18,1.5218820571899414,5,3,False,FEBCDADFEBACAFDECB +10,nb_gm_004,5,43,3.712139129638672,14,7,False,AEFFCABEFFABDFAADBEACDCBDCECFBBEDCEDEACFBDA +11,nb_gm_004,7,60,5.11740517616272,19,10,False,FDEDCEBFDDECEDFFDCCFEBFCBAFEDBBEAAEBFBAEACADBBCACFAADCABDFCE +12,nb_gm_004,7,48,4.116453170776367,16,8,False,ADBADCCADFBDDCADCFDEFEACCDBFDCECFBEFBEFEABABEFCE +13,nb_gm_004,4,17,1.3661417961120605,4,2,False,CBEACBBDCBFCDAEEF +14,nb_gm_004,4,61,5.220706224441528,20,10,False,CEDACEDCACDBEBDDEAFAEAEFBDECFDEDBFBDCFABEFAEDEACBFABCFCBFFDCC +15,nb_gm_004,3,52,4.4212260246276855,17,8,False,EBCDBCDEBFDBFBCEFCBFECDEADCEDAEFBDEBDBAABFDAFCADFAEE +16,nb_gm_004,7,27,2.323706865310669,9,4,False,EACFDBBEAAFDDCEBCFFECABDCFA +17,nb_gm_004,3,32,2.64604115486145,10,5,False,CBACEBCDBFCBCEBFCBACDDFCEFAFEAFA +18,nb_gm_004,6,26,2.1442930698394775,7,4,False,ECBADFECBBAFEADDCFDFABCEFC +19,nb_gm_004,2,44,3.7390267848968506,14,7,False,EDCECACAFADFDAEACECDBDCBCEFEAFFDAFADBDCBCFCB +20,nb_gm_004,4,62,5.2222230434417725,20,10,False,EACFEACDFADCCAFDFAFCAADFADBFCABCDADBFBDBCFABFEDAFDADFAEDBACEBD +21,nb_gm_004,5,61,5.658479928970337,20,10,False,BAEFCBBEFFBCCAFEBCEFABECBAEEFCDECFBCBAFFDBDFAFADAEFABDEADBEDD +22,nb_gm_004,5,32,2.645524024963379,10,5,False,ECDBCEEDBBFEFBAFAEDACDAFBCADFCEA +23,nb_gm_004,7,62,5.216619968414307,20,10,False,EADDFBDEAADFFCEEBDFADCDBAFEDFCADFFDBABDDFACAEACDABEAFCACBCEFCB +24,nb_gm_004,3,24,2.0706608295440674,8,3,False,EBAEBFAEFDECBDCADBACFCDF +25,nb_gm_004,3,36,3.1037821769714355,12,6,False,BCFEBFECFEFCDFBDEFDBCDEBFEDBECEDCEFD +26,nb_gm_004,6,61,5.195503234863281,20,10,False,CADBEACADDBACEBDFBEFBBFCADBABCBDABFCBECBDFFEBBEDDEFFBDEBFEFDA +27,nb_gm_004,6,11,0.8340439796447754,3,0,False,AEFBCDABFEC +28,nb_gm_004,4,39,3.390317916870117,13,6,False,ACBFACBCFABEBAECEAEDBCADFDADAFFDECFBEFC +29,nb_gm_004,2,56,4.782411098480225,18,9,False,BCDBDCDCFDFBCBEBFEFABFBECEAEDADBCDCEFEBFBEDACDCFEFBEBACA +30,nb_gm_004,2,53,4.454513788223267,17,8,False,CEDEDBEBABDADECDCECDBCBDBCABADAFCDCFCEFFCECFEFADFDAEA +31,nb_gm_004,5,41,3.454822063446045,13,6,False,BEFACBBFAAEBCBAADCDAFDECFEDFCADEAEBDFCEED +32,nb_gm_004,2,53,4.557706117630005,17,8,False,BDEDEBDBEBAECEFEDFAFCFECACBABECEAEFDFCDDAEAFEFADFDBCB +33,nb_gm_004,3,57,4.94400691986084,19,9,False,FCEFBEDFEDBFBEFBCEECAEDCFDAFADFEBCFBADBACDAEFCAFCFEACEDCA +34,nb_gm_004,5,13,1.0586318969726562,4,2,False,FAEDBCFEDBACE +35,nb_gm_004,3,43,3.702164888381958,14,7,False,ACEADCADFCDABEAAEBAFCBFDEFBDFECFBEDBFCBEDCE +36,nb_gm_004,4,40,3.446906089782715,13,6,False,EDCAEDCBAEABCBAAEBCADBACBCACFDAECDEBEDCF +37,nb_gm_004,7,60,5.721850156784058,20,10,False,FABAFDBFAABFDAFFCBCDBAFDBECFADDABFDAADBFADAFCDFBBACBCFDCACAB +38,nb_gm_004,2,40,3.326483964920044,13,6,False,DEAEACAFCFDCDFEDEAFADFDBEBABFCBCACEBECBF +39,nb_gm_004,5,45,3.9018988609313965,15,7,False,CABEACCBEFACDEBAECEDFAFEBEACFBCAECBDBDCCDFDBE +40,nb_gm_004,3,18,1.55079984664917,6,3,False,EBADBAABFCAFCEDCBE +41,nb_gm_004,6,34,2.884040355682373,11,5,False,ECBABFECBBAFEADBDACFDBEDBFCEFDDACA +42,nb_gm_004,2,48,4.0855629444122314,14,7,False,AFEFAEAEFAFDBDCDBCBFEFCECDBDABACBCEDFDEBCACDABEF +43,nb_gm_004,6,50,4.191677093505859,16,8,False,FDEFACFDEEFCEDFDECFDBADCBDCBDABFECEADABEBABACECBFA +44,nb_gm_004,3,25,2.081367015838623,8,3,False,EBDEABEACBAFDCFCDFCFAEDBE +45,nb_gm_004,5,15,1.2862391471862793,5,2,False,ABDCEAFBCEDFFDE +46,nb_gm_004,4,19,1.6599581241607666,6,3,False,BFCABFFACBDABEDFAEC +47,nb_gm_004,5,61,5.23445987701416,20,10,True,CEFEFCCFEECDFDADCFDEFCEFCFBFECABCEBCCFEEACAEFABCEADAFECDFABCA +48,nb_gm_004,4,51,4.420213937759399,17,8,False,FDABFDDEFFDBFDEABDEDFDCEEACCEDDAEEDBEDFEBDCEDBFEABC +49,nb_gm_004,2,61,5.241312026977539,20,10,True,FDEDCECEDCDEDBCDCECBFBEFDFEFCEDECDCEAECEFCBCACEAFACFCBCAECEBF +50,nb_gm_004,7,53,4.433992147445679,17,8,False,CFABEFECFFBEFCECEBEDAEDCFADACECABEFCEDCDABFBDADBADBDF +51,nb_gm_004,3,40,3.2851059436798096,13,6,False,BDFCDFCFDFBDABCACBFDBFADFBEFEAFBECDEEDAD +52,nb_gm_004,6,19,1.5269551277160645,6,3,False,CBADEFCBAFDEEBAFCDC +53,nb_gm_004,7,33,2.7817859649658203,11,5,False,FADAECBFAADECBDFEDCDBBAEFCBFECAFC +54,nb_gm_004,2,60,5.081879138946533,20,10,False,ADFDFAFBAFAEACFAFEFBCBDCDABACBABCECFCEACAFACFDFBABEBDEFEDFDB +55,nb_gm_004,3,13,1.0153288841247559,3,1,False,DECBAFCAFDBED +56,nb_gm_004,7,52,4.270846843719482,17,8,False,ADBDCFCADDBCBCAADCEFCCAFEBFFEAFACBCEBEADBEFEDCDBEBFF +57,nb_gm_004,5,34,2.718968152999878,11,5,False,BEDFEBBDFFDBAFDDCBFACDBEBCACEACEAF +58,nb_gm_004,2,59,4.88099479675293,19,9,True,BDFDFADACDCBFBCFCECBACABEBCBACFCBABFAFBFECFBDBCABACAFBABCBE +59,nb_gm_004,7,15,1.2424840927124023,5,2,False,CDFEBAACDFBEBAC +60,nb_gm_004,4,45,3.7462897300720215,15,7,False,FBECFBDEFBCDCBEDACEAFECADEADAEBDFEABFDCCBDFCA +61,nb_gm_004,7,49,3.994555950164795,16,8,False,BDECFEFBDDEFECBBDCCEBCEDCEFECBACFFAEEFCCBAEACFABF +62,nb_gm_004,5,42,3.4888839721679688,13,7,False,CDFFBCEDFFCECFDCDEADBFDAABCBEABEAAEBECBAFD +63,nb_gm_004,7,61,5.040170907974243,20,10,False,DEBFBCFDEEFBECDDEBCEFCFECFEEAFBCEFEBFAECAEAFEACFEDCAECDECCDAD +64,nb_gm_004,7,43,3.566600799560547,14,7,False,CEDEAFBCEEDADBCCEAACFBFEAEBCDFCBEFBDFDABFDA +65,nb_gm_004,5,48,3.976670980453491,16,8,False,BFDDFBBEDEFBEDAAFECDADBCBEDDFBBDFEABDBFFEDEAFFAE +66,nb_gm_004,6,17,1.2704148292541504,5,2,False,DFBACEDFBCAEECDFA +67,nb_gm_004,3,11,0.8034019470214844,2,1,False,ECAFDBADBCF +68,nb_gm_004,7,43,3.4832749366760254,14,7,False,FAEBDFEFAAEDFECFADFCEDCABECCDBBFEEBDBCAFDBA +69,nb_gm_004,2,12,1.0047342777252197,2,0,False,FCABEDEDFABC +70,nb_gm_004,4,49,4.085228681564331,16,8,False,DCAADCCAFDCBDACDBADFBABDDEBBDFABEFEACBEEFBEFBFECD +71,nb_gm_004,5,49,3.932910680770874,16,8,False,DFABEDDABBDACBDADCFDBCDFEBDCBEBEFCEACFBEFABAEFCAF +72,nb_gm_004,4,12,0.9949767589569092,3,1,False,EAFDBCADBCFE +73,nb_gm_004,5,43,3.502958059310913,14,7,False,EABBCEEDBDCEDBCBCDFCEDCFAEFECABFAEAFDAFCADF +74,nb_gm_004,3,44,3.5608408451080322,13,7,False,EFCFECFEBCDBFEBFCEFABEAFCADACDFBDDEADABDEACB +75,nb_gm_004,2,61,4.981963157653809,20,10,False,ABFBDFDFBFABAEFAFDFACADCECFCAFBFCBCFEFDFEDBDEBEDECACEAEDBDCBE +76,nb_gm_004,2,61,5.044064044952393,20,10,False,DFBFCBCBEBDEDCBDBEAECEDCBCECAEABFBDFDEAEBABCFCAFDFAFBADAFDFEE +77,nb_gm_004,3,26,2.024602174758911,8,4,False,FCAFBCFBEDFEDCADBCECABEABD +78,nb_gm_004,6,16,1.2625012397766113,5,2,False,CDEBFACDEBAFCBDF +79,nb_gm_004,2,14,1.071295976638794,4,2,False,CFBCBDBEAEDAFA +80,nb_gm_004,5,33,2.739096164703369,11,5,False,ADFFEAAFCEFAFECECFCBEEACDEBBADCBD +81,nb_gm_004,2,61,4.994161128997803,20,10,False,AFBABDBDEBEDECBCFBEBCBACAFEFCEDEBEABDBCDCAEABACBCFDFBDEDFEFAC +82,nb_gm_004,2,24,2.010740041732788,7,3,False,DEAEFAFACFCBEBDBCDCEABFD +83,nb_gm_004,7,10,0.7493958473205566,3,0,False,FACBEDBFAC +84,nb_gm_004,2,63,5.357555150985718,21,10,False,ECFCFBCBEBDEAECEDCDEBEDBDCADAEACBABCECACDADBFBAFEFCECBFBEFECDCF +85,nb_gm_004,2,44,3.593871831893921,14,7,False,BAEAFEFECEDCBCFCEFEBAEACDCFDFABCDBDFDBADABFB +86,nb_gm_004,3,17,1.3206660747528076,5,2,False,FDCFECAFCBFDABEAC +87,nb_gm_004,6,18,1.50052809715271,6,3,False,DCFEABDCFEBADACFBE +88,nb_gm_004,4,29,2.3075549602508545,8,4,False,FACEFAABFFDBCEDCDEDBCBAECEBDA +89,nb_gm_004,3,11,0.8077938556671143,2,1,False,ADEBCFECFDA +90,nb_gm_004,3,55,4.561264276504517,18,9,True,BACBCADCAEDACBADCABCEACDBCABDCFDBCEBFECBACBEDCADEACDFCB +91,nb_gm_004,3,62,5.1214518547058105,20,10,False,DFEBDECDEEDCADEABDAFEAEFDCFFCAACBABCDBEBDEBFACAFCFBCBFDBEFCAFC +92,nb_gm_004,7,63,5.354221820831299,21,10,False,ECDEACDECCEAABEECACDBBEDAEBDCEDEBABCBFEBCAADFFBAECDDFEADFCEFCAF +93,nb_gm_004,2,42,3.4913809299468994,13,7,False,FEAEBABADACDEDCDBCBFCFDEDAFAEFBFCBCEBEDFAC +94,nb_gm_004,4,58,4.802886962890625,19,9,False,ABDCABDACADBFBDBEFDFCEDCAFDCFAECAADEEABDEFDFEFCBBECEBDFCBF +95,nb_gm_004,6,14,1.061150074005127,4,2,False,ABCEDFABCFEDDB +96,nb_gm_004,4,41,3.3158693313598633,13,6,False,DEFADEFEADFAABEFAECFEACEADCEDBDABBACABECE +97,nb_gm_004,4,24,2.0305070877075195,8,4,False,DEBCDEFBDEAFCDABCAEFCBAF +98,nb_gm_004,6,35,2.8204848766326904,10,5,False,FDCEFBFDCCEBDECDCBAEDFCAFACBDAEABEB +99,nb_gm_004,3,32,2.5904409885406494,10,4,False,AFBEABFABBAECDECFDDFCCDEDAEFCBFC diff --git a/demo/nb_gm_002_demo.py b/demo/nb_gm_002_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/results/nb_gm_004_profile.csv b/benchmarks/results/nb_gm_004_profile.csv new file mode 100644 index 0000000..656adff --- /dev/null +++ b/benchmarks/results/nb_gm_004_profile.csv @@ -0,0 +1,101 @@ +,alg,n,trials,time,targets,lures,skewed,sequence +0,nb_gm_004,2,64,5.629104852676392,20,10,False,DBFBFAFEAECACFDCDABADBDCFCBCABACECAEDEADAFAEDEFBFEBABFDCECDEBEFB +1,nb_gm_004,2,18,1.5522487163543701,6,3,True,EACADCDCACBABFCBCA +2,nb_gm_004,7,36,3.1199769973754883,12,6,False,ABEABFDABBAEBDAABFDBFDAFFACFCDECACBF +3,nb_gm_004,2,37,3.655029773712158,12,6,False,BFDFEDEDCECDCABADBDFADAFEFBEBCACFAFEC +4,nb_gm_004,4,39,3.4385950565338135,13,6,False,AFBDAFFDEACDCAECBAEBAFABCBAACFDECDFEDEF +5,nb_gm_004,7,54,4.757416009902954,18,9,False,BFAECBDBFFACEDBBDACBEAEDAFDBADCAEFCAFCEADCEFDEDACFBFBD +6,nb_gm_004,7,22,1.847884178161621,7,3,False,EDCBFAAEDBCFFAECBDCFDB +7,nb_gm_004,4,32,2.5619711875915527,10,5,False,DBFEDBFCEDFAECABACACFEBDCEDBAFDB +8,nb_gm_004,5,45,3.880707025527954,15,7,False,BCDEDBBDEECBDBFACDBEDADEDCAAFDEBAFBDADFEBAEFC +9,nb_gm_004,7,18,1.5218820571899414,5,3,False,FEBCDADFEBACAFDECB +10,nb_gm_004,5,43,3.712139129638672,14,7,False,AEFFCABEFFABDFAADBEACDCBDCECFBBEDCEDEACFBDA +11,nb_gm_004,7,60,5.11740517616272,19,10,False,FDEDCEBFDDECEDFFDCCFEBFCBAFEDBBEAAEBFBAEACADBBCACFAADCABDFCE +12,nb_gm_004,7,48,4.116453170776367,16,8,False,ADBADCCADFBDDCADCFDEFEACCDBFDCECFBEFBEFEABABEFCE +13,nb_gm_004,4,17,1.3661417961120605,4,2,False,CBEACBBDCBFCDAEEF +14,nb_gm_004,4,61,5.220706224441528,20,10,False,CEDACEDCACDBEBDDEAFAEAEFBDECFDEDBFBDCFABEFAEDEACBFABCFCBFFDCC +15,nb_gm_004,3,52,4.4212260246276855,17,8,False,EBCDBCDEBFDBFBCEFCBFECDEADCEDAEFBDEBDBAABFDAFCADFAEE +16,nb_gm_004,7,27,2.323706865310669,9,4,False,EACFDBBEAAFDDCEBCFFECABDCFA +17,nb_gm_004,3,32,2.64604115486145,10,5,False,CBACEBCDBFCBCEBFCBACDDFCEFAFEAFA +18,nb_gm_004,6,26,2.1442930698394775,7,4,False,ECBADFECBBAFEADDCFDFABCEFC +19,nb_gm_004,2,44,3.7390267848968506,14,7,False,EDCECACAFADFDAEACECDBDCBCEFEAFFDAFADBDCBCFCB +20,nb_gm_004,4,62,5.2222230434417725,20,10,False,EACFEACDFADCCAFDFAFCAADFADBFCABCDADBFBDBCFABFEDAFDADFAEDBACEBD +21,nb_gm_004,5,61,5.658479928970337,20,10,False,BAEFCBBEFFBCCAFEBCEFABECBAEEFCDECFBCBAFFDBDFAFADAEFABDEADBEDD +22,nb_gm_004,5,32,2.645524024963379,10,5,False,ECDBCEEDBBFEFBAFAEDACDAFBCADFCEA +23,nb_gm_004,7,62,5.216619968414307,20,10,False,EADDFBDEAADFFCEEBDFADCDBAFEDFCADFFDBABDDFACAEACDABEAFCACBCEFCB +24,nb_gm_004,3,24,2.0706608295440674,8,3,False,EBAEBFAEFDECBDCADBACFCDF +25,nb_gm_004,3,36,3.1037821769714355,12,6,False,BCFEBFECFEFCDFBDEFDBCDEBFEDBECEDCEFD +26,nb_gm_004,6,61,5.195503234863281,20,10,False,CADBEACADDBACEBDFBEFBBFCADBABCBDABFCBECBDFFEBBEDDEFFBDEBFEFDA +27,nb_gm_004,6,11,0.8340439796447754,3,0,False,AEFBCDABFEC +28,nb_gm_004,4,39,3.390317916870117,13,6,False,ACBFACBCFABEBAECEAEDBCADFDADAFFDECFBEFC +29,nb_gm_004,2,56,4.782411098480225,18,9,False,BCDBDCDCFDFBCBEBFEFABFBECEAEDADBCDCEFEBFBEDACDCFEFBEBACA +30,nb_gm_004,2,53,4.454513788223267,17,8,False,CEDEDBEBABDADECDCECDBCBDBCABADAFCDCFCEFFCECFEFADFDAEA +31,nb_gm_004,5,41,3.454822063446045,13,6,False,BEFACBBFAAEBCBAADCDAFDECFEDFCADEAEBDFCEED +32,nb_gm_004,2,53,4.557706117630005,17,8,False,BDEDEBDBEBAECEFEDFAFCFECACBABECEAEFDFCDDAEAFEFADFDBCB +33,nb_gm_004,3,57,4.94400691986084,19,9,False,FCEFBEDFEDBFBEFBCEECAEDCFDAFADFEBCFBADBACDAEFCAFCFEACEDCA +34,nb_gm_004,5,13,1.0586318969726562,4,2,False,FAEDBCFEDBACE +35,nb_gm_004,3,43,3.702164888381958,14,7,False,ACEADCADFCDABEAAEBAFCBFDEFBDFECFBEDBFCBEDCE +36,nb_gm_004,4,40,3.446906089782715,13,6,False,EDCAEDCBAEABCBAAEBCADBACBCACFDAECDEBEDCF +37,nb_gm_004,7,60,5.721850156784058,20,10,False,FABAFDBFAABFDAFFCBCDBAFDBECFADDABFDAADBFADAFCDFBBACBCFDCACAB +38,nb_gm_004,2,40,3.326483964920044,13,6,False,DEAEACAFCFDCDFEDEAFADFDBEBABFCBCACEBECBF +39,nb_gm_004,5,45,3.9018988609313965,15,7,False,CABEACCBEFACDEBAECEDFAFEBEACFBCAECBDBDCCDFDBE +40,nb_gm_004,3,18,1.55079984664917,6,3,False,EBADBAABFCAFCEDCBE +41,nb_gm_004,6,34,2.884040355682373,11,5,False,ECBABFECBBAFEADBDACFDBEDBFCEFDDACA +42,nb_gm_004,2,48,4.0855629444122314,14,7,False,AFEFAEAEFAFDBDCDBCBFEFCECDBDABACBCEDFDEBCACDABEF +43,nb_gm_004,6,50,4.191677093505859,16,8,False,FDEFACFDEEFCEDFDECFDBADCBDCBDABFECEADABEBABACECBFA +44,nb_gm_004,3,25,2.081367015838623,8,3,False,EBDEABEACBAFDCFCDFCFAEDBE +45,nb_gm_004,5,15,1.2862391471862793,5,2,False,ABDCEAFBCEDFFDE +46,nb_gm_004,4,19,1.6599581241607666,6,3,False,BFCABFFACBDABEDFAEC +47,nb_gm_004,5,61,5.23445987701416,20,10,True,CEFEFCCFEECDFDADCFDEFCEFCFBFECABCEBCCFEEACAEFABCEADAFECDFABCA +48,nb_gm_004,4,51,4.420213937759399,17,8,False,FDABFDDEFFDBFDEABDEDFDCEEACCEDDAEEDBEDFEBDCEDBFEABC +49,nb_gm_004,2,61,5.241312026977539,20,10,True,FDEDCECEDCDEDBCDCECBFBEFDFEFCEDECDCEAECEFCBCACEAFACFCBCAECEBF +50,nb_gm_004,7,53,4.433992147445679,17,8,False,CFABEFECFFBEFCECEBEDAEDCFADACECABEFCEDCDABFBDADBADBDF +51,nb_gm_004,3,40,3.2851059436798096,13,6,False,BDFCDFCFDFBDABCACBFDBFADFBEFEAFBECDEEDAD +52,nb_gm_004,6,19,1.5269551277160645,6,3,False,CBADEFCBAFDEEBAFCDC +53,nb_gm_004,7,33,2.7817859649658203,11,5,False,FADAECBFAADECBDFEDCDBBAEFCBFECAFC +54,nb_gm_004,2,60,5.081879138946533,20,10,False,ADFDFAFBAFAEACFAFEFBCBDCDABACBABCECFCEACAFACFDFBABEBDEFEDFDB +55,nb_gm_004,3,13,1.0153288841247559,3,1,False,DECBAFCAFDBED +56,nb_gm_004,7,52,4.270846843719482,17,8,False,ADBDCFCADDBCBCAADCEFCCAFEBFFEAFACBCEBEADBEFEDCDBEBFF +57,nb_gm_004,5,34,2.718968152999878,11,5,False,BEDFEBBDFFDBAFDDCBFACDBEBCACEACEAF +58,nb_gm_004,2,59,4.88099479675293,19,9,True,BDFDFADACDCBFBCFCECBACABEBCBACFCBABFAFBFECFBDBCABACAFBABCBE +59,nb_gm_004,7,15,1.2424840927124023,5,2,False,CDFEBAACDFBEBAC +60,nb_gm_004,4,45,3.7462897300720215,15,7,False,FBECFBDEFBCDCBEDACEAFECADEADAEBDFEABFDCCBDFCA +61,nb_gm_004,7,49,3.994555950164795,16,8,False,BDECFEFBDDEFECBBDCCEBCEDCEFECBACFFAEEFCCBAEACFABF +62,nb_gm_004,5,42,3.4888839721679688,13,7,False,CDFFBCEDFFCECFDCDEADBFDAABCBEABEAAEBECBAFD +63,nb_gm_004,7,61,5.040170907974243,20,10,False,DEBFBCFDEEFBECDDEBCEFCFECFEEAFBCEFEBFAECAEAFEACFEDCAECDECCDAD +64,nb_gm_004,7,43,3.566600799560547,14,7,False,CEDEAFBCEEDADBCCEAACFBFEAEBCDFCBEFBDFDABFDA +65,nb_gm_004,5,48,3.976670980453491,16,8,False,BFDDFBBEDEFBEDAAFECDADBCBEDDFBBDFEABDBFFEDEAFFAE +66,nb_gm_004,6,17,1.2704148292541504,5,2,False,DFBACEDFBCAEECDFA +67,nb_gm_004,3,11,0.8034019470214844,2,1,False,ECAFDBADBCF +68,nb_gm_004,7,43,3.4832749366760254,14,7,False,FAEBDFEFAAEDFECFADFCEDCABECCDBBFEEBDBCAFDBA +69,nb_gm_004,2,12,1.0047342777252197,2,0,False,FCABEDEDFABC +70,nb_gm_004,4,49,4.085228681564331,16,8,False,DCAADCCAFDCBDACDBADFBABDDEBBDFABEFEACBEEFBEFBFECD +71,nb_gm_004,5,49,3.932910680770874,16,8,False,DFABEDDABBDACBDADCFDBCDFEBDCBEBEFCEACFBEFABAEFCAF +72,nb_gm_004,4,12,0.9949767589569092,3,1,False,EAFDBCADBCFE +73,nb_gm_004,5,43,3.502958059310913,14,7,False,EABBCEEDBDCEDBCBCDFCEDCFAEFECABFAEAFDAFCADF +74,nb_gm_004,3,44,3.5608408451080322,13,7,False,EFCFECFEBCDBFEBFCEFABEAFCADACDFBDDEADABDEACB +75,nb_gm_004,2,61,4.981963157653809,20,10,False,ABFBDFDFBFABAEFAFDFACADCECFCAFBFCBCFEFDFEDBDEBEDECACEAEDBDCBE +76,nb_gm_004,2,61,5.044064044952393,20,10,False,DFBFCBCBEBDEDCBDBEAECEDCBCECAEABFBDFDEAEBABCFCAFDFAFBADAFDFEE +77,nb_gm_004,3,26,2.024602174758911,8,4,False,FCAFBCFBEDFEDCADBCECABEABD +78,nb_gm_004,6,16,1.2625012397766113,5,2,False,CDEBFACDEBAFCBDF +79,nb_gm_004,2,14,1.071295976638794,4,2,False,CFBCBDBEAEDAFA +80,nb_gm_004,5,33,2.739096164703369,11,5,False,ADFFEAAFCEFAFECECFCBEEACDEBBADCBD +81,nb_gm_004,2,61,4.994161128997803,20,10,False,AFBABDBDEBEDECBCFBEBCBACAFEFCEDEBEABDBCDCAEABACBCFDFBDEDFEFAC +82,nb_gm_004,2,24,2.010740041732788,7,3,False,DEAEFAFACFCBEBDBCDCEABFD +83,nb_gm_004,7,10,0.7493958473205566,3,0,False,FACBEDBFAC +84,nb_gm_004,2,63,5.357555150985718,21,10,False,ECFCFBCBEBDEAECEDCDEBEDBDCADAEACBABCECACDADBFBAFEFCECBFBEFECDCF +85,nb_gm_004,2,44,3.593871831893921,14,7,False,BAEAFEFECEDCBCFCEFEBAEACDCFDFABCDBDFDBADABFB +86,nb_gm_004,3,17,1.3206660747528076,5,2,False,FDCFECAFCBFDABEAC +87,nb_gm_004,6,18,1.50052809715271,6,3,False,DCFEABDCFEBADACFBE +88,nb_gm_004,4,29,2.3075549602508545,8,4,False,FACEFAABFFDBCEDCDEDBCBAECEBDA +89,nb_gm_004,3,11,0.8077938556671143,2,1,False,ADEBCFECFDA +90,nb_gm_004,3,55,4.561264276504517,18,9,True,BACBCADCAEDACBADCABCEACDBCABDCFDBCEBFECBACBEDCADEACDFCB +91,nb_gm_004,3,62,5.1214518547058105,20,10,False,DFEBDECDEEDCADEABDAFEAEFDCFFCAACBABCDBEBDEBFACAFCFBCBFDBEFCAFC +92,nb_gm_004,7,63,5.354221820831299,21,10,False,ECDEACDECCEAABEECACDBBEDAEBDCEDEBABCBFEBCAADFFBAECDDFEADFCEFCAF +93,nb_gm_004,2,42,3.4913809299468994,13,7,False,FEAEBABADACDEDCDBCBFCFDEDAFAEFBFCBCEBEDFAC +94,nb_gm_004,4,58,4.802886962890625,19,9,False,ABDCABDACADBFBDBEFDFCEDCAFDCFAECAADEEABDEFDFEFCBBECEBDFCBF +95,nb_gm_004,6,14,1.061150074005127,4,2,False,ABCEDFABCFEDDB +96,nb_gm_004,4,41,3.3158693313598633,13,6,False,DEFADEFEADFAABEFAECFEACEADCEDBDABBACABECE +97,nb_gm_004,4,24,2.0305070877075195,8,4,False,DEBCDEFBDEAFCDABCAEFCBAF +98,nb_gm_004,6,35,2.8204848766326904,10,5,False,FDCEFBFDCCEBDECDCBAEDFCAFACBDAEABEB +99,nb_gm_004,3,32,2.5904409885406494,10,4,False,AFBEABFABBAECDECFDDFCCDEDAEFCBFC diff --git a/demo/nb_gm_002_demo.py b/demo/nb_gm_002_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_002_demo_sdt.py b/demo/nb_gm_002_demo_sdt.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo_sdt.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/results/nb_gm_004_profile.csv b/benchmarks/results/nb_gm_004_profile.csv new file mode 100644 index 0000000..656adff --- /dev/null +++ b/benchmarks/results/nb_gm_004_profile.csv @@ -0,0 +1,101 @@ +,alg,n,trials,time,targets,lures,skewed,sequence +0,nb_gm_004,2,64,5.629104852676392,20,10,False,DBFBFAFEAECACFDCDABADBDCFCBCABACECAEDEADAFAEDEFBFEBABFDCECDEBEFB +1,nb_gm_004,2,18,1.5522487163543701,6,3,True,EACADCDCACBABFCBCA +2,nb_gm_004,7,36,3.1199769973754883,12,6,False,ABEABFDABBAEBDAABFDBFDAFFACFCDECACBF +3,nb_gm_004,2,37,3.655029773712158,12,6,False,BFDFEDEDCECDCABADBDFADAFEFBEBCACFAFEC +4,nb_gm_004,4,39,3.4385950565338135,13,6,False,AFBDAFFDEACDCAECBAEBAFABCBAACFDECDFEDEF +5,nb_gm_004,7,54,4.757416009902954,18,9,False,BFAECBDBFFACEDBBDACBEAEDAFDBADCAEFCAFCEADCEFDEDACFBFBD +6,nb_gm_004,7,22,1.847884178161621,7,3,False,EDCBFAAEDBCFFAECBDCFDB +7,nb_gm_004,4,32,2.5619711875915527,10,5,False,DBFEDBFCEDFAECABACACFEBDCEDBAFDB +8,nb_gm_004,5,45,3.880707025527954,15,7,False,BCDEDBBDEECBDBFACDBEDADEDCAAFDEBAFBDADFEBAEFC +9,nb_gm_004,7,18,1.5218820571899414,5,3,False,FEBCDADFEBACAFDECB +10,nb_gm_004,5,43,3.712139129638672,14,7,False,AEFFCABEFFABDFAADBEACDCBDCECFBBEDCEDEACFBDA +11,nb_gm_004,7,60,5.11740517616272,19,10,False,FDEDCEBFDDECEDFFDCCFEBFCBAFEDBBEAAEBFBAEACADBBCACFAADCABDFCE +12,nb_gm_004,7,48,4.116453170776367,16,8,False,ADBADCCADFBDDCADCFDEFEACCDBFDCECFBEFBEFEABABEFCE +13,nb_gm_004,4,17,1.3661417961120605,4,2,False,CBEACBBDCBFCDAEEF +14,nb_gm_004,4,61,5.220706224441528,20,10,False,CEDACEDCACDBEBDDEAFAEAEFBDECFDEDBFBDCFABEFAEDEACBFABCFCBFFDCC +15,nb_gm_004,3,52,4.4212260246276855,17,8,False,EBCDBCDEBFDBFBCEFCBFECDEADCEDAEFBDEBDBAABFDAFCADFAEE +16,nb_gm_004,7,27,2.323706865310669,9,4,False,EACFDBBEAAFDDCEBCFFECABDCFA +17,nb_gm_004,3,32,2.64604115486145,10,5,False,CBACEBCDBFCBCEBFCBACDDFCEFAFEAFA +18,nb_gm_004,6,26,2.1442930698394775,7,4,False,ECBADFECBBAFEADDCFDFABCEFC +19,nb_gm_004,2,44,3.7390267848968506,14,7,False,EDCECACAFADFDAEACECDBDCBCEFEAFFDAFADBDCBCFCB +20,nb_gm_004,4,62,5.2222230434417725,20,10,False,EACFEACDFADCCAFDFAFCAADFADBFCABCDADBFBDBCFABFEDAFDADFAEDBACEBD +21,nb_gm_004,5,61,5.658479928970337,20,10,False,BAEFCBBEFFBCCAFEBCEFABECBAEEFCDECFBCBAFFDBDFAFADAEFABDEADBEDD +22,nb_gm_004,5,32,2.645524024963379,10,5,False,ECDBCEEDBBFEFBAFAEDACDAFBCADFCEA +23,nb_gm_004,7,62,5.216619968414307,20,10,False,EADDFBDEAADFFCEEBDFADCDBAFEDFCADFFDBABDDFACAEACDABEAFCACBCEFCB +24,nb_gm_004,3,24,2.0706608295440674,8,3,False,EBAEBFAEFDECBDCADBACFCDF +25,nb_gm_004,3,36,3.1037821769714355,12,6,False,BCFEBFECFEFCDFBDEFDBCDEBFEDBECEDCEFD +26,nb_gm_004,6,61,5.195503234863281,20,10,False,CADBEACADDBACEBDFBEFBBFCADBABCBDABFCBECBDFFEBBEDDEFFBDEBFEFDA +27,nb_gm_004,6,11,0.8340439796447754,3,0,False,AEFBCDABFEC +28,nb_gm_004,4,39,3.390317916870117,13,6,False,ACBFACBCFABEBAECEAEDBCADFDADAFFDECFBEFC +29,nb_gm_004,2,56,4.782411098480225,18,9,False,BCDBDCDCFDFBCBEBFEFABFBECEAEDADBCDCEFEBFBEDACDCFEFBEBACA +30,nb_gm_004,2,53,4.454513788223267,17,8,False,CEDEDBEBABDADECDCECDBCBDBCABADAFCDCFCEFFCECFEFADFDAEA +31,nb_gm_004,5,41,3.454822063446045,13,6,False,BEFACBBFAAEBCBAADCDAFDECFEDFCADEAEBDFCEED +32,nb_gm_004,2,53,4.557706117630005,17,8,False,BDEDEBDBEBAECEFEDFAFCFECACBABECEAEFDFCDDAEAFEFADFDBCB +33,nb_gm_004,3,57,4.94400691986084,19,9,False,FCEFBEDFEDBFBEFBCEECAEDCFDAFADFEBCFBADBACDAEFCAFCFEACEDCA +34,nb_gm_004,5,13,1.0586318969726562,4,2,False,FAEDBCFEDBACE +35,nb_gm_004,3,43,3.702164888381958,14,7,False,ACEADCADFCDABEAAEBAFCBFDEFBDFECFBEDBFCBEDCE +36,nb_gm_004,4,40,3.446906089782715,13,6,False,EDCAEDCBAEABCBAAEBCADBACBCACFDAECDEBEDCF +37,nb_gm_004,7,60,5.721850156784058,20,10,False,FABAFDBFAABFDAFFCBCDBAFDBECFADDABFDAADBFADAFCDFBBACBCFDCACAB +38,nb_gm_004,2,40,3.326483964920044,13,6,False,DEAEACAFCFDCDFEDEAFADFDBEBABFCBCACEBECBF +39,nb_gm_004,5,45,3.9018988609313965,15,7,False,CABEACCBEFACDEBAECEDFAFEBEACFBCAECBDBDCCDFDBE +40,nb_gm_004,3,18,1.55079984664917,6,3,False,EBADBAABFCAFCEDCBE +41,nb_gm_004,6,34,2.884040355682373,11,5,False,ECBABFECBBAFEADBDACFDBEDBFCEFDDACA +42,nb_gm_004,2,48,4.0855629444122314,14,7,False,AFEFAEAEFAFDBDCDBCBFEFCECDBDABACBCEDFDEBCACDABEF +43,nb_gm_004,6,50,4.191677093505859,16,8,False,FDEFACFDEEFCEDFDECFDBADCBDCBDABFECEADABEBABACECBFA +44,nb_gm_004,3,25,2.081367015838623,8,3,False,EBDEABEACBAFDCFCDFCFAEDBE +45,nb_gm_004,5,15,1.2862391471862793,5,2,False,ABDCEAFBCEDFFDE +46,nb_gm_004,4,19,1.6599581241607666,6,3,False,BFCABFFACBDABEDFAEC +47,nb_gm_004,5,61,5.23445987701416,20,10,True,CEFEFCCFEECDFDADCFDEFCEFCFBFECABCEBCCFEEACAEFABCEADAFECDFABCA +48,nb_gm_004,4,51,4.420213937759399,17,8,False,FDABFDDEFFDBFDEABDEDFDCEEACCEDDAEEDBEDFEBDCEDBFEABC +49,nb_gm_004,2,61,5.241312026977539,20,10,True,FDEDCECEDCDEDBCDCECBFBEFDFEFCEDECDCEAECEFCBCACEAFACFCBCAECEBF +50,nb_gm_004,7,53,4.433992147445679,17,8,False,CFABEFECFFBEFCECEBEDAEDCFADACECABEFCEDCDABFBDADBADBDF +51,nb_gm_004,3,40,3.2851059436798096,13,6,False,BDFCDFCFDFBDABCACBFDBFADFBEFEAFBECDEEDAD +52,nb_gm_004,6,19,1.5269551277160645,6,3,False,CBADEFCBAFDEEBAFCDC +53,nb_gm_004,7,33,2.7817859649658203,11,5,False,FADAECBFAADECBDFEDCDBBAEFCBFECAFC +54,nb_gm_004,2,60,5.081879138946533,20,10,False,ADFDFAFBAFAEACFAFEFBCBDCDABACBABCECFCEACAFACFDFBABEBDEFEDFDB +55,nb_gm_004,3,13,1.0153288841247559,3,1,False,DECBAFCAFDBED +56,nb_gm_004,7,52,4.270846843719482,17,8,False,ADBDCFCADDBCBCAADCEFCCAFEBFFEAFACBCEBEADBEFEDCDBEBFF +57,nb_gm_004,5,34,2.718968152999878,11,5,False,BEDFEBBDFFDBAFDDCBFACDBEBCACEACEAF +58,nb_gm_004,2,59,4.88099479675293,19,9,True,BDFDFADACDCBFBCFCECBACABEBCBACFCBABFAFBFECFBDBCABACAFBABCBE +59,nb_gm_004,7,15,1.2424840927124023,5,2,False,CDFEBAACDFBEBAC +60,nb_gm_004,4,45,3.7462897300720215,15,7,False,FBECFBDEFBCDCBEDACEAFECADEADAEBDFEABFDCCBDFCA +61,nb_gm_004,7,49,3.994555950164795,16,8,False,BDECFEFBDDEFECBBDCCEBCEDCEFECBACFFAEEFCCBAEACFABF +62,nb_gm_004,5,42,3.4888839721679688,13,7,False,CDFFBCEDFFCECFDCDEADBFDAABCBEABEAAEBECBAFD +63,nb_gm_004,7,61,5.040170907974243,20,10,False,DEBFBCFDEEFBECDDEBCEFCFECFEEAFBCEFEBFAECAEAFEACFEDCAECDECCDAD +64,nb_gm_004,7,43,3.566600799560547,14,7,False,CEDEAFBCEEDADBCCEAACFBFEAEBCDFCBEFBDFDABFDA +65,nb_gm_004,5,48,3.976670980453491,16,8,False,BFDDFBBEDEFBEDAAFECDADBCBEDDFBBDFEABDBFFEDEAFFAE +66,nb_gm_004,6,17,1.2704148292541504,5,2,False,DFBACEDFBCAEECDFA +67,nb_gm_004,3,11,0.8034019470214844,2,1,False,ECAFDBADBCF +68,nb_gm_004,7,43,3.4832749366760254,14,7,False,FAEBDFEFAAEDFECFADFCEDCABECCDBBFEEBDBCAFDBA +69,nb_gm_004,2,12,1.0047342777252197,2,0,False,FCABEDEDFABC +70,nb_gm_004,4,49,4.085228681564331,16,8,False,DCAADCCAFDCBDACDBADFBABDDEBBDFABEFEACBEEFBEFBFECD +71,nb_gm_004,5,49,3.932910680770874,16,8,False,DFABEDDABBDACBDADCFDBCDFEBDCBEBEFCEACFBEFABAEFCAF +72,nb_gm_004,4,12,0.9949767589569092,3,1,False,EAFDBCADBCFE +73,nb_gm_004,5,43,3.502958059310913,14,7,False,EABBCEEDBDCEDBCBCDFCEDCFAEFECABFAEAFDAFCADF +74,nb_gm_004,3,44,3.5608408451080322,13,7,False,EFCFECFEBCDBFEBFCEFABEAFCADACDFBDDEADABDEACB +75,nb_gm_004,2,61,4.981963157653809,20,10,False,ABFBDFDFBFABAEFAFDFACADCECFCAFBFCBCFEFDFEDBDEBEDECACEAEDBDCBE +76,nb_gm_004,2,61,5.044064044952393,20,10,False,DFBFCBCBEBDEDCBDBEAECEDCBCECAEABFBDFDEAEBABCFCAFDFAFBADAFDFEE +77,nb_gm_004,3,26,2.024602174758911,8,4,False,FCAFBCFBEDFEDCADBCECABEABD +78,nb_gm_004,6,16,1.2625012397766113,5,2,False,CDEBFACDEBAFCBDF +79,nb_gm_004,2,14,1.071295976638794,4,2,False,CFBCBDBEAEDAFA +80,nb_gm_004,5,33,2.739096164703369,11,5,False,ADFFEAAFCEFAFECECFCBEEACDEBBADCBD +81,nb_gm_004,2,61,4.994161128997803,20,10,False,AFBABDBDEBEDECBCFBEBCBACAFEFCEDEBEABDBCDCAEABACBCFDFBDEDFEFAC +82,nb_gm_004,2,24,2.010740041732788,7,3,False,DEAEFAFACFCBEBDBCDCEABFD +83,nb_gm_004,7,10,0.7493958473205566,3,0,False,FACBEDBFAC +84,nb_gm_004,2,63,5.357555150985718,21,10,False,ECFCFBCBEBDEAECEDCDEBEDBDCADAEACBABCECACDADBFBAFEFCECBFBEFECDCF +85,nb_gm_004,2,44,3.593871831893921,14,7,False,BAEAFEFECEDCBCFCEFEBAEACDCFDFABCDBDFDBADABFB +86,nb_gm_004,3,17,1.3206660747528076,5,2,False,FDCFECAFCBFDABEAC +87,nb_gm_004,6,18,1.50052809715271,6,3,False,DCFEABDCFEBADACFBE +88,nb_gm_004,4,29,2.3075549602508545,8,4,False,FACEFAABFFDBCEDCDEDBCBAECEBDA +89,nb_gm_004,3,11,0.8077938556671143,2,1,False,ADEBCFECFDA +90,nb_gm_004,3,55,4.561264276504517,18,9,True,BACBCADCAEDACBADCABCEACDBCABDCFDBCEBFECBACBEDCADEACDFCB +91,nb_gm_004,3,62,5.1214518547058105,20,10,False,DFEBDECDEEDCADEABDAFEAEFDCFFCAACBABCDBEBDEBFACAFCFBCBFDBEFCAFC +92,nb_gm_004,7,63,5.354221820831299,21,10,False,ECDEACDECCEAABEECACDBBEDAEBDCEDEBABCBFEBCAADFFBAECDDFEADFCEFCAF +93,nb_gm_004,2,42,3.4913809299468994,13,7,False,FEAEBABADACDEDCDBCBFCFDEDAFAEFBFCBCEBEDFAC +94,nb_gm_004,4,58,4.802886962890625,19,9,False,ABDCABDACADBFBDBEFDFCEDCAFDCFAECAADEEABDEFDFEFCBBECEBDFCBF +95,nb_gm_004,6,14,1.061150074005127,4,2,False,ABCEDFABCFEDDB +96,nb_gm_004,4,41,3.3158693313598633,13,6,False,DEFADEFEADFAABEFAECFEACEADCEDBDABBACABECE +97,nb_gm_004,4,24,2.0305070877075195,8,4,False,DEBCDEFBDEAFCDABCAEFCBAF +98,nb_gm_004,6,35,2.8204848766326904,10,5,False,FDCEFBFDCCEBDECDCBAEDFCAFACBDAEABEB +99,nb_gm_004,3,32,2.5904409885406494,10,4,False,AFBEABFABBAECDECFDDFCCDEDAEFCBFC diff --git a/demo/nb_gm_002_demo.py b/demo/nb_gm_002_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_002_demo_sdt.py b/demo/nb_gm_002_demo_sdt.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo_sdt.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_003_demo.py b/demo/nb_gm_003_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_003_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/results/nb_gm_004_profile.csv b/benchmarks/results/nb_gm_004_profile.csv new file mode 100644 index 0000000..656adff --- /dev/null +++ b/benchmarks/results/nb_gm_004_profile.csv @@ -0,0 +1,101 @@ +,alg,n,trials,time,targets,lures,skewed,sequence +0,nb_gm_004,2,64,5.629104852676392,20,10,False,DBFBFAFEAECACFDCDABADBDCFCBCABACECAEDEADAFAEDEFBFEBABFDCECDEBEFB +1,nb_gm_004,2,18,1.5522487163543701,6,3,True,EACADCDCACBABFCBCA +2,nb_gm_004,7,36,3.1199769973754883,12,6,False,ABEABFDABBAEBDAABFDBFDAFFACFCDECACBF +3,nb_gm_004,2,37,3.655029773712158,12,6,False,BFDFEDEDCECDCABADBDFADAFEFBEBCACFAFEC +4,nb_gm_004,4,39,3.4385950565338135,13,6,False,AFBDAFFDEACDCAECBAEBAFABCBAACFDECDFEDEF +5,nb_gm_004,7,54,4.757416009902954,18,9,False,BFAECBDBFFACEDBBDACBEAEDAFDBADCAEFCAFCEADCEFDEDACFBFBD +6,nb_gm_004,7,22,1.847884178161621,7,3,False,EDCBFAAEDBCFFAECBDCFDB +7,nb_gm_004,4,32,2.5619711875915527,10,5,False,DBFEDBFCEDFAECABACACFEBDCEDBAFDB +8,nb_gm_004,5,45,3.880707025527954,15,7,False,BCDEDBBDEECBDBFACDBEDADEDCAAFDEBAFBDADFEBAEFC +9,nb_gm_004,7,18,1.5218820571899414,5,3,False,FEBCDADFEBACAFDECB +10,nb_gm_004,5,43,3.712139129638672,14,7,False,AEFFCABEFFABDFAADBEACDCBDCECFBBEDCEDEACFBDA +11,nb_gm_004,7,60,5.11740517616272,19,10,False,FDEDCEBFDDECEDFFDCCFEBFCBAFEDBBEAAEBFBAEACADBBCACFAADCABDFCE +12,nb_gm_004,7,48,4.116453170776367,16,8,False,ADBADCCADFBDDCADCFDEFEACCDBFDCECFBEFBEFEABABEFCE +13,nb_gm_004,4,17,1.3661417961120605,4,2,False,CBEACBBDCBFCDAEEF +14,nb_gm_004,4,61,5.220706224441528,20,10,False,CEDACEDCACDBEBDDEAFAEAEFBDECFDEDBFBDCFABEFAEDEACBFABCFCBFFDCC +15,nb_gm_004,3,52,4.4212260246276855,17,8,False,EBCDBCDEBFDBFBCEFCBFECDEADCEDAEFBDEBDBAABFDAFCADFAEE +16,nb_gm_004,7,27,2.323706865310669,9,4,False,EACFDBBEAAFDDCEBCFFECABDCFA +17,nb_gm_004,3,32,2.64604115486145,10,5,False,CBACEBCDBFCBCEBFCBACDDFCEFAFEAFA +18,nb_gm_004,6,26,2.1442930698394775,7,4,False,ECBADFECBBAFEADDCFDFABCEFC +19,nb_gm_004,2,44,3.7390267848968506,14,7,False,EDCECACAFADFDAEACECDBDCBCEFEAFFDAFADBDCBCFCB +20,nb_gm_004,4,62,5.2222230434417725,20,10,False,EACFEACDFADCCAFDFAFCAADFADBFCABCDADBFBDBCFABFEDAFDADFAEDBACEBD +21,nb_gm_004,5,61,5.658479928970337,20,10,False,BAEFCBBEFFBCCAFEBCEFABECBAEEFCDECFBCBAFFDBDFAFADAEFABDEADBEDD +22,nb_gm_004,5,32,2.645524024963379,10,5,False,ECDBCEEDBBFEFBAFAEDACDAFBCADFCEA +23,nb_gm_004,7,62,5.216619968414307,20,10,False,EADDFBDEAADFFCEEBDFADCDBAFEDFCADFFDBABDDFACAEACDABEAFCACBCEFCB +24,nb_gm_004,3,24,2.0706608295440674,8,3,False,EBAEBFAEFDECBDCADBACFCDF +25,nb_gm_004,3,36,3.1037821769714355,12,6,False,BCFEBFECFEFCDFBDEFDBCDEBFEDBECEDCEFD +26,nb_gm_004,6,61,5.195503234863281,20,10,False,CADBEACADDBACEBDFBEFBBFCADBABCBDABFCBECBDFFEBBEDDEFFBDEBFEFDA +27,nb_gm_004,6,11,0.8340439796447754,3,0,False,AEFBCDABFEC +28,nb_gm_004,4,39,3.390317916870117,13,6,False,ACBFACBCFABEBAECEAEDBCADFDADAFFDECFBEFC +29,nb_gm_004,2,56,4.782411098480225,18,9,False,BCDBDCDCFDFBCBEBFEFABFBECEAEDADBCDCEFEBFBEDACDCFEFBEBACA +30,nb_gm_004,2,53,4.454513788223267,17,8,False,CEDEDBEBABDADECDCECDBCBDBCABADAFCDCFCEFFCECFEFADFDAEA +31,nb_gm_004,5,41,3.454822063446045,13,6,False,BEFACBBFAAEBCBAADCDAFDECFEDFCADEAEBDFCEED +32,nb_gm_004,2,53,4.557706117630005,17,8,False,BDEDEBDBEBAECEFEDFAFCFECACBABECEAEFDFCDDAEAFEFADFDBCB +33,nb_gm_004,3,57,4.94400691986084,19,9,False,FCEFBEDFEDBFBEFBCEECAEDCFDAFADFEBCFBADBACDAEFCAFCFEACEDCA +34,nb_gm_004,5,13,1.0586318969726562,4,2,False,FAEDBCFEDBACE +35,nb_gm_004,3,43,3.702164888381958,14,7,False,ACEADCADFCDABEAAEBAFCBFDEFBDFECFBEDBFCBEDCE +36,nb_gm_004,4,40,3.446906089782715,13,6,False,EDCAEDCBAEABCBAAEBCADBACBCACFDAECDEBEDCF +37,nb_gm_004,7,60,5.721850156784058,20,10,False,FABAFDBFAABFDAFFCBCDBAFDBECFADDABFDAADBFADAFCDFBBACBCFDCACAB +38,nb_gm_004,2,40,3.326483964920044,13,6,False,DEAEACAFCFDCDFEDEAFADFDBEBABFCBCACEBECBF +39,nb_gm_004,5,45,3.9018988609313965,15,7,False,CABEACCBEFACDEBAECEDFAFEBEACFBCAECBDBDCCDFDBE +40,nb_gm_004,3,18,1.55079984664917,6,3,False,EBADBAABFCAFCEDCBE +41,nb_gm_004,6,34,2.884040355682373,11,5,False,ECBABFECBBAFEADBDACFDBEDBFCEFDDACA +42,nb_gm_004,2,48,4.0855629444122314,14,7,False,AFEFAEAEFAFDBDCDBCBFEFCECDBDABACBCEDFDEBCACDABEF +43,nb_gm_004,6,50,4.191677093505859,16,8,False,FDEFACFDEEFCEDFDECFDBADCBDCBDABFECEADABEBABACECBFA +44,nb_gm_004,3,25,2.081367015838623,8,3,False,EBDEABEACBAFDCFCDFCFAEDBE +45,nb_gm_004,5,15,1.2862391471862793,5,2,False,ABDCEAFBCEDFFDE +46,nb_gm_004,4,19,1.6599581241607666,6,3,False,BFCABFFACBDABEDFAEC +47,nb_gm_004,5,61,5.23445987701416,20,10,True,CEFEFCCFEECDFDADCFDEFCEFCFBFECABCEBCCFEEACAEFABCEADAFECDFABCA +48,nb_gm_004,4,51,4.420213937759399,17,8,False,FDABFDDEFFDBFDEABDEDFDCEEACCEDDAEEDBEDFEBDCEDBFEABC +49,nb_gm_004,2,61,5.241312026977539,20,10,True,FDEDCECEDCDEDBCDCECBFBEFDFEFCEDECDCEAECEFCBCACEAFACFCBCAECEBF +50,nb_gm_004,7,53,4.433992147445679,17,8,False,CFABEFECFFBEFCECEBEDAEDCFADACECABEFCEDCDABFBDADBADBDF +51,nb_gm_004,3,40,3.2851059436798096,13,6,False,BDFCDFCFDFBDABCACBFDBFADFBEFEAFBECDEEDAD +52,nb_gm_004,6,19,1.5269551277160645,6,3,False,CBADEFCBAFDEEBAFCDC +53,nb_gm_004,7,33,2.7817859649658203,11,5,False,FADAECBFAADECBDFEDCDBBAEFCBFECAFC +54,nb_gm_004,2,60,5.081879138946533,20,10,False,ADFDFAFBAFAEACFAFEFBCBDCDABACBABCECFCEACAFACFDFBABEBDEFEDFDB +55,nb_gm_004,3,13,1.0153288841247559,3,1,False,DECBAFCAFDBED +56,nb_gm_004,7,52,4.270846843719482,17,8,False,ADBDCFCADDBCBCAADCEFCCAFEBFFEAFACBCEBEADBEFEDCDBEBFF +57,nb_gm_004,5,34,2.718968152999878,11,5,False,BEDFEBBDFFDBAFDDCBFACDBEBCACEACEAF +58,nb_gm_004,2,59,4.88099479675293,19,9,True,BDFDFADACDCBFBCFCECBACABEBCBACFCBABFAFBFECFBDBCABACAFBABCBE +59,nb_gm_004,7,15,1.2424840927124023,5,2,False,CDFEBAACDFBEBAC +60,nb_gm_004,4,45,3.7462897300720215,15,7,False,FBECFBDEFBCDCBEDACEAFECADEADAEBDFEABFDCCBDFCA +61,nb_gm_004,7,49,3.994555950164795,16,8,False,BDECFEFBDDEFECBBDCCEBCEDCEFECBACFFAEEFCCBAEACFABF +62,nb_gm_004,5,42,3.4888839721679688,13,7,False,CDFFBCEDFFCECFDCDEADBFDAABCBEABEAAEBECBAFD +63,nb_gm_004,7,61,5.040170907974243,20,10,False,DEBFBCFDEEFBECDDEBCEFCFECFEEAFBCEFEBFAECAEAFEACFEDCAECDECCDAD +64,nb_gm_004,7,43,3.566600799560547,14,7,False,CEDEAFBCEEDADBCCEAACFBFEAEBCDFCBEFBDFDABFDA +65,nb_gm_004,5,48,3.976670980453491,16,8,False,BFDDFBBEDEFBEDAAFECDADBCBEDDFBBDFEABDBFFEDEAFFAE +66,nb_gm_004,6,17,1.2704148292541504,5,2,False,DFBACEDFBCAEECDFA +67,nb_gm_004,3,11,0.8034019470214844,2,1,False,ECAFDBADBCF +68,nb_gm_004,7,43,3.4832749366760254,14,7,False,FAEBDFEFAAEDFECFADFCEDCABECCDBBFEEBDBCAFDBA +69,nb_gm_004,2,12,1.0047342777252197,2,0,False,FCABEDEDFABC +70,nb_gm_004,4,49,4.085228681564331,16,8,False,DCAADCCAFDCBDACDBADFBABDDEBBDFABEFEACBEEFBEFBFECD +71,nb_gm_004,5,49,3.932910680770874,16,8,False,DFABEDDABBDACBDADCFDBCDFEBDCBEBEFCEACFBEFABAEFCAF +72,nb_gm_004,4,12,0.9949767589569092,3,1,False,EAFDBCADBCFE +73,nb_gm_004,5,43,3.502958059310913,14,7,False,EABBCEEDBDCEDBCBCDFCEDCFAEFECABFAEAFDAFCADF +74,nb_gm_004,3,44,3.5608408451080322,13,7,False,EFCFECFEBCDBFEBFCEFABEAFCADACDFBDDEADABDEACB +75,nb_gm_004,2,61,4.981963157653809,20,10,False,ABFBDFDFBFABAEFAFDFACADCECFCAFBFCBCFEFDFEDBDEBEDECACEAEDBDCBE +76,nb_gm_004,2,61,5.044064044952393,20,10,False,DFBFCBCBEBDEDCBDBEAECEDCBCECAEABFBDFDEAEBABCFCAFDFAFBADAFDFEE +77,nb_gm_004,3,26,2.024602174758911,8,4,False,FCAFBCFBEDFEDCADBCECABEABD +78,nb_gm_004,6,16,1.2625012397766113,5,2,False,CDEBFACDEBAFCBDF +79,nb_gm_004,2,14,1.071295976638794,4,2,False,CFBCBDBEAEDAFA +80,nb_gm_004,5,33,2.739096164703369,11,5,False,ADFFEAAFCEFAFECECFCBEEACDEBBADCBD +81,nb_gm_004,2,61,4.994161128997803,20,10,False,AFBABDBDEBEDECBCFBEBCBACAFEFCEDEBEABDBCDCAEABACBCFDFBDEDFEFAC +82,nb_gm_004,2,24,2.010740041732788,7,3,False,DEAEFAFACFCBEBDBCDCEABFD +83,nb_gm_004,7,10,0.7493958473205566,3,0,False,FACBEDBFAC +84,nb_gm_004,2,63,5.357555150985718,21,10,False,ECFCFBCBEBDEAECEDCDEBEDBDCADAEACBABCECACDADBFBAFEFCECBFBEFECDCF +85,nb_gm_004,2,44,3.593871831893921,14,7,False,BAEAFEFECEDCBCFCEFEBAEACDCFDFABCDBDFDBADABFB +86,nb_gm_004,3,17,1.3206660747528076,5,2,False,FDCFECAFCBFDABEAC +87,nb_gm_004,6,18,1.50052809715271,6,3,False,DCFEABDCFEBADACFBE +88,nb_gm_004,4,29,2.3075549602508545,8,4,False,FACEFAABFFDBCEDCDEDBCBAECEBDA +89,nb_gm_004,3,11,0.8077938556671143,2,1,False,ADEBCFECFDA +90,nb_gm_004,3,55,4.561264276504517,18,9,True,BACBCADCAEDACBADCABCEACDBCABDCFDBCEBFECBACBEDCADEACDFCB +91,nb_gm_004,3,62,5.1214518547058105,20,10,False,DFEBDECDEEDCADEABDAFEAEFDCFFCAACBABCDBEBDEBFACAFCFBCBFDBEFCAFC +92,nb_gm_004,7,63,5.354221820831299,21,10,False,ECDEACDECCEAABEECACDBBEDAEBDCEDEBABCBFEBCAADFFBAECDDFEADFCEFCAF +93,nb_gm_004,2,42,3.4913809299468994,13,7,False,FEAEBABADACDEDCDBCBFCFDEDAFAEFBFCBCEBEDFAC +94,nb_gm_004,4,58,4.802886962890625,19,9,False,ABDCABDACADBFBDBEFDFCEDCAFDCFAECAADEEABDEFDFEFCBBECEBDFCBF +95,nb_gm_004,6,14,1.061150074005127,4,2,False,ABCEDFABCFEDDB +96,nb_gm_004,4,41,3.3158693313598633,13,6,False,DEFADEFEADFAABEFAECFEACEADCEDBDABBACABECE +97,nb_gm_004,4,24,2.0305070877075195,8,4,False,DEBCDEFBDEAFCDABCAEFCBAF +98,nb_gm_004,6,35,2.8204848766326904,10,5,False,FDCEFBFDCCEBDECDCBAEDFCAFACBDAEABEB +99,nb_gm_004,3,32,2.5904409885406494,10,4,False,AFBEABFABBAECDECFDDFCCDEDAEFCBFC diff --git a/demo/nb_gm_002_demo.py b/demo/nb_gm_002_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_002_demo_sdt.py b/demo/nb_gm_002_demo_sdt.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo_sdt.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_003_demo.py b/demo/nb_gm_003_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_003_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_005_demo.py b/demo/nb_gm_005_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_005_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/results/nb_gm_004_profile.csv b/benchmarks/results/nb_gm_004_profile.csv new file mode 100644 index 0000000..656adff --- /dev/null +++ b/benchmarks/results/nb_gm_004_profile.csv @@ -0,0 +1,101 @@ +,alg,n,trials,time,targets,lures,skewed,sequence +0,nb_gm_004,2,64,5.629104852676392,20,10,False,DBFBFAFEAECACFDCDABADBDCFCBCABACECAEDEADAFAEDEFBFEBABFDCECDEBEFB +1,nb_gm_004,2,18,1.5522487163543701,6,3,True,EACADCDCACBABFCBCA +2,nb_gm_004,7,36,3.1199769973754883,12,6,False,ABEABFDABBAEBDAABFDBFDAFFACFCDECACBF +3,nb_gm_004,2,37,3.655029773712158,12,6,False,BFDFEDEDCECDCABADBDFADAFEFBEBCACFAFEC +4,nb_gm_004,4,39,3.4385950565338135,13,6,False,AFBDAFFDEACDCAECBAEBAFABCBAACFDECDFEDEF +5,nb_gm_004,7,54,4.757416009902954,18,9,False,BFAECBDBFFACEDBBDACBEAEDAFDBADCAEFCAFCEADCEFDEDACFBFBD +6,nb_gm_004,7,22,1.847884178161621,7,3,False,EDCBFAAEDBCFFAECBDCFDB +7,nb_gm_004,4,32,2.5619711875915527,10,5,False,DBFEDBFCEDFAECABACACFEBDCEDBAFDB +8,nb_gm_004,5,45,3.880707025527954,15,7,False,BCDEDBBDEECBDBFACDBEDADEDCAAFDEBAFBDADFEBAEFC +9,nb_gm_004,7,18,1.5218820571899414,5,3,False,FEBCDADFEBACAFDECB +10,nb_gm_004,5,43,3.712139129638672,14,7,False,AEFFCABEFFABDFAADBEACDCBDCECFBBEDCEDEACFBDA +11,nb_gm_004,7,60,5.11740517616272,19,10,False,FDEDCEBFDDECEDFFDCCFEBFCBAFEDBBEAAEBFBAEACADBBCACFAADCABDFCE +12,nb_gm_004,7,48,4.116453170776367,16,8,False,ADBADCCADFBDDCADCFDEFEACCDBFDCECFBEFBEFEABABEFCE +13,nb_gm_004,4,17,1.3661417961120605,4,2,False,CBEACBBDCBFCDAEEF +14,nb_gm_004,4,61,5.220706224441528,20,10,False,CEDACEDCACDBEBDDEAFAEAEFBDECFDEDBFBDCFABEFAEDEACBFABCFCBFFDCC +15,nb_gm_004,3,52,4.4212260246276855,17,8,False,EBCDBCDEBFDBFBCEFCBFECDEADCEDAEFBDEBDBAABFDAFCADFAEE +16,nb_gm_004,7,27,2.323706865310669,9,4,False,EACFDBBEAAFDDCEBCFFECABDCFA +17,nb_gm_004,3,32,2.64604115486145,10,5,False,CBACEBCDBFCBCEBFCBACDDFCEFAFEAFA +18,nb_gm_004,6,26,2.1442930698394775,7,4,False,ECBADFECBBAFEADDCFDFABCEFC +19,nb_gm_004,2,44,3.7390267848968506,14,7,False,EDCECACAFADFDAEACECDBDCBCEFEAFFDAFADBDCBCFCB +20,nb_gm_004,4,62,5.2222230434417725,20,10,False,EACFEACDFADCCAFDFAFCAADFADBFCABCDADBFBDBCFABFEDAFDADFAEDBACEBD +21,nb_gm_004,5,61,5.658479928970337,20,10,False,BAEFCBBEFFBCCAFEBCEFABECBAEEFCDECFBCBAFFDBDFAFADAEFABDEADBEDD +22,nb_gm_004,5,32,2.645524024963379,10,5,False,ECDBCEEDBBFEFBAFAEDACDAFBCADFCEA +23,nb_gm_004,7,62,5.216619968414307,20,10,False,EADDFBDEAADFFCEEBDFADCDBAFEDFCADFFDBABDDFACAEACDABEAFCACBCEFCB +24,nb_gm_004,3,24,2.0706608295440674,8,3,False,EBAEBFAEFDECBDCADBACFCDF +25,nb_gm_004,3,36,3.1037821769714355,12,6,False,BCFEBFECFEFCDFBDEFDBCDEBFEDBECEDCEFD +26,nb_gm_004,6,61,5.195503234863281,20,10,False,CADBEACADDBACEBDFBEFBBFCADBABCBDABFCBECBDFFEBBEDDEFFBDEBFEFDA +27,nb_gm_004,6,11,0.8340439796447754,3,0,False,AEFBCDABFEC +28,nb_gm_004,4,39,3.390317916870117,13,6,False,ACBFACBCFABEBAECEAEDBCADFDADAFFDECFBEFC +29,nb_gm_004,2,56,4.782411098480225,18,9,False,BCDBDCDCFDFBCBEBFEFABFBECEAEDADBCDCEFEBFBEDACDCFEFBEBACA +30,nb_gm_004,2,53,4.454513788223267,17,8,False,CEDEDBEBABDADECDCECDBCBDBCABADAFCDCFCEFFCECFEFADFDAEA +31,nb_gm_004,5,41,3.454822063446045,13,6,False,BEFACBBFAAEBCBAADCDAFDECFEDFCADEAEBDFCEED +32,nb_gm_004,2,53,4.557706117630005,17,8,False,BDEDEBDBEBAECEFEDFAFCFECACBABECEAEFDFCDDAEAFEFADFDBCB +33,nb_gm_004,3,57,4.94400691986084,19,9,False,FCEFBEDFEDBFBEFBCEECAEDCFDAFADFEBCFBADBACDAEFCAFCFEACEDCA +34,nb_gm_004,5,13,1.0586318969726562,4,2,False,FAEDBCFEDBACE +35,nb_gm_004,3,43,3.702164888381958,14,7,False,ACEADCADFCDABEAAEBAFCBFDEFBDFECFBEDBFCBEDCE +36,nb_gm_004,4,40,3.446906089782715,13,6,False,EDCAEDCBAEABCBAAEBCADBACBCACFDAECDEBEDCF +37,nb_gm_004,7,60,5.721850156784058,20,10,False,FABAFDBFAABFDAFFCBCDBAFDBECFADDABFDAADBFADAFCDFBBACBCFDCACAB +38,nb_gm_004,2,40,3.326483964920044,13,6,False,DEAEACAFCFDCDFEDEAFADFDBEBABFCBCACEBECBF +39,nb_gm_004,5,45,3.9018988609313965,15,7,False,CABEACCBEFACDEBAECEDFAFEBEACFBCAECBDBDCCDFDBE +40,nb_gm_004,3,18,1.55079984664917,6,3,False,EBADBAABFCAFCEDCBE +41,nb_gm_004,6,34,2.884040355682373,11,5,False,ECBABFECBBAFEADBDACFDBEDBFCEFDDACA +42,nb_gm_004,2,48,4.0855629444122314,14,7,False,AFEFAEAEFAFDBDCDBCBFEFCECDBDABACBCEDFDEBCACDABEF +43,nb_gm_004,6,50,4.191677093505859,16,8,False,FDEFACFDEEFCEDFDECFDBADCBDCBDABFECEADABEBABACECBFA +44,nb_gm_004,3,25,2.081367015838623,8,3,False,EBDEABEACBAFDCFCDFCFAEDBE +45,nb_gm_004,5,15,1.2862391471862793,5,2,False,ABDCEAFBCEDFFDE +46,nb_gm_004,4,19,1.6599581241607666,6,3,False,BFCABFFACBDABEDFAEC +47,nb_gm_004,5,61,5.23445987701416,20,10,True,CEFEFCCFEECDFDADCFDEFCEFCFBFECABCEBCCFEEACAEFABCEADAFECDFABCA +48,nb_gm_004,4,51,4.420213937759399,17,8,False,FDABFDDEFFDBFDEABDEDFDCEEACCEDDAEEDBEDFEBDCEDBFEABC +49,nb_gm_004,2,61,5.241312026977539,20,10,True,FDEDCECEDCDEDBCDCECBFBEFDFEFCEDECDCEAECEFCBCACEAFACFCBCAECEBF +50,nb_gm_004,7,53,4.433992147445679,17,8,False,CFABEFECFFBEFCECEBEDAEDCFADACECABEFCEDCDABFBDADBADBDF +51,nb_gm_004,3,40,3.2851059436798096,13,6,False,BDFCDFCFDFBDABCACBFDBFADFBEFEAFBECDEEDAD +52,nb_gm_004,6,19,1.5269551277160645,6,3,False,CBADEFCBAFDEEBAFCDC +53,nb_gm_004,7,33,2.7817859649658203,11,5,False,FADAECBFAADECBDFEDCDBBAEFCBFECAFC +54,nb_gm_004,2,60,5.081879138946533,20,10,False,ADFDFAFBAFAEACFAFEFBCBDCDABACBABCECFCEACAFACFDFBABEBDEFEDFDB +55,nb_gm_004,3,13,1.0153288841247559,3,1,False,DECBAFCAFDBED +56,nb_gm_004,7,52,4.270846843719482,17,8,False,ADBDCFCADDBCBCAADCEFCCAFEBFFEAFACBCEBEADBEFEDCDBEBFF +57,nb_gm_004,5,34,2.718968152999878,11,5,False,BEDFEBBDFFDBAFDDCBFACDBEBCACEACEAF +58,nb_gm_004,2,59,4.88099479675293,19,9,True,BDFDFADACDCBFBCFCECBACABEBCBACFCBABFAFBFECFBDBCABACAFBABCBE +59,nb_gm_004,7,15,1.2424840927124023,5,2,False,CDFEBAACDFBEBAC +60,nb_gm_004,4,45,3.7462897300720215,15,7,False,FBECFBDEFBCDCBEDACEAFECADEADAEBDFEABFDCCBDFCA +61,nb_gm_004,7,49,3.994555950164795,16,8,False,BDECFEFBDDEFECBBDCCEBCEDCEFECBACFFAEEFCCBAEACFABF +62,nb_gm_004,5,42,3.4888839721679688,13,7,False,CDFFBCEDFFCECFDCDEADBFDAABCBEABEAAEBECBAFD +63,nb_gm_004,7,61,5.040170907974243,20,10,False,DEBFBCFDEEFBECDDEBCEFCFECFEEAFBCEFEBFAECAEAFEACFEDCAECDECCDAD +64,nb_gm_004,7,43,3.566600799560547,14,7,False,CEDEAFBCEEDADBCCEAACFBFEAEBCDFCBEFBDFDABFDA +65,nb_gm_004,5,48,3.976670980453491,16,8,False,BFDDFBBEDEFBEDAAFECDADBCBEDDFBBDFEABDBFFEDEAFFAE +66,nb_gm_004,6,17,1.2704148292541504,5,2,False,DFBACEDFBCAEECDFA +67,nb_gm_004,3,11,0.8034019470214844,2,1,False,ECAFDBADBCF +68,nb_gm_004,7,43,3.4832749366760254,14,7,False,FAEBDFEFAAEDFECFADFCEDCABECCDBBFEEBDBCAFDBA +69,nb_gm_004,2,12,1.0047342777252197,2,0,False,FCABEDEDFABC +70,nb_gm_004,4,49,4.085228681564331,16,8,False,DCAADCCAFDCBDACDBADFBABDDEBBDFABEFEACBEEFBEFBFECD +71,nb_gm_004,5,49,3.932910680770874,16,8,False,DFABEDDABBDACBDADCFDBCDFEBDCBEBEFCEACFBEFABAEFCAF +72,nb_gm_004,4,12,0.9949767589569092,3,1,False,EAFDBCADBCFE +73,nb_gm_004,5,43,3.502958059310913,14,7,False,EABBCEEDBDCEDBCBCDFCEDCFAEFECABFAEAFDAFCADF +74,nb_gm_004,3,44,3.5608408451080322,13,7,False,EFCFECFEBCDBFEBFCEFABEAFCADACDFBDDEADABDEACB +75,nb_gm_004,2,61,4.981963157653809,20,10,False,ABFBDFDFBFABAEFAFDFACADCECFCAFBFCBCFEFDFEDBDEBEDECACEAEDBDCBE +76,nb_gm_004,2,61,5.044064044952393,20,10,False,DFBFCBCBEBDEDCBDBEAECEDCBCECAEABFBDFDEAEBABCFCAFDFAFBADAFDFEE +77,nb_gm_004,3,26,2.024602174758911,8,4,False,FCAFBCFBEDFEDCADBCECABEABD +78,nb_gm_004,6,16,1.2625012397766113,5,2,False,CDEBFACDEBAFCBDF +79,nb_gm_004,2,14,1.071295976638794,4,2,False,CFBCBDBEAEDAFA +80,nb_gm_004,5,33,2.739096164703369,11,5,False,ADFFEAAFCEFAFECECFCBEEACDEBBADCBD +81,nb_gm_004,2,61,4.994161128997803,20,10,False,AFBABDBDEBEDECBCFBEBCBACAFEFCEDEBEABDBCDCAEABACBCFDFBDEDFEFAC +82,nb_gm_004,2,24,2.010740041732788,7,3,False,DEAEFAFACFCBEBDBCDCEABFD +83,nb_gm_004,7,10,0.7493958473205566,3,0,False,FACBEDBFAC +84,nb_gm_004,2,63,5.357555150985718,21,10,False,ECFCFBCBEBDEAECEDCDEBEDBDCADAEACBABCECACDADBFBAFEFCECBFBEFECDCF +85,nb_gm_004,2,44,3.593871831893921,14,7,False,BAEAFEFECEDCBCFCEFEBAEACDCFDFABCDBDFDBADABFB +86,nb_gm_004,3,17,1.3206660747528076,5,2,False,FDCFECAFCBFDABEAC +87,nb_gm_004,6,18,1.50052809715271,6,3,False,DCFEABDCFEBADACFBE +88,nb_gm_004,4,29,2.3075549602508545,8,4,False,FACEFAABFFDBCEDCDEDBCBAECEBDA +89,nb_gm_004,3,11,0.8077938556671143,2,1,False,ADEBCFECFDA +90,nb_gm_004,3,55,4.561264276504517,18,9,True,BACBCADCAEDACBADCABCEACDBCABDCFDBCEBFECBACBEDCADEACDFCB +91,nb_gm_004,3,62,5.1214518547058105,20,10,False,DFEBDECDEEDCADEABDAFEAEFDCFFCAACBABCDBEBDEBFACAFCFBCBFDBEFCAFC +92,nb_gm_004,7,63,5.354221820831299,21,10,False,ECDEACDECCEAABEECACDBBEDAEBDCEDEBABCBFEBCAADFFBAECDDFEADFCEFCAF +93,nb_gm_004,2,42,3.4913809299468994,13,7,False,FEAEBABADACDEDCDBCBFCFDEDAFAEFBFCBCEBEDFAC +94,nb_gm_004,4,58,4.802886962890625,19,9,False,ABDCABDACADBFBDBEFDFCEDCAFDCFAECAADEEABDEFDFEFCBBECEBDFCBF +95,nb_gm_004,6,14,1.061150074005127,4,2,False,ABCEDFABCFEDDB +96,nb_gm_004,4,41,3.3158693313598633,13,6,False,DEFADEFEADFAABEFAECFEACEADCEDBDABBACABECE +97,nb_gm_004,4,24,2.0305070877075195,8,4,False,DEBCDEFBDEAFCDABCAEFCBAF +98,nb_gm_004,6,35,2.8204848766326904,10,5,False,FDCEFBFDCCEBDECDCBAEDFCAFACBDAEABEB +99,nb_gm_004,3,32,2.5904409885406494,10,4,False,AFBEABFABBAECDECFDDFCCDEDAEFCBFC diff --git a/demo/nb_gm_002_demo.py b/demo/nb_gm_002_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_002_demo_sdt.py b/demo/nb_gm_002_demo_sdt.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo_sdt.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_003_demo.py b/demo/nb_gm_003_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_003_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_005_demo.py b/demo/nb_gm_005_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_005_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/skewed_nback.py b/demo/skewed_nback.py deleted file mode 100644 index 44dcfa1..0000000 --- a/demo/skewed_nback.py +++ /dev/null @@ -1,42 +0,0 @@ -import expyriment -from expyriment import design, control, stimuli, misc -from generators import nb_gm_002 - -nback_sequence = nb_gm_002.SequenceGenerator().generate() - -exp = design.Experiment("Skewed N-Back Task") -control.initialize(exp) -exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] - - -fixation = stimuli.FixCross() -fixation.preload() - -# left and right arrow keys for responses -response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] - -expyriment.control.start(exp) - -# initialize three blocks -for b in range(0, 2): - block = design.Block() - block.set_factor("block", b) - for item in nback_sequence: - trial = design.Trial() - trial.set_factor("stimulus", item) - stim = stimuli.TextLine(item, text_size=200) - stim.preload() - trial.add_stimulus(stim) - block.add_trial(trial, random_position=False) - exp.add_block(block) - -for block in exp.blocks: - for trial in block.trials: - exp.clock.wait(1000 - fixation.present()) - trial.stimuli[0].present() - pressed_key, rt = exp.keyboard.wait(response_keys) - exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) - exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) - -expyriment.control.end("Goodbye!", goodbye_delay=1000) - diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/results/nb_gm_004_profile.csv b/benchmarks/results/nb_gm_004_profile.csv new file mode 100644 index 0000000..656adff --- /dev/null +++ b/benchmarks/results/nb_gm_004_profile.csv @@ -0,0 +1,101 @@ +,alg,n,trials,time,targets,lures,skewed,sequence +0,nb_gm_004,2,64,5.629104852676392,20,10,False,DBFBFAFEAECACFDCDABADBDCFCBCABACECAEDEADAFAEDEFBFEBABFDCECDEBEFB +1,nb_gm_004,2,18,1.5522487163543701,6,3,True,EACADCDCACBABFCBCA +2,nb_gm_004,7,36,3.1199769973754883,12,6,False,ABEABFDABBAEBDAABFDBFDAFFACFCDECACBF +3,nb_gm_004,2,37,3.655029773712158,12,6,False,BFDFEDEDCECDCABADBDFADAFEFBEBCACFAFEC +4,nb_gm_004,4,39,3.4385950565338135,13,6,False,AFBDAFFDEACDCAECBAEBAFABCBAACFDECDFEDEF +5,nb_gm_004,7,54,4.757416009902954,18,9,False,BFAECBDBFFACEDBBDACBEAEDAFDBADCAEFCAFCEADCEFDEDACFBFBD +6,nb_gm_004,7,22,1.847884178161621,7,3,False,EDCBFAAEDBCFFAECBDCFDB +7,nb_gm_004,4,32,2.5619711875915527,10,5,False,DBFEDBFCEDFAECABACACFEBDCEDBAFDB +8,nb_gm_004,5,45,3.880707025527954,15,7,False,BCDEDBBDEECBDBFACDBEDADEDCAAFDEBAFBDADFEBAEFC +9,nb_gm_004,7,18,1.5218820571899414,5,3,False,FEBCDADFEBACAFDECB +10,nb_gm_004,5,43,3.712139129638672,14,7,False,AEFFCABEFFABDFAADBEACDCBDCECFBBEDCEDEACFBDA +11,nb_gm_004,7,60,5.11740517616272,19,10,False,FDEDCEBFDDECEDFFDCCFEBFCBAFEDBBEAAEBFBAEACADBBCACFAADCABDFCE +12,nb_gm_004,7,48,4.116453170776367,16,8,False,ADBADCCADFBDDCADCFDEFEACCDBFDCECFBEFBEFEABABEFCE +13,nb_gm_004,4,17,1.3661417961120605,4,2,False,CBEACBBDCBFCDAEEF +14,nb_gm_004,4,61,5.220706224441528,20,10,False,CEDACEDCACDBEBDDEAFAEAEFBDECFDEDBFBDCFABEFAEDEACBFABCFCBFFDCC +15,nb_gm_004,3,52,4.4212260246276855,17,8,False,EBCDBCDEBFDBFBCEFCBFECDEADCEDAEFBDEBDBAABFDAFCADFAEE +16,nb_gm_004,7,27,2.323706865310669,9,4,False,EACFDBBEAAFDDCEBCFFECABDCFA +17,nb_gm_004,3,32,2.64604115486145,10,5,False,CBACEBCDBFCBCEBFCBACDDFCEFAFEAFA +18,nb_gm_004,6,26,2.1442930698394775,7,4,False,ECBADFECBBAFEADDCFDFABCEFC +19,nb_gm_004,2,44,3.7390267848968506,14,7,False,EDCECACAFADFDAEACECDBDCBCEFEAFFDAFADBDCBCFCB +20,nb_gm_004,4,62,5.2222230434417725,20,10,False,EACFEACDFADCCAFDFAFCAADFADBFCABCDADBFBDBCFABFEDAFDADFAEDBACEBD +21,nb_gm_004,5,61,5.658479928970337,20,10,False,BAEFCBBEFFBCCAFEBCEFABECBAEEFCDECFBCBAFFDBDFAFADAEFABDEADBEDD +22,nb_gm_004,5,32,2.645524024963379,10,5,False,ECDBCEEDBBFEFBAFAEDACDAFBCADFCEA +23,nb_gm_004,7,62,5.216619968414307,20,10,False,EADDFBDEAADFFCEEBDFADCDBAFEDFCADFFDBABDDFACAEACDABEAFCACBCEFCB +24,nb_gm_004,3,24,2.0706608295440674,8,3,False,EBAEBFAEFDECBDCADBACFCDF +25,nb_gm_004,3,36,3.1037821769714355,12,6,False,BCFEBFECFEFCDFBDEFDBCDEBFEDBECEDCEFD +26,nb_gm_004,6,61,5.195503234863281,20,10,False,CADBEACADDBACEBDFBEFBBFCADBABCBDABFCBECBDFFEBBEDDEFFBDEBFEFDA +27,nb_gm_004,6,11,0.8340439796447754,3,0,False,AEFBCDABFEC +28,nb_gm_004,4,39,3.390317916870117,13,6,False,ACBFACBCFABEBAECEAEDBCADFDADAFFDECFBEFC +29,nb_gm_004,2,56,4.782411098480225,18,9,False,BCDBDCDCFDFBCBEBFEFABFBECEAEDADBCDCEFEBFBEDACDCFEFBEBACA +30,nb_gm_004,2,53,4.454513788223267,17,8,False,CEDEDBEBABDADECDCECDBCBDBCABADAFCDCFCEFFCECFEFADFDAEA +31,nb_gm_004,5,41,3.454822063446045,13,6,False,BEFACBBFAAEBCBAADCDAFDECFEDFCADEAEBDFCEED +32,nb_gm_004,2,53,4.557706117630005,17,8,False,BDEDEBDBEBAECEFEDFAFCFECACBABECEAEFDFCDDAEAFEFADFDBCB +33,nb_gm_004,3,57,4.94400691986084,19,9,False,FCEFBEDFEDBFBEFBCEECAEDCFDAFADFEBCFBADBACDAEFCAFCFEACEDCA +34,nb_gm_004,5,13,1.0586318969726562,4,2,False,FAEDBCFEDBACE +35,nb_gm_004,3,43,3.702164888381958,14,7,False,ACEADCADFCDABEAAEBAFCBFDEFBDFECFBEDBFCBEDCE +36,nb_gm_004,4,40,3.446906089782715,13,6,False,EDCAEDCBAEABCBAAEBCADBACBCACFDAECDEBEDCF +37,nb_gm_004,7,60,5.721850156784058,20,10,False,FABAFDBFAABFDAFFCBCDBAFDBECFADDABFDAADBFADAFCDFBBACBCFDCACAB +38,nb_gm_004,2,40,3.326483964920044,13,6,False,DEAEACAFCFDCDFEDEAFADFDBEBABFCBCACEBECBF +39,nb_gm_004,5,45,3.9018988609313965,15,7,False,CABEACCBEFACDEBAECEDFAFEBEACFBCAECBDBDCCDFDBE +40,nb_gm_004,3,18,1.55079984664917,6,3,False,EBADBAABFCAFCEDCBE +41,nb_gm_004,6,34,2.884040355682373,11,5,False,ECBABFECBBAFEADBDACFDBEDBFCEFDDACA +42,nb_gm_004,2,48,4.0855629444122314,14,7,False,AFEFAEAEFAFDBDCDBCBFEFCECDBDABACBCEDFDEBCACDABEF +43,nb_gm_004,6,50,4.191677093505859,16,8,False,FDEFACFDEEFCEDFDECFDBADCBDCBDABFECEADABEBABACECBFA +44,nb_gm_004,3,25,2.081367015838623,8,3,False,EBDEABEACBAFDCFCDFCFAEDBE +45,nb_gm_004,5,15,1.2862391471862793,5,2,False,ABDCEAFBCEDFFDE +46,nb_gm_004,4,19,1.6599581241607666,6,3,False,BFCABFFACBDABEDFAEC +47,nb_gm_004,5,61,5.23445987701416,20,10,True,CEFEFCCFEECDFDADCFDEFCEFCFBFECABCEBCCFEEACAEFABCEADAFECDFABCA +48,nb_gm_004,4,51,4.420213937759399,17,8,False,FDABFDDEFFDBFDEABDEDFDCEEACCEDDAEEDBEDFEBDCEDBFEABC +49,nb_gm_004,2,61,5.241312026977539,20,10,True,FDEDCECEDCDEDBCDCECBFBEFDFEFCEDECDCEAECEFCBCACEAFACFCBCAECEBF +50,nb_gm_004,7,53,4.433992147445679,17,8,False,CFABEFECFFBEFCECEBEDAEDCFADACECABEFCEDCDABFBDADBADBDF +51,nb_gm_004,3,40,3.2851059436798096,13,6,False,BDFCDFCFDFBDABCACBFDBFADFBEFEAFBECDEEDAD +52,nb_gm_004,6,19,1.5269551277160645,6,3,False,CBADEFCBAFDEEBAFCDC +53,nb_gm_004,7,33,2.7817859649658203,11,5,False,FADAECBFAADECBDFEDCDBBAEFCBFECAFC +54,nb_gm_004,2,60,5.081879138946533,20,10,False,ADFDFAFBAFAEACFAFEFBCBDCDABACBABCECFCEACAFACFDFBABEBDEFEDFDB +55,nb_gm_004,3,13,1.0153288841247559,3,1,False,DECBAFCAFDBED +56,nb_gm_004,7,52,4.270846843719482,17,8,False,ADBDCFCADDBCBCAADCEFCCAFEBFFEAFACBCEBEADBEFEDCDBEBFF +57,nb_gm_004,5,34,2.718968152999878,11,5,False,BEDFEBBDFFDBAFDDCBFACDBEBCACEACEAF +58,nb_gm_004,2,59,4.88099479675293,19,9,True,BDFDFADACDCBFBCFCECBACABEBCBACFCBABFAFBFECFBDBCABACAFBABCBE +59,nb_gm_004,7,15,1.2424840927124023,5,2,False,CDFEBAACDFBEBAC +60,nb_gm_004,4,45,3.7462897300720215,15,7,False,FBECFBDEFBCDCBEDACEAFECADEADAEBDFEABFDCCBDFCA +61,nb_gm_004,7,49,3.994555950164795,16,8,False,BDECFEFBDDEFECBBDCCEBCEDCEFECBACFFAEEFCCBAEACFABF +62,nb_gm_004,5,42,3.4888839721679688,13,7,False,CDFFBCEDFFCECFDCDEADBFDAABCBEABEAAEBECBAFD +63,nb_gm_004,7,61,5.040170907974243,20,10,False,DEBFBCFDEEFBECDDEBCEFCFECFEEAFBCEFEBFAECAEAFEACFEDCAECDECCDAD +64,nb_gm_004,7,43,3.566600799560547,14,7,False,CEDEAFBCEEDADBCCEAACFBFEAEBCDFCBEFBDFDABFDA +65,nb_gm_004,5,48,3.976670980453491,16,8,False,BFDDFBBEDEFBEDAAFECDADBCBEDDFBBDFEABDBFFEDEAFFAE +66,nb_gm_004,6,17,1.2704148292541504,5,2,False,DFBACEDFBCAEECDFA +67,nb_gm_004,3,11,0.8034019470214844,2,1,False,ECAFDBADBCF +68,nb_gm_004,7,43,3.4832749366760254,14,7,False,FAEBDFEFAAEDFECFADFCEDCABECCDBBFEEBDBCAFDBA +69,nb_gm_004,2,12,1.0047342777252197,2,0,False,FCABEDEDFABC +70,nb_gm_004,4,49,4.085228681564331,16,8,False,DCAADCCAFDCBDACDBADFBABDDEBBDFABEFEACBEEFBEFBFECD +71,nb_gm_004,5,49,3.932910680770874,16,8,False,DFABEDDABBDACBDADCFDBCDFEBDCBEBEFCEACFBEFABAEFCAF +72,nb_gm_004,4,12,0.9949767589569092,3,1,False,EAFDBCADBCFE +73,nb_gm_004,5,43,3.502958059310913,14,7,False,EABBCEEDBDCEDBCBCDFCEDCFAEFECABFAEAFDAFCADF +74,nb_gm_004,3,44,3.5608408451080322,13,7,False,EFCFECFEBCDBFEBFCEFABEAFCADACDFBDDEADABDEACB +75,nb_gm_004,2,61,4.981963157653809,20,10,False,ABFBDFDFBFABAEFAFDFACADCECFCAFBFCBCFEFDFEDBDEBEDECACEAEDBDCBE +76,nb_gm_004,2,61,5.044064044952393,20,10,False,DFBFCBCBEBDEDCBDBEAECEDCBCECAEABFBDFDEAEBABCFCAFDFAFBADAFDFEE +77,nb_gm_004,3,26,2.024602174758911,8,4,False,FCAFBCFBEDFEDCADBCECABEABD +78,nb_gm_004,6,16,1.2625012397766113,5,2,False,CDEBFACDEBAFCBDF +79,nb_gm_004,2,14,1.071295976638794,4,2,False,CFBCBDBEAEDAFA +80,nb_gm_004,5,33,2.739096164703369,11,5,False,ADFFEAAFCEFAFECECFCBEEACDEBBADCBD +81,nb_gm_004,2,61,4.994161128997803,20,10,False,AFBABDBDEBEDECBCFBEBCBACAFEFCEDEBEABDBCDCAEABACBCFDFBDEDFEFAC +82,nb_gm_004,2,24,2.010740041732788,7,3,False,DEAEFAFACFCBEBDBCDCEABFD +83,nb_gm_004,7,10,0.7493958473205566,3,0,False,FACBEDBFAC +84,nb_gm_004,2,63,5.357555150985718,21,10,False,ECFCFBCBEBDEAECEDCDEBEDBDCADAEACBABCECACDADBFBAFEFCECBFBEFECDCF +85,nb_gm_004,2,44,3.593871831893921,14,7,False,BAEAFEFECEDCBCFCEFEBAEACDCFDFABCDBDFDBADABFB +86,nb_gm_004,3,17,1.3206660747528076,5,2,False,FDCFECAFCBFDABEAC +87,nb_gm_004,6,18,1.50052809715271,6,3,False,DCFEABDCFEBADACFBE +88,nb_gm_004,4,29,2.3075549602508545,8,4,False,FACEFAABFFDBCEDCDEDBCBAECEBDA +89,nb_gm_004,3,11,0.8077938556671143,2,1,False,ADEBCFECFDA +90,nb_gm_004,3,55,4.561264276504517,18,9,True,BACBCADCAEDACBADCABCEACDBCABDCFDBCEBFECBACBEDCADEACDFCB +91,nb_gm_004,3,62,5.1214518547058105,20,10,False,DFEBDECDEEDCADEABDAFEAEFDCFFCAACBABCDBEBDEBFACAFCFBCBFDBEFCAFC +92,nb_gm_004,7,63,5.354221820831299,21,10,False,ECDEACDECCEAABEECACDBBEDAEBDCEDEBABCBFEBCAADFFBAECDDFEADFCEFCAF +93,nb_gm_004,2,42,3.4913809299468994,13,7,False,FEAEBABADACDEDCDBCBFCFDEDAFAEFBFCBCEBEDFAC +94,nb_gm_004,4,58,4.802886962890625,19,9,False,ABDCABDACADBFBDBEFDFCEDCAFDCFAECAADEEABDEFDFEFCBBECEBDFCBF +95,nb_gm_004,6,14,1.061150074005127,4,2,False,ABCEDFABCFEDDB +96,nb_gm_004,4,41,3.3158693313598633,13,6,False,DEFADEFEADFAABEFAECFEACEADCEDBDABBACABECE +97,nb_gm_004,4,24,2.0305070877075195,8,4,False,DEBCDEFBDEAFCDABCAEFCBAF +98,nb_gm_004,6,35,2.8204848766326904,10,5,False,FDCEFBFDCCEBDECDCBAEDFCAFACBDAEABEB +99,nb_gm_004,3,32,2.5904409885406494,10,4,False,AFBEABFABBAECDECFDDFCCDEDAEFCBFC diff --git a/demo/nb_gm_002_demo.py b/demo/nb_gm_002_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_002_demo_sdt.py b/demo/nb_gm_002_demo_sdt.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo_sdt.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_003_demo.py b/demo/nb_gm_003_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_003_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_005_demo.py b/demo/nb_gm_005_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_005_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/skewed_nback.py b/demo/skewed_nback.py deleted file mode 100644 index 44dcfa1..0000000 --- a/demo/skewed_nback.py +++ /dev/null @@ -1,42 +0,0 @@ -import expyriment -from expyriment import design, control, stimuli, misc -from generators import nb_gm_002 - -nback_sequence = nb_gm_002.SequenceGenerator().generate() - -exp = design.Experiment("Skewed N-Back Task") -control.initialize(exp) -exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] - - -fixation = stimuli.FixCross() -fixation.preload() - -# left and right arrow keys for responses -response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] - -expyriment.control.start(exp) - -# initialize three blocks -for b in range(0, 2): - block = design.Block() - block.set_factor("block", b) - for item in nback_sequence: - trial = design.Trial() - trial.set_factor("stimulus", item) - stim = stimuli.TextLine(item, text_size=200) - stim.preload() - trial.add_stimulus(stim) - block.add_trial(trial, random_position=False) - exp.add_block(block) - -for block in exp.blocks: - for trial in block.trials: - exp.clock.wait(1000 - fixation.present()) - trial.stimuli[0].present() - pressed_key, rt = exp.keyboard.wait(response_keys) - exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) - exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) - -expyriment.control.end("Goodbye!", goodbye_delay=1000) - diff --git a/generators/nb_gm_004.py b/generators/nb_gm_004.py index 20ce55d..56678a3 100644 --- a/generators/nb_gm_004.py +++ b/generators/nb_gm_004.py @@ -40,7 +40,7 @@ self.reset(trials, targets, lures) while not self.seq or len(self.seq) < self.trials: #self.seq += self.best_choice() - chunk_size = self.n+1 if len(self.seq) + self.n + 1 <= self.trials else self.trials-len(self.seq) + chunk_size = 3 if len(self.seq) + 3 <= self.trials else self.trials-len(self.seq) self.seq += self.best_chunk(chunk_size) return self.seq @@ -83,19 +83,3 @@ def lures_cost(self, lures_ratio) -> float: return 1.0 - self.lures_norm.pdf(lures_ratio) / self.lures_norm.pdf(self.lures_ratio) - -if __name__ == '__main__': - import time - import numpy as np - - trials, targets, lures = 24, 8, 4 - choices = ['1', '2', '3', '4', '5', '6'] - print('alg,n,trials,time,targets,lures') - for s in range(1, common.sample_size): - n = 3 #np.random.randint(2, 8) - gen = SequenceGenerator(choices, n) - st = time.time() - s = gen.generate(trials, targets, lures) - st = time.time() - st - t, lu = common.count_targets_and_lures(s, n) - print(f"nb_gm_004,{n},{trials},{st:0.2f},{t},{lu}") diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/results/nb_gm_004_profile.csv b/benchmarks/results/nb_gm_004_profile.csv new file mode 100644 index 0000000..656adff --- /dev/null +++ b/benchmarks/results/nb_gm_004_profile.csv @@ -0,0 +1,101 @@ +,alg,n,trials,time,targets,lures,skewed,sequence +0,nb_gm_004,2,64,5.629104852676392,20,10,False,DBFBFAFEAECACFDCDABADBDCFCBCABACECAEDEADAFAEDEFBFEBABFDCECDEBEFB +1,nb_gm_004,2,18,1.5522487163543701,6,3,True,EACADCDCACBABFCBCA +2,nb_gm_004,7,36,3.1199769973754883,12,6,False,ABEABFDABBAEBDAABFDBFDAFFACFCDECACBF +3,nb_gm_004,2,37,3.655029773712158,12,6,False,BFDFEDEDCECDCABADBDFADAFEFBEBCACFAFEC +4,nb_gm_004,4,39,3.4385950565338135,13,6,False,AFBDAFFDEACDCAECBAEBAFABCBAACFDECDFEDEF +5,nb_gm_004,7,54,4.757416009902954,18,9,False,BFAECBDBFFACEDBBDACBEAEDAFDBADCAEFCAFCEADCEFDEDACFBFBD +6,nb_gm_004,7,22,1.847884178161621,7,3,False,EDCBFAAEDBCFFAECBDCFDB +7,nb_gm_004,4,32,2.5619711875915527,10,5,False,DBFEDBFCEDFAECABACACFEBDCEDBAFDB +8,nb_gm_004,5,45,3.880707025527954,15,7,False,BCDEDBBDEECBDBFACDBEDADEDCAAFDEBAFBDADFEBAEFC +9,nb_gm_004,7,18,1.5218820571899414,5,3,False,FEBCDADFEBACAFDECB +10,nb_gm_004,5,43,3.712139129638672,14,7,False,AEFFCABEFFABDFAADBEACDCBDCECFBBEDCEDEACFBDA +11,nb_gm_004,7,60,5.11740517616272,19,10,False,FDEDCEBFDDECEDFFDCCFEBFCBAFEDBBEAAEBFBAEACADBBCACFAADCABDFCE +12,nb_gm_004,7,48,4.116453170776367,16,8,False,ADBADCCADFBDDCADCFDEFEACCDBFDCECFBEFBEFEABABEFCE +13,nb_gm_004,4,17,1.3661417961120605,4,2,False,CBEACBBDCBFCDAEEF +14,nb_gm_004,4,61,5.220706224441528,20,10,False,CEDACEDCACDBEBDDEAFAEAEFBDECFDEDBFBDCFABEFAEDEACBFABCFCBFFDCC +15,nb_gm_004,3,52,4.4212260246276855,17,8,False,EBCDBCDEBFDBFBCEFCBFECDEADCEDAEFBDEBDBAABFDAFCADFAEE +16,nb_gm_004,7,27,2.323706865310669,9,4,False,EACFDBBEAAFDDCEBCFFECABDCFA +17,nb_gm_004,3,32,2.64604115486145,10,5,False,CBACEBCDBFCBCEBFCBACDDFCEFAFEAFA +18,nb_gm_004,6,26,2.1442930698394775,7,4,False,ECBADFECBBAFEADDCFDFABCEFC +19,nb_gm_004,2,44,3.7390267848968506,14,7,False,EDCECACAFADFDAEACECDBDCBCEFEAFFDAFADBDCBCFCB +20,nb_gm_004,4,62,5.2222230434417725,20,10,False,EACFEACDFADCCAFDFAFCAADFADBFCABCDADBFBDBCFABFEDAFDADFAEDBACEBD +21,nb_gm_004,5,61,5.658479928970337,20,10,False,BAEFCBBEFFBCCAFEBCEFABECBAEEFCDECFBCBAFFDBDFAFADAEFABDEADBEDD +22,nb_gm_004,5,32,2.645524024963379,10,5,False,ECDBCEEDBBFEFBAFAEDACDAFBCADFCEA +23,nb_gm_004,7,62,5.216619968414307,20,10,False,EADDFBDEAADFFCEEBDFADCDBAFEDFCADFFDBABDDFACAEACDABEAFCACBCEFCB +24,nb_gm_004,3,24,2.0706608295440674,8,3,False,EBAEBFAEFDECBDCADBACFCDF +25,nb_gm_004,3,36,3.1037821769714355,12,6,False,BCFEBFECFEFCDFBDEFDBCDEBFEDBECEDCEFD +26,nb_gm_004,6,61,5.195503234863281,20,10,False,CADBEACADDBACEBDFBEFBBFCADBABCBDABFCBECBDFFEBBEDDEFFBDEBFEFDA +27,nb_gm_004,6,11,0.8340439796447754,3,0,False,AEFBCDABFEC +28,nb_gm_004,4,39,3.390317916870117,13,6,False,ACBFACBCFABEBAECEAEDBCADFDADAFFDECFBEFC +29,nb_gm_004,2,56,4.782411098480225,18,9,False,BCDBDCDCFDFBCBEBFEFABFBECEAEDADBCDCEFEBFBEDACDCFEFBEBACA +30,nb_gm_004,2,53,4.454513788223267,17,8,False,CEDEDBEBABDADECDCECDBCBDBCABADAFCDCFCEFFCECFEFADFDAEA +31,nb_gm_004,5,41,3.454822063446045,13,6,False,BEFACBBFAAEBCBAADCDAFDECFEDFCADEAEBDFCEED +32,nb_gm_004,2,53,4.557706117630005,17,8,False,BDEDEBDBEBAECEFEDFAFCFECACBABECEAEFDFCDDAEAFEFADFDBCB +33,nb_gm_004,3,57,4.94400691986084,19,9,False,FCEFBEDFEDBFBEFBCEECAEDCFDAFADFEBCFBADBACDAEFCAFCFEACEDCA +34,nb_gm_004,5,13,1.0586318969726562,4,2,False,FAEDBCFEDBACE +35,nb_gm_004,3,43,3.702164888381958,14,7,False,ACEADCADFCDABEAAEBAFCBFDEFBDFECFBEDBFCBEDCE +36,nb_gm_004,4,40,3.446906089782715,13,6,False,EDCAEDCBAEABCBAAEBCADBACBCACFDAECDEBEDCF +37,nb_gm_004,7,60,5.721850156784058,20,10,False,FABAFDBFAABFDAFFCBCDBAFDBECFADDABFDAADBFADAFCDFBBACBCFDCACAB +38,nb_gm_004,2,40,3.326483964920044,13,6,False,DEAEACAFCFDCDFEDEAFADFDBEBABFCBCACEBECBF +39,nb_gm_004,5,45,3.9018988609313965,15,7,False,CABEACCBEFACDEBAECEDFAFEBEACFBCAECBDBDCCDFDBE +40,nb_gm_004,3,18,1.55079984664917,6,3,False,EBADBAABFCAFCEDCBE +41,nb_gm_004,6,34,2.884040355682373,11,5,False,ECBABFECBBAFEADBDACFDBEDBFCEFDDACA +42,nb_gm_004,2,48,4.0855629444122314,14,7,False,AFEFAEAEFAFDBDCDBCBFEFCECDBDABACBCEDFDEBCACDABEF +43,nb_gm_004,6,50,4.191677093505859,16,8,False,FDEFACFDEEFCEDFDECFDBADCBDCBDABFECEADABEBABACECBFA +44,nb_gm_004,3,25,2.081367015838623,8,3,False,EBDEABEACBAFDCFCDFCFAEDBE +45,nb_gm_004,5,15,1.2862391471862793,5,2,False,ABDCEAFBCEDFFDE +46,nb_gm_004,4,19,1.6599581241607666,6,3,False,BFCABFFACBDABEDFAEC +47,nb_gm_004,5,61,5.23445987701416,20,10,True,CEFEFCCFEECDFDADCFDEFCEFCFBFECABCEBCCFEEACAEFABCEADAFECDFABCA +48,nb_gm_004,4,51,4.420213937759399,17,8,False,FDABFDDEFFDBFDEABDEDFDCEEACCEDDAEEDBEDFEBDCEDBFEABC +49,nb_gm_004,2,61,5.241312026977539,20,10,True,FDEDCECEDCDEDBCDCECBFBEFDFEFCEDECDCEAECEFCBCACEAFACFCBCAECEBF +50,nb_gm_004,7,53,4.433992147445679,17,8,False,CFABEFECFFBEFCECEBEDAEDCFADACECABEFCEDCDABFBDADBADBDF +51,nb_gm_004,3,40,3.2851059436798096,13,6,False,BDFCDFCFDFBDABCACBFDBFADFBEFEAFBECDEEDAD +52,nb_gm_004,6,19,1.5269551277160645,6,3,False,CBADEFCBAFDEEBAFCDC +53,nb_gm_004,7,33,2.7817859649658203,11,5,False,FADAECBFAADECBDFEDCDBBAEFCBFECAFC +54,nb_gm_004,2,60,5.081879138946533,20,10,False,ADFDFAFBAFAEACFAFEFBCBDCDABACBABCECFCEACAFACFDFBABEBDEFEDFDB +55,nb_gm_004,3,13,1.0153288841247559,3,1,False,DECBAFCAFDBED +56,nb_gm_004,7,52,4.270846843719482,17,8,False,ADBDCFCADDBCBCAADCEFCCAFEBFFEAFACBCEBEADBEFEDCDBEBFF +57,nb_gm_004,5,34,2.718968152999878,11,5,False,BEDFEBBDFFDBAFDDCBFACDBEBCACEACEAF +58,nb_gm_004,2,59,4.88099479675293,19,9,True,BDFDFADACDCBFBCFCECBACABEBCBACFCBABFAFBFECFBDBCABACAFBABCBE +59,nb_gm_004,7,15,1.2424840927124023,5,2,False,CDFEBAACDFBEBAC +60,nb_gm_004,4,45,3.7462897300720215,15,7,False,FBECFBDEFBCDCBEDACEAFECADEADAEBDFEABFDCCBDFCA +61,nb_gm_004,7,49,3.994555950164795,16,8,False,BDECFEFBDDEFECBBDCCEBCEDCEFECBACFFAEEFCCBAEACFABF +62,nb_gm_004,5,42,3.4888839721679688,13,7,False,CDFFBCEDFFCECFDCDEADBFDAABCBEABEAAEBECBAFD +63,nb_gm_004,7,61,5.040170907974243,20,10,False,DEBFBCFDEEFBECDDEBCEFCFECFEEAFBCEFEBFAECAEAFEACFEDCAECDECCDAD +64,nb_gm_004,7,43,3.566600799560547,14,7,False,CEDEAFBCEEDADBCCEAACFBFEAEBCDFCBEFBDFDABFDA +65,nb_gm_004,5,48,3.976670980453491,16,8,False,BFDDFBBEDEFBEDAAFECDADBCBEDDFBBDFEABDBFFEDEAFFAE +66,nb_gm_004,6,17,1.2704148292541504,5,2,False,DFBACEDFBCAEECDFA +67,nb_gm_004,3,11,0.8034019470214844,2,1,False,ECAFDBADBCF +68,nb_gm_004,7,43,3.4832749366760254,14,7,False,FAEBDFEFAAEDFECFADFCEDCABECCDBBFEEBDBCAFDBA +69,nb_gm_004,2,12,1.0047342777252197,2,0,False,FCABEDEDFABC +70,nb_gm_004,4,49,4.085228681564331,16,8,False,DCAADCCAFDCBDACDBADFBABDDEBBDFABEFEACBEEFBEFBFECD +71,nb_gm_004,5,49,3.932910680770874,16,8,False,DFABEDDABBDACBDADCFDBCDFEBDCBEBEFCEACFBEFABAEFCAF +72,nb_gm_004,4,12,0.9949767589569092,3,1,False,EAFDBCADBCFE +73,nb_gm_004,5,43,3.502958059310913,14,7,False,EABBCEEDBDCEDBCBCDFCEDCFAEFECABFAEAFDAFCADF +74,nb_gm_004,3,44,3.5608408451080322,13,7,False,EFCFECFEBCDBFEBFCEFABEAFCADACDFBDDEADABDEACB +75,nb_gm_004,2,61,4.981963157653809,20,10,False,ABFBDFDFBFABAEFAFDFACADCECFCAFBFCBCFEFDFEDBDEBEDECACEAEDBDCBE +76,nb_gm_004,2,61,5.044064044952393,20,10,False,DFBFCBCBEBDEDCBDBEAECEDCBCECAEABFBDFDEAEBABCFCAFDFAFBADAFDFEE +77,nb_gm_004,3,26,2.024602174758911,8,4,False,FCAFBCFBEDFEDCADBCECABEABD +78,nb_gm_004,6,16,1.2625012397766113,5,2,False,CDEBFACDEBAFCBDF +79,nb_gm_004,2,14,1.071295976638794,4,2,False,CFBCBDBEAEDAFA +80,nb_gm_004,5,33,2.739096164703369,11,5,False,ADFFEAAFCEFAFECECFCBEEACDEBBADCBD +81,nb_gm_004,2,61,4.994161128997803,20,10,False,AFBABDBDEBEDECBCFBEBCBACAFEFCEDEBEABDBCDCAEABACBCFDFBDEDFEFAC +82,nb_gm_004,2,24,2.010740041732788,7,3,False,DEAEFAFACFCBEBDBCDCEABFD +83,nb_gm_004,7,10,0.7493958473205566,3,0,False,FACBEDBFAC +84,nb_gm_004,2,63,5.357555150985718,21,10,False,ECFCFBCBEBDEAECEDCDEBEDBDCADAEACBABCECACDADBFBAFEFCECBFBEFECDCF +85,nb_gm_004,2,44,3.593871831893921,14,7,False,BAEAFEFECEDCBCFCEFEBAEACDCFDFABCDBDFDBADABFB +86,nb_gm_004,3,17,1.3206660747528076,5,2,False,FDCFECAFCBFDABEAC +87,nb_gm_004,6,18,1.50052809715271,6,3,False,DCFEABDCFEBADACFBE +88,nb_gm_004,4,29,2.3075549602508545,8,4,False,FACEFAABFFDBCEDCDEDBCBAECEBDA +89,nb_gm_004,3,11,0.8077938556671143,2,1,False,ADEBCFECFDA +90,nb_gm_004,3,55,4.561264276504517,18,9,True,BACBCADCAEDACBADCABCEACDBCABDCFDBCEBFECBACBEDCADEACDFCB +91,nb_gm_004,3,62,5.1214518547058105,20,10,False,DFEBDECDEEDCADEABDAFEAEFDCFFCAACBABCDBEBDEBFACAFCFBCBFDBEFCAFC +92,nb_gm_004,7,63,5.354221820831299,21,10,False,ECDEACDECCEAABEECACDBBEDAEBDCEDEBABCBFEBCAADFFBAECDDFEADFCEFCAF +93,nb_gm_004,2,42,3.4913809299468994,13,7,False,FEAEBABADACDEDCDBCBFCFDEDAFAEFBFCBCEBEDFAC +94,nb_gm_004,4,58,4.802886962890625,19,9,False,ABDCABDACADBFBDBEFDFCEDCAFDCFAECAADEEABDEFDFEFCBBECEBDFCBF +95,nb_gm_004,6,14,1.061150074005127,4,2,False,ABCEDFABCFEDDB +96,nb_gm_004,4,41,3.3158693313598633,13,6,False,DEFADEFEADFAABEFAECFEACEADCEDBDABBACABECE +97,nb_gm_004,4,24,2.0305070877075195,8,4,False,DEBCDEFBDEAFCDABCAEFCBAF +98,nb_gm_004,6,35,2.8204848766326904,10,5,False,FDCEFBFDCCEBDECDCBAEDFCAFACBDAEABEB +99,nb_gm_004,3,32,2.5904409885406494,10,4,False,AFBEABFABBAECDECFDDFCCDEDAEFCBFC diff --git a/demo/nb_gm_002_demo.py b/demo/nb_gm_002_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_002_demo_sdt.py b/demo/nb_gm_002_demo_sdt.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo_sdt.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_003_demo.py b/demo/nb_gm_003_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_003_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_005_demo.py b/demo/nb_gm_005_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_005_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/skewed_nback.py b/demo/skewed_nback.py deleted file mode 100644 index 44dcfa1..0000000 --- a/demo/skewed_nback.py +++ /dev/null @@ -1,42 +0,0 @@ -import expyriment -from expyriment import design, control, stimuli, misc -from generators import nb_gm_002 - -nback_sequence = nb_gm_002.SequenceGenerator().generate() - -exp = design.Experiment("Skewed N-Back Task") -control.initialize(exp) -exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] - - -fixation = stimuli.FixCross() -fixation.preload() - -# left and right arrow keys for responses -response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] - -expyriment.control.start(exp) - -# initialize three blocks -for b in range(0, 2): - block = design.Block() - block.set_factor("block", b) - for item in nback_sequence: - trial = design.Trial() - trial.set_factor("stimulus", item) - stim = stimuli.TextLine(item, text_size=200) - stim.preload() - trial.add_stimulus(stim) - block.add_trial(trial, random_position=False) - exp.add_block(block) - -for block in exp.blocks: - for trial in block.trials: - exp.clock.wait(1000 - fixation.present()) - trial.stimuli[0].present() - pressed_key, rt = exp.keyboard.wait(response_keys) - exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) - exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) - -expyriment.control.end("Goodbye!", goodbye_delay=1000) - diff --git a/generators/nb_gm_004.py b/generators/nb_gm_004.py index 20ce55d..56678a3 100644 --- a/generators/nb_gm_004.py +++ b/generators/nb_gm_004.py @@ -40,7 +40,7 @@ self.reset(trials, targets, lures) while not self.seq or len(self.seq) < self.trials: #self.seq += self.best_choice() - chunk_size = self.n+1 if len(self.seq) + self.n + 1 <= self.trials else self.trials-len(self.seq) + chunk_size = 3 if len(self.seq) + 3 <= self.trials else self.trials-len(self.seq) self.seq += self.best_chunk(chunk_size) return self.seq @@ -83,19 +83,3 @@ def lures_cost(self, lures_ratio) -> float: return 1.0 - self.lures_norm.pdf(lures_ratio) / self.lures_norm.pdf(self.lures_ratio) - -if __name__ == '__main__': - import time - import numpy as np - - trials, targets, lures = 24, 8, 4 - choices = ['1', '2', '3', '4', '5', '6'] - print('alg,n,trials,time,targets,lures') - for s in range(1, common.sample_size): - n = 3 #np.random.randint(2, 8) - gen = SequenceGenerator(choices, n) - st = time.time() - s = gen.generate(trials, targets, lures) - st = time.time() - st - t, lu = common.count_targets_and_lures(s, n) - print(f"nb_gm_004,{n},{trials},{st:0.2f},{t},{lu}") diff --git a/generators/progressive_random.py b/generators/progressive_random.py index 81bebbc..441656f 100644 --- a/generators/progressive_random.py +++ b/generators/progressive_random.py @@ -1,6 +1,8 @@ import random import scipy.stats +import benchmarks.common as common + class SequenceGenerator: """Generate a sequence progressively according to a predefined TL ratio and an even distribution""" @@ -57,26 +59,15 @@ :return: """ - targets, lures = self.count_targets_and_lures(seq) + targets, lures = common.count_targets_and_lures(seq, self.n) targets_cost = 1.0 - self.norm_targets_ratio_dist.pdf(targets/self.trials) tl_cost = 1.0 - self.norm_tl_ratio_dist.pdf(self.tl(seq)) even_cost = self.even_distribution_cost(seq) return targets_cost + tl_cost + even_cost - def count_targets_and_lures(self, seq): - n = self.n - targets = 0.0 - lures = 0.0 - for index in range(n, len(seq)): - if seq[index] == seq[index - n]: - targets += 1.0 - elif seq[index] == seq[index - (n-1)] or seq[index] == seq[index - (n+1)]: - lures += 1.0 - return targets, lures - def tl(self, seq): """Calculates the T/L ratio in a block of trials.""" - targets, lures = self.count_targets_and_lures(seq) + targets, lures = common.count_targets_and_lures(seq, self.n) if lures < 0.01: # avoid division by zero lures = 0.01 return targets/lures diff --git a/benchmarks/common.py b/benchmarks/common.py index 5e2b1da..e40c0df 100644 --- a/benchmarks/common.py +++ b/benchmarks/common.py @@ -2,9 +2,9 @@ # Common benchmark parameters choices = alphabetic_choices = ['A', 'B', 'C', 'D', 'E', 'F'] -trials_range = (10, 100) +trials_range = (10, 65) n = 4 -sample_size = 20 +sample_size = 100 def count_targets_and_lures(seq, n): @@ -17,3 +17,11 @@ else: mask += 'D' return mask.count('T'), mask.count('L') + + +def skewness(seq, choices): + import heapq + trials = len(seq) + freqs = [float(seq.count(c)) for c in choices] + ralph_skewed = sum(heapq.nlargest(int(len(choices) / 2), freqs)) > (trials * 2 / 3) + return ralph_skewed diff --git a/benchmarks/nb_gm_004_bm.py b/benchmarks/nb_gm_004_bm.py new file mode 100644 index 0000000..4b0015c --- /dev/null +++ b/benchmarks/nb_gm_004_bm.py @@ -0,0 +1,26 @@ +import time +import numpy as np +import pandas as pd + +import benchmarks.common as common +from generators.nb_gm_004 import SequenceGenerator + +if __name__ == '__main__': + + res = [] + + for s in range(common.sample_size): + trials = np.random.randint(common.trials_range[0], common.trials_range[1]) + targets = int(trials / 3) + lures = int(targets / 6) # tl_ratio = 2.0 + n = np.random.randint(2, 8) + gen = SequenceGenerator(common.choices, n) + st = time.time() + seq = gen.generate(trials, targets, lures) + st = time.time() - st + t, lu = common.count_targets_and_lures(seq, n) + skewed = common.skewness(seq, common.choices) + res.append(['nb_gm_004', n, trials, st, t, lu, skewed, ''.join(seq)]) + print(f"sequence #{s+1} generated") + res_df = pd.DataFrame(res, columns=['alg', 'n', 'trials', 'time', 'targets', 'lures', 'skewed', 'sequence']) + res_df.to_csv('benchmarks/results/nb_gm_004_profile.csv', sep=',', encoding='utf-8') diff --git a/benchmarks/results/nb_gm_004_profile.csv b/benchmarks/results/nb_gm_004_profile.csv new file mode 100644 index 0000000..656adff --- /dev/null +++ b/benchmarks/results/nb_gm_004_profile.csv @@ -0,0 +1,101 @@ +,alg,n,trials,time,targets,lures,skewed,sequence +0,nb_gm_004,2,64,5.629104852676392,20,10,False,DBFBFAFEAECACFDCDABADBDCFCBCABACECAEDEADAFAEDEFBFEBABFDCECDEBEFB +1,nb_gm_004,2,18,1.5522487163543701,6,3,True,EACADCDCACBABFCBCA +2,nb_gm_004,7,36,3.1199769973754883,12,6,False,ABEABFDABBAEBDAABFDBFDAFFACFCDECACBF +3,nb_gm_004,2,37,3.655029773712158,12,6,False,BFDFEDEDCECDCABADBDFADAFEFBEBCACFAFEC +4,nb_gm_004,4,39,3.4385950565338135,13,6,False,AFBDAFFDEACDCAECBAEBAFABCBAACFDECDFEDEF +5,nb_gm_004,7,54,4.757416009902954,18,9,False,BFAECBDBFFACEDBBDACBEAEDAFDBADCAEFCAFCEADCEFDEDACFBFBD +6,nb_gm_004,7,22,1.847884178161621,7,3,False,EDCBFAAEDBCFFAECBDCFDB +7,nb_gm_004,4,32,2.5619711875915527,10,5,False,DBFEDBFCEDFAECABACACFEBDCEDBAFDB +8,nb_gm_004,5,45,3.880707025527954,15,7,False,BCDEDBBDEECBDBFACDBEDADEDCAAFDEBAFBDADFEBAEFC +9,nb_gm_004,7,18,1.5218820571899414,5,3,False,FEBCDADFEBACAFDECB +10,nb_gm_004,5,43,3.712139129638672,14,7,False,AEFFCABEFFABDFAADBEACDCBDCECFBBEDCEDEACFBDA +11,nb_gm_004,7,60,5.11740517616272,19,10,False,FDEDCEBFDDECEDFFDCCFEBFCBAFEDBBEAAEBFBAEACADBBCACFAADCABDFCE +12,nb_gm_004,7,48,4.116453170776367,16,8,False,ADBADCCADFBDDCADCFDEFEACCDBFDCECFBEFBEFEABABEFCE +13,nb_gm_004,4,17,1.3661417961120605,4,2,False,CBEACBBDCBFCDAEEF +14,nb_gm_004,4,61,5.220706224441528,20,10,False,CEDACEDCACDBEBDDEAFAEAEFBDECFDEDBFBDCFABEFAEDEACBFABCFCBFFDCC +15,nb_gm_004,3,52,4.4212260246276855,17,8,False,EBCDBCDEBFDBFBCEFCBFECDEADCEDAEFBDEBDBAABFDAFCADFAEE +16,nb_gm_004,7,27,2.323706865310669,9,4,False,EACFDBBEAAFDDCEBCFFECABDCFA +17,nb_gm_004,3,32,2.64604115486145,10,5,False,CBACEBCDBFCBCEBFCBACDDFCEFAFEAFA +18,nb_gm_004,6,26,2.1442930698394775,7,4,False,ECBADFECBBAFEADDCFDFABCEFC +19,nb_gm_004,2,44,3.7390267848968506,14,7,False,EDCECACAFADFDAEACECDBDCBCEFEAFFDAFADBDCBCFCB +20,nb_gm_004,4,62,5.2222230434417725,20,10,False,EACFEACDFADCCAFDFAFCAADFADBFCABCDADBFBDBCFABFEDAFDADFAEDBACEBD +21,nb_gm_004,5,61,5.658479928970337,20,10,False,BAEFCBBEFFBCCAFEBCEFABECBAEEFCDECFBCBAFFDBDFAFADAEFABDEADBEDD +22,nb_gm_004,5,32,2.645524024963379,10,5,False,ECDBCEEDBBFEFBAFAEDACDAFBCADFCEA +23,nb_gm_004,7,62,5.216619968414307,20,10,False,EADDFBDEAADFFCEEBDFADCDBAFEDFCADFFDBABDDFACAEACDABEAFCACBCEFCB +24,nb_gm_004,3,24,2.0706608295440674,8,3,False,EBAEBFAEFDECBDCADBACFCDF +25,nb_gm_004,3,36,3.1037821769714355,12,6,False,BCFEBFECFEFCDFBDEFDBCDEBFEDBECEDCEFD +26,nb_gm_004,6,61,5.195503234863281,20,10,False,CADBEACADDBACEBDFBEFBBFCADBABCBDABFCBECBDFFEBBEDDEFFBDEBFEFDA +27,nb_gm_004,6,11,0.8340439796447754,3,0,False,AEFBCDABFEC +28,nb_gm_004,4,39,3.390317916870117,13,6,False,ACBFACBCFABEBAECEAEDBCADFDADAFFDECFBEFC +29,nb_gm_004,2,56,4.782411098480225,18,9,False,BCDBDCDCFDFBCBEBFEFABFBECEAEDADBCDCEFEBFBEDACDCFEFBEBACA +30,nb_gm_004,2,53,4.454513788223267,17,8,False,CEDEDBEBABDADECDCECDBCBDBCABADAFCDCFCEFFCECFEFADFDAEA +31,nb_gm_004,5,41,3.454822063446045,13,6,False,BEFACBBFAAEBCBAADCDAFDECFEDFCADEAEBDFCEED +32,nb_gm_004,2,53,4.557706117630005,17,8,False,BDEDEBDBEBAECEFEDFAFCFECACBABECEAEFDFCDDAEAFEFADFDBCB +33,nb_gm_004,3,57,4.94400691986084,19,9,False,FCEFBEDFEDBFBEFBCEECAEDCFDAFADFEBCFBADBACDAEFCAFCFEACEDCA +34,nb_gm_004,5,13,1.0586318969726562,4,2,False,FAEDBCFEDBACE +35,nb_gm_004,3,43,3.702164888381958,14,7,False,ACEADCADFCDABEAAEBAFCBFDEFBDFECFBEDBFCBEDCE +36,nb_gm_004,4,40,3.446906089782715,13,6,False,EDCAEDCBAEABCBAAEBCADBACBCACFDAECDEBEDCF +37,nb_gm_004,7,60,5.721850156784058,20,10,False,FABAFDBFAABFDAFFCBCDBAFDBECFADDABFDAADBFADAFCDFBBACBCFDCACAB +38,nb_gm_004,2,40,3.326483964920044,13,6,False,DEAEACAFCFDCDFEDEAFADFDBEBABFCBCACEBECBF +39,nb_gm_004,5,45,3.9018988609313965,15,7,False,CABEACCBEFACDEBAECEDFAFEBEACFBCAECBDBDCCDFDBE +40,nb_gm_004,3,18,1.55079984664917,6,3,False,EBADBAABFCAFCEDCBE +41,nb_gm_004,6,34,2.884040355682373,11,5,False,ECBABFECBBAFEADBDACFDBEDBFCEFDDACA +42,nb_gm_004,2,48,4.0855629444122314,14,7,False,AFEFAEAEFAFDBDCDBCBFEFCECDBDABACBCEDFDEBCACDABEF +43,nb_gm_004,6,50,4.191677093505859,16,8,False,FDEFACFDEEFCEDFDECFDBADCBDCBDABFECEADABEBABACECBFA +44,nb_gm_004,3,25,2.081367015838623,8,3,False,EBDEABEACBAFDCFCDFCFAEDBE +45,nb_gm_004,5,15,1.2862391471862793,5,2,False,ABDCEAFBCEDFFDE +46,nb_gm_004,4,19,1.6599581241607666,6,3,False,BFCABFFACBDABEDFAEC +47,nb_gm_004,5,61,5.23445987701416,20,10,True,CEFEFCCFEECDFDADCFDEFCEFCFBFECABCEBCCFEEACAEFABCEADAFECDFABCA +48,nb_gm_004,4,51,4.420213937759399,17,8,False,FDABFDDEFFDBFDEABDEDFDCEEACCEDDAEEDBEDFEBDCEDBFEABC +49,nb_gm_004,2,61,5.241312026977539,20,10,True,FDEDCECEDCDEDBCDCECBFBEFDFEFCEDECDCEAECEFCBCACEAFACFCBCAECEBF +50,nb_gm_004,7,53,4.433992147445679,17,8,False,CFABEFECFFBEFCECEBEDAEDCFADACECABEFCEDCDABFBDADBADBDF +51,nb_gm_004,3,40,3.2851059436798096,13,6,False,BDFCDFCFDFBDABCACBFDBFADFBEFEAFBECDEEDAD +52,nb_gm_004,6,19,1.5269551277160645,6,3,False,CBADEFCBAFDEEBAFCDC +53,nb_gm_004,7,33,2.7817859649658203,11,5,False,FADAECBFAADECBDFEDCDBBAEFCBFECAFC +54,nb_gm_004,2,60,5.081879138946533,20,10,False,ADFDFAFBAFAEACFAFEFBCBDCDABACBABCECFCEACAFACFDFBABEBDEFEDFDB +55,nb_gm_004,3,13,1.0153288841247559,3,1,False,DECBAFCAFDBED +56,nb_gm_004,7,52,4.270846843719482,17,8,False,ADBDCFCADDBCBCAADCEFCCAFEBFFEAFACBCEBEADBEFEDCDBEBFF +57,nb_gm_004,5,34,2.718968152999878,11,5,False,BEDFEBBDFFDBAFDDCBFACDBEBCACEACEAF +58,nb_gm_004,2,59,4.88099479675293,19,9,True,BDFDFADACDCBFBCFCECBACABEBCBACFCBABFAFBFECFBDBCABACAFBABCBE +59,nb_gm_004,7,15,1.2424840927124023,5,2,False,CDFEBAACDFBEBAC +60,nb_gm_004,4,45,3.7462897300720215,15,7,False,FBECFBDEFBCDCBEDACEAFECADEADAEBDFEABFDCCBDFCA +61,nb_gm_004,7,49,3.994555950164795,16,8,False,BDECFEFBDDEFECBBDCCEBCEDCEFECBACFFAEEFCCBAEACFABF +62,nb_gm_004,5,42,3.4888839721679688,13,7,False,CDFFBCEDFFCECFDCDEADBFDAABCBEABEAAEBECBAFD +63,nb_gm_004,7,61,5.040170907974243,20,10,False,DEBFBCFDEEFBECDDEBCEFCFECFEEAFBCEFEBFAECAEAFEACFEDCAECDECCDAD +64,nb_gm_004,7,43,3.566600799560547,14,7,False,CEDEAFBCEEDADBCCEAACFBFEAEBCDFCBEFBDFDABFDA +65,nb_gm_004,5,48,3.976670980453491,16,8,False,BFDDFBBEDEFBEDAAFECDADBCBEDDFBBDFEABDBFFEDEAFFAE +66,nb_gm_004,6,17,1.2704148292541504,5,2,False,DFBACEDFBCAEECDFA +67,nb_gm_004,3,11,0.8034019470214844,2,1,False,ECAFDBADBCF +68,nb_gm_004,7,43,3.4832749366760254,14,7,False,FAEBDFEFAAEDFECFADFCEDCABECCDBBFEEBDBCAFDBA +69,nb_gm_004,2,12,1.0047342777252197,2,0,False,FCABEDEDFABC +70,nb_gm_004,4,49,4.085228681564331,16,8,False,DCAADCCAFDCBDACDBADFBABDDEBBDFABEFEACBEEFBEFBFECD +71,nb_gm_004,5,49,3.932910680770874,16,8,False,DFABEDDABBDACBDADCFDBCDFEBDCBEBEFCEACFBEFABAEFCAF +72,nb_gm_004,4,12,0.9949767589569092,3,1,False,EAFDBCADBCFE +73,nb_gm_004,5,43,3.502958059310913,14,7,False,EABBCEEDBDCEDBCBCDFCEDCFAEFECABFAEAFDAFCADF +74,nb_gm_004,3,44,3.5608408451080322,13,7,False,EFCFECFEBCDBFEBFCEFABEAFCADACDFBDDEADABDEACB +75,nb_gm_004,2,61,4.981963157653809,20,10,False,ABFBDFDFBFABAEFAFDFACADCECFCAFBFCBCFEFDFEDBDEBEDECACEAEDBDCBE +76,nb_gm_004,2,61,5.044064044952393,20,10,False,DFBFCBCBEBDEDCBDBEAECEDCBCECAEABFBDFDEAEBABCFCAFDFAFBADAFDFEE +77,nb_gm_004,3,26,2.024602174758911,8,4,False,FCAFBCFBEDFEDCADBCECABEABD +78,nb_gm_004,6,16,1.2625012397766113,5,2,False,CDEBFACDEBAFCBDF +79,nb_gm_004,2,14,1.071295976638794,4,2,False,CFBCBDBEAEDAFA +80,nb_gm_004,5,33,2.739096164703369,11,5,False,ADFFEAAFCEFAFECECFCBEEACDEBBADCBD +81,nb_gm_004,2,61,4.994161128997803,20,10,False,AFBABDBDEBEDECBCFBEBCBACAFEFCEDEBEABDBCDCAEABACBCFDFBDEDFEFAC +82,nb_gm_004,2,24,2.010740041732788,7,3,False,DEAEFAFACFCBEBDBCDCEABFD +83,nb_gm_004,7,10,0.7493958473205566,3,0,False,FACBEDBFAC +84,nb_gm_004,2,63,5.357555150985718,21,10,False,ECFCFBCBEBDEAECEDCDEBEDBDCADAEACBABCECACDADBFBAFEFCECBFBEFECDCF +85,nb_gm_004,2,44,3.593871831893921,14,7,False,BAEAFEFECEDCBCFCEFEBAEACDCFDFABCDBDFDBADABFB +86,nb_gm_004,3,17,1.3206660747528076,5,2,False,FDCFECAFCBFDABEAC +87,nb_gm_004,6,18,1.50052809715271,6,3,False,DCFEABDCFEBADACFBE +88,nb_gm_004,4,29,2.3075549602508545,8,4,False,FACEFAABFFDBCEDCDEDBCBAECEBDA +89,nb_gm_004,3,11,0.8077938556671143,2,1,False,ADEBCFECFDA +90,nb_gm_004,3,55,4.561264276504517,18,9,True,BACBCADCAEDACBADCABCEACDBCABDCFDBCEBFECBACBEDCADEACDFCB +91,nb_gm_004,3,62,5.1214518547058105,20,10,False,DFEBDECDEEDCADEABDAFEAEFDCFFCAACBABCDBEBDEBFACAFCFBCBFDBEFCAFC +92,nb_gm_004,7,63,5.354221820831299,21,10,False,ECDEACDECCEAABEECACDBBEDAEBDCEDEBABCBFEBCAADFFBAECDDFEADFCEFCAF +93,nb_gm_004,2,42,3.4913809299468994,13,7,False,FEAEBABADACDEDCDBCBFCFDEDAFAEFBFCBCEBEDFAC +94,nb_gm_004,4,58,4.802886962890625,19,9,False,ABDCABDACADBFBDBEFDFCEDCAFDCFAECAADEEABDEFDFEFCBBECEBDFCBF +95,nb_gm_004,6,14,1.061150074005127,4,2,False,ABCEDFABCFEDDB +96,nb_gm_004,4,41,3.3158693313598633,13,6,False,DEFADEFEADFAABEFAECFEACEADCEDBDABBACABECE +97,nb_gm_004,4,24,2.0305070877075195,8,4,False,DEBCDEFBDEAFCDABCAEFCBAF +98,nb_gm_004,6,35,2.8204848766326904,10,5,False,FDCEFBFDCCEBDECDCBAEDFCAFACBDAEABEB +99,nb_gm_004,3,32,2.5904409885406494,10,4,False,AFBEABFABBAECDECFDDFCCDEDAEFCBFC diff --git a/demo/nb_gm_002_demo.py b/demo/nb_gm_002_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_002_demo_sdt.py b/demo/nb_gm_002_demo_sdt.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_002_demo_sdt.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_003_demo.py b/demo/nb_gm_003_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_003_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/nb_gm_005_demo.py b/demo/nb_gm_005_demo.py new file mode 100644 index 0000000..776b951 --- /dev/null +++ b/demo/nb_gm_005_demo.py @@ -0,0 +1,44 @@ +import expyriment +from expyriment import design, control, stimuli, misc +from generators import nb_gm_002 + +import benchmarks.common as common + +nback_sequence = nb_gm_002.SequenceGenerator(common.choices).generate(24, 8, 2, 2) + +exp = design.Experiment("Skewed N-Back Task") +control.initialize(exp) +exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] + + +fixation = stimuli.FixCross() +fixation.preload() + +# left and right arrow keys for responses +response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] + +expyriment.control.start(exp) + +# initialize three blocks +for b in range(0, 2): + block = design.Block() + block.set_factor("block", b) + for item in nback_sequence: + trial = design.Trial() + trial.set_factor("stimulus", item) + stim = stimuli.TextLine(item, text_size=200) + stim.preload() + trial.add_stimulus(stim) + block.add_trial(trial, random_position=False) + exp.add_block(block) + +for block in exp.blocks: + for trial in block.trials: + exp.clock.wait(1000 - fixation.present()) + trial.stimuli[0].present() + pressed_key, rt = exp.keyboard.wait(response_keys) + exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) + exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) + +expyriment.control.end("Goodbye!", goodbye_delay=1000) + diff --git a/demo/skewed_nback.py b/demo/skewed_nback.py deleted file mode 100644 index 44dcfa1..0000000 --- a/demo/skewed_nback.py +++ /dev/null @@ -1,42 +0,0 @@ -import expyriment -from expyriment import design, control, stimuli, misc -from generators import nb_gm_002 - -nback_sequence = nb_gm_002.SequenceGenerator().generate() - -exp = design.Experiment("Skewed N-Back Task") -control.initialize(exp) -exp.data_variable_names = ["block", "stimulus", "pressed_key", "rt"] - - -fixation = stimuli.FixCross() -fixation.preload() - -# left and right arrow keys for responses -response_keys = [misc.constants.K_LEFT, misc.constants.K_RIGHT] - -expyriment.control.start(exp) - -# initialize three blocks -for b in range(0, 2): - block = design.Block() - block.set_factor("block", b) - for item in nback_sequence: - trial = design.Trial() - trial.set_factor("stimulus", item) - stim = stimuli.TextLine(item, text_size=200) - stim.preload() - trial.add_stimulus(stim) - block.add_trial(trial, random_position=False) - exp.add_block(block) - -for block in exp.blocks: - for trial in block.trials: - exp.clock.wait(1000 - fixation.present()) - trial.stimuli[0].present() - pressed_key, rt = exp.keyboard.wait(response_keys) - exp.data.add([block.get_factor("block"), trial.get_factor("stimulus"), pressed_key, rt]) - exp.clock.wait(1000 - expyriment.stimuli.BlankScreen().present() - trial.stimuli[0].unload()) - -expyriment.control.end("Goodbye!", goodbye_delay=1000) - diff --git a/generators/nb_gm_004.py b/generators/nb_gm_004.py index 20ce55d..56678a3 100644 --- a/generators/nb_gm_004.py +++ b/generators/nb_gm_004.py @@ -40,7 +40,7 @@ self.reset(trials, targets, lures) while not self.seq or len(self.seq) < self.trials: #self.seq += self.best_choice() - chunk_size = self.n+1 if len(self.seq) + self.n + 1 <= self.trials else self.trials-len(self.seq) + chunk_size = 3 if len(self.seq) + 3 <= self.trials else self.trials-len(self.seq) self.seq += self.best_chunk(chunk_size) return self.seq @@ -83,19 +83,3 @@ def lures_cost(self, lures_ratio) -> float: return 1.0 - self.lures_norm.pdf(lures_ratio) / self.lures_norm.pdf(self.lures_ratio) - -if __name__ == '__main__': - import time - import numpy as np - - trials, targets, lures = 24, 8, 4 - choices = ['1', '2', '3', '4', '5', '6'] - print('alg,n,trials,time,targets,lures') - for s in range(1, common.sample_size): - n = 3 #np.random.randint(2, 8) - gen = SequenceGenerator(choices, n) - st = time.time() - s = gen.generate(trials, targets, lures) - st = time.time() - st - t, lu = common.count_targets_and_lures(s, n) - print(f"nb_gm_004,{n},{trials},{st:0.2f},{t},{lu}") diff --git a/generators/progressive_random.py b/generators/progressive_random.py index 81bebbc..441656f 100644 --- a/generators/progressive_random.py +++ b/generators/progressive_random.py @@ -1,6 +1,8 @@ import random import scipy.stats +import benchmarks.common as common + class SequenceGenerator: """Generate a sequence progressively according to a predefined TL ratio and an even distribution""" @@ -57,26 +59,15 @@ :return: """ - targets, lures = self.count_targets_and_lures(seq) + targets, lures = common.count_targets_and_lures(seq, self.n) targets_cost = 1.0 - self.norm_targets_ratio_dist.pdf(targets/self.trials) tl_cost = 1.0 - self.norm_tl_ratio_dist.pdf(self.tl(seq)) even_cost = self.even_distribution_cost(seq) return targets_cost + tl_cost + even_cost - def count_targets_and_lures(self, seq): - n = self.n - targets = 0.0 - lures = 0.0 - for index in range(n, len(seq)): - if seq[index] == seq[index - n]: - targets += 1.0 - elif seq[index] == seq[index - (n-1)] or seq[index] == seq[index - (n+1)]: - lures += 1.0 - return targets, lures - def tl(self, seq): """Calculates the T/L ratio in a block of trials.""" - targets, lures = self.count_targets_and_lures(seq) + targets, lures = common.count_targets_and_lures(seq, self.n) if lures < 0.01: # avoid division by zero lures = 0.01 return targets/lures diff --git a/generators/progressive_random_block_ga.py b/generators/progressive_random_block_ga.py index c07ac49..a7f454a 100644 --- a/generators/progressive_random_block_ga.py +++ b/generators/progressive_random_block_ga.py @@ -1,6 +1,8 @@ import itertools as it import random +import benchmarks.common as common +import scipy.stats class ProgressiveGAGenerator: """Generate a sequence progressively according to a predefined TL ratio and an even distribution""" @@ -15,6 +17,10 @@ """ self.tl, self.trials, self.choices, self.pool_size, self.n = tl, trials, choices, pool_size, n self.pool = [] + + self.tl_norm = scipy.stats.norm(self.tl, 0.5) + self.skewness_norm = scipy.stats.norm(0, 0.5) + self.__init_pool(pool_size) def generate(self): @@ -55,27 +61,6 @@ sorted_pool = sorted(self.pool, key=lambda ss: self.cost(ss)) return sorted_pool[:count] - def even_dist_cost(self, seq): - """ - Calculate fitness according to the similarity to the desired uniform distribution. - :param seq: a string - :return: - """ - costs = {c: 0.0 for c in self.choices} - for c in list(seq): - costs[c] += (1.0 if costs.__contains__(c) else 0.0) - costs = {k: abs(1.0 - v*len(self.choices)/self.trials) for k,v in costs.items()} - return max(list(costs.values())) - - def cost(self, seq): - """ - Calculate overall fitness of a sequence (block of trials). - Right now it's a cost function, so we try to minimize this cost. - :param seq: - :return: - """ - # add fitness for uniform distribution of all stimuli - return abs(self.calculate_tl_ratio(seq, self.n) - self.tl) + self.even_dist_cost(seq) def crossover_all(self): """ @@ -108,27 +93,26 @@ return ''.join(seq_list) return seq - @staticmethod - def calculate_tl_ratio(seq, n: int): - """Calculates the T/L ratio in a block of trials.""" - targets = 0.0 - lures = 0.0 - for index in range(n, len(seq)): - item = seq[index] - if item == seq[index - n]: - targets += 1.0 - elif item == seq[index - (n-1)] or item == seq[index - (n+1)]: - lures += 1.0 - if lures - 0.0 < 0.001: # avoid division by zero - lures = 0.001 - return targets/lures + def cost(self, seq): + targets, lures = common.count_targets_and_lures(seq, self.n) + #print(seq, targets, lures) + tl = targets / lures if lures >0 else targets + c1, c2 = self.skewness_cost(seq), self.tl_cost(tl) + return c1+c2 + + def skewness_cost(self, seq): + even_ratio = self.trials / len(self.choices) + costs = {c: abs(seq.count(c) - even_ratio) for c in self.choices} + max_deviation_from_even_dist = max(list(costs.values())) + return 1.0 - self.skewness_norm.pdf(max_deviation_from_even_dist) / self.skewness_norm.pdf(0) + + def tl_cost(self, tl): + return 1.0 - self.tl_norm.pdf(tl) / self.tl_norm.pdf(self.tl) if __name__ == '__main__': - generator = ProgressiveGAGenerator(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'], trials=16, n=2) + generator = ProgressiveGAGenerator(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'], trials=24, n=4) sq = generator.generate() - tl_ratio = generator.calculate_tl_ratio(sq, n=2) - even_dist = generator.even_dist_cost(sq) - print('Progressively-Optimized Sequence: %s' % sq, 'with tl_ratio=%f' % tl_ratio, 'and even_dist_cost=%f' % even_dist) + print('Progressively-Optimized Sequence: %s' % sq)