On Sun, May 30, 2010 at 10:10 PM, Benoit Jacob
<jacob.benoit.1@xxxxxxxxx> wrote:
Hi list,
The huge "index types" change is pushed to the development branch..
*** What changed ***
Before, we used type int for all indices. A recent huge thread on this
list showed that while the choice of a signed type was sensible, it
would be good to make it more adaptable. This is what this change
does:
- dense matrices now default to std::ptrdiff_t, which means that
you're sure to be able to address half the size of your address space
(half, because it's signed).
- sparse matrices are still using int, because the sizeof() matters a
lot there (since we are story arrays of indices).
You can change that at will by defining EIGEN_DEFAULT_DENSE_INDEX_TYPE
and EIGEN_DEFAULT_SPARSE_INDEX_TYPE. Of course, this breaks ABI
compatibility.
In the future we'll probably add an option to Sparse matrix types to
specify different index types. On the other hand, for Dense matrices,
I don't think there can ever be a valid reason to use something else
than ptrdiff_t. Notice that for fixed-size matrices, this doesn't have
any cost as the sizes aren't stored as runtime variables.
*** How this works ***
This works per-StorageKind. So if in the future we add a new
StorageKind for "Dense matrix stored over distributed storage", we're
free to specify e.g. long long int for them, without affecting the
rest.
See in XprHelper.h, the new struct ei_index, see this code:
template<typename StorageKind> struct ei_index {};
template<>
struct ei_index<Dense>
{ typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE type; };
typedef typename ei_index<Dense>::type DenseIndex;
Then in the macro EIGEN_DENSE_PUBLIC_INTERFACE, we now have:
typedef typename Eigen::ei_traits<Derived>::StorageKind StorageKind; \
typedef typename Eigen::ei_index<StorageKind>::type Index; \
this means that all expressions have a Index typedef that means the
right thing. Normally, we propagate this recursively as appropriate.
However there are some contexts where we know we are only dealing with
Dense expressions, and don't have a MatrixType to work with (e.g. in
some public functions). There, it's OK to specify explicitly
DenseIndex.
Then, we have the same thing in the Sparse module, in SparseUtil.h:
template<>
struct ei_index<Sparse>
{ typedef EIGEN_DEFAULT_SPARSE_INDEX_TYPE type; };
typedef typename ei_index<Sparse>::type SparseIndex;
etc, etc.
Benoit