Prev Next multi_newton_run

@(@\newcommand{\W}[1]{ \; #1 \; } \newcommand{\R}[1]{ {\rm #1} } \newcommand{\B}[1]{ {\bf #1} } \newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} } \newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} } \newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} } \newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@This is cppad-20221105 documentation. Here is a link to its current documentation .
A Multi-Threaded Newton's Method

Syntax
ok = multi_newton_run(xout,
    
funnum_subxlowxupepsilonmax_itrnum_threads
)


Purpose
Multi-threaded determination of the argument values @(@ x @)@, in the interval @(@ [a, b] @)@ (where @(@ a < b @)@), such that @(@ f(x) = 0 @)@.

Thread
It is assumed that this function is called by thread zero, and all the other threads are blocked (waiting).

Method
For @(@ i = 0 , \ldots , n @)@, we define the i-th grid point @(@ g_i @)@ by @[@ g_i = a \frac{n - i}{n} + b \frac{i}{n} @]@ For @(@ i = 0 , \ldots , n-1 @)@, we define the i-th sub-interval of @(@ [a, b] @)@ by @[@ I_i = [ g_i , g_{i+1} ] @]@ Newton's method is applied starting at the center of each of the sub-intervals @(@ I_i @)@ for @(@ i = 0 , \ldots , n-1 @)@ and at most one zero is found for each sub-interval.

ok
The return value ok has prototype
    bool 
ok
If an error occurs, it is false, otherwise it is true.

xout
The argument xout has the prototype
    vector<double>& 
xout
The input size and value of the elements of xout do not matter. Upon return from multi_newton, the size of xout is less than or equal the number of sub-intervals @(@ n @)@ and @[@ | f( xout[i] ) | \leq epsilon @]@ for each valid index 0 <= i < xout.size() . Two @(@ x @)@ solutions are considered equal (and joined as one) if the absolute difference between the solutions is less than @(@ (b - a) / n @)@.

fun
The argument fun has prototype
    void 
fun (double x, double& f, double& df)
This function must evaluate @(@ f(x) @)@, and its derivative @(@ f^{(1)} (x) @)@, using the syntax
    
fun(xfdf)
where the arguments to fun have the prototypes
    double    
x
    double&   
f
    double&   
df
. The input values of f and df do not matter. Upon return they are @(@ f(x) @)@ and @(@ f^{(1)} (x) @)@ respectively.

num_sub
The argument num_sub has prototype
    size_t 
num_sub
It specifies the number of sub-intervals; i.e., @(@ n @)@.

xlow
The argument xlow has prototype
    double 
xlow
It specifies the lower limit for the entire search interval; i.e., @(@ a @)@.

xup
The argument xup has prototype
    double 
xup
It specifies the upper limit for the entire search interval; i.e., @(@ b @)@.

epsilon
The argument epsilon has prototype
    double 
epsilon
It specifies the convergence criteria for Newton's method in terms of how small the function value must be.

max_itr
The argument max_itr has prototype
    size_t 
max_itr
It specifies the maximum number of iterations of Newton's method to try before giving up on convergence (on each sub-interval).

num_threads
This argument has prototype
    size_t 
num_threads
It specifies the number of threads that are available for this test. If it is zero, the test is run without the multi-threading environment.

Source

namespace {
bool multi_newton_run(
    vector<double>& xout                       ,
    void fun(double x, double& f, double& df)  ,
    size_t num_sub                             ,
    double xlow                                ,
    double xup                                 ,
    double epsilon                             ,
    size_t max_itr                             ,
    size_t num_threads                         )
{
    bool ok = true;
    ok     &= thread_alloc::thread_num() == 0;

    // setup the work for num_threads threads
    ok &= multi_newton_setup(
        num_sub, xlow, xup, epsilon, max_itr, num_threads
    );

    // now do the work for each thread
    if( num_threads > 0 )
        team_work( multi_newton_worker );
    else
        multi_newton_worker();

    // now combine the results for all the threads
    ok &= multi_newton_takedown(xout);

    return ok;
}
}

Input File: example/multi_thread/multi_newton.cpp