TimeConstrained and returning a partial answer

*To*: mathgroup at smc.vnet.net*Subject*: [mg88200] TimeConstrained and returning a partial answer*From*: Szabolcs Horvát <szhorvat at gmail.com>*Date*: Mon, 28 Apr 2008 04:38:30 -0400 (EDT)*Organization*: University of Bergen

The following came up on sci.math.symbolic: Among the examples on the doc page of TimeConstrained there is one where a partial (less precise) answer is returned even if the calculation cannot be finished within the time constraint. I was wondering if there is a way to create user-defined functions with this behaviour. I found two relevant functions in the docs: AbortProtect and CheckAbort. Here's a small test program: AbortProtect@CheckAbort[ x = 0; Do[Pause[.1]; x++, {100}]; x, x] This program will return an answer even if the calculation is aborted with Alt+. (or the menu item Evaluation -> Abort evaluation). Now let us try to use it with TimeConstrained: TimeConstrained[ AbortProtect@CheckAbort[ x = 0; Do[Pause[.1]; x++, {100}]; x, x], 1 ] // AbsoluteTiming Unfortunately this always runs for 10 full seconds, and then returns $Aborted (i.e. the worst possible thing happens: the calculation is not stopped after 1 sec, but no answer is returned.) ** Question: How can this program be modified so that TimeConstrained will be able to stop it after 1 sec, and it will still return an answer? Note: I experimented a little with the example from the docs, and I cannot reproduce the result that is presented there. If the calculation cannot be finished within the time constraint, $Aborted is returned: In[1]:= Timing[NDSolve[{Derivative[2][x][t] + x[t] == 0, x[0] == 1, Derivative[1][x][0] == 0}, x, {t, 0, 50000*Pi}, MaxSteps -> Infinity]] Out[1]= {5.578, {{x -> InterpolatingFunction[]}}} In[2]:= AbsoluteTiming[TimeConstrained[ NDSolve[{Derivative[2][x][t] + x[t] == 0, x[0] == 1, Derivative[1][x][0] == 0}, x, {t, 0, 50000*Pi}, MaxSteps -> Infinity], 5]] Out[2]= {5.0625`8.155910029718697, $Aborted} In[3]:= AbsoluteTiming[TimeConstrained[ NDSolve[{Derivative[2][x][t] + x[t] == 0, x[0] == 1, Derivative[1][x][0] == 0}, x, {t, 0, 50000*Pi}, MaxSteps -> Infinity], 6]] Out[3]= {5.984375`8.228563793480708, {{x -> InterpolatingFunction[]}}}