comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Real_Arrays on heap with overloaded operators and clean syntax
Date: Sun, 22 Jan 2023 23:13:14 +0100	[thread overview]
Message-ID: <tqkcdo$1u1j$1@gioia.aioe.org> (raw)
In-Reply-To: 9c7cccd9-733f-49a8-b482-087ccb14b58dn@googlegroups.com

On 2023-01-22 22:34, Jim Paloander wrote:
> 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

  parent reply	other threads:[~2023-01-22 22:13 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. Kazakov [this message]
2023-01-22 22:36   ` Jim Paloander
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