> On Nov 10, 2017, at 8:51 AM, Vaclav Hapla <vaclav.ha...@erdw.ethz.ch> wrote: > > > >> 10. 11. 2017 v 14:56, Jed Brown <j...@jedbrown.org>: >> >> Vaclav Hapla <vaclav.ha...@erdw.ethz.ch> writes: >> >>>> 10. 11. 2017 v 5:09, Smith, Barry F. <bsm...@mcs.anl.gov>: >>>> >>>> >>>> >>>>> On Nov 8, 2017, at 3:52 AM, Vaclav Hapla <vaclav.ha...@erdw.ethz.ch> >>>>> wrote: >>>>> >>>>> >>>>>> 8. 11. 2017 v 9:06, Lisandro Dalcin <dalc...@gmail.com>: >>>>>> >>>>>> On 8 November 2017 at 05:51, Smith, Barry F. <bsm...@mcs.anl.gov> wrote: >>>>>>> >>>>>>>> On Nov 7, 2017, at 1:33 AM, Lisandro Dalcin <dalc...@gmail.com> wrote: >>>>>>>> >>>>>>>> The only concern I have about PetscPartitioner is that the API depends >>>>>>>> on DM (PetscPartitionerPartition_<TYPE> routines). Maybe >>>>>>>> PetscPartitioner should eventually move to became more agnostic, and >>>>>>>> that way it can be used to partition matrices and meshes. >>>>>>> >>>>>>> This is certainly a serious flaw if PetscPartitioner is intended as THE >>>>>>> API to use for partitioning. If it is not intended as THE API for >>>>>>> partitioning then that is also a problem, because why have multiple >>>>>>> APIs for what is essentially one set of abstractions. >>>>>>> >>>>>> >>>>>> Note however that things looks easy to refactor. I'll try to team up >>>>>> with Matt to improve things. >>>>> >>>>> Wait, now we are at the beginning again. I actually wanted to do some >>>>> refactoring of PetscPartitioner, starting with few cosmetic changes to >>>>> make it better settable from options. But Barry kept me back of any edits >>>>> since he think it's anti-systematic to keep two independent classes doing >>>>> essentially the same. And I agree with that to be honest. It's strange to >>>>> have two ParMetis, two Scotch and two whatever interfaces. >>>> >>>> Strange is not the word, f***up is the word >>>> >>>>> The only thing I don't like on MatPartitioning is its name as it's not >>>>> just for Mat Partitioning :-) >>>>> >>>>> There are from my point of view multiple issues with PetscPartitioner. >>>>> Let's look e.g. at PetscPartitionerPartition. It takes as arguments both >>>>> PetscPartitioner and DM. This DM must be in fact DMPlex which is not >>>>> checked so it will probably crash somewhere deep in the stack once the >>>>> first DMPlex specific line is reached. Then there are two output >>>>> arguments PetscSection partSection and IS *partition. The first must be >>>>> created beforehand while the second is created inside. And I guess they >>>>> must keep the same basic information just in two different forms. >>>>> >>>>> Actually the original problem I wanted to solve is that >>>>> src/dm/impls/plex/examples/tutorials/ex5.c fails with partitioner set to >>>>> PETSCPARTITIONERPARMETIS for certain numbers of processes, see below. Let >>>>> me start with pull request altering ex5.c so that partitioner type can be >>>>> set from options properly and this bug can be reproduced easily. >>>>> [ 0] ***ASSERTION failed on line 176 of file >>>>> /scratch/petsc-dev/arch-linux-gcc-salvus/externalpackages/git.parmetis/libparmetis/comm.c: >>>>> j == nnbrs >>>>> [ 2] ***ASSERTION failed on line 176 of file >>>>> /scratch/petsc-dev/arch-linux-gcc-salvus/externalpackages/git.parmetis/libparmetis/comm.c: >>>>> j == nnbrs >>>>> ex5: >>>>> /scratch/petsc-dev/arch-linux-gcc-salvus/externalpackages/git.parmetis/libparmetis/comm.c:176: >>>>> libparmetis__CommSetup: Assertion `j == nnbrs' failed. >>>>> ex5: >>>>> /scratch/petsc-dev/arch-linux-gcc-salvus/externalpackages/git.parmetis/libparmetis/comm.c:176: >>>>> libparmetis__CommSetup: Assertion `j == nnbrs' failed. >>>>> >>>>> I'm wondering whether the MatPartitioning interface has the same problem. >>>>> But anyhow I mean it's maybe time to decide about the two interfaces >>>>> before chasing all these PetscPartitioner issues. >>>>> >>>>> I propose >>>>> - to rename Mat Partitioning to just Partitioning/-er or take over the >>>>> name PetscPartitioner, >>>> >>>> Why? What is wrong with Mat? Mat can represent any graph and graphs are >>>> always what partitioning packages actually partition. I don't see a reason >>>> for a different name. MatPartitioner does not, nor should it, directly >>>> partition meshes etc, those can/should be done by; the proper massaging of >>>> data, the creation of a MatPartitioner object, calling the partitioner and >>>> then using the result of the partitioner to build whatever appropriate >>>> data structures are needed for the mesh partitioner. >>> >>> Yes. Mat can represent any graph in several different ways - >>> e.g. Laplacian, adjacency, incidence, oriented incidence matrix. The >>> graph could be also represented in other way like a list of vertices >>> and edges. >> >> Also known as COO format for a matrix. > > You could represent by COO any of the matrices above. I don't understand how > it relates to listing vertices and edges of a graph. > >> >>> MatPartitioning picks just one representation as an input - the >>> adjacency matrix. But I mean the picked representation does not >>> matter, and the result is not a partitioning of any matrix, but >>> partitioning of the graph. The graph is the underlying concept. This >>> is why I don't consider the Mat prefix optimal. >> >> Matrix and graph are equivalent concepts. > > I think that's an overly strong statement. It sounds like a matrix and a > graph are bijectively interchangeable things which is certainly not true: > 1) As I mentioned, there are multiple ways of representing a graph by a > matrix, and for a given graphs these matrix representations don't even have > the same dimensions. > 2) Even if you stick to the adjacency matrix (which you apparently do), it's > still not bijective with the graph - the adjacency matrix is a square > symmetric Boolean matrix. You can just say that the _sparse pattern_ of the > _symmetric_ matrix is bijective with the respective graph. This is a by far > weaker statement. > > Why you then have a special matrix type MATMPIADJ which is value-less and > automatically symmetric if all matrices "are" graphs?
For efficiency. It is the format partitioning packages like and can use directly without any additional processing. > > Not talking about directed graphs, multigraphs, ... > > Vaclav > >> Mat is already extensible in >> the sense that it can have many representations. >> >>> (*) It's a similar problem as MatCreateVecs means to me "create a matrix of >>> Vecs type" according to usual convention. >> >> I think the key here is to look at the types. VecCreateFromMat() might >> be more clear in this context, but isn't clearly better. Alternatively, >> PetscCreateVec() and MatCreateVecs() would have this symmetry, but don't >> follow our usual prefix conventions.