Re: Compile function and AppendTo for lists (vrs.
- To: mathgroup at smc.vnet.net
- Subject: [mg124704] Re: Compile function and AppendTo for lists (vrs.
- From: Fred Simons <f.h.simons at tue.nl>
- Date: Wed, 1 Feb 2012 03:50:50 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201201311039.FAA01093@smc.vnet.net>
Hi Patrick, Many thanks for your prompt reaction. Here are two comments. Op 31-1-2012 11:39, Patrick Scheibe schreef: > Hi Fred, > > some short notes: > > >> appendBag2a = Compile[{{k, _Integer, 0}}, Module[{p = Bag[Most[{0}]]}, >> Do[StuffBag[p, Bag[{1, i}]], {i, 1, k}]; >> Table[BagPart[BagPart[p, i], All], {i, 1, k}]]]; >> >> That works fine and fast, > But look that your type p is clearly wrong. p is a bag of bags of > Integer and has to be initialized with > > Internal`Bag[Most[{Internal`Bag[{1}]}]] > > We can only guess about the reasons why it works anyway. If it is > implemented with pointers, than it seems the integers of your p-Bag are > used to store the pointers. Clearly wrong is not quite clearly wrong. Indeed, with p = Bag[Most[{0}]]} we define p to be a bag with argument a list of integers. The fact that the implementation works suggests that in such a situation not only integers but also bags with integers are allowed as elements of the list. > >> The problem seems to be the initialization of the >> locale variable p. I tried compilation with the definitions p=Bag[], >> p=Bag[{}], p=Bag[Rest[{0}]], p=Bag[Rest[{{0,0}}]], or e.g. > Now you know how. No, not really. Inspired by your remarks, I did some further tests with compiling functions containing a Bag, and it seems to be that that the compiled function runs smoothly only when the argument of Bag is a list of reals or a list of integers (maybe containing bags of reals or bags of integers). So when it is a list of a list of integers, as in the function I was trying to compile, the compiled function will always proceed with the uncompiled version. In your function appendBag2 you use a Bag with Bag's inside the argument list. That is a very interesting idea. However, there is a big disadvantage: at the and the resulting expression will contain many Bag's. Since each Bag points to a raw expression stored somewhere, the amount of memory that is needed can be tremendous. In some of my tests indeed the kernel closed because of lack of memory. So my feeling is that it is better not to use this technique and instead to flatten the tensor to a list, and at the end use the function Partition fo find the tensor you are looking for. In this way, only one Bag is needed, thus not requiring an excessive amount of memory, and the compiled function will run smoothly. > > Cheers > Patrick > > Once again many thanks and best wishes, Fred