```
From: Jim Paloander <dhmos.altiotis@gmail.com>
Subject: Re: Real_Arrays on heap with overloaded operators and clean syntax
Date: Sun, 22 Jan 2023 14:36:28 -0800 (PST) [thread overview]
Message-ID: <2801afb2-045f-4fec-b41e-f83b2c80e672n@googlegroups.com> (raw)
In-Reply-To: <tqkcdo$1u1j$1@gioia.aioe.org>
> > 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) 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?
> You can define "+" on the access type, which should probably be an arena
> pointer for performance reasons:
>
> 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
Privet Dmitry,
thank you for your answer, I was thinking about that, but 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;
somehow... 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.
Spacebo Bolshoe,
Jim.
```

next prev parent reply other threads:[~2023-01-22 22:36 UTC|newest]Thread overview:34+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-01-22 21:34 Real_Arrays on heap with overloaded operators and clean syntax Jim Paloander 2023-01-22 21:56 ` Joakim Strandberg 2023-01-22 22:07 ` Jim Paloander 2023-01-22 22:42 ` Joakim Strandberg 2023-01-22 22:49 ` Jim Paloander 2023-01-22 23:11 ` Joakim Strandberg 2023-01-22 23:14 ` Gautier write-only address 2023-01-23 1:14 ` Leo Brewin 2023-01-23 6:01 ` Jim Paloander 2023-01-23 8:39 ` G.B. 2023-01-22 22:13 ` Dmitry A. Kazakov2023-01-22 22:36 ` Jim Paloander [this message]2023-01-23 8:28 ` Dmitry A. Kazakov 2023-01-24 1:04 ` Jim Paloander 2023-01-24 10:42 ` J-P. Rosen 2023-01-25 9:52 ` Jim Paloander 2023-01-25 12:21 ` J-P. Rosen 2023-01-25 22:41 ` Gautier write-only address 2023-01-26 19:08 ` Jim Paloander 2023-01-22 23:18 ` Rod Kay 2023-01-22 23:20 ` Jim Paloander 2023-01-22 23:34 ` Rod Kay 2023-01-22 23:53 ` Joakim Strandberg 2023-01-23 7:50 ` Egil H H 2023-01-23 8:51 ` J-P. Rosen 2023-01-23 6:34 ` Rod Kay 2023-01-23 6:56 ` Jim Paloander 2023-01-23 7:31 ` Rod Kay 2023-01-24 19:47 ` Gautier write-only address 2023-01-24 23:02 ` Gautier write-only address 2023-01-25 9:50 ` Jim Paloander 2023-01-26 20:39 ` Jerry 2023-01-26 21:52 ` Jim Paloander 2023-02-02 21:59 ` Jerry

replies disabled

This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox