Antonio, You are right auto z2 = std::complex < ceres::Jet<double, 3>>(0.0); does not work, but auto z2 = std::complex < ceres::Jet<double, 3>>(); does work.
>From this discussion it seems that the general idea of Zero for custom numerical values is not well defined. Maybe this function must be marked as deprecated and only used for primitive types like int, float and double. ср, 22 июн. 2022 г. в 20:22, Oleg Shirokobrod <[email protected]>: > Hi Rasmus, > > You are right. This abbreviated declaration of Jet > > template <typename T, int N> > struct Jet { > enum { DIMENSION = N }; > using Scalar = T; > > // Default-construct "a" because otherwise this can lead to false errors > about > // uninitialized uses when other classes relying on default constructed T > // (where T is a Jet<T, N>). This usually only happens in opt mode. Note > that > // the C++ standard mandates that e.g. default constructed doubles are > // initialized to 0.0; see sections 8.5 of the C++03 standard. > Jet() : a() { v.setConstant(Scalar()); } > > // Constructor from scalar: a + 0. > explicit Jet(const T& value) { > a = value; > v.setConstant(Scalar()); > } > // The scalar part. > T a; > > // The infinitesimal part. > Eigen::Matrix<T, N, 1> v; > }; > It has default zero initialized CTOR and CTOR initializing Jet from > floating value. Of course instead of using Mat::Zero() -> return > Mat::Constant(0) I can use Mat::Constant(0.0). > > ср, 22 июн. 2022 г. в 19:00, Rasmus Munk Larsen <[email protected]>: > >> BTW: What happens if you do Mat x = Mat::Zero(10.0); ? Perhaps conversion >> from double or float work, because those types are "differentiable", as >> opposed to int. >> >> On Wed, Jun 22, 2022 at 5:13 AM Oleg Shirokobrod < >> [email protected]> wrote: >> >>> Hi, >>> >>> In the file CwiseNullaryOp.h the functions DenseBase<Derived>::Zero call >>> function DenseBase<Derived>::Constant which uses Scalar(0) for >>> zero-initialization. It gives compilation error for this line >>> using Mat = Eigen::Matrix<std::complex<ceres::Jet<double, 3>>, -1, 1, 0, >>> -1, 1>; >>> Mat x = Mat::Zero(10); >>> Here ceres::Jet<double, 3> is autodif type in ceres-solver. The problem >>> is that it is not always possible to make conversion from int. From the >>> other side for non-class-type scalar values, Scalar() provides a temporary >>> which is zero-initialized. It is likely that for custom numerical class >>> types Scalar() provides zero-initialized temporary. This is the case for >>> Jet. When I replaced >>> >>> return Constant(size, Scalar(0)); >>> >>> with >>> >>> return Constant(size, Scalar()); >>> >>> in all Zero and setZero functions, code was compiled without errors. >>> >>> Best, >>> >>> Oleg >>> >>>
