Example #1
0
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;
}
Example #2
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;
}
Example #3
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;
}