aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8.3/gcc/ada/a-ngcoar.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.8.3/gcc/ada/a-ngcoar.adb')
-rw-r--r--gcc-4.8.3/gcc/ada/a-ngcoar.adb1254
1 files changed, 1254 insertions, 0 deletions
diff --git a/gcc-4.8.3/gcc/ada/a-ngcoar.adb b/gcc-4.8.3/gcc/ada/a-ngcoar.adb
new file mode 100644
index 000000000..ca0c58c36
--- /dev/null
+++ b/gcc-4.8.3/gcc/ada/a-ngcoar.adb
@@ -0,0 +1,1254 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT COMPILER COMPONENTS --
+-- --
+-- ADA.NUMERICS.GENERIC_COMPLEX_ARRAYS --
+-- --
+-- B o d y --
+-- --
+-- Copyright (C) 2006-2012, Free Software Foundation, Inc. --
+-- --
+-- GNAT is free software; you can redistribute it and/or modify it under --
+-- terms of the GNU General Public License as published by the Free Soft- --
+-- ware Foundation; either version 3, or (at your option) any later ver- --
+-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE. --
+-- --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception, --
+-- version 3.1, as published by the Free Software Foundation. --
+-- --
+-- You should have received a copy of the GNU General Public License and --
+-- a copy of the GCC Runtime Library Exception along with this program; --
+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
+-- <http://www.gnu.org/licenses/>. --
+-- --
+-- GNAT was originally developed by the GNAT team at New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
+-- --
+------------------------------------------------------------------------------
+
+with System.Generic_Array_Operations; use System.Generic_Array_Operations;
+with Ada.Numerics; use Ada.Numerics;
+
+package body Ada.Numerics.Generic_Complex_Arrays is
+
+ -- Operations that are defined in terms of operations on the type Real,
+ -- such as addition, subtraction and scaling, are computed in the canonical
+ -- way looping over all elements.
+
+ package Ops renames System.Generic_Array_Operations;
+
+ subtype Real is Real_Arrays.Real;
+ -- Work around visibility bug ???
+
+ function Is_Non_Zero (X : Complex) return Boolean is (X /= (0.0, 0.0));
+ -- Needed by Back_Substitute
+
+ procedure Back_Substitute is new Ops.Back_Substitute
+ (Scalar => Complex,
+ Matrix => Complex_Matrix,
+ Is_Non_Zero => Is_Non_Zero);
+
+ procedure Forward_Eliminate is new Ops.Forward_Eliminate
+ (Scalar => Complex,
+ Real => Real'Base,
+ Matrix => Complex_Matrix,
+ Zero => (0.0, 0.0),
+ One => (1.0, 0.0));
+
+ procedure Transpose is new Ops.Transpose
+ (Scalar => Complex,
+ Matrix => Complex_Matrix);
+
+ -- Helper function that raises a Constraint_Error is the argument is
+ -- not a square matrix, and otherwise returns its length.
+
+ function Length is new Square_Matrix_Length (Complex, Complex_Matrix);
+
+ -- Instant a generic square root implementation here, in order to avoid
+ -- instantiating a complete copy of Generic_Elementary_Functions.
+ -- Speed of the square root is not a big concern here.
+
+ function Sqrt is new Ops.Sqrt (Real'Base);
+
+ -- Instantiating the following subprograms directly would lead to
+ -- name clashes, so use a local package.
+
+ package Instantiations is
+
+ ---------
+ -- "*" --
+ ---------
+
+ function "*" is new Vector_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "*");
+
+ function "*" is new Vector_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "*");
+
+ function "*" is new Scalar_Vector_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Right_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "*");
+
+ function "*" is new Scalar_Vector_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Right_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "*");
+
+ function "*" is new Inner_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Right_Vector => Real_Vector,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Inner_Product
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Real_Vector,
+ Right_Vector => Complex_Vector,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Inner_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Right_Vector => Complex_Vector,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Outer_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Right_Vector => Complex_Vector,
+ Matrix => Complex_Matrix);
+
+ function "*" is new Outer_Product
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Real_Vector,
+ Right_Vector => Complex_Vector,
+ Matrix => Complex_Matrix);
+
+ function "*" is new Outer_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Right_Vector => Real_Vector,
+ Matrix => Complex_Matrix);
+
+ function "*" is new Matrix_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "*");
+
+ function "*" is new Matrix_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "*");
+
+ function "*" is new Scalar_Matrix_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Right_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "*");
+
+ function "*" is new Scalar_Matrix_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Right_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "*");
+
+ function "*" is new Matrix_Vector_Product
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Matrix => Real_Matrix,
+ Right_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Matrix_Vector_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Matrix => Complex_Matrix,
+ Right_Vector => Real_Vector,
+ Result_Vector => Complex_Vector,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Matrix_Vector_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Matrix => Complex_Matrix,
+ Right_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Vector_Matrix_Product
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Real_Vector,
+ Matrix => Complex_Matrix,
+ Result_Vector => Complex_Vector,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Vector_Matrix_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Matrix => Real_Matrix,
+ Result_Vector => Complex_Vector,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Vector_Matrix_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Matrix => Complex_Matrix,
+ Result_Vector => Complex_Vector,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Matrix_Matrix_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Right_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Matrix_Matrix_Product
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Matrix => Real_Matrix,
+ Right_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Zero => (0.0, 0.0));
+
+ function "*" is new Matrix_Matrix_Product
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Right_Matrix => Real_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Zero => (0.0, 0.0));
+
+ ---------
+ -- "+" --
+ ---------
+
+ function "+" is new Vector_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Complex,
+ X_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "+");
+
+ function "+" is new Vector_Vector_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Right_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "+");
+
+ function "+" is new Vector_Vector_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Real_Vector,
+ Right_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "+");
+
+ function "+" is new Vector_Vector_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Right_Vector => Real_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "+");
+
+ function "+" is new Matrix_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Complex,
+ X_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "+");
+
+ function "+" is new Matrix_Matrix_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Right_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "+");
+
+ function "+" is new Matrix_Matrix_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Matrix => Real_Matrix,
+ Right_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "+");
+
+ function "+" is new Matrix_Matrix_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Right_Matrix => Real_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "+");
+
+ ---------
+ -- "-" --
+ ---------
+
+ function "-" is new Vector_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Complex,
+ X_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "-");
+
+ function "-" is new Vector_Vector_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Right_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "-");
+
+ function "-" is new Vector_Vector_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Real_Vector,
+ Right_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "-");
+
+ function "-" is new Vector_Vector_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Right_Vector => Real_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "-");
+
+ function "-" is new Matrix_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Complex,
+ X_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "-");
+
+ function "-" is new Matrix_Matrix_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Right_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "-");
+
+ function "-" is new Matrix_Matrix_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Matrix => Real_Matrix,
+ Right_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "-");
+
+ function "-" is new Matrix_Matrix_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Right_Matrix => Real_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "-");
+
+ ---------
+ -- "/" --
+ ---------
+
+ function "/" is new Vector_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "/");
+
+ function "/" is new Vector_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => "/");
+
+ function "/" is new Matrix_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Complex,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "/");
+
+ function "/" is new Matrix_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => "/");
+
+ -----------
+ -- "abs" --
+ -----------
+
+ function "abs" is new L2_Norm
+ (X_Scalar => Complex,
+ Result_Real => Real'Base,
+ X_Vector => Complex_Vector);
+
+ --------------
+ -- Argument --
+ --------------
+
+ function Argument is new Vector_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Real'Base,
+ X_Vector => Complex_Vector,
+ Result_Vector => Real_Vector,
+ Operation => Argument);
+
+ function Argument is new Vector_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Real'Base,
+ Left_Vector => Complex_Vector,
+ Result_Vector => Real_Vector,
+ Operation => Argument);
+
+ function Argument is new Matrix_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Real'Base,
+ X_Matrix => Complex_Matrix,
+ Result_Matrix => Real_Matrix,
+ Operation => Argument);
+
+ function Argument is new Matrix_Scalar_Elementwise_Operation
+ (Left_Scalar => Complex,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Real'Base,
+ Left_Matrix => Complex_Matrix,
+ Result_Matrix => Real_Matrix,
+ Operation => Argument);
+
+ ----------------------------
+ -- Compose_From_Cartesian --
+ ----------------------------
+
+ function Compose_From_Cartesian is new Vector_Elementwise_Operation
+ (X_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ X_Vector => Real_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => Compose_From_Cartesian);
+
+ function Compose_From_Cartesian is
+ new Vector_Vector_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Vector => Real_Vector,
+ Right_Vector => Real_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => Compose_From_Cartesian);
+
+ function Compose_From_Cartesian is new Matrix_Elementwise_Operation
+ (X_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ X_Matrix => Real_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => Compose_From_Cartesian);
+
+ function Compose_From_Cartesian is
+ new Matrix_Matrix_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Matrix => Real_Matrix,
+ Right_Matrix => Real_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => Compose_From_Cartesian);
+
+ ------------------------
+ -- Compose_From_Polar --
+ ------------------------
+
+ function Compose_From_Polar is
+ new Vector_Vector_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Vector => Real_Vector,
+ Right_Vector => Real_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => Compose_From_Polar);
+
+ function Compose_From_Polar is
+ new Vector_Vector_Scalar_Elementwise_Operation
+ (X_Scalar => Real'Base,
+ Y_Scalar => Real'Base,
+ Z_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ X_Vector => Real_Vector,
+ Y_Vector => Real_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => Compose_From_Polar);
+
+ function Compose_From_Polar is
+ new Matrix_Matrix_Elementwise_Operation
+ (Left_Scalar => Real'Base,
+ Right_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ Left_Matrix => Real_Matrix,
+ Right_Matrix => Real_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => Compose_From_Polar);
+
+ function Compose_From_Polar is
+ new Matrix_Matrix_Scalar_Elementwise_Operation
+ (X_Scalar => Real'Base,
+ Y_Scalar => Real'Base,
+ Z_Scalar => Real'Base,
+ Result_Scalar => Complex,
+ X_Matrix => Real_Matrix,
+ Y_Matrix => Real_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => Compose_From_Polar);
+
+ ---------------
+ -- Conjugate --
+ ---------------
+
+ function Conjugate is new Vector_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Complex,
+ X_Vector => Complex_Vector,
+ Result_Vector => Complex_Vector,
+ Operation => Conjugate);
+
+ function Conjugate is new Matrix_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Complex,
+ X_Matrix => Complex_Matrix,
+ Result_Matrix => Complex_Matrix,
+ Operation => Conjugate);
+
+ --------
+ -- Im --
+ --------
+
+ function Im is new Vector_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Real'Base,
+ X_Vector => Complex_Vector,
+ Result_Vector => Real_Vector,
+ Operation => Im);
+
+ function Im is new Matrix_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Real'Base,
+ X_Matrix => Complex_Matrix,
+ Result_Matrix => Real_Matrix,
+ Operation => Im);
+
+ -------------
+ -- Modulus --
+ -------------
+
+ function Modulus is new Vector_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Real'Base,
+ X_Vector => Complex_Vector,
+ Result_Vector => Real_Vector,
+ Operation => Modulus);
+
+ function Modulus is new Matrix_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Real'Base,
+ X_Matrix => Complex_Matrix,
+ Result_Matrix => Real_Matrix,
+ Operation => Modulus);
+
+ --------
+ -- Re --
+ --------
+
+ function Re is new Vector_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Real'Base,
+ X_Vector => Complex_Vector,
+ Result_Vector => Real_Vector,
+ Operation => Re);
+
+ function Re is new Matrix_Elementwise_Operation
+ (X_Scalar => Complex,
+ Result_Scalar => Real'Base,
+ X_Matrix => Complex_Matrix,
+ Result_Matrix => Real_Matrix,
+ Operation => Re);
+
+ ------------
+ -- Set_Im --
+ ------------
+
+ procedure Set_Im is new Update_Vector_With_Vector
+ (X_Scalar => Complex,
+ Y_Scalar => Real'Base,
+ X_Vector => Complex_Vector,
+ Y_Vector => Real_Vector,
+ Update => Set_Im);
+
+ procedure Set_Im is new Update_Matrix_With_Matrix
+ (X_Scalar => Complex,
+ Y_Scalar => Real'Base,
+ X_Matrix => Complex_Matrix,
+ Y_Matrix => Real_Matrix,
+ Update => Set_Im);
+
+ ------------
+ -- Set_Re --
+ ------------
+
+ procedure Set_Re is new Update_Vector_With_Vector
+ (X_Scalar => Complex,
+ Y_Scalar => Real'Base,
+ X_Vector => Complex_Vector,
+ Y_Vector => Real_Vector,
+ Update => Set_Re);
+
+ procedure Set_Re is new Update_Matrix_With_Matrix
+ (X_Scalar => Complex,
+ Y_Scalar => Real'Base,
+ X_Matrix => Complex_Matrix,
+ Y_Matrix => Real_Matrix,
+ Update => Set_Re);
+
+ -----------
+ -- Solve --
+ -----------
+
+ function Solve is
+ new Matrix_Vector_Solution (Complex, Complex_Vector, Complex_Matrix);
+
+ function Solve is
+ new Matrix_Matrix_Solution (Complex, Complex_Matrix);
+
+ -----------------
+ -- Unit_Matrix --
+ -----------------
+
+ function Unit_Matrix is new System.Generic_Array_Operations.Unit_Matrix
+ (Scalar => Complex,
+ Matrix => Complex_Matrix,
+ Zero => (0.0, 0.0),
+ One => (1.0, 0.0));
+
+ function Unit_Vector is new System.Generic_Array_Operations.Unit_Vector
+ (Scalar => Complex,
+ Vector => Complex_Vector,
+ Zero => (0.0, 0.0),
+ One => (1.0, 0.0));
+ end Instantiations;
+
+ ---------
+ -- "*" --
+ ---------
+
+ function "*"
+ (Left : Complex_Vector;
+ Right : Complex_Vector) return Complex
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Real_Vector;
+ Right : Complex_Vector) return Complex
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Vector;
+ Right : Real_Vector) return Complex
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex;
+ Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Vector;
+ Right : Complex) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Real'Base;
+ Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Vector;
+ Right : Real'Base) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Matrix;
+ Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Vector;
+ Right : Complex_Vector) return Complex_Matrix
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Vector;
+ Right : Complex_Matrix) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Matrix;
+ Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Real_Matrix;
+ Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Matrix;
+ Right : Real_Matrix) return Complex_Matrix
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Real_Vector;
+ Right : Complex_Vector) return Complex_Matrix
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Vector;
+ Right : Real_Vector) return Complex_Matrix
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Real_Vector;
+ Right : Complex_Matrix) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Vector;
+ Right : Real_Matrix) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Real_Matrix;
+ Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Matrix;
+ Right : Real_Vector) return Complex_Vector
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex;
+ Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Matrix;
+ Right : Complex) return Complex_Matrix
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Real'Base;
+ Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."*";
+
+ function "*"
+ (Left : Complex_Matrix;
+ Right : Real'Base) return Complex_Matrix
+ renames Instantiations."*";
+
+ ---------
+ -- "+" --
+ ---------
+
+ function "+" (Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."+";
+
+ function "+"
+ (Left : Complex_Vector;
+ Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."+";
+
+ function "+"
+ (Left : Real_Vector;
+ Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."+";
+
+ function "+"
+ (Left : Complex_Vector;
+ Right : Real_Vector) return Complex_Vector
+ renames Instantiations."+";
+
+ function "+" (Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."+";
+
+ function "+"
+ (Left : Complex_Matrix;
+ Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."+";
+
+ function "+"
+ (Left : Real_Matrix;
+ Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."+";
+
+ function "+"
+ (Left : Complex_Matrix;
+ Right : Real_Matrix) return Complex_Matrix
+ renames Instantiations."+";
+
+ ---------
+ -- "-" --
+ ---------
+
+ function "-"
+ (Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."-";
+
+ function "-"
+ (Left : Complex_Vector;
+ Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."-";
+
+ function "-"
+ (Left : Real_Vector;
+ Right : Complex_Vector) return Complex_Vector
+ renames Instantiations."-";
+
+ function "-"
+ (Left : Complex_Vector;
+ Right : Real_Vector) return Complex_Vector
+ renames Instantiations."-";
+
+ function "-" (Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."-";
+
+ function "-"
+ (Left : Complex_Matrix;
+ Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."-";
+
+ function "-"
+ (Left : Real_Matrix;
+ Right : Complex_Matrix) return Complex_Matrix
+ renames Instantiations."-";
+
+ function "-"
+ (Left : Complex_Matrix;
+ Right : Real_Matrix) return Complex_Matrix
+ renames Instantiations."-";
+
+ ---------
+ -- "/" --
+ ---------
+
+ function "/"
+ (Left : Complex_Vector;
+ Right : Complex) return Complex_Vector
+ renames Instantiations."/";
+
+ function "/"
+ (Left : Complex_Vector;
+ Right : Real'Base) return Complex_Vector
+ renames Instantiations."/";
+
+ function "/"
+ (Left : Complex_Matrix;
+ Right : Complex) return Complex_Matrix
+ renames Instantiations."/";
+
+ function "/"
+ (Left : Complex_Matrix;
+ Right : Real'Base) return Complex_Matrix
+ renames Instantiations."/";
+
+ -----------
+ -- "abs" --
+ -----------
+
+ function "abs" (Right : Complex_Vector) return Real'Base
+ renames Instantiations."abs";
+
+ --------------
+ -- Argument --
+ --------------
+
+ function Argument (X : Complex_Vector) return Real_Vector
+ renames Instantiations.Argument;
+
+ function Argument
+ (X : Complex_Vector;
+ Cycle : Real'Base) return Real_Vector
+ renames Instantiations.Argument;
+
+ function Argument (X : Complex_Matrix) return Real_Matrix
+ renames Instantiations.Argument;
+
+ function Argument
+ (X : Complex_Matrix;
+ Cycle : Real'Base) return Real_Matrix
+ renames Instantiations.Argument;
+
+ ----------------------------
+ -- Compose_From_Cartesian --
+ ----------------------------
+
+ function Compose_From_Cartesian (Re : Real_Vector) return Complex_Vector
+ renames Instantiations.Compose_From_Cartesian;
+
+ function Compose_From_Cartesian
+ (Re : Real_Vector;
+ Im : Real_Vector) return Complex_Vector
+ renames Instantiations.Compose_From_Cartesian;
+
+ function Compose_From_Cartesian (Re : Real_Matrix) return Complex_Matrix
+ renames Instantiations.Compose_From_Cartesian;
+
+ function Compose_From_Cartesian
+ (Re : Real_Matrix;
+ Im : Real_Matrix) return Complex_Matrix
+ renames Instantiations.Compose_From_Cartesian;
+
+ ------------------------
+ -- Compose_From_Polar --
+ ------------------------
+
+ function Compose_From_Polar
+ (Modulus : Real_Vector;
+ Argument : Real_Vector) return Complex_Vector
+ renames Instantiations.Compose_From_Polar;
+
+ function Compose_From_Polar
+ (Modulus : Real_Vector;
+ Argument : Real_Vector;
+ Cycle : Real'Base) return Complex_Vector
+ renames Instantiations.Compose_From_Polar;
+
+ function Compose_From_Polar
+ (Modulus : Real_Matrix;
+ Argument : Real_Matrix) return Complex_Matrix
+ renames Instantiations.Compose_From_Polar;
+
+ function Compose_From_Polar
+ (Modulus : Real_Matrix;
+ Argument : Real_Matrix;
+ Cycle : Real'Base) return Complex_Matrix
+ renames Instantiations.Compose_From_Polar;
+
+ ---------------
+ -- Conjugate --
+ ---------------
+
+ function Conjugate (X : Complex_Vector) return Complex_Vector
+ renames Instantiations.Conjugate;
+
+ function Conjugate (X : Complex_Matrix) return Complex_Matrix
+ renames Instantiations.Conjugate;
+
+ -----------------
+ -- Determinant --
+ -----------------
+
+ function Determinant (A : Complex_Matrix) return Complex is
+ M : Complex_Matrix := A;
+ B : Complex_Matrix (A'Range (1), 1 .. 0);
+ R : Complex;
+ begin
+ Forward_Eliminate (M, B, R);
+ return R;
+ end Determinant;
+
+ -----------------
+ -- Eigensystem --
+ -----------------
+
+ procedure Eigensystem
+ (A : Complex_Matrix;
+ Values : out Real_Vector;
+ Vectors : out Complex_Matrix)
+ is
+ N : constant Natural := Length (A);
+
+ -- For a Hermitian matrix C, we convert the eigenvalue problem to a
+ -- real symmetric one: if C = A + i * B, then the (N, N) complex
+ -- eigenvalue problem:
+ -- (A + i * B) * (u + i * v) = Lambda * (u + i * v)
+ --
+ -- is equivalent to the (2 * N, 2 * N) real eigenvalue problem:
+ -- [ A, B ] [ u ] = Lambda * [ u ]
+ -- [ -B, A ] [ v ] [ v ]
+ --
+ -- Note that the (2 * N, 2 * N) matrix above is symmetric, as
+ -- Transpose (A) = A and Transpose (B) = -B if C is Hermitian.
+
+ -- We solve this eigensystem using the real-valued algorithms. The final
+ -- result will have every eigenvalue twice, so in the sorted output we
+ -- just pick every second value, with associated eigenvector u + i * v.
+
+ M : Real_Matrix (1 .. 2 * N, 1 .. 2 * N);
+ Vals : Real_Vector (1 .. 2 * N);
+ Vecs : Real_Matrix (1 .. 2 * N, 1 .. 2 * N);
+
+ begin
+ for J in 1 .. N loop
+ for K in 1 .. N loop
+ declare
+ C : constant Complex :=
+ (A (A'First (1) + (J - 1), A'First (2) + (K - 1)));
+ begin
+ M (J, K) := Re (C);
+ M (J + N, K + N) := Re (C);
+ M (J + N, K) := Im (C);
+ M (J, K + N) := -Im (C);
+ end;
+ end loop;
+ end loop;
+
+ Eigensystem (M, Vals, Vecs);
+
+ for J in 1 .. N loop
+ declare
+ Col : constant Integer := Values'First + (J - 1);
+ begin
+ Values (Col) := Vals (2 * J);
+
+ for K in 1 .. N loop
+ declare
+ Row : constant Integer := Vectors'First (2) + (K - 1);
+ begin
+ Vectors (Row, Col)
+ := (Vecs (J * 2, Col), Vecs (J * 2, Col + N));
+ end;
+ end loop;
+ end;
+ end loop;
+ end Eigensystem;
+
+ -----------------
+ -- Eigenvalues --
+ -----------------
+
+ function Eigenvalues (A : Complex_Matrix) return Real_Vector is
+ -- See Eigensystem for a description of the algorithm
+
+ N : constant Natural := Length (A);
+ R : Real_Vector (A'Range (1));
+
+ M : Real_Matrix (1 .. 2 * N, 1 .. 2 * N);
+ Vals : Real_Vector (1 .. 2 * N);
+ begin
+ for J in 1 .. N loop
+ for K in 1 .. N loop
+ declare
+ C : constant Complex :=
+ (A (A'First (1) + (J - 1), A'First (2) + (K - 1)));
+ begin
+ M (J, K) := Re (C);
+ M (J + N, K + N) := Re (C);
+ M (J + N, K) := Im (C);
+ M (J, K + N) := -Im (C);
+ end;
+ end loop;
+ end loop;
+
+ Vals := Eigenvalues (M);
+
+ for J in 1 .. N loop
+ R (A'First (1) + (J - 1)) := Vals (2 * J);
+ end loop;
+
+ return R;
+ end Eigenvalues;
+
+ --------
+ -- Im --
+ --------
+
+ function Im (X : Complex_Vector) return Real_Vector
+ renames Instantiations.Im;
+
+ function Im (X : Complex_Matrix) return Real_Matrix
+ renames Instantiations.Im;
+
+ -------------
+ -- Inverse --
+ -------------
+
+ function Inverse (A : Complex_Matrix) return Complex_Matrix is
+ (Solve (A, Unit_Matrix (Length (A))));
+
+ -------------
+ -- Modulus --
+ -------------
+
+ function Modulus (X : Complex_Vector) return Real_Vector
+ renames Instantiations.Modulus;
+
+ function Modulus (X : Complex_Matrix) return Real_Matrix
+ renames Instantiations.Modulus;
+
+ --------
+ -- Re --
+ --------
+
+ function Re (X : Complex_Vector) return Real_Vector
+ renames Instantiations.Re;
+
+ function Re (X : Complex_Matrix) return Real_Matrix
+ renames Instantiations.Re;
+
+ ------------
+ -- Set_Im --
+ ------------
+
+ procedure Set_Im
+ (X : in out Complex_Matrix;
+ Im : Real_Matrix)
+ renames Instantiations.Set_Im;
+
+ procedure Set_Im
+ (X : in out Complex_Vector;
+ Im : Real_Vector)
+ renames Instantiations.Set_Im;
+
+ ------------
+ -- Set_Re --
+ ------------
+
+ procedure Set_Re
+ (X : in out Complex_Matrix;
+ Re : Real_Matrix)
+ renames Instantiations.Set_Re;
+
+ procedure Set_Re
+ (X : in out Complex_Vector;
+ Re : Real_Vector)
+ renames Instantiations.Set_Re;
+
+ -----------
+ -- Solve --
+ -----------
+
+ function Solve
+ (A : Complex_Matrix;
+ X : Complex_Vector) return Complex_Vector
+ renames Instantiations.Solve;
+
+ function Solve
+ (A : Complex_Matrix;
+ X : Complex_Matrix) return Complex_Matrix
+ renames Instantiations.Solve;
+
+ ---------------
+ -- Transpose --
+ ---------------
+
+ function Transpose
+ (X : Complex_Matrix) return Complex_Matrix
+ is
+ R : Complex_Matrix (X'Range (2), X'Range (1));
+ begin
+ Transpose (X, R);
+ return R;
+ end Transpose;
+
+ -----------------
+ -- Unit_Matrix --
+ -----------------
+
+ function Unit_Matrix
+ (Order : Positive;
+ First_1 : Integer := 1;
+ First_2 : Integer := 1) return Complex_Matrix
+ renames Instantiations.Unit_Matrix;
+
+ -----------------
+ -- Unit_Vector --
+ -----------------
+
+ function Unit_Vector
+ (Index : Integer;
+ Order : Positive;
+ First : Integer := 1) return Complex_Vector
+ renames Instantiations.Unit_Vector;
+
+end Ada.Numerics.Generic_Complex_Arrays;