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-devel@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+unsubscr...@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/CAAWYfq2JFwCDZYmFXb1V7pwAX%2B79FcBkxCeYC7HcG-X7UQOx7A%40mail.gmail.com.