Dear ADA lovers,and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in runtime)
Thanks for your time!
and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in runtime)
environment task. You will avoid the unnecessary heap allocations and have nice clean syntax.Thanks for your time!Easiest solution is probably to declare a new task and specify the stack size using the Storage_Size aspect. Allocate as much stack space as you need to be able to do the calculations and do all the allocations on the declared task, not on the
Best regards,
Joakim
Dear ADA lovers,and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in runtime)
runtime) and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in
environment task. You will avoid the unnecessary heap allocations and have nice clean syntax.Thanks for your time!Easiest solution is probably to declare a new task and specify the stack size using the Storage_Size aspect. Allocate as much stack space as you need to be able to do the calculations and do all the allocations on the declared task, not on the
should be a way to do this also for the main program. But thanks anyway. Are you aware of any libraries similar to Real_Arrays, but who allocated memory internally using heap? This is the natural way to do such things. Similarly to the Containers.Vector.Best regards,Thank you for your reply,
Joakim
since I am a newbie I was under the impression that tasks are used only when you want to write a parallel code that takes advantage of multicore architectures. You suggest I have a single task and single thread something like this? I see, but there
and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in runtime)
You can define "+" on the access type, which should probably be an arena pointer for performance reasons:Privet Dmitry,
Arena : Mark_And_Release_Pool;
type Real_Vector_Ptr is access Real_Vector;
for Real_Vector_Ptr'Storage_Pool use Arena;
function "+" (Left, Right : Real_Vector_Ptr)
return Real_Vector_Ptr is
begin
if Left'Length /= Right'Length then
raise Constraint_Error;
end if;
return Result : Real_Vector_Ptr := new Real_Vector (Left'Range) do
for I in Result'Range loop
Result (I) :=
Left (I) + Right (I - Left'First + Right'First);
end loop;
end return;
end "+";
You can overload that with
function "+" (Left : Real_Vector_Ptr; Right : Real_Vector)
return Real_Vector_Ptr is
begin
if Left'Length /= Right'Length then
raise Constraint_Error;
end if;
return Result : Real_Vector_Ptr := new Real_Vector (Left'Range) do
for I in Result'Range loop
Result (I) :=
Left (I) + Right (I - Left'First + Right'First);
end loop;
end return;
end "+";
and with
function "+" (Left : Real_Vector; Right : Real_Vector_Ptr)
return Real_Vector_Ptr;
Then you will be able to write:
X := A + B + C + C + A + B;
-- Use X
Free (X); -- Pop all arena garbage
But of course, the optimal way to work large linear algebra problems is
by using in-place operations, e.g.
procedure Add (Left : in out Real_Vector; Right : Real_Vector);
etc.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
runtime) and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in
environment task. You will avoid the unnecessary heap allocations and have nice clean syntax.Thanks for your time!Easiest solution is probably to declare a new task and specify the stack size using the Storage_Size aspect. Allocate as much stack space as you need to be able to do the calculations and do all the allocations on the declared task, not on the
should be a way to do this also for the main program. But thanks anyway. Are you aware of any libraries similar to Real_Arrays, but who allocated memory internally using heap? This is the natural way to do such things. Similarly to the Containers.Vector.Best regards,Thank you for your reply,
Joakim
since I am a newbie I was under the impression that tasks are used only when you want to write a parallel code that takes advantage of multicore architectures. You suggest I have a single task and single thread something like this? I see, but there
doesn't know how much time that will take nor if it always will succeed. In addition, applications that use the heap may be susceptible to heap memory fragmentation. In Ada, it is easy to specify stack sizes when declaring tasks. It is not part of theIt my impression that in the Ada community the preferred way of working is in general stack only. Heap allocations are avoided for a number of reasons for example performance, the application needs to ask the operating system for memory which one
With great depression I realized that the preferred way is of stack only. This is very restrictive excluding all scientific modelling involving solvers for partial differential equations, linear algebra kernels, etc. It is insane. Completely insane. 3Dsimulations of physical phenomena may involve billions of grid-cells and at each grid-cell several unknowns are defined (velocity, pressure, temperature, energy, density, etc). That is why they are using Fortran or C++, but ADA has really cool stuff for
runtime) and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in
environment task. You will avoid the unnecessary heap allocations and have nice clean syntax.Thanks for your time!Easiest solution is probably to declare a new task and specify the stack size using the Storage_Size aspect. Allocate as much stack space as you need to be able to do the calculations and do all the allocations on the declared task, not on the
should be a way to do this also for the main program. But thanks anyway. Are you aware of any libraries similar to Real_Arrays, but who allocated memory internally using heap? This is the natural way to do such things. Similarly to the Containers.Vector.Best regards,Thank you for your reply,
Joakim
since I am a newbie I was under the impression that tasks are used only when you want to write a parallel code that takes advantage of multicore architectures. You suggest I have a single task and single thread something like this? I see, but there
It my impression that in the Ada community the preferred way of working is in general stack only. Heap allocations are avoided for a number of reasons for example performance, the application needs to ask the operating system for memory which one doesn't know how much time that will take nor if it always will succeed. In addition, applications that use the heap may be susceptible to heap memory fragmentation. In Ada, it is easy to specify stack sizes when declaring tasks. It is not part of the Ada
and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in runtime)
On Windows 10 with mingw64?Thanks for your time!If you are on linux, then you could set the stack size with
$ ulimit -s unlimited
$ launch_my_app
Regards.
Dear ADA lovers,and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in runtime)
Thanks for your time!
and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in runtime)
Thanks for your time!If you are on linux, then you could set the stack size with
$ ulimit -s unlimited
$ launch_my_app
Regards.On Windows 10 with mingw64?
On 23/1/23 10:20, Jim Paloander wrote:runtime) and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?
Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in
Not sure. I don't have a windows machine.On Windows 10 with mingw64?Thanks for your time!If you are on linux, then you could set the stack size with
$ ulimit -s unlimited
$ launch_my_app
Regards.
What happens when try ?
$ ulimit -a
Here is a slight variation on the solution suggested by Gautier. It uses Aad's "rename" syntax so that you can avoid all the .all stuff. I use
this construction extensively in my large scale scientific computations.
with Ada.Numerics.Generic_Real_Arrays;
with Ada.Unchecked_Deallocation;
procedure Test_Large is
type Float_15 is digits 15;
package F15_R_A is new Ada.Numerics.Generic_Real_Arrays (Float_15);
use F15_R_A;
procedure Solve_it
(x : in Real_Vector;
y : out Real_Vector;
A : in Real_Matrix) is
begin
null; -- Here, the big number-crunching
end;
n : constant := 10_000;
type Vector_Access is access Real_Vector;
type Matrix_Access is access Real_Matrix;
x_ptr, y_ptr : Vector_Access := new Real_Vector (1 .. n);
A_ptr : Matrix_Access := new Real_Matrix (1 .. n, 1 .. n);
x : Real_Vector renames x_ptr.all;
y : Real_Vector renames y_ptr.all;
A : Real_Matrix renames A_ptr.all;
procedure FreeVector is new
Ada.Unchecked_Deallocation (Real_Vector,Vector_Access);
procedure FreeMatrix is new
Ada.Unchecked_Deallocation (Real_Matrix,Matrix_Access);
begin
Solve_it (x, y, A);
-- Deallocation here
FreeVector (x_ptr);
FreeVector (y_ptr);
FreeMatrix (A_ptr);
end;
It is, but I am not sure if it works since -D400m -d400m together with ulimit were not able to solve the problem. So I thought that under windows 10 and mingw things related to stack size settings are not equivalent to Linux. I checked your repository.On Windows 10 with mingw64?Dear ADA lovers,If you are on linux, then you could set the stack size with
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I >>>> get STACK_OVERFLOW ERROR while trying to check how fast operator
overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I >>>> lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using
Real_Arrays for implementing some linear algebra method who relies
heavilly on matrix vector products and vector updates, you do need
to allocate on the heap (sizes are determined in runtime) and you do >>>> need a clean syntax. So, is there any way to simplify my life
without using the .all or even without declaring A,B,C,X as access
Real_Vector?
Thanks for your time!
$ ulimit -s unlimited
$ launch_my_app
Regards.
Not sure. I don't have a windows machine.
What happens when try ?
$ ulimit -aulimit is available on cygwin.
It is not available on mingw64 then ?
On 23/1/23 10:20, Jim Paloander wrote:
On Windows 10 with mingw64?Dear ADA lovers,If you are on linux, then you could set the stack size with
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I
get STACK_OVERFLOW ERROR while trying to check how fast operator
overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I
lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using
Real_Arrays for implementing some linear algebra method who relies
heavilly on matrix vector products and vector updates, you do need
to allocate on the heap (sizes are determined in runtime) and you do
need a clean syntax. So, is there any way to simplify my life
without using the .all or even without declaring A,B,C,X as access
Real_Vector?
Thanks for your time!
$ ulimit -s unlimited
$ launch_my_app
Regards.
Not sure. I don't have a windows machine.
What happens when try ?
$ ulimit -a
Looks good. We need some elegant solution, because sometimes it is not easy to predict the stack size that will be needed. Imagine you write a commercial application that is running from a GUI and the user loads a particular case from a file. The memoryIt is, but I am not sure if it works since -D400m -d400m together with ulimit were not able to solve the problem. So I thought that under windows 10 and mingw things related to stack size settings are not equivalent to Linux. I checked your repository.ulimit is available on cygwin.If you are on linux, then you could set the stack size withOn Windows 10 with mingw64?
$ ulimit -s unlimited
$ launch_my_app
Regards.
Not sure. I don't have a windows machine.
What happens when try ?
$ ulimit -a
It is not available on mingw64 then ?
Something came up and I had to send my previous reply/e-mail as is. I wanted to find the video where Jean Pierre Rosen talks about how memory is handled in the Ada language from FOSDEM perhaps 2018-2019. Unfortunately I have been unable to find it.
and you do need a clean syntax. So, is there any way to simplify my life without using the .all or even without declaring A,B,C,X as access Real_Vector?Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
X := A + B + C + C + A + B, where
A,B,C,X are all Real_Vector ( 1 .. N ).
So my only option was to allocate on the heap using new. But then I lost the clean syntax
X := A + B + C + C + A + B
and I had to write instead:
X.all := A.all + B.all + C.all + C.all + A.all + B.all.
This is really ugly and annoying because when you are using Real_Arrays for implementing some linear algebra method who relies heavilly on matrix vector products and vector updates, you do need to allocate on the heap (sizes are determined in runtime)
environment task. You will avoid the unnecessary heap allocations and have nice clean syntax.Thanks for your time!Easiest solution is probably to declare a new task and specify the stack size using the Storage_Size aspect. Allocate as much stack space as you need to be able to do the calculations and do all the allocations on the declared task, not on the
Best regards,
Joakim
Thank you for your reply,
since I am a newbie I was under the impression that tasks are used only when you want to write a parallel code that takes advantage of multicore architectures.
You suggest I have a single task and single thread something like this? I see, but there should be a way to do this also for the main program.
But thanks anyway. Are you aware of any libraries similar to Real_Arrays, but who allocated memory internally using heap? This is the natural way to do such things.
Similarly to the Containers.Vector. But Vector has such an awful syntax. There should be something like an indexer [i] similarly to the C++ std::vector to make things simpler
On Monday, January 23, 2023 at 12:53:15 AM UTC+1, joak...@kth.se wrote:
Something came up and I had to send my previous reply/e-mail as is. I wanted to find the video where Jean Pierre Rosen talks about how memory is handled in the Ada language from FOSDEM perhaps 2018-2019. Unfortunately I have been unable to find it.It was in 2016:
https://archive.fosdem.org/2016/schedule/event/ada_memory/
I was not sure whether or not it can be avoided with Implicit_Dereference,
type Accessor (Data: not null access Element) is limited private
with Implicit_Dereference => Data;
Otherwise what you described for operator+ one has to do for every operator overloaded inside Real_Arrays package.
The optimal way to work large linear algebra problem is what you describe because unfortunately ADA does not allow what Fortran does since 30 years ago or more.
But in C++ you can reproduce the same functionality as Fortran using Expression Templates and Template Metaprogramming.
Perhaps ADA should allow something like that. Because for maintainability reasons the best would be to write the mathematical expressions as close as possible to the mathematical formulas.
You should not use the standard library anyway. It is not intended for
large problems, which require specific approaches and methods, like
sparse matrices, concurrent processing and so on.
The optimal way to work large linear algebra problem is what you describe because unfortunately ADA does not allow what Fortran does since 30 years ago or more.I am not sure what you mean. It is quite possible to design a wrapper
ADA should provide native support of vector-math or Vector.Numerics, or AdvancedNumerics or Numerics.LinearAlgebra and/or Numerics.SparseLinearAlgebra. Honestly with all the mission critical applications ADA is used for, I would expect something likethat to enable people working in scientific computing and in general wherever Linear Algebra kernels are essential tool of the core algorithms development.
that to enable people working in scientific computing and in general wherever Linear Algebra kernels are essential tool of the core algorithms development.ADA should provide native support of vector-math or Vector.Numerics, or AdvancedNumerics or Numerics.LinearAlgebra and/or Numerics.SparseLinearAlgebra. Honestly with all the mission critical applications ADA is used for, I would expect something like
Did you consider the facilities from Annex G? Moreover, there are
bindings to BLAS, LAPACK, and more. Try "Ada mathematical libraries" on Google...
that to enable people working in scientific computing and in general wherever Linear Algebra kernels are essential tool of the core algorithms development.ADA should provide native support of vector-math or Vector.Numerics, or AdvancedNumerics or Numerics.LinearAlgebra and/or Numerics.SparseLinearAlgebra. Honestly with all the mission critical applications ADA is used for, I would expect something like
Did you consider the facilities from Annex G? Moreover, there are
bindings to BLAS, LAPACK, and more. Try "Ada mathematical libraries" on
Google...
Thank you, very nice and positive suggestion. Please read my answer below to Gautier. Thank you again for the nice feedback.By the way, is there any other forum/discussion for ADA in github or elsewhere where we can also post code with colours etc?
...and: https://forum.ada-lang.io/
Dear ADA lovers,
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
maybe it could be about why this workaround is necessary. I will pull out Leo's answer from his post and put my version here:Dear ADA lovers,Leo's answer is responsive to the OP but seems to have gotten buried in an amazingly long discussion which I haven't read. This answer appeared here years ago (was it you, Leo?) and I have used it ever since. If there needs to be a long discussion
with stack allocation of Real_Vector ( 1 .. N ) when N >= 100,000 I get STACK_OVERFLOW ERROR while trying to check how fast operator overloading is working for an expression
type Real_Vector_Access is access Real_Vector;
then
x_Ptr : Real_Vector_Access := new Real_Vector(0 .. N - 1);
x : Real_Vector renames x_Ptr.all;
That's all. All the overloaded operators work as though the vector was declared from the stack. If you have code which formerly used stack allocation (of x, in this example), it will work without modification with this trick.
Jerry
Thank you Jerry, that's true, this trick does the job indeed. Thanks. But to be honest among us, it seems to me that the Real_Arrays library has been implemented probably (note the probably) by people not targeting real world engineering / industrialapplications. Examples are Finite Volume solutions of semiconductor device equations, or weather prediction problems. You cannot expect to solve these on the stack and of course ADA containers are impractical for such computations. Possibly a library as
Do you agree?
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 251 |
Nodes: | 16 (2 / 14) |
Uptime: | 128:36:43 |
Calls: | 5,523 |
Files: | 11,670 |
Messages: | 5,094,247 |