// // Created by Brady Bodily on 3/28/20. // #include "MakePermutationMatrix.h" #include "mpi.h" #include #include std::vector MakePermutationMatrix::MakePermutation(std::vector source, int rank, int size, std::vector> costMatrix){ std::vector returnVector; std::vector localCostVector; std::size_t counter = 0; int vectorOffset = (source.size())/2; std::sort(source.begin(), source.end()); std::vector myPerm = source; std::vector nextPerm = source; //return vector should be the size of number of processors as they are going to only return their own smallest. returnVector.resize(source.size(), 0); //the "nextPerm" is the permutation to stop at. std::rotate(nextPerm.begin(), nextPerm.begin()+(rank+1+vectorOffset), nextPerm.end()); std::partial_sort(nextPerm.begin()+1, nextPerm.end(), nextPerm.end()); //rotate my perm. std::rotate(myPerm.begin(), myPerm.begin()+(rank+vectorOffset),myPerm.end()); std::partial_sort(myPerm.begin()+1, myPerm.end(), myPerm.end()); //std::cout << "source.last(): " << source[8].GetName() << std::endl; std::cout << "source: "; for(int i = 0; i < source.size(); i++){ std::cout << source[i].GetName() << " "; } std::cout << std::endl << std::endl; std::cout <<"Rank: " << rank << " next perm: "; for(int i = 0; i < nextPerm.size(); i++){ std::cout << nextPerm[i].GetName() << " "; } std::cout << std::endl; if(rank == size-1){ nextPerm = source; } do { double cost = 0; //Add up the cost of the current permutation. // std::cout <<"Rank: " << rank << " Current perm: "; for (int i = 0; i < myPerm.size(); i++) { // std::cout << myPerm[i].GetName() << " "; cost += costMatrix[myPerm[i].GetName()][myPerm[i-1].GetName()]; } //std::cout << std::endl << std::endl; //Push permutation cost to the localCostVector. localCostVector.push_back(cost); counter++; } while (std::next_permutation(myPerm.begin(), myPerm.end()) && myPerm!=nextPerm); // //find the lowest and add it to a lowest vector. // auto lowest = std::vector(1,localCostVector[0]); // for(int i = 0; i < localCostVector.size(); i++) { // if(localCostVector[i] < lowest[0]) // lowest[0] = localCostVector[i]; // std::cout << lowest[0] << " "; // } std::cout<< "Rank: "<< rank<< "cost count: "<< localCostVector.size() << std::endl; std::cout << "Rank: "<< rank <<" Last Perm: "; for(int i = 0; i < myPerm.size(); i++){ std::cout << myPerm[i].GetName() << " "; } std::cout << std::endl; //MPI_Gather(&localCostVector,1, MPI_DOUBLE, &returnVector,1, MPI_DOUBLE,0, MPI_COMM_WORLD); return returnVector; } std::vector MakePermutationMatrix::GetLowestCost(std::vector source, int rank, int size, std::vector> costMatrix){ return MakePermutation(source, rank, size, costMatrix); }