Recently I analyzed 14 million EPD positions with Stockfish at 1000ms which took me 4½ days to complete. Then I noticed I had forgotten the "50-move counter" and "move-number" tags, usualy "0" and "1".
char s [1000] = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - id sf10; bm e2e4; ce 55; acd 18;\n";
char h [1000];
char *q;
int x;
q=strstr(s,"id ");
if (q==NULL) { something is wrong }
q[-1]=0; // cuts string till "id"
x=0;
while (q[x] != 10) { h[x]=q[x]; x++; h[x]=0; } // copy rest of string to h
strcat(s," 0 1 "); // add the missing "50-move counter" and "move-number" tags.
strcat(s,h); // combine the 2 strings, mission accomplished
I am sure there are more elegant solutions.
90% of coding is debugging, the other 10% is writing bugs.
# -*- coding: utf-8 -*-
"""
modify_epd_1.py
Read epd file and fix epd lines to make it epd compliant.
* Add double quotes to id name
* Convert bm LAN to bm SAN
* Add hmvc and fmvn
* Write to a new epd file
Requirements:
python 3
python-chess v0.26.0
"""
import chess
def main():
inepdfn = 'big.epd'
outepdfn = 'out_' + inepdfn
with open(outepdfn, 'w') as w:
with open(inepdfn, 'r') as f:
for line in f:
epd = line.rstrip()
# Modify bm LAN to bm SAN in orig epd
epd1 = ' '.join(epd.split()[0:4])
bm_lan = epd.split('bm')[1].strip().split(';')[0]
pos = chess.Board()
pos.set_epd(epd1)
bm_san = pos.san(chess.Move.from_uci(bm_lan))
a = 'bm ' + bm_lan
b = 'bm ' + bm_san
updated_epd = epd.replace(a, b)
# Add double quotes to id name
id_name = updated_epd.split('id')[1].strip().split(';')[0]
updated_id_name = '\"' + id_name + '\"'
a = 'id ' + id_name
b = 'id ' + updated_id_name
updated_epd = updated_epd.replace(a, b)
# Convert bm LAN to bm SAN and add hmvc and fmvn
pos, epd_info = chess.Board().from_epd(updated_epd)
new_epd = pos.epd(id=epd_info['id'],
bm=epd_info['bm'],
ce=epd_info['ce'],
acd=epd_info['acd'],
hmvc=pos.halfmove_clock,
fmvn=pos.fullmove_number)
# print(new_epd)
w.write('%s\n' % (new_epd))
if __name__ == "__main__":
main()
If you really just want to insert the hmvc and fmvn
hgm wrote: ↑Thu Feb 28, 2019 1:31 pm
EPDs have no 50-move or move-number fields. Only FENs have that...
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - fmvn 1; hmvc 0;
They have them, but they are decorated with a label.
Taking ideas is not a vice, it is a virtue. We have another word for this. It is called learning.
But sharing ideas is an even greater virtue. We have another word for this. It is called teaching.
hgm wrote: ↑Thu Feb 28, 2019 1:31 pm
EPDs have no 50-move or move-number fields. Only FENs have that...
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - fmvn 1; hmvc 0;
They have them, but they are decorated with a label.
I put that in as an issue to Python Chess about a week or so ago.
One more item: many online FEN strings come without the two final fields (moves since, movenum). the FEN reader complains. Might be useful if it added 0, 1, with some documentation explanation.
Response back: I need this quite frequently myself, but never got around to do it. Now implemented in 65e8729. Defaults to 0 1.
So, I think Python Chess now accepts both:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq x, y
and appends an 0, 1 if x, y missing. It used to just issue an error, "fen strings have six fields"
I'm not sure what happens if fmvn is specifically used as an identifier.
I hate pedantic interfaces. WinBoard just uses a default value 0 for the ply counter if it is missing, and ignores the move number anyway, when it parses a FEN.
I guess stupid old NotePad would not even have a problem doing this; just do a 'Replace All' on " id " for " 0 1 id " if you insist on beraking the EPDs that way.
chrisw wrote: ↑Fri Mar 01, 2019 10:58 am
So, I think Python Chess now accepts both:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq x, y
Yeah, on the master branch it now even defaults to