reason scipy factors only square sparse matrices Problem is basically in _superlu.gstrf <https://github.com/scipy/scipy/blob/4edfcaa3ce8a387450b6efce968572def71be089/scipy/sparse/linalg/_dsolve/linsolve.py#L437>it accepts only one dimension as input rather than both row and col. In c implementation <https://github.com/scipy/scipy/blob/4edfcaa3ce8a387450b6efce968572def71be089/scipy/sparse/linalg/_dsolve/_superlumodule.c#L202> we can see it uses N only <https://github.com/scipy/scipy/blob/4edfcaa3ce8a387450b6efce968572def71be089/scipy/sparse/linalg/_dsolve/_superlumodule.c#L246> and assumes A to be square matrix.
Currently I am going with the solution given by *Dima* which uses block matrices. On Wednesday, February 28, 2024 at 9:49:07 PM UTC+5:30 Animesh Shree wrote: > Yes > Because of same reason I tried to commented scipy code > <https://github.com/scipy/scipy/blob/4edfcaa3ce8a387450b6efce968572def71be089/scipy/sparse/linalg/_dsolve/linsolve.py#L423C1-L424C77> > > to test this. > > I got some error saying *RuntimeError: Factor is exactly singular* > But same worked for sage LU factorization in dense matrix for same matrix. > > -----Scipy (Modified)------ > >>> from scipy.sparse import csc_matrix > >>> from scipy.sparse.linalg import splu > >>> import numpy as np > >>> A = csc_matrix([[1,0,0],[5,0,2]], dtype=np.float64) > >>> print(A) > (0, 0) 1.0 > (1, 0) 5.0 > (1, 2) 2.0 > >>> splu(A) > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File > "/home/shay/miniconda3/envs/py39/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py", > > line 440, in splu > return _superlu.gstrf(N, A.nnz, A.data, indices, indptr, > RuntimeError: Factor is exactly singular > >>> > > > > > -----Sage------- > sage: A = Matrix(RDF, 2,3, [[1,0,0],[5,0,2]]) > sage: A > [1.0 0.0 0.0] > [5.0 0.0 2.0] > sage: A.LU() > ( > [0.0 1.0] [1.0 0.0] [ 5.0 0.0 2.0] > [1.0 0.0], [0.2 1.0], [ 0.0 0.0 -0.4] > ) > > > > I am looking into it too. > > > On Wednesday, February 28, 2024 at 8:59:36 PM UTC+5:30 Dima Pasechnik > wrote: > >> There is a good reason for numerics people to adopt "SuperLU" >> factorisations over >> the classical PLU sparse decomposition - namely, it's more stable. >> Perhaps it should be made the Sage's default for sparse RDF matrices, too. >> By the way, >> https://portal.nersc.gov/project/sparse/superlu/superlu_ug.pdf >> (the manual for the upstream superlu) says it can handle non-square >> matrices. >> >> Dima >> >> >> >> >> >> >> >> >> On Wed, Feb 28, 2024 at 1:09 PM 'Animesh Shree' via sage-devel < >> sage-...@googlegroups.com> wrote: >> >>> I went through the link. >>> It also returns perm_c and perm_r and the solution is represented as >>> >>> Pr * (R^-1) * A * Pc = L * U >>> >>> It is similar to one returned by scipy >>> >>> lu.perm_r >>> >>> array([0, 2, 1, 3], dtype=int32) >>> >>> >>> lu.perm_c >>> >>> array([2, 0, 1, 3], dtype=int32) >>> >>> I think it doesn't support square matrix too. Link >>> <https://github.com/scikit-umfpack/scikit-umfpack/blob/ce77944bce003a29771ae07be182af348c3eadce/scikits/umfpack/interface.py#L199C1-L200C81> >>> On Wednesday, February 28, 2024 at 6:17:26 PM UTC+5:30 Max Alekseyev >>> wrote: >>> >>>> One more option would be umfack via scikits.umfpack: >>>> >>>> https://scikit-umfpack.github.io/scikit-umfpack/reference/scikits.umfpack.UmfpackLU.html >>>> >>>> Regards, >>>> Max >>>> On Wednesday, February 28, 2024 at 7:07:53 AM UTC-5 Animesh Shree wrote: >>>> >>>>> One thing I would like to suggest. >>>>> >>>>> We can provide multiple ways to compute the sparse LU >>>>> 1. scipy >>>>> 2. sage original implementation in src.sage.matrix.matrix2.LU >>>>> <https://github.com/sagemath/sage/blob/acbe15dcd87085d4fa177705ec01107b53a026ef/src/sage/matrix/matrix2.pyx#L13160> >>>>> (Note >>>>> - link >>>>> <https://github.com/sagemath/sage/blob/acbe15dcd87085d4fa177705ec01107b53a026ef/src/sage/matrix/matrix2.pyx#L13249C1-L13254C51> >>>>> ) >>>>> 3. convert to dense then factor >>>>> >>>>> It will be up to user to choose based on the complexity. >>>>> Is it fine? >>>>> >>>>> On Wednesday, February 28, 2024 at 4:30:51 PM UTC+5:30 Animesh Shree >>>>> wrote: >>>>> >>>>>> Thank you for reminding >>>>>> I went through. >>>>>> We need to Decompose A11 only and rest can be calculated via taking >>>>>> inverse of L11 or U11. >>>>>> Here A11 is square matrix and we can use scipy to decompose square >>>>>> matrices. >>>>>> Am I correct? >>>>>> >>>>>> New and only problem that I see is the returned LU decomposition of >>>>>> scipy's splu is calculated by full permutation of row and column as >>>>>> pointed >>>>>> out by *Nils Bruin*. We will be returning row and col permutation >>>>>> array/matrix separately instead of single row permutation which sage >>>>>> usage generally for plu decomposition. >>>>>> User will have to manage row and col permutations. >>>>>> or else >>>>>> We can return handler function for reconstruction of matrix from L, >>>>>> U & p={perm_r, perm_c} >>>>>> or >>>>>> We can leave that to user >>>>>> User will have to permute its input data according to perm_c (like : >>>>>> perm_c * input) before using the perm_r^(-1) * L * U >>>>>> as perm_r^(-1) * L * U is PLU decomposition of Original_matrix*perm_c >>>>>> >>>>>> https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.SuperLU.html >>>>>> >>> A = Pr^(-1) *L*U * Pc^(-1) # as told by *Nils Bruin* >>>>>> or >>>>>> scipy's splu will not do. >>>>>> >>>>>> On Tuesday, February 27, 2024 at 11:57:02 PM UTC+5:30 Dima Pasechnik >>>>>> wrote: >>>>>> >>>>>>> >>>>>>> >>>>>>> On 27 February 2024 17:25:51 GMT, 'Animesh Shree' via sage-devel < >>>>>>> sage-...@googlegroups.com> wrote: >>>>>>> >This works good if input is square and I also checked on your idea >>>>>>> of >>>>>>> >padding zeros for non square matrices. >>>>>>> >I am currently concerned about the permutation matrix and L, U in >>>>>>> case of >>>>>>> >padded 0s. Because if we pad then how will they affect the outputs, >>>>>>> so that >>>>>>> >we can extract p,l,u for unpadded matrix. >>>>>>> >>>>>>> please read details I wrote on how to deal with the non-square case. >>>>>>> There is no padding needed. >>>>>>> >>>>>>> >>>>>>> > >>>>>>> >On Tuesday, February 27, 2024 at 10:03:25 PM UTC+5:30 Dima >>>>>>> Pasechnik wrote: >>>>>>> > >>>>>>> >> >>>>>>> >> >>>>>>> >> On 27 February 2024 15:34:20 GMT, 'Animesh Shree' via sage-devel >>>>>>> < >>>>>>> >> sage-...@googlegroups.com> wrote: >>>>>>> >> >I tried scipy which uses superLU. We get the result but there is >>>>>>> little >>>>>>> >> bit >>>>>>> >> >of issue. >>>>>>> >> > >>>>>>> >> > >>>>>>> >> >--For Dense-- >>>>>>> >> >The dense matrix factorization gives this output using >>>>>>> permutation matrix >>>>>>> >> >sage: a = Matrix(RDF, [[1, 0],[2, 1]], sparse=True) >>>>>>> >> >sage: a >>>>>>> >> >[1.0 0.0] >>>>>>> >> >[2.0 1.0] >>>>>>> >> >sage: p,l,u = a.dense_matrix().LU() >>>>>>> >> >sage: p >>>>>>> >> >[0.0 1.0] >>>>>>> >> >[1.0 0.0] >>>>>>> >> >sage: l >>>>>>> >> >[1.0 0.0] >>>>>>> >> >[0.5 1.0] >>>>>>> >> >sage: u >>>>>>> >> >[ 2.0 1.0] >>>>>>> >> >[ 0.0 -0.5] >>>>>>> >> > >>>>>>> >> >>>>>>> >> you'd probably want to convert the permutation matrix into a >>>>>>> permutation. >>>>>>> >> >>>>>>> >> >>>>>>> >> >--For Sparse-- >>>>>>> >> >But the scipy LU decomposition uses permutations which involves >>>>>>> taking >>>>>>> >> >transpose, also the output permutations are represented as >>>>>>> array. >>>>>>> >> >>>>>>> >> It is very normal to represent permutations as arrays. >>>>>>> >> One can reconstruct the permutation matrix from such an array >>>>>>> trivially >>>>>>> >> (IIRC, Sage even has a function for it) >>>>>>> >> >>>>>>> >> I am not sure what you mean by "taking transpose". >>>>>>> >> >>>>>>> >> >sage: p,l,u = a.LU(force=True) >>>>>>> >> >sage: p >>>>>>> >> >{'perm_r': [1, 0], 'perm_c': [1, 0]} >>>>>>> >> >sage: l >>>>>>> >> >[1.0 0.0] >>>>>>> >> >[0.0 1.0] >>>>>>> >> >sage: u >>>>>>> >> >[1.0 2.0] >>>>>>> >> >[0.0 1.0] >>>>>>> >> > >>>>>>> >> > >>>>>>> >> >Shall I continue with this? >>>>>>> >> >>>>>>> >> sure, you are quite close to getting it all done it seems. >>>>>>> >> >>>>>>> >> >>>>>>> >> >On Tuesday, February 6, 2024 at 11:29:07 PM UTC+5:30 Dima >>>>>>> Pasechnik wrote: >>>>>>> >> > >>>>>>> >> >> Non-square case for LU is in fact easy. Note that if you have >>>>>>> A=LU as >>>>>>> >> >> a block matrix >>>>>>> >> >> A11 A12 >>>>>>> >> >> A21 A22 >>>>>>> >> >> >>>>>>> >> >> then its LU-factors L and U are >>>>>>> >> >> L11 0 and U11 U12 >>>>>>> >> >> L21 L22 0 U22 >>>>>>> >> >> >>>>>>> >> >> and A11=L11 U11, A12=L11 U12, A21=L21 U11, A22=L21 U12+L22 U22 >>>>>>> >> >> >>>>>>> >> >> Assume that A11 is square and full rank (else one may apply >>>>>>> >> >> permutations of rows and columns in the usual way). while >>>>>>> A21=0 and >>>>>>> >> >> A22=0. Then one can take L21=0, L22=U22=0, while A12=L11 U12 >>>>>>> >> >> implies U12=L11^-1 A12. >>>>>>> >> >> That is, we can first compute LU-decomposition of a square >>>>>>> matrix A11, >>>>>>> >> >> and then compute U12 from it and A. >>>>>>> >> >> >>>>>>> >> >> Similarly, if instead A12=0 and A22=0, then we can take U12=0, >>>>>>> >> >> L22=U22=0, and A21=L21 U11, >>>>>>> >> >> i.e. L21=A21 U11^-1, and again we compute LU-decomposition of >>>>>>> A11, and >>>>>>> >> >> then L21=A21 U11^-1. >>>>>>> >> >> >>>>>>> >> >> ---------------- >>>>>>> >> >> >>>>>>> >> >> Note that in some cases one cannot get LU, but instead must go >>>>>>> for an >>>>>>> >> >> PLU,with P a permutation matrix. >>>>>>> >> >> For non-square matrices this seems a bit more complicated, >>>>>>> but, well, >>>>>>> >> >> still doable. >>>>>>> >> >> >>>>>>> >> >> HTH >>>>>>> >> >> Dima >>>>>>> >> >> >>>>>>> >> >> >>>>>>> >> >> >>>>>>> >> >> >>>>>>> >> >> On Mon, Feb 5, 2024 at 6:00 PM Nils Bruin <nbr...@sfu.ca> >>>>>>> wrote: >>>>>>> >> >> > >>>>>>> >> >> > On Monday 5 February 2024 at 02:31:04 UTC-8 Dima Pasechnik >>>>>>> wrote: >>>>>>> >> >> > >>>>>>> >> >> > >>>>>>> >> >> > it is the matter of adding extra zero rows or columns to the >>>>>>> matrix >>>>>>> >> you >>>>>>> >> >> want to decompose. This could be a quick fix. >>>>>>> >> >> > >>>>>>> >> >> > (in reference to computing LU decompositions of non-square >>>>>>> matrices) >>>>>>> >> -- >>>>>>> >> >> in a numerical setting, adding extra zero rows/columns may not >>>>>>> be such >>>>>>> >> an >>>>>>> >> >> attractive option: if previously you know you had a maximal >>>>>>> rank >>>>>>> >> matrix, >>>>>>> >> >> you have now ruined it by the padding. It's worth checking the >>>>>>> >> >> documentation and literature if padding is >>>>>>> appropriate/desirable for >>>>>>> >> the >>>>>>> >> >> target algorithm/implementation. >>>>>>> >> >> > >>>>>>> >> >> > -- >>>>>>> >> >> > You received this message because you are subscribed to the >>>>>>> Google >>>>>>> >> >> Groups "sage-devel" group. >>>>>>> >> >> > To unsubscribe from this group and stop receiving emails >>>>>>> from it, >>>>>>> >> send >>>>>>> >> >> an email to sage-devel+...@googlegroups.com. >>>>>>> >> >> > To view this discussion on the web visit >>>>>>> >> >> >>>>>>> >> >>>>>>> https://groups.google.com/d/msgid/sage-devel/622a01e0-9197-40c5-beda-92729c4e4a32n%40googlegroups.com >>>>>>> >>>>>>> >> >> . >>>>>>> >> >> >>>>>>> >> > >>>>>>> >> >>>>>>> > >>>>>>> >>>>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "sage-devel" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to sage-devel+...@googlegroups.com. >>> >> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/sage-devel/7a28f65b-a68d-4758-862e-b07d2e859d8bn%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/sage-devel/7a28f65b-a68d-4758-862e-b07d2e859d8bn%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-devel/d13d3977-7067-436c-a108-a3cfd13199ban%40googlegroups.com.