int main(int argc, char *argv[]) { // set up MPI //MPI_Init(&argc, &argv); //int rank, p; //MPI_Comm_rank(MPI_COMM_WORLD, &rank); //MPI_Comm_size(MPI_COMM_WORLD, &p); mxx::env e(argc, argv); mxx::env::set_exception_on_error(); mxx::comm comm = mxx::comm(); try { // define commandline usage TCLAP::CmdLine cmd("Parallel distirbuted suffix array and LCP construction."); TCLAP::ValueArg<std::string> fileArg("f", "file", "Input filename.", true, "", "filename"); TCLAP::ValueArg<std::size_t> randArg("r", "random", "Random input size", true, 0, "size"); cmd.xorAdd(fileArg, randArg); TCLAP::ValueArg<int> seedArg("s", "seed", "Sets the seed for the ranom input generation", false, 0, "int"); cmd.add(seedArg); TCLAP::SwitchArg lcpArg("l", "lcp", "Construct the LCP alongside the SA.", false); cmd.add(lcpArg); TCLAP::SwitchArg checkArg("c", "check", "Check correctness of SA (and LCP).", false); cmd.add(checkArg); cmd.parse(argc, argv); // read input file or generate input on master processor // block decompose input file std::string local_str; if (fileArg.getValue() != "") { local_str = mxx::file_block_decompose(fileArg.getValue().c_str(), MPI_COMM_WORLD); } else { // TODO proper distributed random! local_str = rand_dna(randArg.getValue()/comm.size(), seedArg.getValue() * comm.rank()); } // TODO differentiate between index types // run our distributed suffix array construction mxx::timer t; double start = t.elapsed(); if (lcpArg.getValue()) { // construct with LCP suffix_array<std::string::iterator, index_t, true> sa(local_str.begin(), local_str.end(), MPI_COMM_WORLD); // TODO choose construction method sa.construct(true); double end = t.elapsed() - start; if (comm.rank() == 0) std::cerr << "PSAC time: " << end << " ms" << std::endl; if (checkArg.getValue()) { gl_check_correct(sa, local_str.begin(), local_str.end(), MPI_COMM_WORLD); } } else { // construct without LCP suffix_array<std::string::iterator, index_t, false> sa(local_str.begin(), local_str.end(), MPI_COMM_WORLD); // TODO choose construction method sa.construct_arr<2>(true); double end = t.elapsed() - start; if (comm.rank() == 0) std::cerr << "PSAC time: " << end << " ms" << std::endl; if (checkArg.getValue()) { gl_check_correct(sa, local_str.begin(), local_str.end(), MPI_COMM_WORLD); } } // catch any TCLAP exception } catch (TCLAP::ArgException& e) { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; exit(EXIT_FAILURE); } // finalize MPI //MPI_Finalize(); return 0; }
int main(int argc, char* argv[]) { double high = DEFAULT_MAX_WEIGHT; double low = DEFAULT_MIN_WEIGHT; unsigned width = DEFAULT_GRID_WIDTH; unsigned height = DEFAULT_GRID_HEIGHT; double equalWeight = MIN_EQUAL_WEIGHT; double heuristicWeight = MIN_WEIGHTED_HEURISTIC; try { TCLAP::CmdLine cmd("command line for astar demo", ' ' , "0.1"); TCLAP::ValueArg<unsigned> seedArg("s", "seed", "Initial seed value for the Random Number Generator", false, 0, "unsigned integer: seed value for the RNG."); TCLAP::ValueArg<double> lowArg("l", "low", "Low value for path weights", false, DEFAULT_MIN_WEIGHT, "double 0, less than or equal to high"); TCLAP::ValueArg<double> highArg("i", "high", "High value for path weights", false, DEFAULT_MAX_WEIGHT, "double 0, greater than or equal low"); TCLAP::ValueArg<unsigned> widthArg("w", "width", "Width of the grid in cells", false, DEFAULT_GRID_WIDTH, "unsigned, between 2 and 9"); TCLAP::ValueArg<unsigned> heightArg("e", "height", "Height of the grid in cells", false, DEFAULT_GRID_HEIGHT, "unsigned, between 2 and 9"); TCLAP::ValueArg<double> equidistantArg("q", "equal", "Vertical and Horizontal weights are equal. Diagonal weights are 1.414 times Vertical weights", false, MIN_EQUAL_WEIGHT, "double, between 0 and 7"); TCLAP::ValueArg<double> weightedHeuristicArg("u", "weighted_heuristic", "Heuristcs are weighted on the manhattan distance and a proportion of the path weight", false, MIN_WEIGHTED_HEURISTIC, "double, between 0.0 and 1.0"); cmd.add(seedArg); cmd.add(lowArg); cmd.add(highArg); cmd.add(widthArg); cmd.add(heightArg); cmd.add(equidistantArg); cmd.add(weightedHeuristicArg); cmd.parse(argc, argv); RandGen::setSeed(seedArg.getValue()); low = lowArg.getValue(); low = low < 0 ? 0 : low; high = highArg.getValue(); high = high < low ? low : high; width = widthArg.getValue(); width = width > MAX_GRID_DIMENSION ? MAX_GRID_DIMENSION : width; width = width < MIN_GRID_DIMENSION ? MIN_GRID_DIMENSION : width; height = heightArg.getValue(); height = height > MAX_GRID_DIMENSION ? MAX_GRID_DIMENSION : height; height = height < MIN_GRID_DIMENSION ? MIN_GRID_DIMENSION : height; equalWeight = equidistantArg.getValue(); equalWeight = equalWeight > MAX_EQUAL_WEIGHT ? MAX_EQUAL_WEIGHT : equalWeight; equalWeight = equalWeight < MIN_EQUAL_WEIGHT ? MIN_EQUAL_WEIGHT : equalWeight; heuristicWeight = weightedHeuristicArg.getValue(); heuristicWeight = heuristicWeight > MAX_WEIGHTED_HEURISTIC ? MAX_WEIGHTED_HEURISTIC : heuristicWeight; heuristicWeight = heuristicWeight < MIN_WEIGHTED_HEURISTIC ? MIN_WEIGHTED_HEURISTIC : heuristicWeight; } catch(TCLAP::ArgException& e) { std::cerr << "error: " << e.error() << " for argument " << e.argId() << std::endl; return 1; } Board board(width, height, low, high, equalWeight, heuristicWeight); do { board.show(std::cout); std::cout << "Press <enter> to continue....."; std::cin.get(); }while(board.next(std::cout) == false); std::cin.get(); return 0; }
int main(int argc, char *argv[]) { // set up MPI MPI_Init(&argc, &argv); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); try { // define commandline usage TCLAP::CmdLine cmd("Compare our parallel implementation with divsufsort."); TCLAP::ValueArg<std::string> fileArg("f", "file", "Input filename.", true, "", "filename"); TCLAP::ValueArg<std::size_t> randArg("r", "random", "Random input size", true, 0, "size"); TCLAP::ValueArg<int> seedArg("s", "seed", "Sets the seed for the ranom input generation", false, 0, "int"); cmd.add(seedArg); cmd.xorAdd(fileArg, randArg); TCLAP::SwitchArg checkArg("c", "check", "Check correctness of SA for PSAC using divsufsort `sufcheck()`.", false); cmd.add(checkArg); cmd.parse(argc, argv); // read input file or generate input on master processor std::string input_str; if (rank == 0) { if (fileArg.getValue() != "") { std::ifstream t(fileArg.getValue().c_str()); std::stringstream buffer; buffer << t.rdbuf(); input_str = buffer.str(); } else { input_str = rand_dna(randArg.getValue(), seedArg.getValue()); } } // TODO differentiate between index types // run our distributed suffix array construction std::string local_str = mxx::stable_distribute(input_str, MPI_COMM_WORLD); mxx::timer t; double start = t.elapsed(); suffix_array<std::string::iterator, index_t, false> sa(local_str.begin(), local_str.end(), MPI_COMM_WORLD); // TODO: choose construction method! sa.construct_arr<2>(true); //sa.construct_arr<2>(); double end = t.elapsed() - start; if (rank == 0) std::cerr << "PSAC time: " << end << " ms" << std::endl; std::vector<index_t> glSA = mxx::gatherv(sa.local_SA, 0); // run construction with divsufsort locally on rank 0 if (rank == 0) { mxx::timer t; std::vector<index_t> SA; double start = t.elapsed(); dss::construct(input_str.begin(), input_str.end(), SA); double end = t.elapsed() - start; std::cerr << "divsufsort time: " << end << " ms" << std::endl; // check correctness if we should do so! if (checkArg.getValue()) { std::cerr << "Checking for correctness..." << std::endl; if(!dss::check(input_str.begin(), input_str.end(), glSA)) { std::cerr << "ERROR: wrong suffix array from PSAC" << std::endl; return false; } if(!dss::check(input_str.begin(), input_str.end(), SA)) { std::cerr << "ERROR: wrong suffix array from divsufsort" << std::endl; } } } // catch any TCLAP exception } catch (TCLAP::ArgException& e) { std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; exit(EXIT_FAILURE); } // finalize MPI MPI_Finalize(); return 0; }