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 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 { enum { Cost = 3 * NumTraits::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. */ }