On 04/30/2011 08:39 AM, Robert Bradshaw wrote:
On Fri, Apr 29, 2011 at 3:53 AM, mark florisson
<markflorisso...@gmail.com>  wrote:
On 29 April 2011 12:28, Pauli Virtanen<p...@iki.fi>  wrote:
No, just that real_t is specialized to float whenever struct_t is specialized
to A and to double when B. Or a more realistic example,

        ctypedef cython.fused_type(float, double) real_t
        ctypedef cython.fused_type(float complex, double complex) complex_t

        cdef real_plus_one(complex_t a):
            real_t b = a.real
            return b + 1

which I suppose would not be a very unusual thing in numerical codes.
This would also allow writing the case you had earlier as

        cdef cython.fused_type(string_t, int, paired=struct_t) attr_t

        cdef func(struct_t mystruct, int i):
            cdef attr_t var

            if typeof(mystruct) is typeof(int):
                var = mystruct.attrib + i
                ...
            else:
                var = mystruct.attrib + i
                ...

Things would need to be done explicitly instead of implicitly, though,
but it would remove the need for any special handling of
the "complex" keyword.

If we're going to introduce pairing, another option would be

     ctypedef fused_type((double complex, double), (float complex,
float)) (complex_t, real_t)

though I'm not sure I like that either. We're not trying to create the
all-powerful templating system here, and anything that can be done
with pairing can be done (though less elegantly) via branching on the
types, or, as Pauli mentions, using a wider type is often (but not
always) a viable option.

Keeping the right balance is difficult. But, at least there's some cases of needing this in various codebases when interfacing with LAPACK.

Most uses of templating with Cython code I've seen so far does a similar kind of "zip" as what you have above (as we discussed on the workshop). So at least the usage pattern you write above is very common.

float32 is not about to disappear, it really is twice as fast when you're memory IO bound.

Using a wider type is actually quite often not possible; any time the type is involved as the base type of an array it is not possible, and that's a pretty common case. (With LAPACK you take the address of the variable and pass it to Fortran, so using a wider type is not possible there either, although I'll agree that's a more remote case.)

My proposal: Don't support either "real_t complex" or paired fused types for the time being. Then see.

But my vote is for paired fused types instead of "real_t complex".

Dag Sverre
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to