Changes

Jump to: navigation, search

CPW-Engine utils

4,187 bytes added, 17:05, 18 December 2018
Created page with "'''Home * Engines * CPW-Engine * Utils''' <pre> #include "stdafx.h" #include "0x88_math.h" #include "transposition.h" enum etask { TASK_NOTHING,..."
'''[[Main Page|Home]] * [[Engines]] * [[CPW-Engine]] * Utils'''

<pre>

#include "stdafx.h"
#include "0x88_math.h"
#include "transposition.h"


enum etask {
TASK_NOTHING,
TASK_SEARCH,
TASK_PONDER
} extern task;

extern bool time_over;

unsigned int gettime();

int util_pv(char * pv) {

sboard rootb = b;

char best;
smove m[256];
int mcount = 0;

for (U8 depth = 1; depth <= sd.depth; depth++) {

best = -1;
tt_probe(0, 0, 0, &best);

if (best == -1) break;

mcount = movegen(m, 0xFF);

for (int i = 0; i<mcount; i++) {
if (m[i].id == best) {
move_make(m[i]);

pv = algebraic_writemove(m[i], pv);
pv[0] = ' ';
pv++;

break;
}
}
}

pv[0] = 0;
b = rootb;
return 0;
}

void perft_start(char * command) {

unsigned int starttime = gettime();

int depth;
sscanf(command + 6, "%d", &depth);

printf("Performance Test\n");
for (U8 d = 1; d <= depth; d++) {
printf("%d:\t%d\t%d\n", d, gettime() - starttime, perft(d));
}
}

U64 perft(U8 depth) {

U64 nodes = 0;

if (depth == 0) return 1;

smove m[256];
int mcount = movegen(m, 0xFF);

for (int i = 0; i < mcount; i++) {
move_make(m[i]);

if (!isAttacked(b.stm, b.KingLoc[!b.stm]))
nodes += perft(depth - 1);

move_unmake(m[i]);
}

return nodes;
}

void util_bench(char * command) {

unsigned int starttime = gettime();

int depth;
sscanf(command + 6, "%d", &depth);

time_over = false;

sd.myside = b.stm;
sd.starttime = gettime();
sd.depth = 0;
sd.nodes = 0;

task = TASK_SEARCH;

chronos.depth = depth;
chronos.flags = FDEPTH;

search_run();

task = TASK_NOTHING;

if (gettime() - starttime < 1000) starttime = gettime() - 1000;

printf("Nodes:\t%d\nTime:\t%d ms\nNPS:\t%d\n", (int)sd.nodes, gettime() - starttime, (int)sd.nodes / ((gettime() - starttime) / 1000));

return;
}

smove strToMove(char * a) {
smove m;

m.from = convert_a_0x88(a);
m.to = convert_a_0x88(a + 2);

m.piece_from = b.pieces[m.from];
m.piece_to = b.pieces[m.from];
m.piece_cap = b.pieces[m.to];

m.flags = 0;
m.castle = 0;
m.ep = -1;
m.ply = 0;
m.score = 0;

/* default promotion to queen */

if ((m.piece_to == PAWN) &&
(ROW(m.to) == ROW_1 || ROW(m.to) == ROW_8))
m.piece_to = QUEEN;


switch (a[4]) {
case 'q': m.piece_to = QUEEN; a++; break;
case 'r': m.piece_to = ROOK; a++; break;
case 'b': m.piece_to = BISHOP; a++; break;
case 'n': m.piece_to = KNIGHT; a++; break;
}

//castling
if ((m.piece_from == KING) &&
((m.from == E1 && (m.to == G1 || m.to == C1)) ||
(m.from == E8 && (m.to == G8 || m.to == C8)))) {
m.flags = MFLAG_CASTLE;
}

/* ep
if the moving-piece is a Pawn, the square it moves to is empty and
it was a diagonal move it has to be an en-passant capture.
*/
if ((m.piece_from == PAWN) &&
(m.piece_cap == PIECE_EMPTY) &&
((abs(m.from - m.to) == 15) || (abs(m.from - m.to) == 17))) {
m.flags = MFLAG_EPCAPTURE;
}

if ((m.piece_from == PAWN) && (abs(m.from - m.to) == 32)) {
m.flags |= MFLAG_EP;
}

return m;
}

int algebraic_moves(char * a) {

smove m;
int found_match = 0;

while (a[0]) {

if (!((a[0] >= 'a') && (a[0] <= 'h'))) {
a++;
continue;
}

m = strToMove(a);

found_match = move_isLegal(m);

if (found_match) {

move_make(m);

if ((m.piece_from == PAWN) ||
(move_iscapt(m)) ||
(m.flags == MFLAG_CASTLE))
b.rep_index = 0;

}
else {

break;

}

a += 4;
if (a[0] == 0) break;
if (a[0] != ' ') a++;

}

return found_match;
}


//returns new pointer
char * algebraic_writemove(smove m, char * a) {
char parray[5] = { 0,'q','r','b','n' };

convert_0x88_a(m.from, a);
convert_0x88_a(m.to, a + 2);
a += 4;
if (m.piece_to != m.piece_from) {
a[0] = parray[m.piece_to];
a++;
}
a[0] = 0;
return a;
}

void convert_0x88_a(S8 sq, char * a) {
a[0] = COL(sq) + 'a';
a[1] = ROW(sq) + '1';
a[2] = 0;
}

U8 convert_a_0x88(char * a) {
S8 sq;
sq = a[0] - 'a';
sq += (a[1] - '1') * 16;

return sq;
}
</pre>
'''[[CPW-Engine|Up one Level]]'''

Navigation menu