@@ -9,18 +9,128 @@ use ndarray_linalg::prelude::*;
9
9
fn test1d < A , Sa , Sb , Tol > ( uplo : UPLO , a : ArrayBase < Sa , Ix2 > , b : ArrayBase < Sb , Ix1 > , tol : Tol )
10
10
where A : Field + Absolute < Output = Tol > ,
11
11
Sa : Data < Elem = A > ,
12
- Sb : DataMut < Elem = A > + DataClone ,
12
+ Sb : DataMut < Elem = A > + DataOwned ,
13
13
Tol : RealField
14
14
{
15
15
println ! ( "a = {:?}" , & a) ;
16
16
println ! ( "b = {:?}" , & b) ;
17
- let ans = b . clone ( ) ;
18
- let x = a . solve_triangular ( uplo , Diag :: NonUnit , b ) . unwrap ( ) ;
17
+ let x = a . solve_triangular ( uplo , Diag :: NonUnit , & b ) . unwrap ( ) ;
18
+ println ! ( " x = {:?}" , & x ) ;
19
19
let b_ = a. dot ( & x) ;
20
- assert_close_l2 ! ( & b_, & ans, tol) ;
20
+ println ! ( "Ax = {:?}" , & b_) ;
21
+ assert_close_l2 ! ( & b_, & b, tol) ;
22
+ }
23
+
24
+ fn test2d < A , Sa , Sb , Tol > ( uplo : UPLO , a : ArrayBase < Sa , Ix2 > , b : ArrayBase < Sb , Ix2 > , tol : Tol )
25
+ where A : Field + Absolute < Output = Tol > ,
26
+ Sa : Data < Elem = A > ,
27
+ Sb : DataMut < Elem = A > + DataOwned ,
28
+ Tol : RealField
29
+ {
30
+ println ! ( "a = {:?}" , & a) ;
31
+ println ! ( "b = {:?}" , & b) ;
32
+ let x = a. solve_triangular ( uplo, Diag :: NonUnit , & b) . unwrap ( ) ;
33
+ println ! ( "x = {:?}" , & x) ;
34
+ let b_ = a. dot ( & x) ;
35
+ println ! ( "Ax = {:?}" , & b_) ;
36
+ println ! ( "A^Tx = {:?}" , a. t( ) . dot( & x) ) ;
37
+ println ! ( "Ax^T = {:?}" , a. dot( & x. t( ) ) ) ;
38
+ println ! ( "(Ax^T)^T = {:?}" , a. dot( & x. t( ) ) . t( ) ) ;
39
+ assert_close_l2 ! ( & b_, & b, tol) ;
40
+ }
41
+
42
+ #[ test]
43
+ fn triangular_1d_upper ( ) {
44
+ let n = 3 ;
45
+ let b: Array1 < f64 > = random_vector ( n) ;
46
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Upper ) ;
47
+ test1d ( UPLO :: Upper , a, b. clone ( ) , 1e-7 ) ;
48
+ }
49
+
50
+ #[ test]
51
+ fn triangular_1d_lower ( ) {
52
+ let n = 3 ;
53
+ let b: Array1 < f64 > = random_vector ( n) ;
54
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Lower ) ;
55
+ test1d ( UPLO :: Lower , a, b. clone ( ) , 1e-7 ) ;
56
+ }
57
+
58
+ #[ test]
59
+ fn triangular_1d_lower_t ( ) {
60
+ let n = 3 ;
61
+ let b: Array1 < f64 > = random_vector ( n) ;
62
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Lower ) . reversed_axes ( ) ;
63
+ test1d ( UPLO :: Upper , a, b. clone ( ) , 1e-7 ) ;
64
+ }
65
+
66
+ #[ test]
67
+ fn triangular_1d_upper_t ( ) {
68
+ let n = 3 ;
69
+ let b: Array1 < f64 > = random_vector ( n) ;
70
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Upper ) . reversed_axes ( ) ;
71
+ test1d ( UPLO :: Lower , a, b. clone ( ) , 1e-7 ) ;
72
+ }
73
+
74
+ #[ test]
75
+ fn triangular_2d_upper ( ) {
76
+ let n = 3 ;
77
+ let b: Array2 < f64 > = random_square ( n) ;
78
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Upper ) ;
79
+ test2d ( UPLO :: Upper , a, b. clone ( ) , 1e-7 ) ;
80
+ }
81
+
82
+ #[ test]
83
+ fn triangular_2d_lower ( ) {
84
+ let n = 3 ;
85
+ let b: Array2 < f64 > = random_square ( n) ;
86
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Lower ) ;
87
+ test2d ( UPLO :: Lower , a, b. clone ( ) , 1e-7 ) ;
88
+ }
89
+
90
+ #[ test]
91
+ fn triangular_2d_lower_t ( ) {
92
+ let n = 3 ;
93
+ let b: Array2 < f64 > = random_square ( n) ;
94
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Lower ) . reversed_axes ( ) ;
95
+ test2d ( UPLO :: Upper , a, b. clone ( ) , 1e-7 ) ;
96
+ }
97
+
98
+ #[ test]
99
+ fn triangular_2d_upper_t ( ) {
100
+ let n = 3 ;
101
+ let b: Array2 < f64 > = random_square ( n) ;
102
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Upper ) . reversed_axes ( ) ;
103
+ test2d ( UPLO :: Lower , a, b. clone ( ) , 1e-7 ) ;
104
+ }
105
+
106
+ #[ test]
107
+ fn triangular_2d_upper_bt ( ) {
108
+ let n = 3 ;
109
+ let b: Array2 < f64 > = random_square ( n) . reversed_axes ( ) ;
110
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Upper ) ;
111
+ test2d ( UPLO :: Upper , a, b. clone ( ) , 1e-7 ) ;
112
+ }
113
+
114
+ #[ test]
115
+ fn triangular_2d_lower_bt ( ) {
116
+ let n = 3 ;
117
+ let b: Array2 < f64 > = random_square ( n) . reversed_axes ( ) ;
118
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Lower ) ;
119
+ test2d ( UPLO :: Lower , a, b. clone ( ) , 1e-7 ) ;
120
+ }
121
+
122
+ #[ test]
123
+ fn triangular_2d_lower_t_bt ( ) {
124
+ let n = 3 ;
125
+ let b: Array2 < f64 > = random_square ( n) . reversed_axes ( ) ;
126
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Lower ) . reversed_axes ( ) ;
127
+ test2d ( UPLO :: Upper , a, b. clone ( ) , 1e-7 ) ;
21
128
}
22
129
23
130
#[ test]
24
- fn triangular_rand ( ) {
25
- let a = random_square ( n) ;
131
+ fn triangular_2d_upper_t_bt ( ) {
132
+ let n = 3 ;
133
+ let b: Array2 < f64 > = random_square ( n) . reversed_axes ( ) ;
134
+ let a: Array2 < f64 > = random_square ( n) . into_triangular ( UPLO :: Upper ) . reversed_axes ( ) ;
135
+ test2d ( UPLO :: Lower , a, b. clone ( ) , 1e-7 ) ;
26
136
}
0 commit comments