2015-05-22 Eric Botcazou <ebotcazou@adacore.com>
[official-gcc.git] / gcc / ada / s-gearop.ads
blobf401da219e36fd2636bda36793fbef05a049094f
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME COMPONENTS --
4 -- --
5 -- S Y S T E M . G E N E R I C _ A R R A Y _ O P E R A T I O N S --
6 -- --
7 -- S p e c --
8 -- --
9 -- Copyright (C) 2006-2011, Free Software Foundation, Inc. --
10 -- --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
17 -- --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
21 -- --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
26 -- --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
29 -- --
30 ------------------------------------------------------------------------------
32 package System.Generic_Array_Operations is
33 pragma Pure (Generic_Array_Operations);
35 ---------------------
36 -- Back_Substitute --
37 ---------------------
39 generic
40 type Scalar is private;
41 type Matrix is array (Integer range <>, Integer range <>) of Scalar;
42 with function "-" (Left, Right : Scalar) return Scalar is <>;
43 with function "*" (Left, Right : Scalar) return Scalar is <>;
44 with function "/" (Left, Right : Scalar) return Scalar is <>;
45 with function Is_Non_Zero (X : Scalar) return Boolean is <>;
46 procedure Back_Substitute (M, N : in out Matrix);
48 --------------
49 -- Diagonal --
50 --------------
52 generic
53 type Scalar is private;
54 type Vector is array (Integer range <>) of Scalar;
55 type Matrix is array (Integer range <>, Integer range <>) of Scalar;
56 function Diagonal (A : Matrix) return Vector;
58 -----------------------
59 -- Forward_Eliminate --
60 -----------------------
62 -- Use elementary row operations to put square matrix M in row echolon
63 -- form. Identical row operations are performed on matrix N, must have the
64 -- same number of rows as M.
66 generic
67 type Scalar is private;
68 type Real is digits <>;
69 type Matrix is array (Integer range <>, Integer range <>) of Scalar;
70 with function "abs" (Right : Scalar) return Real'Base is <>;
71 with function "-" (Left, Right : Scalar) return Scalar is <>;
72 with function "*" (Left, Right : Scalar) return Scalar is <>;
73 with function "/" (Left, Right : Scalar) return Scalar is <>;
74 Zero : Scalar;
75 One : Scalar;
76 procedure Forward_Eliminate
77 (M : in out Matrix;
78 N : in out Matrix;
79 Det : out Scalar);
81 --------------------------
82 -- Square_Matrix_Length --
83 --------------------------
85 generic
86 type Scalar is private;
87 type Matrix is array (Integer range <>, Integer range <>) of Scalar;
88 function Square_Matrix_Length (A : Matrix) return Natural;
89 -- If A is non-square, raise Constraint_Error, else return its dimension
91 ----------------------------------
92 -- Vector_Elementwise_Operation --
93 ----------------------------------
95 generic
96 type X_Scalar is private;
97 type Result_Scalar is private;
98 type X_Vector is array (Integer range <>) of X_Scalar;
99 type Result_Vector is array (Integer range <>) of Result_Scalar;
100 with function Operation (X : X_Scalar) return Result_Scalar;
101 function Vector_Elementwise_Operation (X : X_Vector) return Result_Vector;
103 ----------------------------------
104 -- Matrix_Elementwise_Operation --
105 ----------------------------------
107 generic
108 type X_Scalar is private;
109 type Result_Scalar is private;
110 type X_Matrix is array (Integer range <>, Integer range <>) of X_Scalar;
111 type Result_Matrix is array (Integer range <>, Integer range <>)
112 of Result_Scalar;
113 with function Operation (X : X_Scalar) return Result_Scalar;
114 function Matrix_Elementwise_Operation (X : X_Matrix) return Result_Matrix;
116 -----------------------------------------
117 -- Vector_Vector_Elementwise_Operation --
118 -----------------------------------------
120 generic
121 type Left_Scalar is private;
122 type Right_Scalar is private;
123 type Result_Scalar is private;
124 type Left_Vector is array (Integer range <>) of Left_Scalar;
125 type Right_Vector is array (Integer range <>) of Right_Scalar;
126 type Result_Vector is array (Integer range <>) of Result_Scalar;
127 with function Operation
128 (Left : Left_Scalar;
129 Right : Right_Scalar) return Result_Scalar;
130 function Vector_Vector_Elementwise_Operation
131 (Left : Left_Vector;
132 Right : Right_Vector) return Result_Vector;
134 ------------------------------------------------
135 -- Vector_Vector_Scalar_Elementwise_Operation --
136 ------------------------------------------------
138 generic
139 type X_Scalar is private;
140 type Y_Scalar is private;
141 type Z_Scalar is private;
142 type Result_Scalar is private;
143 type X_Vector is array (Integer range <>) of X_Scalar;
144 type Y_Vector is array (Integer range <>) of Y_Scalar;
145 type Result_Vector is array (Integer range <>) of Result_Scalar;
146 with function Operation
147 (X : X_Scalar;
148 Y : Y_Scalar;
149 Z : Z_Scalar) return Result_Scalar;
150 function Vector_Vector_Scalar_Elementwise_Operation
151 (X : X_Vector;
152 Y : Y_Vector;
153 Z : Z_Scalar) return Result_Vector;
155 -----------------------------------------
156 -- Matrix_Matrix_Elementwise_Operation --
157 -----------------------------------------
159 generic
160 type Left_Scalar is private;
161 type Right_Scalar is private;
162 type Result_Scalar is private;
163 type Left_Matrix is array (Integer range <>, Integer range <>)
164 of Left_Scalar;
165 type Right_Matrix is array (Integer range <>, Integer range <>)
166 of Right_Scalar;
167 type Result_Matrix is array (Integer range <>, Integer range <>)
168 of Result_Scalar;
169 with function Operation
170 (Left : Left_Scalar;
171 Right : Right_Scalar) return Result_Scalar;
172 function Matrix_Matrix_Elementwise_Operation
173 (Left : Left_Matrix;
174 Right : Right_Matrix) return Result_Matrix;
176 ------------------------------------------------
177 -- Matrix_Matrix_Scalar_Elementwise_Operation --
178 ------------------------------------------------
180 generic
181 type X_Scalar is private;
182 type Y_Scalar is private;
183 type Z_Scalar is private;
184 type Result_Scalar is private;
185 type X_Matrix is array (Integer range <>, Integer range <>) of X_Scalar;
186 type Y_Matrix is array (Integer range <>, Integer range <>) of Y_Scalar;
187 type Result_Matrix is array (Integer range <>, Integer range <>)
188 of Result_Scalar;
189 with function Operation
190 (X : X_Scalar;
191 Y : Y_Scalar;
192 Z : Z_Scalar) return Result_Scalar;
193 function Matrix_Matrix_Scalar_Elementwise_Operation
194 (X : X_Matrix;
195 Y : Y_Matrix;
196 Z : Z_Scalar) return Result_Matrix;
198 -----------------------------------------
199 -- Vector_Scalar_Elementwise_Operation --
200 -----------------------------------------
202 generic
203 type Left_Scalar is private;
204 type Right_Scalar is private;
205 type Result_Scalar is private;
206 type Left_Vector is array (Integer range <>) of Left_Scalar;
207 type Result_Vector is array (Integer range <>) of Result_Scalar;
208 with function Operation
209 (Left : Left_Scalar;
210 Right : Right_Scalar) return Result_Scalar;
211 function Vector_Scalar_Elementwise_Operation
212 (Left : Left_Vector;
213 Right : Right_Scalar) return Result_Vector;
215 -----------------------------------------
216 -- Matrix_Scalar_Elementwise_Operation --
217 -----------------------------------------
219 generic
220 type Left_Scalar is private;
221 type Right_Scalar is private;
222 type Result_Scalar is private;
223 type Left_Matrix is array (Integer range <>, Integer range <>)
224 of Left_Scalar;
225 type Result_Matrix is array (Integer range <>, Integer range <>)
226 of Result_Scalar;
227 with function Operation
228 (Left : Left_Scalar;
229 Right : Right_Scalar) return Result_Scalar;
230 function Matrix_Scalar_Elementwise_Operation
231 (Left : Left_Matrix;
232 Right : Right_Scalar) return Result_Matrix;
234 -----------------------------------------
235 -- Scalar_Vector_Elementwise_Operation --
236 -----------------------------------------
238 generic
239 type Left_Scalar is private;
240 type Right_Scalar is private;
241 type Result_Scalar is private;
242 type Right_Vector is array (Integer range <>) of Right_Scalar;
243 type Result_Vector is array (Integer range <>) of Result_Scalar;
244 with function Operation
245 (Left : Left_Scalar;
246 Right : Right_Scalar) return Result_Scalar;
247 function Scalar_Vector_Elementwise_Operation
248 (Left : Left_Scalar;
249 Right : Right_Vector) return Result_Vector;
251 -----------------------------------------
252 -- Scalar_Matrix_Elementwise_Operation --
253 -----------------------------------------
255 generic
256 type Left_Scalar is private;
257 type Right_Scalar is private;
258 type Result_Scalar is private;
259 type Right_Matrix is array (Integer range <>, Integer range <>)
260 of Right_Scalar;
261 type Result_Matrix is array (Integer range <>, Integer range <>)
262 of Result_Scalar;
263 with function Operation
264 (Left : Left_Scalar;
265 Right : Right_Scalar) return Result_Scalar;
266 function Scalar_Matrix_Elementwise_Operation
267 (Left : Left_Scalar;
268 Right : Right_Matrix) return Result_Matrix;
270 -------------------
271 -- Inner_Product --
272 -------------------
274 generic
275 type Left_Scalar is private;
276 type Right_Scalar is private;
277 type Result_Scalar is private;
278 type Left_Vector is array (Integer range <>) of Left_Scalar;
279 type Right_Vector is array (Integer range <>) of Right_Scalar;
280 Zero : Result_Scalar;
281 with function "*"
282 (Left : Left_Scalar;
283 Right : Right_Scalar) return Result_Scalar is <>;
284 with function "+"
285 (Left : Result_Scalar;
286 Right : Result_Scalar) return Result_Scalar is <>;
287 function Inner_Product
288 (Left : Left_Vector;
289 Right : Right_Vector) return Result_Scalar;
291 -------------
292 -- L2_Norm --
293 -------------
295 generic
296 type X_Scalar is private;
297 type Result_Real is digits <>;
298 type X_Vector is array (Integer range <>) of X_Scalar;
299 with function "abs" (Right : X_Scalar) return Result_Real is <>;
300 with function Sqrt (X : Result_Real'Base) return Result_Real'Base is <>;
301 function L2_Norm (X : X_Vector) return Result_Real'Base;
303 -------------------
304 -- Outer_Product --
305 -------------------
307 generic
308 type Left_Scalar is private;
309 type Right_Scalar is private;
310 type Result_Scalar is private;
311 type Left_Vector is array (Integer range <>) of Left_Scalar;
312 type Right_Vector is array (Integer range <>) of Right_Scalar;
313 type Matrix is array (Integer range <>, Integer range <>)
314 of Result_Scalar;
315 with function "*"
316 (Left : Left_Scalar;
317 Right : Right_Scalar) return Result_Scalar is <>;
318 function Outer_Product
319 (Left : Left_Vector;
320 Right : Right_Vector) return Matrix;
322 ---------------------------
323 -- Matrix_Vector_Product --
324 ---------------------------
326 generic
327 type Left_Scalar is private;
328 type Right_Scalar is private;
329 type Result_Scalar is private;
330 type Matrix is array (Integer range <>, Integer range <>)
331 of Left_Scalar;
332 type Right_Vector is array (Integer range <>) of Right_Scalar;
333 type Result_Vector is array (Integer range <>) of Result_Scalar;
334 Zero : Result_Scalar;
335 with function "*"
336 (Left : Left_Scalar;
337 Right : Right_Scalar) return Result_Scalar is <>;
338 with function "+"
339 (Left : Result_Scalar;
340 Right : Result_Scalar) return Result_Scalar is <>;
341 function Matrix_Vector_Product
342 (Left : Matrix;
343 Right : Right_Vector) return Result_Vector;
345 ---------------------------
346 -- Vector_Matrix_Product --
347 ---------------------------
349 generic
350 type Left_Scalar is private;
351 type Right_Scalar is private;
352 type Result_Scalar is private;
353 type Left_Vector is array (Integer range <>) of Left_Scalar;
354 type Matrix is array (Integer range <>, Integer range <>)
355 of Right_Scalar;
356 type Result_Vector is array (Integer range <>) of Result_Scalar;
357 Zero : Result_Scalar;
358 with function "*"
359 (Left : Left_Scalar;
360 Right : Right_Scalar) return Result_Scalar is <>;
361 with function "+"
362 (Left : Result_Scalar;
363 Right : Result_Scalar) return Result_Scalar is <>;
364 function Vector_Matrix_Product
365 (Left : Left_Vector;
366 Right : Matrix) return Result_Vector;
368 ---------------------------
369 -- Matrix_Matrix_Product --
370 ---------------------------
372 generic
373 type Left_Scalar is private;
374 type Right_Scalar is private;
375 type Result_Scalar is private;
376 type Left_Matrix is array (Integer range <>, Integer range <>)
377 of Left_Scalar;
378 type Right_Matrix is array (Integer range <>, Integer range <>)
379 of Right_Scalar;
380 type Result_Matrix is array (Integer range <>, Integer range <>)
381 of Result_Scalar;
382 Zero : Result_Scalar;
383 with function "*"
384 (Left : Left_Scalar;
385 Right : Right_Scalar) return Result_Scalar is <>;
386 with function "+"
387 (Left : Result_Scalar;
388 Right : Result_Scalar) return Result_Scalar is <>;
389 function Matrix_Matrix_Product
390 (Left : Left_Matrix;
391 Right : Right_Matrix) return Result_Matrix;
393 ----------------------------
394 -- Matrix_Vector_Solution --
395 ----------------------------
397 generic
398 type Scalar is private;
399 type Vector is array (Integer range <>) of Scalar;
400 type Matrix is array (Integer range <>, Integer range <>) of Scalar;
401 with procedure Back_Substitute (M, N : in out Matrix) is <>;
402 with procedure Forward_Eliminate
403 (M : in out Matrix;
404 N : in out Matrix;
405 Det : out Scalar) is <>;
406 function Matrix_Vector_Solution (A : Matrix; X : Vector) return Vector;
408 ----------------------------
409 -- Matrix_Matrix_Solution --
410 ----------------------------
412 generic
413 type Scalar is private;
414 type Matrix is array (Integer range <>, Integer range <>) of Scalar;
415 with procedure Back_Substitute (M, N : in out Matrix) is <>;
416 with procedure Forward_Eliminate
417 (M : in out Matrix;
418 N : in out Matrix;
419 Det : out Scalar) is <>;
420 function Matrix_Matrix_Solution (A : Matrix; X : Matrix) return Matrix;
422 ----------
423 -- Sqrt --
424 ----------
426 generic
427 type Real is digits <>;
428 function Sqrt (X : Real'Base) return Real'Base;
430 -----------------
431 -- Swap_Column --
432 -----------------
434 generic
435 type Scalar is private;
436 type Matrix is array (Integer range <>, Integer range <>) of Scalar;
437 procedure Swap_Column (A : in out Matrix; Left, Right : Integer);
439 ---------------
440 -- Transpose --
441 ---------------
443 generic
444 type Scalar is private;
445 type Matrix is array (Integer range <>, Integer range <>) of Scalar;
446 procedure Transpose (A : Matrix; R : out Matrix);
448 -------------------------------
449 -- Update_Vector_With_Vector --
450 -------------------------------
452 generic
453 type X_Scalar is private;
454 type Y_Scalar is private;
455 type X_Vector is array (Integer range <>) of X_Scalar;
456 type Y_Vector is array (Integer range <>) of Y_Scalar;
457 with procedure Update (X : in out X_Scalar; Y : Y_Scalar);
458 procedure Update_Vector_With_Vector (X : in out X_Vector; Y : Y_Vector);
460 -------------------------------
461 -- Update_Matrix_With_Matrix --
462 -------------------------------
464 generic
465 type X_Scalar is private;
466 type Y_Scalar is private;
467 type X_Matrix is array (Integer range <>, Integer range <>) of X_Scalar;
468 type Y_Matrix is array (Integer range <>, Integer range <>) of Y_Scalar;
469 with procedure Update (X : in out X_Scalar; Y : Y_Scalar);
470 procedure Update_Matrix_With_Matrix (X : in out X_Matrix; Y : Y_Matrix);
472 -----------------
473 -- Unit_Matrix --
474 -----------------
476 generic
477 type Scalar is private;
478 type Matrix is array (Integer range <>, Integer range <>) of Scalar;
479 Zero : Scalar;
480 One : Scalar;
481 function Unit_Matrix
482 (Order : Positive;
483 First_1 : Integer := 1;
484 First_2 : Integer := 1) return Matrix;
486 -----------------
487 -- Unit_Vector --
488 -----------------
490 generic
491 type Scalar is private;
492 type Vector is array (Integer range <>) of Scalar;
493 Zero : Scalar;
494 One : Scalar;
495 function Unit_Vector
496 (Index : Integer;
497 Order : Positive;
498 First : Integer := 1) return Vector;
500 end System.Generic_Array_Operations;