Advertisement
Litigare

Untitled

Jun 16th, 2021
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.43 KB | None | 0 0
  1. #include <iostream>
  2. #include "mpi.h"
  3. #include <cstdio>
  4. #include <ctime>
  5.  
  6. #include "AStar.h"
  7. #include "AStarMPICommunication.h"
  8. #include "Coordinate.h"
  9. #include "CoordinateList.h"
  10. #include "Heuristic.h"
  11.  
  12. //Global variable definitions
  13. std::clock_t start;
  14.  
  15. void StartClock() {
  16.     start = std::clock();
  17. }
  18.  
  19. void StopClockAndDisplayTime() {
  20.     double duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
  21.     std::cout << "Took " << duration << " seconds to execute";
  22. }
  23.  
  24. void SetWalls(AStar& mapGenerator)
  25. {
  26.     mapGenerator.addCollision({0, 1});
  27.     mapGenerator.addCollision({1, 1});
  28.     mapGenerator.addCollision({2, 1});
  29.    
  30.     mapGenerator.addCollision({4, 0});
  31.     mapGenerator.addCollision({4, 1});
  32.     mapGenerator.addCollision({4, 2});
  33.    
  34.     mapGenerator.addCollision({10, 13});
  35.     mapGenerator.addCollision({10, 14});
  36.     mapGenerator.addCollision({10, 15});
  37.  
  38.     mapGenerator.addCollision({11, 13});
  39.    
  40.     mapGenerator.addCollision({12, 13});
  41.  
  42.     mapGenerator.addCollision({13, 11});
  43.     mapGenerator.addCollision({13, 12});
  44.     mapGenerator.addCollision({13, 13});
  45.     mapGenerator.addCollision({13, 14});
  46.     mapGenerator.addCollision({13, 15});
  47. }
  48.  
  49. void ListPathNodes(CoordinateList& path)
  50. {
  51.     for (auto& coordinate : path) {
  52.         std::cout << coordinate.x << " " << coordinate.y << "\n";
  53.     }
  54. }
  55.  
  56. void ExecuteAStarAlgorithm(AStarMPICommunication aStarMPICommunication, int rank, int size)
  57. {
  58.     int map_size_x = 25,
  59.         map_size_y = 25;
  60.  
  61.     AStar mapGenerator;
  62.  
  63.     mapGenerator.setMapSize({map_size_x, map_size_y});
  64.     mapGenerator.setHeuristic(Heuristic::euclidean);
  65.     mapGenerator.setDiagonalMovement(false);
  66.  
  67.     SetWalls(mapGenerator);
  68.  
  69.     mapGenerator.updateMap();
  70.     mapGenerator.showMap();
  71.  
  72.     std::cout << "Running path generation ... \n";
  73.  
  74.     CoordinateList path;
  75.  
  76.     if (size < 5) {
  77.         path = mapGenerator.findPath(
  78.             {0, 0},
  79.             {map_size_x - 1, map_size_y - 1}
  80.         );
  81.     } else {
  82.         path = mapGenerator.findPathMPI(
  83.             {0, 0},
  84.             {map_size_x - 1, map_size_y - 1},
  85.             aStarMPICommunication,
  86.             rank
  87.         );
  88.     }
  89.  
  90.  
  91.     mapGenerator.updateMap(path);
  92.     mapGenerator.showMap();
  93.  
  94.     ListPathNodes(path);
  95. }
  96.  
  97. void DisplayNode(Node node) {
  98.     std::cout << "Node:"
  99.         << "\n\tX - " << node.coordinates.x
  100.         << "\n\tY - " << node.coordinates.y
  101.         << "\n\tG - " << node.G
  102.         << "\n\tH - " << node.H
  103.         << "\n\tP - " << node.parent
  104.         << "\n\tPX - " << (*(node.parent)).coordinates.x
  105.         << "\n\tPY - " << (*(node.parent)).coordinates.y
  106.         << "\n\tPG - " << (*(node.parent)).G
  107.         << "\n\tPH - " << (*(node.parent)).H
  108.         << "\n\tPP - " << (*(node.parent)).parent;
  109. }
  110.  
  111. void SendNodeToOtherHost(AStarMPICommunication aStarMPICommunication, int rank) {
  112.     std::cout << "SendNodeToOtherHost #" << rank;
  113.  
  114.     if (rank == 0) {
  115.         auto parent_coordinates = *new Coordinate;
  116.         parent_coordinates.x = 24;
  117.         parent_coordinates.y = 21;
  118.  
  119.         auto parentNode = new Node(parent_coordinates);
  120.         parentNode->G = 255;
  121.         parentNode->H = 277;
  122.  
  123.         auto coordinates = *new Coordinate;
  124.         coordinates.x = 4;
  125.         coordinates.y = 5;
  126.  
  127.         auto node = *new Node(coordinates, parentNode);
  128.  
  129.         node.G = 17;
  130.         node.H = 19;
  131.  
  132.         aStarMPICommunication.SendNode(1, node);
  133.     } else {
  134.         auto node = aStarMPICommunication.ReceiveNode(0);
  135.  
  136.         DisplayNode(node);
  137.     }
  138. }
  139.  
  140. int main(int argc, char **argv)
  141. {
  142.     //MPI initialization
  143.     int rank, size;
  144.  
  145.     MPI_Init(&argc, &argv);
  146.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  147.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  148.  
  149.     auto aStarMPICommunication = * new AStarMPICommunication();
  150.     aStarMPICommunication.DefineCoordinateTypeInMPI();
  151.     aStarMPICommunication.DefineNodeTypeInMPI();
  152.  
  153.     bool shouldUseBuiltInClock = false;
  154.  
  155.     if (shouldUseBuiltInClock) {
  156.         StartClock();
  157.     }
  158.  
  159.     //Current program selection
  160.     //ExecuteAStarAlgorithm(aStarMPICommunication, rank, size);
  161.     //aStarMPICommunication.CommunicationWithCoordinateExample(rank);
  162.     //aStarMPICommunication.CommunicationWithNodeExample(rank);
  163.     SendNodeToOtherHost(aStarMPICommunication, rank);
  164.  
  165.     //MPI finalization
  166.     MPI_Finalize();
  167.  
  168.     if (shouldUseBuiltInClock) {
  169.         StopClockAndDisplayTime();
  170.     }
  171.  
  172.     return 0;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement