Skip to content

Commit f98ef76

Browse files
committed
Debuging solve_triangular (not solved)
1 parent 3abe98f commit f98ef76

File tree

3 files changed

+128
-9
lines changed

3 files changed

+128
-9
lines changed

src/impl2/triangular.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,16 @@ impl Triangular_ for $scalar {
3434
let (n, _) = al.size();
3535
let lda = al.lda();
3636
let nrhs = bl.len();
37-
let ldb = bl.lda();
37+
let ldb = match al {
38+
Layout::C(_) => bl.len() as i32,
39+
Layout::F(_) => bl.lda() as i32,
40+
};
41+
println!("al = {:?}", al);
42+
println!("bl = {:?}", bl);
43+
println!("n = {}", n);
44+
println!("lda = {}", lda);
45+
println!("nrhs = {}", nrhs);
46+
println!("ldb = {}", ldb);
3847
let info = $trtrs(al.lapacke_layout(), uplo as u8, Transpose::No as u8, diag as u8, n, nrhs, a, lda, &mut b, ldb);
3948
into_result(info, ())
4049
}

src/layout.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,11 @@ impl<A, S> AllocatedArray for ArrayBase<S, Ix1>
109109
type Elem = A;
110110

111111
fn layout(&self) -> Result<Layout> {
112-
Ok(Layout::F((self.len() as i32, 1)))
112+
Ok(Layout::F((1, self.len() as i32)))
113113
}
114114

115115
fn square_layout(&self) -> Result<Layout> {
116-
Err(NotSquareError::new(self.len() as i32, 1).into())
116+
Err(NotSquareError::new(1, self.len() as i32).into())
117117
}
118118

119119
fn as_allocated(&self) -> Result<&[A]> {

tests/triangular.rs

Lines changed: 116 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,128 @@ use ndarray_linalg::prelude::*;
99
fn test1d<A, Sa, Sb, Tol>(uplo: UPLO, a: ArrayBase<Sa, Ix2>, b: ArrayBase<Sb, Ix1>, tol: Tol)
1010
where A: Field + Absolute<Output = Tol>,
1111
Sa: Data<Elem = A>,
12-
Sb: DataMut<Elem = A> + DataClone,
12+
Sb: DataMut<Elem = A> + DataOwned,
1313
Tol: RealField
1414
{
1515
println!("a = {:?}", &a);
1616
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);
1919
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);
21128
}
22129

23130
#[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);
26136
}

0 commit comments

Comments
 (0)