Re: [eigen] mixed-precision Cholesky?

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


oh, I see you are using the 2.0 branch... indeed in this very special
case calling the high level routines would probably work though it
will skip the efficient matrix-vector implementation.

For instance, try to replace the line containing the
ei_cache_friendly_product_colmajor_times_vector by what is commented
below this line, something like:

// 				if (IsLowerTriangular)
//           other.col(c).end(size-endBlock) += (lhs.block(endBlock,
startBlock, size-endBlock, endBlock-startBlock)
//                                           *
other.col(c).block(startBlock,endBlock-startBlock)).lazy();
// 				else
//           other.col(c).end(size-endBlock) += (lhs.block(endBlock,
startBlock, size-endBlock, endBlock-startBlock)
//                                           *
other.col(c).block(startBlock,endBlock-startBlock)).lazy();


Beside I'm currently working on a true support for mixing real and
complex with vectorization and optimal performance. See the other
threads on that topic. So this should work out of the box soon.

gael

On Mon, Jul 12, 2010 at 3:56 PM, Manoj Rajagopalan <rmanoj@xxxxxxxxx> wrote:
>
>
>
> On Thursday 10 June 2010 05:26:30 am Gael Guennebaud wrote:
>> On Thu, Jun 10, 2010 at 1:37 AM, Manoj Rajagopalan <rmanoj@xxxxxxxxx> wrote:
>> > Hi,
>> >
>> >   I have situation where, due to memory pressure, I need to store a
>> > symmetric
>> > matrix as real-values but it must solve a complex RHS for a complex
>> > solution
>> > vector. Currently I am storing the matrix as complex-type so that llt()
>> > and ldlt() can be called without compilation errors but is the above
>> > situation realizable in Eigen?
>> >
>> >  When invoking
>> > real_matrix.selfadjointView<Lower>().ldlt().solveInPlace(complex_vector)
>> >
>> >  I get a gcc 4.2.4 error saying:
>> >
>> > no matching function for call
>> > to ‘ei_cache_friendly_product_colmajor_times_vector(Eigen::DenseIndex&,
>> > double*, Eigen::DenseIndex,
>> > Eigen::VectorBlock<Eigen::Matrix<std::complex<double>, 33331, 1, 0,
>> > 33331, 1>, 33331>, std::complex<double>*, std::complex<double>)’
>> >
>> >
>> > no matching function for call
>> > to ‘ei_cache_friendly_product_rowmajor_times_vector(double*,
>> > Eigen::DenseIndex, std::complex<double>*, Eigen::DenseIndex&,
>> > Eigen::VectorBlock<Eigen::Matrix<std::complex<double>, 33331, 1, 0,
>> > 33331, 1>, 33331>&, std::complex<double>)’
>> >
>> >
>> >
>> >   Would it make sense to introduce a cast<> on LLT and LDLT so that such
>> > a mixed-precision operation becomes possible?
>>
>> The idea is rather to allow mixing types where it makes sense, as for
>> products, triangular solves and the like, but I don't know when this will
>> be available.
>>
>> gael
>>
>
> Will replacing the call to ei_cache_friendly_product-*() with a high-level
> Eigen GEMM routine be a simple fix for the problem? When I call
> solveInPlace() on
>   real_matrix.cast<complex_type>().selfadjointView<Lower>().ldlt(),
> this is the point where I get a compile error since
> ei_cache_friendly_product*() expect each operand to have a valid coeffRef()
> which doesn't make sense for a type-cast matrix.
>
> I wanted to try this myself but I got lost in the template branches that
> specialize and optimize :-(
>
> thanks,
> Manoj
>
>
>



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/