+2011-10-13 Geert Bosch <bosch@adacore.com>
+
+ * a-ngrear.adb ("abs"): Adjust for modified L2_Norm generic
+ * s-gearop.ads (L2_Norm): Change profile to be suitable for
+ Complex_Vector
+ * s-gearop.adb (L2_Norm): Reimplement using direct definition,
+ not inner product
+
2011-10-13 Robert Dewar <dewar@adacore.com>
* exp_ch5.adb, sem_ch3.adb, impunit.adb, impunit.ads, sem_type.adb,
function "abs" is new
L2_Norm
- (Scalar => Real'Base,
- Vector => Real_Vector,
- Inner_Product => "*",
- Sqrt => Sqrt);
+ (X_Scalar => Real'Base,
+ Result_Real => Real'Base,
+ X_Vector => Real_Vector,
+ "abs" => "+");
+ -- While the L2_Norm by definition uses the absolute values of the
+ -- elements of X_Vector, for real values the subsequent squaring
+ -- makes this unnecessary, so we substitute the "+" identity function
+ -- instead.
function "abs" is new
Vector_Elementwise_Operation
-- L2_Norm --
-------------
- function L2_Norm (X : Vector) return Scalar is
+ function L2_Norm (X : X_Vector) return Result_Real'Base is
+ Sum : Result_Real'Base := 0.0;
begin
- return Sqrt (Inner_Product (X, X));
+ for J in X'Range loop
+ Sum := Sum + Result_Real'Base (abs X (J))**2;
+ end loop;
+
+ return Sqrt (Sum);
end L2_Norm;
----------------------------------
-------------
generic
- type Scalar is private;
- type Vector is array (Integer range <>) of Scalar;
- with function Inner_Product (Left, Right : Vector) return Scalar is <>;
- with function Sqrt (X : Scalar) return Scalar is <>;
- function L2_Norm (X : Vector) return Scalar;
+ type X_Scalar is private;
+ type Result_Real is digits <>;
+ type X_Vector is array (Integer range <>) of X_Scalar;
+ with function "abs" (Right : X_Scalar) return Result_Real is <>;
+ with function Sqrt (X : Result_Real'Base) return Result_Real'Base is <>;
+ function L2_Norm (X : X_Vector) return Result_Real'Base;
-------------------
-- Outer_Product --