Ejemplo n.º 1
0
void MyDomain::received(char* str)
{
    static double Tottime=0;
    static long TotNoEval=0;

	//printf("\n %s", str);
    if (strncmp(str, "quit", 4)==0) {
	l.exit();
	return;
    }

    if (strncmp(str, "pos ", 4)!=0) return;

    b.setState(str+4);
    if (verbose) {
	printf("\n\n==========================================\n");
	printf(str+4);
    }

    int state = b.validState();
    if ((state != Board::valid1) && 
	(state != Board::valid2)) {
	printf("%s\n", Board::stateDescription(state));
	switch(state) {
	    case Board::timeout1:
	    case Board::timeout2:
	    case Board::win1:
	    case Board::win2:
        printf("\nTotal run time for player ");
	    printf("%s ", (myColor == Board::color1) ? "O":"X");
        printf(" =  %lf\n", (Tottime/1000));
        printf("Absolute evaluations = %ld\n ", TotNoEval);
        printf("Evaluations per sec = %lf \n", (TotNoEval*1000/Tottime));
		l.exit();
	    default:
		break;
	}
	return;
    }

    if (b.actColor() & myColor) {
	struct timeval t1, t2;

	gettimeofday(&t1,0);
	Move m = b.bestMove();
	gettimeofday(&t2,0);

	int msecsPassed =
	    (1000* t2.tv_sec + t2.tv_usec / 1000) -
	    (1000* t1.tv_sec + t1.tv_usec / 1000);

	printf("%s ", (myColor == Board::color1) ? "O":"X");
	if (m.type == Move::none) {
	    printf(" can not draw any move ?! Sorry.\n");
	    return;
	}
	printf("draws '%s' (after %d.%03d secs)...\n",
	       m.name(), msecsPassed/1000, msecsPassed%1000);
    Tottime += msecsPassed;

	b.playMove(m, msecsPassed);
	sendBoard();

	if (changeEval)
	    ev.changeEvaluation();
    
    // Sum up evaluations
    TotNoEval += ev.getNoEval();

	/* stop player at win position */
	int state = b.validState();
	if ((state != Board::valid1) && 
	    (state != Board::valid2)) {
	    printf("%s\n", Board::stateDescription(state));
	    switch(state) {
		case Board::timeout1:
		case Board::timeout2:
		case Board::win1:
		case Board::win2:
        printf("\nTotal run time for player ");
	    printf("%s ", (myColor == Board::color1) ? "O":"X");
        printf(" =  %lf\n", (Tottime/1000));
        printf("Absolute evaluations = %ld\n ", TotNoEval);
        printf("Evaluations per sec = %lf \n", (TotNoEval*1000/Tottime));
		    l.exit();
		default:
		    break;
	    }
	}

		maxMoves--;
		if (maxMoves == 0) 
		{
			//printf("\n %s", str);
		    printf("Terminating because given number of moves drawn.\n");
		    broadcast("quit\n");
		    l.exit();
		}
    }    
}
Ejemplo n.º 2
0
void MyDomain::received(char* str)
{
    static double Tottime=0;
    long TotNoEval=0;

    if (strncmp(str, "quit", 4)==0) {
	l.exit();
	return;
    }

    if (strncmp(str, "pos ", 4)!=0) return;

    b.setState(str+4);
    if (verbose) {
	printf("\n\n==========================================\n");
	printf(str+4);
    }

    int state = b.validState();
    int len;
    int NumTask, i;
    MPI_Status stat;
    MPI_Comm_size( MPI_COMM_WORLD, &NumTask);

    // Sum up evaluations
    TotNoEval =  ev.getNoEval();

    if ((state != Board::valid1) && 
	(state != Board::valid2)) {
	printf("%s\n", Board::stateDescription(state));

	switch(state) 
    {
	    case Board::timeout1:
	    case Board::timeout2:
	    case Board::win1:
	    case Board::win2:
    
            char boardLayout[500];
            // Send Exit Signal to slave through EXIT board
            len = sprintf(boardLayout, "exit%s\n",b.getState());
            for( i = 1; i< NumTask; i++)
            {
                MPI_Send( boardLayout, 500, MPI_CHAR, i, 10, MPI_COMM_WORLD );
                long NoEval;
                MPI_Recv(&NoEval, 1, MPI_LONG, i, 10, MPI_COMM_WORLD, &stat);
                printf("\n Evaluations for Rank: %d Evals: %ld", i, NoEval);
                TotNoEval += NoEval;
            }

        	printf("\nTotal run time for player ");
	    	printf("%s ", (myColor == Board::color1) ? "O":"X");
        	printf(" =  %lf\n", (Tottime/1000));
	        printf("Evaluations per sec = %lf \n", (TotNoEval*1000/Tottime));
            printf("Total Evaluations= %ld\n", TotNoEval);
		    l.exit();
	    default:
		break;
	}
	return;
    }

    if (b.actColor() & myColor) {
	struct timeval t1, t2;

	gettimeofday(&t1,0);
	Move m = b.bestMove();
	gettimeofday(&t2,0);

	int msecsPassed =
	    (1000* t2.tv_sec + t2.tv_usec / 1000) -
	    (1000* t1.tv_sec + t1.tv_usec / 1000);

	printf("%s ", (myColor == Board::color1) ? "O":"X");
	if (m.type == Move::none) {
	    printf(" can not draw any move ?! Sorry.\n");
	    return;
	}
	printf("draws '%s' (after %d.%03d secs)...\n",
	       m.name(), msecsPassed/1000, msecsPassed%1000);
	    Tottime += msecsPassed;

	printf("\nMoving board for Move:%s \n ", m.name());
	b.playMove(m, msecsPassed);
	sendBoard();

	if (changeEval)
	    ev.changeEvaluation();
    
    // Sum up evaluations
    TotNoEval =  ev.getNoEval();

	/* stop player at win position */
	int state = b.validState();
	if ((state != Board::valid1) && 
	    (state != Board::valid2)) {
	    printf("%s\n", Board::stateDescription(state));
	    switch(state) {
		case Board::timeout1:
		case Board::timeout2:
		case Board::win1:
		case Board::win2:

            char boardLayout[500];
            // Send Exit Signal to slave through EXIT board
            len = sprintf(boardLayout, "exit%s\n",b.getState());
            for( i = 1; i< NumTask; i++)
            {
                MPI_Send( boardLayout, 500, MPI_CHAR, i, 10, MPI_COMM_WORLD );
                long NoEval;
                MPI_Recv(&NoEval, 1, MPI_LONG, i, 10, MPI_COMM_WORLD, &stat);
                printf("\n Evaluations for Rank: %d Evals: %ld", i, NoEval);
                TotNoEval += NoEval;
            }

	        printf("\nTotal run time for player ");
    		printf("%s ", (myColor == Board::color1) ? "O":"X");
	        printf(" =  %lf\n", (Tottime/1000));
        	printf("Evaluations per sec = %lf \n", (TotNoEval*1000/Tottime));
            printf("Total Evaluations= %ld\n", TotNoEval);
		    l.exit();
		default:
		    break;
	    }
	}

		maxMoves--;
		if (maxMoves == 0) 
		{
            char boardLayout[500];
            // Send Exit Signal to slave through EXIT board
            len = sprintf(boardLayout, "exit%s\n",b.getState());
            for( i = 1; i< NumTask; i++)
            {
                MPI_Send( boardLayout, 500, MPI_CHAR, i, 10, MPI_COMM_WORLD );
                long NoEval;
                MPI_Recv(&NoEval, 1, MPI_LONG, i, 10, MPI_COMM_WORLD, &stat);
                printf("\n Evaluations for Rank: %d Evals: %ld", i, NoEval);
                TotNoEval += NoEval;
            }

			//printf("\n %s", str);
		    printf("Terminating because given number of moves drawn.\n");
		    broadcast("quit\n");
		    l.exit();
		}
    }    
}