Max Alekseyev on Fri, 30 Jun 2023 17:48:38 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: How to interrupt a MT calculation?


Jean-Luc,

Not answering your question, but it looks like the threads in your code share and overwrite the same variable t.
Perhaps, the intended functionality is to define
"()->my(t=time()); ..."
for each of the functions.

Regards,
Max


On Fri, Jun 30, 2023 at 11:18 AM Jean-Luc Arnaud <jean-luc@filmsons.com> wrote:
Le 30/06/2023 à 09:07, Bill Allombert a écrit :
On Fri, Jun 30, 2023 at 02:19:22AM +0200, Jean-Luc ARNAUD wrote:

Hi all,



In such a script:



|time()=[getabstime(),getwalltime()];||

||export(time);||

||

||Factor2_MT(n)=||

||

||{my(t);||||

||

||  print(pareval([

    ()->t=time(); factorint(n, 1); time()-t,||

||    ()->t=time(); factorint(n, 3); time()-t,||

||    ()->t=time(); if (n>2^468-1, factorint(n, 7), factorint(n, 6));

time()-t,||

||    ()->t=time(); factorint(n, 9); time()-t,||

||    ()->t=time(); factorint(n, 11); time()-t,||

||    ()->t=time(); print(factor(n)); time()-t

    ]))||

||};|



How is it possible to programmatically stop the calculations, let say as

soon as a result is returned?

This is not really advised, but you can do as follow

Use

default(factor_add_primes,1)



and then replace

factorint(n,...) by error(factorint(n, ...));

and then do



iferr(pareval([ .... ]),E,return(Vec(E)))



Cheers,

Bill



Thank you, Bill.

Your trick works, but not exactly as expected (at least as I expected it).

Actually, error does not interrupt calculations as soon as the error occurs, but at the end of pareval.

Here is the code I wrote:

time()=[getabstime(),getwalltime()];
export(time);
default(factor_add_primes,1);

Factor3_MT(n)=

{my(t);

  iferr(pareval([ ()->t=time(); error(factorint(n, 1); time()-t),
            ()->t=time(); error(factorint(n, 3); time()-t),
            ()->t=time(); if (n>2^468-1, error(factorint(n, 7);time()-t), error(factorint(n, 6);time()-t)),
            ()->t=time(); error(factorint(n, 9); time()-t),
            ()->t=time(); error(factorint(n, 11); time()-t),
        ()->t=time(); error(print(factor(n)); time()-t)]), E, return(Vec(E)))
};

And below the result of Factor3_MT(2^170-1):

[3, 1; 11, 1; 31, 1; 43691, 1; 131071, 1; 9520972806333758431, 1; 26831423036065352611, 1]
cpu time = 10,915 ms, real time = 5,436 ms.
%29 = ["e_USER", [[38, 8]]]

Factor2_MT(2^170-1) returns:

? Factor2_MT(2^170-1)
[3, 1; 11, 1; 31, 1; 43691, 1; 131071, 1; 9520972806333758431, 1; 26831423036065352611, 1]
[[10905, 5432], [10903, 5430], [67, 15], [35, 8], [42, 8], [93, 22]]
cpu time = 10,906 ms, real time = 5,432 ms.

So, first result is calculated in 8 ms (with factorint(n, 9)), but displayed only in 5,436 ms, that is in total calculation time.

With 2^470-1, first result in 1728 ms, displayed after... 7min, 24,773 ms !!!

Is there another way to interrupt the script as soon as the "error" occurs?

TIA

Jean-Luc