Ok, I will do the same. On Thursday, February 29, 2024 at 12:11:56 AM UTC+5:30 Dima Pasechnik wrote:
> On Wed, Feb 28, 2024 at 5:42 PM 'Animesh Shree' via sage-devel < > sage-...@googlegroups.com> wrote: > >> 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. >> > > We can probably change scipy's code (and then do a PR) to accept a > non-square matrix. > The C code they have basically sets up a call to superlu, and gets the > results... > > >> >> 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+...@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 >> >> <https://groups.google.com/d/msgid/sage-devel/d13d3977-7067-436c-a108-a3cfd13199ban%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/5ba39e26-c75c-44f4-803a-9be41b2cb9e2n%40googlegroups.com.