1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use nalgebra::{Dim, Matrix, RealField, SquareMatrix, Vector};
use nalgebra::constraint::{DimEq, ShapeConstraint};
use nalgebra::storage::{Storage, StorageMut};
pub fn quadform_tr<N: Copy + RealField, D1, S, R3, C3, S3, D4, S4>(
    mat: &mut SquareMatrix<N, D1, S>,
    alpha: N,
    lhs: &Matrix<N, R3, C3, S3>,
    mid: &Vector<N, D4, S4>,
    beta: N,
) where
    D1: Dim,
    S: StorageMut<N, D1, D1>,
    R3: Dim,
    C3: Dim,
    D4: Dim,
    S3: Storage<N, R3, C3>,
    S4: Storage<N, D4>,
    ShapeConstraint: DimEq<D1, R3> + DimEq<C3, D4>,
{
    mat.ger(alpha * mid[0], &lhs.column(0), &lhs.column(0), beta);
    for j in 1..mid.nrows() {
        mat.ger(alpha * mid[j], &lhs.column(j), &lhs.column(j), N::one());
    }
}
pub fn quadform_tr_x<N: Copy + RealField, D1, S, R3, C3, S3>(
    mat: &mut SquareMatrix<N, D1, S>,
    alpha: N,
    lhs: &Matrix<N, R3, C3, S3>,
    beta: N,
) where
    D1: Dim,
    S: StorageMut<N, D1, D1>,
    R3: Dim,
    C3: Dim,
    S3: Storage<N, R3, C3>,
    ShapeConstraint: DimEq<D1, R3>,
{
    mat.ger(alpha, &lhs.column(0), &lhs.column(0), beta);
    for j in 1..lhs.ncols() {
        mat.ger(alpha, &lhs.column(j), &lhs.column(j), N::one());
    }
}
pub fn check_positive<N: RealField>(rcond: N, message: &str) -> Result<N, &str> {
    if rcond > N::zero() {
        Ok(rcond)
    } else {
        Err(message)
    }
}
pub fn check_non_negativ<N: RealField>(rcond: N, message: &str) -> Result<N, &str> {
    if rcond >= N::zero() {
        Ok(rcond)
    } else {
        Err(message)
    }
}