       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:= Timing[NDSolve[{Derivative[x][t] + x[t] == 0, x == 1,
Derivative[x] == 0}, x, {t, 0, 50000*Pi},
MaxSteps -> Infinity]]

Out= {5.578, {{x -> InterpolatingFunction[]}}}

In:= AbsoluteTiming[TimeConstrained[
NDSolve[{Derivative[x][t] + x[t] == 0, x == 1,
Derivative[x] == 0}, x, {t, 0, 50000*Pi},
MaxSteps -> Infinity], 5]]

Out= {5.0625`8.155910029718697, \$Aborted}

In:= AbsoluteTiming[TimeConstrained[
NDSolve[{Derivative[x][t] + x[t] == 0, x == 1,
Derivative[x] == 0}, x, {t, 0, 50000*Pi},
MaxSteps -> Infinity], 6]]

Out= {5.984375`8.228563793480708, {{x -> InterpolatingFunction[]}}}

```

• Prev by Date: Re: Cropping a surface to a sphere
• Next by Date: Re: FEM contourplotter - conversion completed
• Previous by thread: Re: Common Multiple Value Question
• Next by thread: AnyOne Knows how to???