Re: [eigen] Custom complex type |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] Custom complex type
- From: Gael Guennebaud <gael.guennebaud@xxxxxxxxx>
- Date: Mon, 20 Jun 2011 21:29:30 +0200
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:from:date :message-id:subject:to:content-type:content-transfer-encoding; bh=TiibHMm0fEo8mLcdzb4GAqO7QM5FmCpcAMGrhdRm0GE=; b=rPA+wOkBB7+AgBU9/8CL5IeJ/Du7Pp1O4O2fTATYSX71mopR+LYW4RA2r4e9PrFh/K nsZCMNFEwoJCrQdKdGPf4vfoXjG3s66I/Xrkpn1TrmhPihzDQvwINKSnaQzJTXSA2hsW +D+bNCTzUKq8apA6oNwH3hon+H3V5KG809C4s=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type:content-transfer-encoding; b=G7v8tnj5NlnFdOwLHDVb0vkJ1TNCFVMQejW+jL/KyDHr8Dv7xF94/5QRq4VaDl83tm n7RtVBfxYshD8hxubrExPwkoPSbSwao7Q5IaNzqJNd0/AMpux/BA4DynllqAS+FvdWAR nAaRvvSqqLQoxtmUlHM9aXfife01/B7Q28wt8=
ok, got it. The pb is in gebp_traits
(src/Core/products/GeneralBlockPanelKernel.h) where I have
specializations on std::complex to identify complexes.
Just a remark: cannot you simply specialize std::complex<mpreal> and
implement your optimization there ?
gael
On Mon, Jun 20, 2011 at 9:21 PM, Gael Guennebaud
<gael.guennebaud@xxxxxxxxx> wrote:
> On Mon, Jun 20, 2011 at 11:38 AM, Pavel Holoborodko
> <pavel@xxxxxxxxxxxxxxx> wrote:
>> In order to compile my Eigen-based code I had to add definitions for various
>> kinds of conj_helper<>:
>> template<> struct conj_helper<mpc::mpcomplex, mpc::mpcomplex,...>
>> And
>> template<> struct scalar_product_traits<mpc::mpcomplex, mpc::mpcomplex>
>
> hm, I was afraid of that. This part of Eigen's internals requires some
> love. In theory, you should not have to do such specializations.
>
>> Code compiled well after that, but after my tests I noticed that in
>> expression (pseudo inverse calculation in SVD):
>> m_matrixV * invertedSingVals.asDiagonal() * m_matrixU.adjoint();
>> m_matrixU.adjoint() works just as plain transpose() despite that m_matrixU
>> is complex. invertedSingVals is of mpreal type.
>> If I use m_matrixU.adjoint().eval() instead everything is all right (as well
>> as adjointInPlace()) .
>> I guess some mpcomplex-specialization is missing for proper matrix
>> expression template evaluation.
>> Could you advise what it could be?
>
> I really have to clean up all this mess with complexes! Could you
> check whether m_matrixV * m_matrixU.adjoint() is equivalent to
> m_matrixV * m_matrixU.transpose()?
>
> gael
>
>> NumTraits<mpcomplex> is in attach. mpcomplex class as simple as:
>> class mpcomplex{
>> private:
>> mpreal re;
>> mpreal im;
>> // Standard API
>> .....
>> Thanks in advance.
>> Pavel Holoborodko.
>> P.S.
>> std::complex<mpreal> works nicely without any shaman dances.
>> On Wed, Jun 8, 2011 at 12:13 PM, Pavel Holoborodko <pavel@xxxxxxxxxxxxxxx>
>> wrote:
>>>
>>> Hi Gael,
>>> Thanks for answers everyone.
>>> Gael, I'll try this way (custom mpcomplex + std comp. API) with hope that
>>> it will work with Eigen "in practice" too.
>>> I'll let you know about the results.
>>> On Wed, Jun 8, 2011 at 3:43 AM, Gael Guennebaud
>>> <gael.guennebaud@xxxxxxxxx> wrote:
>>>>
>>>> Hi Pavel,
>>>>
>>>> in theory you should be able to write your own mpcomplex class, and
>>>> define NumTraits<mpcomplex>::IsComplex to true as long as you
>>>> implement a STD compatible API.
>>>>
>>>> gael
>>>>
>>>> On Tue, Jun 7, 2011 at 8:04 AM, Pavel Holoborodko <pavel@xxxxxxxxxxxxxxx>
>>>> wrote:
>>>> > Hello,
>>>> > Eigen's magicians, please advise on how to implement custom complex
>>>> > type for
>>>> > smooth integration with Eigen.
>>>> > I plan to create multi-precision C++ complex scalar class based on
>>>> > MPC: http://www.multiprecision.org/index.php?prog=mpc.
>>>> > MPC is cousin of MPFR from the same authors - http://mpfr.org.
>>>> > There are two possible ways to proceed:
>>>> > (1). Add template specialization for std::complex<mpfr::mpreal>.
>>>> > (2). Create own scalar class something like mpcomplex based on
>>>> > low-level
>>>> > MPC.
>>>> > Second option seems attractive from optimization point of view -
>>>> > minimum
>>>> > overhead, no conversion mpreal <-> MPC low level stuff is required.
>>>> > There is only one problem - will it be possible to integrate such
>>>> > complex
>>>> > type with Eigen?
>>>> > Documentation on NumTraits says:
>>>> > "An enum value IsComplex. It is equal to 1 if T is a std::complex type,
>>>> > and
>>>> > to 0 otherwise."
>>>> > Does it mean that only std::complex<T> custom complex types are
>>>> > supported in
>>>> > Eigen?
>>>> > If yes, do I need to provide something besides
>>>> > NumTraits<std::complex<mpreal> > specialization?
>>>> > Thanks in advance,
>>>> > Pavel.
>>>> >
>>>> >
>>>> >
>>>> >
>>>>
>>>>
>>>
>>
>>
>