Prev Next atomic_four_mat_mul.hpp Headings

@(@\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 .
Atomic Matrix Multiply Class: Example Implementation
# include <cppad/cppad.hpp>

namespace CppAD { // BEGIN_CPPAD_NAMESPACE
//
template <class Base>
class atomic_mat_mul : public CppAD::atomic_four<Base> {
//
public:
    // ctor
    atomic_mat_mul(const std::string& name) :
    CppAD::atomic_four<Base>(name)
    {   for(size_t thread = 0; thread < CPPAD_MAX_NUM_THREADS; ++thread)
            work_[thread] = nullptr;
    }
    // destructor
    ~atomic_mat_mul(void)
    {   for(size_t thread = 0; thread < CPPAD_MAX_NUM_THREADS; ++thread)
        {   if( work_[thread] != nullptr  )
            {   // allocated in set member function
                delete work_[thread];
            }
        }
    }
    // set
    size_t set(
        size_t n_left, size_t n_right, size_t n_middle
    );
    // get
    void get(
        size_t call_id, size_t& n_left, size_t& n_right, size_t& n_middle
    );
private:
    //
    // matrix dimensions corresponding to a call_id
    struct call_struct {
        size_t n_left; size_t n_middle; size_t n_right; size_t thread;
    };
    // map from call_id to matrix dimensions
    typedef CppAD::vector<call_struct> call_vector;
    //
    // Use pointers, to avoid false sharing between threads.
    call_vector* work_[CPPAD_MAX_NUM_THREADS];
    //
    // base_mat_mul
    static void base_mat_mul(
        size_t                     n_left     ,
        size_t                     n_middle   ,
        size_t                     n_right    ,
        const CppAD::vector<Base>& x          ,
        CppAD::vector<Base>&       y
    );
    //
    // -----------------------------------------------------------------------
    // overrides
    // -----------------------------------------------------------------------
    //
    // for_type
    bool for_type(
        size_t                                        call_id,
        const CppAD::vector<CppAD::ad_type_enum>&     type_x,
        CppAD::vector<CppAD::ad_type_enum>&           type_y
    ) override;
    //
    // Base forward
    bool forward(
        size_t                                           call_id,
        const CppAD::vector<bool>&                       select_y,
        size_t                                           order_low,
        size_t                                           order_up,
        const CppAD::vector<Base>&                       taylor_x,
        CppAD::vector<Base>&                             taylor_y
    ) override;
    //
    // AD<Base> forward
    bool forward(
        size_t                                           call_id,
        const CppAD::vector<bool>&                       select_y,
        size_t                                           order_low,
        size_t                                           order_up,
        const CppAD::vector< CppAD::AD<Base> >&          ataylor_x,
        CppAD::vector< CppAD::AD<Base> >&                ataylor_y
    ) override;
    //
    // Base reverse
    bool reverse(
        size_t                                           call_id,
        const CppAD::vector<bool>&                       select_x,
        size_t                                           order_up,
        const CppAD::vector<Base>&                       taylor_x,
        const CppAD::vector<Base>&                       taylor_y,
        CppAD::vector<Base>&                             partial_x,
        const CppAD::vector<Base>&                       partial_y
    ) override;
    //
    // AD<Base> reverse
    bool reverse(
        size_t                                           call_id,
        const CppAD::vector<bool>&                       select_x,
        size_t                                           order_up,
        const CppAD::vector< CppAD::AD<Base> >&          ataylor_x,
        const CppAD::vector< CppAD::AD<Base> >&          ataylor_y,
        CppAD::vector< CppAD::AD<Base> >&                apartial_x,
        const CppAD::vector< CppAD::AD<Base> >&          apartial_y
    ) override;
    //
    // jac_sparsity
    bool jac_sparsity(
        size_t                                         call_id,
        bool                                           dependency,
        const CppAD::vector<bool>&                     ident_zero_x,
        const CppAD::vector<bool>&                     select_x,
        const CppAD::vector<bool>&                     select_y,
        CppAD::sparse_rc< CppAD::vector<size_t> >&     pattern_out
    ) override;
    //
    // hes_sparsity
    bool hes_sparsity(
        size_t                                         call_id,
        const CppAD::vector<bool>&                     ident_zero_x,
        const CppAD::vector<bool>&                     select_x,
        const CppAD::vector<bool>&                     select_y,
        CppAD::sparse_rc< CppAD::vector<size_t> >&     pattern_out
    ) override;
    //
    // rev_depend
    bool rev_depend(
        size_t                                         call_id,
        CppAD::vector<bool>&                           depend_x,
        const CppAD::vector<bool>&                     depend_y
    ) override;
};
} // END_CPPAD_NAMESPACE

# include <cppad/example/atomic_four/mat_mul/set.hpp>
# include <cppad/example/atomic_four/mat_mul/get.hpp>
# include <cppad/example/atomic_four/mat_mul/base_mat_mul.hpp>
# include <cppad/example/atomic_four/mat_mul/for_type.hpp>
# include <cppad/example/atomic_four/mat_mul/forward.hpp>
# include <cppad/example/atomic_four/mat_mul/reverse.hpp>
# include <cppad/example/atomic_four/mat_mul/jac_sparsity.hpp>
# include <cppad/example/atomic_four/mat_mul/hes_sparsity.hpp>
# include <cppad/example/atomic_four/mat_mul/rev_depend.hpp>

Input File: include/cppad/example/atomic_four/mat_mul/mat_mul.hpp