@@ -9,24 +9,35 @@ function nterms(t)
99end
1010# Soft pivoted
1111# Note: we call this function with a matrix of Union{SymbolicUtils.Symbolic, Any}
12- # It should work as-is with Operation type too.
13- function sym_lu (A )
12+ function sym_lu (A; check = true )
13+ SINGULAR = typemax (Int )
1414 m, n = size (A)
1515 F = map (x-> x isa Num ? x : Num (x), A)
1616 minmn = min (m, n)
1717 p = Vector {BlasInt} (undef, minmn)
18- info = zero (BlasInt)
18+ info = 0
1919 for k = 1 : minmn
20- val, i = findmin (map (ii-> _iszero (F[ii, k]) ? Inf : nterms (F[ii,k]), k: n))
21- if ! (val isa Symbolic) && (val isa Number) && val == Inf && iszero (info)
20+ kp = k
21+ amin = SINGULAR
22+ for i in k: m
23+ absi = _iszero (F[i, k]) ? SINGULAR : nterms (F[i,k])
24+ if absi < amin
25+ kp = i
26+ amin = absi
27+ end
28+ end
29+
30+ p[k] = kp
31+
32+ if amin == SINGULAR && ! (amin isa Symbolic) && (amin isa Number) && iszero (info)
2233 info = k
2334 end
24- i += k - 1
35+
2536 # swap
2637 for j in 1 : n
27- F[k, j], F[i , j] = F[i , j], F[k, j]
38+ F[k, j], F[kp , j] = F[kp , j], F[k, j]
2839 end
29- p[k] = i
40+
3041 for i in k+ 1 : m
3142 F[i, k] = F[i, k] / F[k, k]
3243 end
@@ -36,7 +47,8 @@ function sym_lu(A)
3647 end
3748 end
3849 end
39- LU (F, p, info)
50+ check && LinearAlgebra. checknonsingular (info, Val {true} ())
51+ LU (F, p, convert (BlasInt, info))
4052end
4153
4254# Given a vector of equations and a
0 commit comments