Re: Array of arrays of various sizes and compile
- To: mathgroup at smc.vnet.net
- Subject: [mg115713] Re: Array of arrays of various sizes and compile
- From: Ramiro Barrantes-Reynolds <Ramiro.Barrantes at uvm.edu>
- Date: Wed, 19 Jan 2011 05:24:57 -0500 (EST)
Thanks for your reply. Let me explain myself better, I am going
through the Compile documentation but haven't found what I need yet:
What I really need to do is somewhat like the following (I am pasting
the code at the end just in case there are other suggestions):
example ==
Compile[{{m, _Real, 2}, {a, _Real}, {partition, _Integer, 2}},
Times @@ (With[{mp == m[[All, #]]}, Total[#]*a*Total[m]] & /@
partition)
]
1) The "partition" argument is a partition (e.g. {{1},{2},{3}},
{{1,2},{3}}, {{1,3},{2}}, i.e. an array of vectors of varying sizes),
and that's why the compiler complains for having such a structure as
input.
2) I am just using "Total[#]*a*Total[m]" as an example but it would be
something more complicated that calculates a probability of a block of
a partition (see code at the end). I am sampling over partitions and
that is why it would be a two dimensional array with blocks of various
sizes. Therefore, I am not sure if Listable would help me.
and indeed when I run it:
In[14]:== example[{{1.1, 1.2, 1.3}, {2.1, 2.2, 2.3}}, 1.5, {{1}, {2}, {3}}]
Out[14]== {663.552, 795.906, 944.784}
In[15]:== example[{{1.1, 1.2, 1.3}, {2.1, 2.2, 2.3}}, 1.5, {{1, 2}, {3}}]
During evaluation of In[15]:== CompiledFunction::cfta: Argument
{{1,2},{3}} at position 3 should be a rank 2 tensor of machine-size
integers. >>
Out[15]== {207.36, 234.09, 262.44}
Any suggestions?
Thanks you so much for your help,
Ramiro
calculateH ==
Compile[{{count, _Real,
2}, {\[Alpha], _Real}, {\[Beta], _Real}, {\[Theta], _Real}, \
{treeLengths, _Real, 1}, {event, _Integer, 2}, {partition, _Integer,
2}},
Times @@ (With[{counts == counts[[All, #]], events == event[[#]],
calculatedTree == Transpose[event[[#]]]},
Module[{all, posZero, zerosA, zerosB, concerted, posOnes,
onesA, onesB, zeroes},
zeroes == Count[events, 0, 2];
all == Plus @@ ((Plus @@ events) /. (Length[counts[[1]]] -> 1));
posZero == Position[calculatedTree, 0];
zerosA ==
If[MatchQ[posZero, {}], {},
counts[[#[[1]], #[[2]]]] & /@ posZero];
zerosB ==
If[MatchQ[posZero, {}], {},
treeLengths[[#]] & /@ posZero[[All, 1]]];
posOnes == Position[calculatedTree, 1];
onesA ==
If[MatchQ[posOnes, {}], {},
counts[[#[[1]], #[[2]]]] & /@ posOnes];
onesB ==
If[MatchQ[posOnes, {}], {},
treeLengths[[#]] & /@ posOnes[[All, 1]]];
If[
MatchQ[onesA, {}], \[Beta]^\[Alpha]*
Exp[LogGamma[
Total[zerosA] + \[Alpha]] - (Plus @@ (LogGamma[
zerosA + 1]) + LogGamma[\[Alpha]]) +
Plus @@ (zerosA*
Log[zerosB]) - (Total[zerosA] + \[Alpha])*
Log[Total[zerosB] + \[Beta]]],
If[MatchQ[zerosA, {}], \[Beta]^\[Alpha]*
Exp[LogGamma[
Total[onesA] + \[Alpha]] - (Plus @@ (LogGamma[
onesA + 1]) + LogGamma[\[Alpha]]) +
Plus @@ (onesA*Log[onesB]) - (Total[onesA] + \[Alpha])*
Log[Total[onesB] + \[Beta]]], \[Beta]^\[Alpha]*
Exp[LogGamma[
Total[onesA] + \[Alpha]] - (Plus @@ (LogGamma[
onesA + 1]) + LogGamma[\[Alpha]]) +
Plus @@ (onesA*Log[onesB]) - (Total[onesA] + \[Alpha])*
Log[Total[onesB] + \[Beta]]]*\[Beta]^\[Alpha]*
Exp[LogGamma[
Total[zerosA] + \[Alpha]] - (Plus @@ (LogGamma[
zerosA + 1]) + LogGamma[\[Alpha]]) +
Plus @@ (zerosA*
Log[zerosB]) - (Total[zerosA] + \[Alpha])*
Log[Total[zerosB] + \[Beta]]]]]*\[Theta]^
all*(1 - \[Theta])^zeroes
]
] & /@ partition)
]