[Date Index]
[Thread Index]
[Author Index]
Re: Function return type in Compile
*To*: mathgroup at smc.vnet.net
*Subject*: [mg124267] Re: Function return type in Compile
*From*: "Oleksandr Rasputinov" <oleksandr_rasputinov at hmamail.com>
*Date*: Sat, 14 Jan 2012 17:17:00 -0500 (EST)
*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com
*References*: <jercqo$1f8$1@smc.vnet.net>
On Sat, 14 Jan 2012 08:02:32 -0000, Ashwini <aksingh21 at gmail.com> wrote:
> Hi,
> I have large number of small functions whose return type is Boolean
> or Integer.
> How can I declare the function return type in a global way so that I
> don't have to write it down in every Compile:
>
> Example:
> TestQ[x_Integer] := If[EvenQ[x], True, False]; (*Just a wrapper on
> EvenQ*)
>
> cf2 = Compile[{{y, _Integer}}, If[TestQ[y], 1, 2]];
>
> cf2[2]
> CompiledFunction::cfex: Could not complete external evaluation at
> instruction 1; proceeding with uncompiled evaluation.
>
> After including the return type of TestQ, It works fine
> cf3 = Compile[{{y, _Integer}}, If[TestQ[y], 1, 2], {{TestQ[_], True |
> False}}];
>
> cf3[2] works fine.
>
> But if I replace TestQ with EvenQ I don't have to specify the the
> return type
> cf4 = Compile[{{y, _Integer}}, If[EvenQ[y], 1, 2]];
>
> How can this be done for TestQ?
>
> regards,
> Ashwini
>
The simple answer is that it can't, or at least not in the way that you
want. The only functions that Compile understands are given by
Compile`CompilerFunctions[]
and, as far as I know, types cannot be provided by the user for functions
that Compile doesn't know about except via the third argument.
However, if you define TestQ as follows, it seems that the types are more
transparent to Compile and it can handle them automatically:
TestQ = Function[{x}, If[EvenQ[x], True, False]];
And of course, since these are small functions that require calling out of
the bytecode interpreter (which is fairly costly) one may wish to inline
them for better performance by setting CompilationOptions ->
"InlineExternalDefinitions" -> True.
Another possible way is to wrap Compile inside your own function that
writes out the third argument as required based on a type specification
you have provided elsewhere. This might be more reliable in more
complicated cases if Compile can't infer the types correctly on its own.
Prev by Date:
**Re: split a number to Date format**
Next by Date:
**Re: Vectors**
Previous by thread:
**Function return type in Compile**
Next by thread:
**Re: Function return type in Compile**
| |