MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

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