> On Aug 30, 2020, at 2:57 AM, Eda Oktay <eda.ok...@metu.edu.tr> wrote: > > Dear Matt, > > First of all I figured out that I asked wrongly. It's not ParMETIS giving the > same result. It is CHACO. ParMETIS gives different results when I use edge > weights. > > Thanks! > > Dear Barry, > > I am trying to partition the matrix to compare the edge cuts when it is > partitioned with CHACO, ParMETIS and the spectral partitioning algorithm with > the k-means clustering (I wrote this code in PETSc). In the end, I will > conclude that if a linear system is to be solved and the coefficient matrix > is large in size, then partitioning the coefficient matrix by using one of > these algorithms will help one to solve the linear system faster and with > small communication. > > What is forcing matrix to have all positive values? Isn't it done by using > MatPartitioningGetUseEdgeWeights and MatPartitioningSetUseEdgeWeights? > > I will send the test case but I am already passing my original matrix > directly to SetAdjacency (SymmA is my symmetric matrix with positive values): > > ierr = MatConvert(SymmA,MATMPIADJ,MAT_INITIAL_MATRIX,&AL);CHKERRQ(ierr); > > ierr = MatPartitioningCreate(MPI_COMM_WORLD,&part);CHKERRQ(ierr); > ierr = MatPartitioningSetAdjacency(part,AL);CHKERRQ(ierr); > ierr = MatPartitioningSetFromOptions(part);CHKERRQ(ierr);
You should not need this. Just ierr = MatPartitioningCreate(MPI_COMM_WORLD,&part);CHKERRQ(ierr); ierr = MatPartitioningSetAdjacency(part,SymmA);CHKERRQ(ierr); ierr = MatPartitioningSetFromOptions(part);CHKERRQ(ierr); MatPartitioningSetAdjacency takes any MatType directly. > > So, if ParMETIS gives different edge cut as it is expected, > MatPartitioningGetUseEdgeWeights and MatPartitioningSetUseEdgeWeights works > correctly. Why can't CHACO? > > Thanks! > > Eda > > Barry Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>>, 30 Ağu 2020 Paz, > 03:00 tarihinde şunu yazdı: > > > > On Aug 29, 2020, at 2:23 PM, Eda Oktay <eda.ok...@metu.edu.tr > > <mailto:eda.ok...@metu.edu.tr>> wrote: > > > > Hi all, > > > > I am trying to partition a sparse matrix by using ParMETIS. I am converting > > my matrix to adjacency type and then applying partitioning. > > You don't need to do this. Just pass your original matrix directly into > MatPartitioningSetAdjacency() it will handle any conversions needed. > > Edge weights need to be positive, since they represent how much > communication is to take place over that link. You may need to force your > matrix to have all positive values before giving it to > MatPartitioningSetAdjacency and using edge weights. > > I this doesn't work than our code is broken, please send us a simple test > case > > Question: Why are you partitioning a matrix? Is it for load balancing of > solves or matrix vector products with the matrix? To reduce interprocess > communication during solves or matrix vector products with the matrix? If so > the numerical values in the matrix don't affect load balance or interprocess > communication for these operations. > > > Barry > > > > > > Default, I understood that partitioning doesn't use edge-weights. However, > > when I used the following codes I saw from ex15 and used > > "-test_use_edge_weights 1", I am getting the same results as when I don't > > consider edge weights. > > > > PetscBool use_edge_weights=PETSC_FALSE; > > > > PetscOptionsGetBool(NULL,NULL,"-test_use_edge_weights",&use_edge_weights,NULL); > > if (use_edge_weights) { > > MatPartitioningSetUseEdgeWeights(part,use_edge_weights); > > > > MatPartitioningGetUseEdgeWeights(part,&use_edge_weights); > > if (!use_edge_weights) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP, > > "use_edge_weights flag does not setup correctly \n"); > > } > > > > My matrix does not consist of 1s and 0s, so I want partitioning to consider > > all the nonzero elements in the matrix as edge weights. Don't > > MatPartitioningSetUseEdgeWeights and MatPartitioningGetUseEdgeWeights do > > that? Should I add something more? In the page of > > MatPartitioningSetUseEdgeWeights, it is written that "If set > > use_edge_weights to TRUE, users need to make sure legal edge weights are > > stored in an ADJ matrix.". How can I make sure of this? > > > > I am trying to compare the use of ParMETIS with the spectral partitioning > > algorithm when I used a weighted Laplacian. > > > > Thanks! > > > > Eda > > >