Search All of the Math Forum:

Views expressed in these public forums are not endorsed by NCTM or The Math Forum.

Notice: We are no longer accepting new posts, but the forums will continue to be readable.

Topic: Compile function and AppendTo for lists (vrs. 8.0.4)
Replies: 8   Last Post: Feb 1, 2012 3:50 AM

 Messages: [ Previous | Next ]
 Patrick Scheibe Posts: 327 Registered: 5/22/07
Re: Compile function and AppendTo for lists (vrs. 8.0.4)
Posted: Jan 28, 2012 6:39 AM

Hi,

> Just to note that your example puts p in a Real register rather than an
> Integer one, so the results are not of the expected type.

yes, I have seen this but left the "Most[{0}] type enforcement" for the
sake of simplicity out. I think anyway that all this compiled Bag is at
the line where there is absolutely no official information from Wolfram
available. So I wanted to present this as short as possible so that
noone is feared to try it.

But of course you are absolutely right, that it is overkill to use real,
when integers are sufficient. Btw, have you seen, that even with a Real
bag you can assign True and False and get 1.0 and 0.0?

This

> first, Internal`BagLength is not supported

I knew because I was looking what is possible and what is not. But the
third arguments to BagPart is new to me and a precious information. I'm
really interested in to what else is possible.

Cheers
Patrick

> Also, it is not
> necessary to create and stuff Bags separately; one can create pre-stuffed
> bags using Internal`Bag[contents]. Thus, one can simplify your example to
> the following:
>
> appendBag2 = Compile[{{k, _Integer, 0}},
> Module[{p = Bag@Most[{0}] (* put into integer register *), i = 1},
> For[i = 1, i <= k, ++i, StuffBag[p, Bag[{1, i}]]];
> Table[BagPart[BagPart[p, i], All], {i, 1, k}]
> ]
> ];
>
> This does not gain (or lose) any performance over your code, but it is
> shorter to write and uses less memory (because integers take up half the
> space that reals do). The latter consideration might be important given
> that this function uses a tremendous amount of memory for long lists
> (using reals with k = 10^6 requires about 9.6GB, even though the result is
> only 16MB in size).
>
> Two miscellaneous notes about Bags that I am fairly sure have not been
> mentioned anywhere else so far: first, Internal`BagLength is not supported
> in compiled code; second, Internal`BagPart can take a third argument,
> which is a function (instead of List) to wrap around the sequence of
> parts, and this does work in compiled code provided that the function is
> either Plus or Times.
>
> Best,
>
> O. R.
>
> On Thu, 26 Jan 2012 08:30:01 -0000, Patrick Scheibe
> <pscheibe@trm.uni-leipzig.de> wrote:
>

> > Hi,
> >
> > using Oleks Internal`Bag suggestion, think of a list as a bag of numbers
> > and you can use this as replacement for the lists in your compile. Using
> > Oleks append-to version as comparison
> >
> > appendTo =
> > Compile[{{k, _Integer, 0}},
> > Module[{mat = {{0, 0}}, i = 0},
> > For[i = 1, i <= k, i++, AppendTo[mat, {1, i}]];
> > Rest[mat]]]
> >
> > and here is the Internal`Bag implementation
> >
> > AppendTo[\$ContextPath, "Internal`"];
> > appendBag = Compile[{{k, _Integer}},
> > Module[{p = Bag[], i = 1, tmpBag},
> > For[i = 1, i <= k, ++i,
> > tmpBag = Bag[];
> > StuffBag[tmpBag, 1];
> > StuffBag[tmpBag, i];
> > StuffBag[p, tmpBag];
> > ];
> > Table[BagPart[BagPart[p, i], All], {i, k}]
> > ]
> > ];
> >
> > Speedtest shows
> >
> > In[55]:= First /@ {AbsoluteTiming[appendTo[10^5]],
> > AbsoluteTiming[appendBag[10^5]]}
> >
> > Out[55]= {14.559237, 0.149063}
> >
> > that the bag implementation is about 100 times faster. Unfortunately
> > here http://stackoverflow.com/a/6795762/1078614 where Daniel gives some
> > insights into the usage.
> >
> > Hope this helps.
> >
> > Cheers
> > Patrick
> >
> >
> > On Tue, 2012-01-24 at 05:06 -0500, kris wrote:

> >> Hi
> >>
> >> I have some trouble with my code and would like ask for your help. In
> >> general it is about appending data in form of a list to an existing
> >> list in a compiled function. As far as I understand Mathematica is not
> >> supporting what I am asking for. In order to understand the problem in
> >> more detail I present some "toy" code below.
> >>
> >> test=Compile[{{k,_Integer}},
> >> Module[{mat={}},
> >> For[i=1,i<=k,i++,
> >> AppendTo[mat,{1,i}];
> >> ];
> >> mat
> >> ]
> >> ];
> >>
> >> test[2]
> >> (*which produces an error*)
> >>
> >> Appending data in form of numbers for example works just fine but not
> >> with lists. Can anybody explain why Mathematica does not support
> >> appending lists to lists for compiled function? As an alternative I
> >> tried Reap and Sow, which also produces an error.
> >>
> >> However, what seems funny is the following code:
> >>
> >> mat={};
> >> test=Compile[{{k,_Integer}},
> >> For[i=1,i<=k,i++,
> >> AppendTo[mat,{1,i}];
> >> ];
> >> ];
> >>
> >> test[2];mat
> >>
> >> The above code produces the result that I was looking for in a
> >> cumbersome way. I would like to prefer compile code which produces the
> >> same result without calling the list mat again.
> >>
> >> Thanks for help I do appreciate it.
> >> Cheers,
> >> Kris

>