Re: [eigen] const-correctness in Eigen 3.0 |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] const-correctness in Eigen 3.0
- From: Hauke Heibel <hauke.heibel@xxxxxxxxxxxxxx>
- Date: Tue, 26 Oct 2010 09:32:48 +0200
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=2CPWA20HAX/+iT4UnPzDXd2Af2HbP5EfYhNfYCjUK4E=; b=WpAuuXNSKog7GLbI6xYXoyt2dm4JqoL3mT61Cw01eotQOJmjxpvsdQL/y4DJ4GTTkc Cn0UmJzDurgKO3Q1kzusUx8bOVQhNfqFmXC3jVTMhovZcOuu3ldzXKH+Q9hcm2b5gVrX v+OcWkf82U1PD7XtLrnhTEU6DU+Wi2Z3NaRak=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=n2H23gMKWPOBDEVl3P1XuSg9ZprRckeiK9p8sHlWudF/ivQvUqrWCsZEZ1zW7/Obtw 33JaXIlB6V76vRAB2FItyFfeKzBNaxpbYWPMBSGN5MZgan3nLGPFNRO5rOhIPn0YPAPp qtQUyu0tN1zna59JXohBG/pubiUN+ZKyMEgts=
I also want to reply later to this topic, but in the meantime, please
try to move the conversation to the related bug report
http://eigen.tuxfamily.org/bz/show_bug.cgi?id=54
Thanks,
Hauke
On Tue, Oct 26, 2010 at 9:29 AM, Christoph Hertzberg
<chtz@xxxxxxxxxxxxxxxxxxxxxxxx> wrote:
> Hi,
>
> great not to be alone with this issue :)
>
> On 26.10.2010 04:18, Jim Bosch wrote:
>> I've been following the occasional discussions regarding the
>> const-incorrectness of Map (and Block, Transpose, etc.) with interest; I
>> once put a lot of effort into getting this right in my own
>> template-based multidimensional array library, and I'd love to see this
>> get fixed in Eigen.
>>
>> I'd be happy to put some effort into fixing this in Eigen 3.0, but as a
>> relatively new face (well, I've been lurking a long time!) tackling a
>> fairly widely-dispersed issue, I wanted to get some discussion going
>> instead of just going out and making a giant patch.
>>
>> First off, here's what I think the solution should look like:
>>
>> - Matrix and Array (and other PlainObjectBase subclasses) should pretty
>> much behave as they do currently.
>>
>> - Map, Block, Transpose, and anything else that does not own its data
>> but supports direct access should come in both const and non-const
>> versions (probably just partial specializations). The non-const version
>> should be implicitly convertible to the const version.
>>
>> - Calling block() or transpose() on a const reference to Matrix should
>> return a const Block or const Transpose(), etc.
>
> I think you mean sth like const_Block<...> or Block<const ..., ...>. The
> const qualifier outside the class (as it is currently done) helps
> little, as you can still construct/assign:
>
> const Block<...> a;
> Block<...> b(a);
>
> This could be avoided by prohibiting the copy constructor etc, but this
> would prohibit some legal copies. (Sorry for repeating this, I assume
> you already know ...)
>
>> What I think this implies:
>>
>> - MatrixBase, ArrayBase, DenseBase, DenseCoeffsBase, and EigenBase
>> should also have partial specializations for const and non-const; the
>> non-const version should probably inherit from the const version in some
>> cases for code reuse, just adding non-const accessors and augmented
>> assignment operators.
>>
>> - PlainObjectBase should inherit from a non-const base class.
>>
>> - Expressions that don't have direct access should inherit from the
>> const MatrixBase or ArrayBase.
>>
>> - There should probably be a flag for constness on every Eigen class.
>>
>>
>> I anticipate these changes would be fairly straightforward, but they are
>> very extensive. I don't seen any easier way to get const-correctness in
>> place in a consistent way, however, and I think doing it now will pay
>> off in the long run.
>>
>> Any thoughts?
>
> I've also been thinking about this, my general idea was based on also
> solving the direct-access-type unification
> http://eigen.tuxfamily.org/bz/show_bug.cgi?id=58
>
> The basic idea is to have a new (internal?) type direct_access with
> template types for storage and for indexing.
>
> template<class Storage, class Indexing>
> class direct_access : Indexing {
> Storage storage;
> public:
> Storage::Scalar& operator(int i, int j) {
> // not valid if Storage is a const-view:
> return storage[Indexing::offset(i, j)];
> }
> // etc ...
> };
>
> The Storage class could be either a dynamic array, a static array, a
> pointer or a const pointer -- and the Storage class would maintain the
> const-correctness (i.e. it's illegal to assign to the const pointer type)..
>
> The Indexing type would calculate indexes to a relative offset and could
> be zero-sized if everything is known at compile time.
> Theoretically Indexing could also handle cases like compressed
> triangular storage (though handling of implicit cases would need some
> thought):
> http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2010/07/msg00198.html
>
>
> Somewhat off-topic:
> Is there a reason why currently it is not possible to have fixed size
> matrices with dynamic memory allocation? (Or is it?)
> A use case would be a 32x32 matrix, which you suggest not to store as
> fixed size type (can't find a reference now). However, storing this as
> dynamic matrix would waste (not much but some) memory, and also
> prohibits some compile-time assertions.
>
> Regards
> Christoph
>
>
> --
> ----------------------------------------------
> Dipl.-Inf. Christoph Hertzberg
> Cartesium 0.051
> Universität Bremen
> Enrique-Schmidt-Straße 5
> 28359 Bremen
>
> Tel: (+49) 421-218-64252
> ----------------------------------------------
>
>
>