[GiNaC-list] memory allocation, matrices

Richard B. Kreckel kreckel at ginac.de
Sat Sep 9 18:27:36 CEST 2006


Hi!

Marko Riedel wrote:

>I'm going to ask a very basic question, namely if you can point me to
>a tutorial where GiNaC's memory managment is described. I read the
>tutorial from your website but I could not find any info on this.
>
>I am familiar with the retain/release mechanism of used by Cocoa and
>GNUstep, and the use of autorelease pools. If you could compare these
>concepts to their GiNaC equivalents, that would be of great help.
>E.g. in Objective C I can create a tree of objects and either free
>them myself or put them into an autorelease pool that will be emptied
>by the runloop. How would I do this in GiNaC?
>  
>

The objects behind a GiNaC::ex are generally trees, but you just deal 
with the top-level thing and everything else happens automatically. Its 
up to you whether to allocate that top-level thing on the stack or on 
the heap. It will maintain its subobjects on the heap, but you don't 
have to care about that.

>Suppose I create a matrix of rational functions, a single entry of
>which I'm interested in retaining. I would like to free the matrix and
>retain that one function. Can you provide a code snippet that does
>this?
>  
>

// ...
ex interesting_element;
{
GiNaC::matrix mybigmatrix(100,100);
// construct mybigmatrix
interesting_element = mybigmatrix(47,11);
}
// use interesting_element here...

At the closing brace, mybigmatrix goes out of scope. The destructor 
incurs derementing the refcount of all 10000 elements, which get deleted 
if their refcount reaches zero. The refcount of the element of interest, 
however, was two (at least). So it continues to exist and you can use it 
afterwards.

>I would also like to know what the limitations of the linear equation
>solver are. How many variables can it handle? What are the time and
>space complexities of the solver in terms of the number of variables
>and the number of equations?
>  
>

Asking for complexity in symbolic algorithms in such a general way does 
not make sense. An algorithm which is O(n^2) over the integers does not 
have to be so in any integral domain. It may be O(d*n^2) over univariate 
polynomials of degree d or even much worse. You have to try it out in 
order to find the practical limitations in your particular case.

Several alternative elimination algorithms are implemented. There is a 
crude heuristic that decides which one to pick. But, as any heuristic, 
it can fail. You can always override the heuristics and do your own 
experiments: 
<http://www.ginac.de/reference/classGiNaC_1_1solve__algo.html>. 
Generally, the Bareiss algorithm is superior to the other ones, but if 
there are many symbols, it gets bogged down early because it incurs huge 
GCD computations. We've had cases where the Gauss algorithm was superior 
when the elements were rational functions. Please, try which works best 
for your problem.

Regards
-richy.

-- 
Richard B. Kreckel
<http://www.ginac.de/~kreckel/>



More information about the GiNaC-list mailing list