|
Ublas : |
From: Jon Pearce (j.pearce_at_[hidden])
Date: 2005-06-01 00:43:30
Dear All,
The current implementation of ublas::indirect_array appears to implicity
treat an empty index set as "the set of all indices".
In the following implementation of indirect_array::preprocess(), the
call to indirect_array::all() returns a static, default-constructed
instance, hence which has an empty set of indirection indices:
[ublas/storage.hpp line 1554]
BOOST_UBLAS_INLINE
indirect_array preprocess (size_type size) const {
if (*this != all ())
return *this;
indirect_array ia (size);
for (size_type i = 0; i < size; ++ i)
ia (i) = i;
return ia;
}
It appears to me that this definition results in an inconsistency.
Introducing some variable names...
typedef ublas ublas::vector<double> vector_type;
vector_type v(100);
ublas::indirect_array< > indices1 = ... , indices2 = ... ;
ublas::vector_indirect<vector_type> view1(v, indices1), view2(v,
indices2);
... IMHO the following would make a sensible invariant:
"[indices1.size() < indices2.size()] implies [view1.size() <
view2.size()]"
Currently, this relationship does not necessarily hold if 0==size(indices1).
I would be grateful for any comments. In particular
* Does anyone else see this as a problem?
* Would it be a good idea to modify the current implementation? (Does
anyone currently rely on the default behaviour, such that they would be
affected by a change)
Many thanks in advance
Jon Pearce