+x+x+xHi All,
I'm back! After some discussion we decided we still need a time limit set for each problem. I'm trying to implement a problem time limit on the Tower of London task from Inquisitlab. I want the script to move on to the next problem once a set time limit that is same for all problems is up ( for example, 60 seconds, then it automatically moves to the next problem).
The part of the script I was thinking of adding to the choice trial is:
/branch [if (script.currenttime - values.t_roundstart > 60000) trial.stopblock
But it doesn't seem to work the way I want it to, and nothing seems to happen. Am I misunderstanding how I should implement the code, or is my approach completely wrong?
Sorry, I forgot the parentheses, /branch [if (script.currenttime - values.t_roundstart > 60000) trial.stopblock]
script.currenttime returns the current time in HH:MM:SS format, it's a string, you cannot do math with it, and subtracting milliseconds from it does not make sense.
You'll need to work with script.elapsedtime instead, see how the solution time is calculated throughout the script, i.e. look at
values.t_roundstart, which records the point in time a given round was started in milliseconds elapsed since the start of the script
and
values.t_solution, which records the point in time a given problem was solved in milliseconds elapsed since the start of the script
You'll need to do something similar to implement your per-problem timeout. Note that t_roundstart is _reset_ when a given problem is re-started.
Okay, here (attached) is something to give you a start. The general idea is to have a new parameter setting the time allowed per problem (here: set to 60000 ms, i.e. one minute):
<parameters>
/ maxattempts = 3
/ npracticeproblems = 1
/ time_per_problem = 60000...
</parameter>
Then set a value to that parameter at the start of each round (<trial newround>):
<trial newround>
/ ontrialbegin = [
values.timeleft = parameters.time_per_problem;values.t_roundstart=0;
values.t_firstmove=0;
values.t_solution=0;
...
</trial>
and use the value as a /timeout in the choice trial (<trial choice>) while subtracting the time taken by each choice on a trial-by-trial basis:
<trial choice>
...
/ ontrialend = [
values.t_choiceend=script.elapsedtime;
values.timeleft -= (values.t_choiceend - values.t_choicestart);...
/ branch = [
if(trial.choice.response=="resetround")
{
if (values.subjectattempts < parameters.maxattempts)
trial.resetround;
else
trial.stopblock;
}
else if (trial.choice.response == "nextround"
|| trial.choice.response == 0)
trial.stopblock;
else if (expressions.targetachieved)
trial.feedback;
else
trial.choice;
]
/ timeout = values.timeleft</trial>
Among the decisions you have to make:
- Do you want to interrupt the subject in the middle of a move if time has run out (this is what the above code will do) or do you want them to be able to complete the move even if time has run out?
- Do you want to allow 1 minute _per problem_ or per _attempt_ at a given problem? Suppose a participant solves the problem in the 1st attempt but not in the minimum amount of moves. Further suppose that 1st attempt took 40 seconds. Is the participant supposed to only have 20 seconds left for their 2nd attempt or are they supposed to get another full minute? The code attached does the former, if you want the latter you would need to set values.timeleft back to 60000ms in <trial resetround>
There probably are a number of other, similar complications that I haven't thought of, so I'd recommend you clarify for yourself how exactly you want things to work before making major modifications to the code.