BUG DESCRIPTION:
----------------
det(sparse) -- actually %sp_det() -- is poorly implemented: Nan is returned even for almost any sparse matrix as small as 200x200 or even smaller.
In addition, the syntax [e,m] = det(sparse) that aims to overcome underflow or overflow is not actually implemented:
--> n = 100;
--> while n < 5000
> s = triu(sprand(n,n,1));
> [e,m] = det(s);
> ref = prod(diag(s));
> mprintf("%d: %g, e=%d m=%g, ref=%g\n", n, det(s),e,m,ref);
> n = n*2;
> end
100: 2.65945e-37, e=0 m=2.65945e-37, ref=2.65945e-37
200: Nan, e=0 m=Nan, ref=3.99071e-77
400: Nan, e=0 m=Nan, ref=6.91694e-184
800: Nan, e=0 m=Nan, ref=0
1600: Nan, e=0 m=Nan, ref=0
3200: Nan, e=0 m=Nan, ref=0
--> n = 100;
--> while n < 5000
> s = triu(sprand(n,n,1))*6;
> [e,m] = det(s);
> ref = prod(diag(s));
> mprintf("%d: %g, e=%d m=%g, ref=%g\n", n, det(s),e,m,ref);
> n = n*2;
> end
100: 1.08815e+37, e=37 m=1.08815, ref=1.08815e+37
200: Nan, e=0 m=Nan, ref=1.56008e+79
400: Nan, e=0 m=Nan, ref=6.97534e+126
800: Nan, e=0 m=Nan, ref=1.21035e+285
1600: Nan, e=0 m=Nan, ref=Inf
3200: Nan, e=0 m=Nan, ref=Inf
We should rather have results like this:
---------------------------------------
--> n = 100;
--> while n < 5000
> s = triu(sprand(n,n,1));
> [e,m] = det(s);
> ref = prod(diag(s));
> mprintf("%d: %g, e=%d m=%g, ref=%g\n", n, det(s),e,m,ref);
> n = n*2;
> end
100: 1.70647e-46, e=-46 m=1.70647, ref=1.70647e-46
200: 4.56006e-87, e=-87 m=4.56006, ref=4.56006e-87
400: 8.16884e-174, e=-174 m=8.16884, ref=8.16884e-174
800: 0, e=-375 m=4.14429, ref=0
1600: 0, e=-736 m=6.2887, ref=0
3200: 0, e=-1410 m=3.64883, ref=0
--> n = 100;
--> while n < 5000
> s = triu(sprand(n,n,1))*6;
> [e,m] = det(s);
> ref = prod(diag(s));
> mprintf("%d: %g, e=%d m=%g, ref=%g\n", n, det(s),e,m,ref);
> n = n*2;
> end
100: 1.89918e+36, e=36 m=1.89918, ref=1.89918e+36
200: 1.51192e+66, e=66 m=1.51192, ref=1.51192e+66
400: 6.58242e+136, e=136 m=6.58242, ref=6.58242e+136
800: 1.76331e+271, e=271 m=1.76331, ref=1.76331e+271
1600: Inf, e=547 m=1.58887, ref=Inf
3200: Inf, e=1123 m=7.09799, ref=Inf
These issues prevent detecting null determinants like here:
--> s = sprand(500,500,0.1);
--> det(s)
ans =
Nan
--> s(:,2)=s(:,1); det(s) // should be 0
ans =
Nan
ERROR LOG:
----------
None. Wrong results.
In addition, there is a disturbing warning about "matrix is singular".
HOW TO REPRODUCE THE BUG:
-------------------------
n = 100;
while n < 5000
s = triu(sprand(n,n,1));
[e,m] = det(s);
ref = prod(diag(s));
mprintf("%d: %g, e=%d m=%g, ref=%g\n", n, det(s),e,m,ref);
n = n*2;
end
n = 100;
while n < 5000
s = triu(sprand(n,n,1))*6;
[e,m] = det(s);
ref = prod(diag(s));
mprintf("%d: %g, e=%d m=%g, ref=%g\n", n, det(s),e,m,ref);
n = n*2;
end
s = sprand(500,500,0.1); s(:,2)=s(:,1);
det(s)==0
OTHER INFORMATION:
------------------