# [?] Compile and infer the rank of tensor correctly?

Posted 5 years ago
8111 Views
|
4 Replies
|
7 Total Likes
|
 In one of my projects, I encountered the following weird behavior of Compile: In[94]:= Compile[{{r, _Integer}}, Module[{gst = Total@RandomVariate[GammaDistribution[3, 1], r]}, gst]][5] Out[94]= 12.8387 In[93]:= Compile[{{r, _Integer}}, Module[{gs = RandomVariate[GammaDistribution[3, 1], r]}, Total@gs]][5] During evaluation of In[93]:= CompiledFunction::cfse: Compiled expression {2.77053,4.99208,2.51185,1.84878,2.6716} should be a machine-size real number. During evaluation of In[93]:= CompiledFunction::cfex: Could not complete external evaluation at instruction 2; proceeding with uncompiled evaluation. Out[93]= 14.6549 In[92]:= Compile[{{r, _Integer}}, Module[{gs = RandomVariate[NormalDistribution[3, 1], r]}, Total@gs]][5] Out[92]= 14.2334 It seems that the rank of RandomVariate[NormalDistribution[x,y],l] can be properly inferred, but not for GammaDistribution.Thanks in advance!
4 Replies
Sort By:
Posted 5 years ago
 This is because the normal distribution is compilable (it's been programmed explicitly into the list of Compilable functions) whereas the Gamma distribution has not. You can see this by comparing at the InputForms of the byt-code compiled expressions.Normal Distribution: CompiledFunction[{8, 9., 5468}, {_Integer}, {{2, 0, 0}, {3, 0, 0}}, {{1, {2, 0, 2}}, {4, {2, 0, 3}}, {3, {2, 0, 1}}}, {0, 4, 2, 0, 2}, {{34, 0, 2, 0}, {10, 1, 0}, {10, 2, 1}, {42, "RandomNormal", 3, 0, 0, 3, 0, 1, 2, 1, 0, 3, 1, 1}, {42, "TotalAll", 3, 1, 1, 2, 0, 3, 3, 0, 0}, {1}}, Function[{r}, Module[{gs = RandomVariate[NormalDistribution[3, 1], r]}, Total[gs]]], Evaluate] GammaDistribution: CompiledFunction[{8, 9., 5468}, {_Integer}, {{2, 0, 0}, {2, 0, 3}}, {{1, {2, 0, 2}}, {3, {2, 0, 1}}}, {0, 5, 0, 0, 1}, {{34, 0, 2, 0}, {46, Function[{r}, RandomVariate[GammaDistribution[3, 1], r]], 2, 0, 0, 2, 0, 4}, {47, Total, 2, 0, 4, 2, 0, 3}, {1}}, Function[{r}, Module[{gs = RandomVariate[GammaDistribution[3, 1], r]}, Total[gs]]], Evaluate] Note the explicit Function[{r}, RandomVariate[GammaDistribution[3, 1], r] in the byte code part of Compile
Posted 5 years ago
 Thanks for your reply!But why some of them are not compilable? e.g. Does it imply that these functions are implemented differently? And how they differ?
 And for a list of the Heads of Compilable functions execute Sort[CompileCompilerFunctions[]] `(Note that some argument froms of the heads may not be compilable as you saw from the GammaDistributions)