<div dir="ltr">Dear Richard,<div><br></div><div>I am trying to use spectral clustering algorithm by using k-means clustering algorithm at some point. I am doing this by producing a matrix consisting of eigenvectors (of the adjacency matrix of the graph that I want to partition), then forming row vectors of this matrix. This is the part that I am using parallel vector. By using the output from k-means, I am trying to cluster these row vectors. To cluster these vectors, I think I need all row vectors in all processes. I wanted to use sequential vectors, however, I couldn't find a different way that I form row vectors of a matrix.</div><div><br></div><div>I am trying to use VecScatterCreateToAll, however, since my vector is parallel crated by VecDuplicateVecs, my input is not in correct type, so I get error. I still can't get how can I use this function in parallel vector created by VecDuplicateVecs.</div><div><br></div><div>Thank you all for your help.</div><div><br></div><div>Eda</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Mills, Richard Tran <<a href="mailto:rtmills@anl.gov" target="_blank">rtmills@anl.gov</a>>, 7 Nis 2020 Sal, 01:51 tarihinde şunu yazdı:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Eda,<br>
<br>
I think that you probably want to use VecScatter routines, as Junchao <br>
has suggested, instead of the lower level star forest for this. I <br>
believe that VecScatterCreateToZero() is what you want for the broadcast <br>
problem you describe, in the second part of your question. I'm not sure <br>
what you are trying to do in the first part. Taking a parallel vector <br>
and then copying its entire contents to a sequential vector residing on <br>
each process is not scalable, and a lot of the design that has gone into <br>
PETSc is to prevent the user from ever needing to do things like that. <br>
Can you please tell us what you intend to do with these sequential vectors?<br>
<br>
I'm also wondering why, later in your message, you say that you get <br>
cluster assignments from Matlab, and then "to cluster row vectors <br>
according to this information, all processors need to have all of the <br>
row vectors". Do you mean you want to get all of the row vectors copied <br>
onto all of the processors so that you can compute the cluster <br>
centroids? If so, computing the cluster centroids can be done without <br>
copying the row vectors onto all processors if you use a communication <br>
operation like MPI_Allreduce().<br>
<br>
Lastly, let me add that I've done a fair amount of work implementing <br>
clustering algorithms on distributed memory parallel machines, but <br>
outside of PETSc. I was thinking that I should implement some of these <br>
routines using PETSc. I can't get to this immediately, but I'm wondering <br>
if you might care to tell me a bit more about the clustering problems <br>
you need to solve and how having some support for this in PETSc might <br>
(or might not) help.<br>
<br>
Best regards,<br>
Richard<br>
<br>
On 4/4/20 1:39 AM, Eda Oktay wrote:<br>
> Hi all,<br>
><br>
> I created a parallel vector UV, by using VecDuplicateVecs since I need <br>
> row vectors of a matrix. However, I need the whole vector be in all <br>
> processors, which means I need to gather all and broadcast them to all <br>
> processors. To gather, I tried to use VecStrideGatherAll:<br>
><br>
> Vec UVG;<br>
> VecStrideGatherAll(UV,UVG,INSERT_VALUES);<br>
> VecView(UVG,PETSC_VIEWER_STDOUT_WORLD);<br>
><br>
> however when I try to view the vector, I get the following error.<br>
><br>
> [3]PETSC ERROR: Invalid argument<br>
> [3]PETSC ERROR: Wrong type of object: Parameter # 1<br>
> [3]PETSC ERROR: See <br>
> <a href="http://www.mcs.anl.gov/petsc/documentation/faq.html" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/documentation/faq.html</a> for trouble shooting.<br>
> [3]PETSC ERROR: Petsc Release Version 3.11.1, Apr, 12, 2019<br>
> [3]PETSC ERROR: ./clustering_son_final_edgecut_without_parmetis on a <br>
> arch-linux2-c-debug named localhost.localdomain by edaoktay Sat Apr 4 <br>
> 11:22:54 2020<br>
> [3]PETSC ERROR: Wrong type of object: Parameter # 1<br>
> [0]PETSC ERROR: See <br>
> <a href="http://www.mcs.anl.gov/petsc/documentation/faq.html" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/documentation/faq.html</a> for trouble shooting.<br>
> [0]PETSC ERROR: Petsc Release Version 3.11.1, Apr, 12, 2019<br>
> [0]PETSC ERROR: ./clustering_son_final_edgecut_without_parmetis on a <br>
> arch-linux2-c-debug named localhost.localdomain by edaoktay Sat Apr 4 <br>
> 11:22:54 2020<br>
> [0]PETSC ERROR: Configure options --download-mpich --download-openblas <br>
> --download-slepc --download-metis --download-parmetis --download-chaco <br>
> --with-X=1<br>
> [0]PETSC ERROR: #1 VecStrideGatherAll() line 646 in <br>
> /home/edaoktay/petsc-3.11.1/src/vec/vec/utils/vinv.c<br>
> ./clustering_son_final_edgecut_without_parmetis on a <br>
> arch-linux2-c-debug named localhost.localdomain by edaoktay Sat Apr 4 <br>
> 11:22:54 2020<br>
> [1]PETSC ERROR: Configure options --download-mpich --download-openblas <br>
> --download-slepc --download-metis --download-parmetis --download-chaco <br>
> --with-X=1<br>
> [1]PETSC ERROR: #1 VecStrideGatherAll() line 646 in <br>
> /home/edaoktay/petsc-3.11.1/src/vec/vec/utils/vinv.c<br>
> Configure options --download-mpich --download-openblas <br>
> --download-slepc --download-metis --download-parmetis --download-chaco <br>
> --with-X=1<br>
> [3]PETSC ERROR: #1 VecStrideGatherAll() line 646 in <br>
> /home/edaoktay/petsc-3.11.1/src/vec/vec/utils/vinv.c<br>
><br>
> I couldn't understand why I am getting this error. Is this because of <br>
> UV being created by VecDuplicateVecs? How can I solve this problem?<br>
><br>
> The other question is broadcasting. After gathering all elements of <br>
> the vector UV, I need to broadcast them to all processors. I found <br>
> PetscSFBcastBegin. However, I couldn't understand the PetscSF concept <br>
> properly. I couldn't adjust my question to the star forest concept.<br>
><br>
> My problem is: If I have 4 processors, I create a matrix whose columns <br>
> are 4 smallest eigenvectors, say of size 72. Then by defining each row <br>
> of this matrix as a vector, I cluster them by using k-means <br>
> clustering algorithm. For now, I cluster them by using MATLAB and I <br>
> obtain a vector showing which row vector is in which cluster. After <br>
> getting this vector, to cluster row vectors according to this <br>
> information, all processors need to have all of the row vectors.<br>
><br>
> According to this problem, how can I use the star forest concept?<br>
><br>
> I will be glad if you can help me about this problem since I don't <br>
> have enough knowledge about graph theory. An if you have any idea <br>
> about how can I use k-means algorithm in a more practical way, please <br>
> let me know.<br>
><br>
> Thanks!<br>
><br>
> Eda<br>
</blockquote></div></div>