Re: [eigen] The horrors of an XLC port/compatibility |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] The horrors of an XLC port/compatibility
- From: Aron Ahmadia <aja2111@xxxxxxxxxxxx>
- Date: Sat, 23 Jan 2010 00:05:52 +0300
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:in-reply-to :references:date:x-google-sender-auth:message-id:subject:from:to :content-type; bh=kaLjk+5uJyvP3QBlKktweb6G3uizcCHGOA5ZeccunQM=; b=O74+wvKLTa3bJwntEMubXDiWuiGKdc2OLHsOPSC54HXNv+i5ojwvmJPTqxdiW2fi3f iLNPMWRuT+sXlW0zikbEi5n1Qou463tXUyFIil6MweHy0TTkPgWYO4lBI30yWuZ0Uw9z uDNSOgwX45gLgKTpotlTS1hrSemrwupKkb3iQ=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:in-reply-to:references:date :x-google-sender-auth:message-id:subject:from:to:content-type; b=gkChionL97m1JGbByq6tAv63MmVZrwnpfjvO8pg2iwZgRXwS4aosuC31Q+Q6uWsMOp LcbbZxkujGp5uhiXR3devrEateEI+z5QArYIw58Va7fqD+g/DbG/60uJ9JYVh4zyDT3e hDBG9jTYZnGPcDMk4XGFNiuk7/AVdVEEHh8SA=
Hi Benoit,
<some snipping>
>>
>> The most common edits are regarding template template arguments:
>> -template<typename Derived> struct AnyMatrixBase
>> +template<template <typename, typename> class Derived> struct AnyMatrixBase
>>
>> The XLC compiler does not accept template template arguments if they
>> are not parametrized (i.e., you cannot put in "typename Derived" if
>> Derived is actually a template class).
>
> Sorry I don't get it. From your diff:
>
> -template<typename UnaryOp, typename MatrixType>
> +template<typename UnaryOp, template <typename, typename> class Derived>
>
> First, i wouldn't call this template parameter Derived here. We call
> them Derived when we have a CRTP,
> http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
>
> Second, I really don't understand why the template template parameter
> here is taking _2_ template parameters?
>
> Actually I don't understand the problem. Here, MatrixType is just a
> class. It's true that we often specialize this template with
> MatrixType = some specialization of a template, but AFAIK we never try
> to pass a template template parameter here. So I'm confused! As to why
> you could possibly need to do a change like this. Here's a
> simplification of this situation:
>
> Eigen code:
> template<typename M>
> class Foo { .... };
>
> Foo<MatrixXd> foo1;
> Foo<Matrix<float,3,5> > foo2;
>
> The fact that we're specializing Foo with M = Matrix<float,3,5>
> doesn't mean that we're trying to pass Foo a template template
> parameter. It shouldn't matter that M happens to be a specialization
> of the template Matrix, as long of course as it's a full
> specialization (which it is), not a partial specialization.
>
I do appear to be missing something, as this was how I was getting
around other compiler errors. Here's an example that I thought would
crack xlc but didn't...
template<class A>
class Foo
{
public:
A x;
};
template<typename B, typename C>
class Bar
{
public:
B y;
C z;
};
template<typename B, typename C>
class FooBar : public Foo< Bar <B, C> >
{
public:
B a;
};
int main()
{
Foo<int> f;
Foo< Bar<int,short> > g;
FooBar<char, float> h;
return 0;
}
I'm guessing things get more complicated when we add things like CRTP.
I reverted my changes (except for the inclusion of the IBM_XLC
macro) and tried a pre-error compile. Here's the XLC error message:
[ 0%] Building CXX object
test/CMakeFiles/prec_inverse_4x4_2.dir/prec_inverse_4x4.cpp.o
"/home/aron/scratch/eigen/hg/Eigen/src/Core/SelfAdjointView.h", line
145.79: 1540-0716 (S) The template argument "Eigen::SelfAdjointView"
does not match the template parameter "class T".
"/home/aron/scratch/eigen/hg/Eigen/src/Core/SelfAdjointView.h", line
132.110: 1540-0716 (S) The template argument "Eigen::SelfAdjointView"
does not match the template parameter "class T".
"/home/aron/scratch/eigen/hg/Eigen/src/Core/util/ForwardDeclarations.h",
line 44.37: 1540-1109 (S) The use of undefined class
"Eigen::ei_traits<Eigen::Matrix<double,4,4,1,4,4> >" is not valid.
"/home/aron/scratch/eigen/hg/Eigen/src/Core/MatrixBase.h", line 55.12:
1540-0700 (I) The previous message was produced while processing
"class Eigen::DenseBase<Eigen::Matrix<double,4,4,1,4,4> >".
make[3]: *** [test/CMakeFiles/prec_inverse_4x4_2.dir/prec_inverse_4x4.cpp.o]
Error 1
make[2]: *** [test/CMakeFiles/prec_inverse_4x4_2.dir/all] Error 2
make[1]: *** [test/CMakeFiles/check.dir/rule] Error 2
make: *** [check] Error 2
I'm not sure the line numbers are being very helpful there.
You can see how I got it to work from the diff:
-template<typename Derived> class TriangularBase : public AnyMatrixBase<Derived>
+template<template <typename, typename> class Derived> class
TriangularBase: public AnyMatrixBase<Derived>;
But we've decided I'm doing the wrong thing here. What would you
suggest I try next?
It's not too hard to get external development accounts onto our
BlueGene/P system here at KAUST, though an easier solution would be to
get you accounts on a local IBM AIX machine with the XL compilers.
Cheers,
Aron