| namespace Eigen { |
| |
| /** \page TopicCustomizing_Functors Writing custom functors |
| |
| Several Eigen extension points accept a user-provided function object, or functor. This is often the lightest way to |
| customize an expression without defining a new expression type. |
| |
| \section CustomFunctors_Where Where functors are used |
| |
| Common entry points include: |
| |
| - \link MatrixBase::unaryExpr unaryExpr()\endlink for coefficient-wise unary operations. |
| - \link MatrixBase::binaryExpr binaryExpr()\endlink for coefficient-wise binary operations. |
| - \link DenseBase::NullaryExpr NullaryExpr()\endlink for procedural matrices whose coefficients are generated on |
| demand. See \ref TopicCustomizing_NullaryExpr for larger examples. |
| - \link DenseBase::redux redux()\endlink and \link VectorwiseOp::redux colwise()/rowwise().redux()\endlink for custom |
| reductions. See \ref TutorialReductionsVisitorsBroadcastingReductionsUserdefined for a tutorial example. |
| |
| \section CustomFunctors_ScalarInterface Scalar interface |
| |
| At minimum, a functor provides an \c operator() matching the expression kind: |
| |
| \code |
| struct clamp { |
| double lo, hi; |
| double operator()(double x) const { return x < lo ? lo : (hi < x ? hi : x); } |
| }; |
| |
| struct add_scaled { |
| double scale; |
| double operator()(double a, double b) const { return a + scale * b; } |
| }; |
| |
| struct checkerboard { |
| double operator()(Eigen::Index i, Eigen::Index j) const { return ((i + j) % 2) ? -1.0 : 1.0; } |
| }; |
| \endcode |
| |
| The result type is deduced from \c operator() and may differ from the input scalar type. |
| Binary functors can rely on Eigen's scalar binary-op traits when the return type follows the usual scalar rules; custom |
| mixed-scalar operations may need a ScalarBinaryOpTraits specialization. |
| |
| Functors used with \c redux() must implement an associative binary operation and return the same scalar type as the |
| expression, because Eigen may combine coefficients in an order chosen by the evaluator. |
| |
| \section CustomFunctors_Traits Cost and vectorization traits |
| |
| Eigen assigns conservative defaults to unknown functors: |
| |
| \code |
| template <typename T> |
| struct functor_traits { |
| enum { Cost = 10, PacketAccess = false, IsRepeatable = false }; |
| }; |
| \endcode |
| |
| For performance-sensitive functors, specialize \c Eigen::internal::functor_traits for your functor: |
| |
| \code |
| namespace Eigen { |
| namespace internal { |
| template <> |
| struct functor_traits<clamp> { |
| enum { Cost = 3 * NumTraits<double>::AddCost, PacketAccess = false }; |
| }; |
| } // namespace internal |
| } // namespace Eigen |
| \endcode |
| |
| \c Cost is an approximate scalar cost used by Eigen's expression evaluators. \c PacketAccess may be set to \c true only |
| when the functor also provides packet overloads compatible with the packet types used by the relevant scalar type. |
| Unary and binary packetized functors usually provide a \c packetOp() member; reduction functors that support packet |
| reductions also provide \c predux(). |
| |
| Most user functors should start with scalar-only code and leave \c PacketAccess set to \c false. That keeps the functor |
| portable and lets Eigen use the scalar path for that operation while preserving vectorization opportunities elsewhere in |
| the expression. |
| |
| \section CustomFunctors_State Capturing state |
| |
| Functor objects are copied into expression objects and may be evaluated later. Store any captured data so that it |
| outlives the expression evaluation. For example, a nullary functor producing a view into another matrix should either |
| store a safe reference to an object owned by the caller or require the caller to evaluate the expression before the |
| referenced object goes out of scope. |
| |
| \section CustomFunctors_WhenNot When a functor is not enough |
| |
| If the expression needs a new shape, a custom nested expression type, or evaluator-specific behavior that cannot be |
| expressed coefficient by coefficient, see \ref TopicNewExpressionType. For many procedural matrices and indexed views, |
| \ref TopicCustomizing_NullaryExpr is simpler than a new expression type. |
| |
| */ |
| |
| } |