├── .gitignore ├── Books ├── 2moves_v1.epd.json ├── 3moves_FRC.epd.json ├── 4moves_noob.epd.json ├── 8moves_v3.epd.json ├── DFRC.epd.json ├── Endgames.epd.json ├── Pohl.epd.json ├── Pohl.pgn.json ├── UHO_4060_v2.epd.json ├── UHO_4060_vB.epd.json ├── UHO_4060_vT.epd.json └── UHO_Lichess_4852_v1.epd.json ├── Client ├── __init__.py ├── bench.py ├── cleanup.sh ├── client.py ├── cutechess-ob ├── cutechess-ob.exe ├── genfens.py ├── pgn_util.py ├── requirements.txt ├── utils.py └── worker.py ├── Config └── config.json ├── Documentation └── openbench.yml ├── Engines ├── 4ku.json ├── Akimbo.json ├── Alexandria.json ├── Altair.json ├── Berserk.json ├── Bit-Genie.json ├── BlackMarlin.json ├── Caissa.json ├── Carp.json ├── Clover.json ├── Demolito.json ├── Dragon.json ├── Drofa.json ├── Equisetum.json ├── Ethereal.json ├── FabChess.json ├── Halogen.json ├── Igel.json ├── Koivisto.json ├── Laser.json ├── Midnight.json ├── Obsidian.json ├── Polaris.json ├── Pytteliten.json ├── RubiChess.json ├── Seer.json ├── Stash.json ├── Stockfish.json ├── Stormphrax.json ├── Svart.json ├── Torch.json ├── Viridithas.json ├── Wahoo.json ├── Weiss.json ├── Willow.json ├── Winter.json └── Zahak.json ├── LICENSE ├── OpenBench ├── __init__.py ├── admin.py ├── apps.py ├── config.py ├── model_utils.py ├── models.py ├── pgn_watcher.py ├── static │ ├── base.css │ ├── copy_text.js │ ├── create_workload.js │ ├── default_text.js │ ├── ethereal.css │ ├── form.css │ ├── logo.svg │ ├── networks.js │ ├── paging.css │ └── style.css ├── stats.py ├── templatetags │ └── mytags.py ├── urls.py ├── utils.py ├── views.py ├── watcher.py └── workloads │ ├── create_workload.py │ ├── get_workload.py │ ├── modify_workload.py │ ├── verify_workload.py │ └── view_workload.py ├── OpenSite ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ├── README.md ├── Scripts ├── archive2nps.py ├── archive2pgns.py ├── bench_all.py ├── bench_engine.py ├── create_test.py ├── delete_networks.py ├── genfens_engine.py └── upload_net.py ├── Templates └── OpenBench │ ├── Blocks │ ├── pagebrowser.html │ └── testsummary.html │ ├── base.html │ ├── buyEthereal.html │ ├── create_workload.html │ ├── errors.html │ ├── event.html │ ├── events.html │ ├── index.html │ ├── login.html │ ├── machine.html │ ├── machines.html │ ├── network.html │ ├── networks.html │ ├── profile.html │ ├── register.html │ ├── search.html │ ├── uploadnet.html │ ├── users.html │ └── workload.html ├── UnitTests ├── example1.pgn ├── example2.pgn ├── example3.pgn └── test_pgn_util.py ├── manage.py └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | Client/* 3 | OpenBench/migrations/* 4 | 5 | credentials 6 | credentials.* 7 | db.sqlite3 8 | 9 | Scripts/Engines/* 10 | Scripts/Networks/* 11 | 12 | Media/* 13 | 14 | !Client/*.py 15 | !Client/cutechess-ob 16 | !Client/cutechess-ob.exe 17 | 18 | Media/PGNs/* 19 | Media/Networks/* 20 | Media/Events/* 21 | 22 | *.lock 23 | *.epd -------------------------------------------------------------------------------- /Books/2moves_v1.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "7bec98239836f219dc41944a768c0506abed950aaec48da69a0782643e90f237", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/2moves_v1.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/3moves_FRC.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "6bf81e1ada6a3306bbc8356f7bca1e2984a2828d658799992d5443b7179c934d", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/3moves_FRC.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/4moves_noob.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "4be746a91e3f8af0c9344b1e72d611e9fcfe486843867a55760970a4896f284d", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/4moves_noob.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/8moves_v3.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "1f055af431656f09ee6a09d2448e0b876125f78bb7b404fca2031c403a1541e5", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/8moves_v3.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/DFRC.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "648c447ef40614a44d13b78911e81470d8ddb0d3b2711c1b180e990871f5db4f", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/DFRC.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/Endgames.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "71c7477ca8c8fb097bb565794d8b5ed8754532f8fb499e9d8b1d397692302a6a", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/Endgames.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/Pohl.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "b3e64e0dab84cf451a9ac7ef031f5a2bbcf16c7e21be95298fb03cbf021f5466", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/Pohl.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/Pohl.pgn.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "aaa7559c5d94e592fe5cca3586cb099d8fc5f13428d4ce84afc4b97811241c7e", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/Pohl.pgn.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/UHO_4060_v2.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "36f2ec751ab78def6be1307430cbe2cd2ba65ade8d2aaae8f10e3df7d0ea83e1", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/UHO_4060_v2.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/UHO_4060_vB.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "68c58a5f6a5e068a30376efa19a6bcd78f8ec8bb67ad984dd8d156abfa81de96", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/UHO_4060_vB.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/UHO_4060_vT.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "f5da53b91b85f5ddc72c352522a8056ab8bbf0058b67d799c4ca96effd5d5f26", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/UHO_4060_vT.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Books/UHO_Lichess_4852_v1.epd.json: -------------------------------------------------------------------------------- 1 | { 2 | "sha" : "7A7F6470615A69C6CF23D565417701D38732876F480AF90D67B42ABADE35644A", 3 | "source" : "https://raw.githubusercontent.com/AndyGrant/openbench-books/master/UHO_Lichess_4852_v1.epd.zip" 4 | } 5 | -------------------------------------------------------------------------------- /Client/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndyGrant/OpenBench/53443bacfb9a6519217692ba4d25cadce5cefb2e/Client/__init__.py -------------------------------------------------------------------------------- /Client/cleanup.sh: -------------------------------------------------------------------------------- 1 | 2 | rm -rf Books/ 3 | rm -rf Engines/ 4 | rm -rf PGNS/ 5 | rm -rf Networks/ 6 | rm -rf __pycache__/ 7 | 8 | rm machine.txt -------------------------------------------------------------------------------- /Client/cutechess-ob: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndyGrant/OpenBench/53443bacfb9a6519217692ba4d25cadce5cefb2e/Client/cutechess-ob -------------------------------------------------------------------------------- /Client/cutechess-ob.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndyGrant/OpenBench/53443bacfb9a6519217692ba4d25cadce5cefb2e/Client/cutechess-ob.exe -------------------------------------------------------------------------------- /Client/pgn_util.py: -------------------------------------------------------------------------------- 1 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 2 | # # 3 | # OpenBench is a chess engine testing framework by Andrew Grant. # 4 | # # 5 | # # 6 | # OpenBench is free software: you can redistribute it and/or modify # 7 | # it under the terms of the GNU General Public License as published by # 8 | # the Free Software Foundation, either version 3 of the License, or # 9 | # (at your option) any later version. # 10 | # # 11 | # OpenBench is distributed in the hope that it will be useful, # 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 14 | # GNU General Public License for more details. # 15 | # # 16 | # You should have received a copy of the GNU General Public License # 17 | # along with this program. If not, see . # 18 | # # 19 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 20 | 21 | import bz2 22 | import re 23 | import sys 24 | 25 | ## Local imports must only use "import x", never "from x import ..." 26 | 27 | # For use externally 28 | REGEX_COMMENT_VERBOSE = r'(book|[+-]?M?\d+(?:\.\d+)? \d+/\d+ \d+ \d+)' 29 | REGEX_COMMENT_COMPACT = r'(book|[+-]?M?\d+(?:\.\d+)?) \d+/\d+ \d+ \d+' 30 | REGEX_MOVE_AND_COMMENT = r'\s*(?:\d+\. )?([a-zA-Z0-9+=#-]+) (?:\s*\{\s*([^}]*)\s*\})?' 31 | REGEX_GAME_RESULT = r'\s*(1-0|0-1|1/2-1/2|\*)' 32 | 33 | def pgn_iterator(fname): 34 | with open(fname) as pgn: 35 | while True: 36 | headers = pgn_header_list(iter(lambda: pgn.readline().rstrip(), '')) 37 | move_list = ' '.join(iter(lambda: pgn.readline().rstrip(), '')) 38 | if not headers or not move_list: 39 | break 40 | yield (headers, move_list) 41 | 42 | def pgn_header_list(lines): 43 | # PGN Format: [
""] 44 | return { f.split()[0][1:] : re.search(r'"([^"]*)"', f).group(1) for f in lines } 45 | 46 | def pgn_strip_headers(headers, compact): 47 | 48 | # 7-Tag Roster that is required to be a legal PGN 49 | desired = [ 50 | 'Event', 'Site', 51 | 'Date', 'Round', 52 | 'White', 'Black', 53 | 'Result', 54 | ] 55 | 56 | desired += [ 57 | 'FEN', # Required due to .epd openings 58 | 'TimeControl', # Useful to extract statistics 59 | 'Variant', # Useful to account for FRC/DFRC 60 | 'ScaleFactor', # Useful to extract statistics 61 | ] 62 | 63 | if not compact: # Useful to reconstruct time events 64 | desired += ['GameEndTime'] 65 | 66 | # PGN Format: [
""] 67 | return '\n'.join('[%s "%s"]' % (f, headers[f]) for f in desired if f in headers) 68 | 69 | def pgn_strip_movelist(move_text, compact): 70 | 71 | # May parse book, otherwise Score for Compact, Score Depth/SelDepth Time Nodes for Verbose 72 | comment_regex = re.compile(REGEX_COMMENT_COMPACT if compact else REGEX_COMMENT_VERBOSE) 73 | 74 | # Parses the move number, the SAN, and an optional comment 75 | one_ply_regex = re.compile(r'\s*(?:\d+\. )?([a-zA-Z0-9+=#-]+) (?:\s*\{\s*([^}]*)\s*\})?') 76 | 77 | # Captures the trailing game result 78 | result_regex = re.compile(r'\s*(1-0|0-1|1/2-1/2|\*)') 79 | 80 | stripped = '' # Add each: {} 81 | for move, comment in re.compile(REGEX_MOVE_AND_COMMENT).findall(move_text): 82 | match = re.search(comment_regex, comment) 83 | stripped += '%s {%s} ' % (move, match.group() if match else 'unknown') 84 | 85 | # PGNs expect trailing game result text 86 | return stripped + re.compile(REGEX_GAME_RESULT).search(move_text).group(1) 87 | 88 | def strip_entire_pgn(file_name, scale_factor, compact): 89 | 90 | stripped = '' 91 | for header_dict, move_text in pgn_iterator(file_name): 92 | header_dict['ScaleFactor'] = str(scale_factor) 93 | stripped += pgn_strip_headers(header_dict, compact) + '\n\n' 94 | stripped += pgn_strip_movelist(move_text, compact) + '\n\n' 95 | 96 | return stripped 97 | 98 | def compress_list_of_pgns(file_names, scale_factor, compact): 99 | 100 | text = '' 101 | for fname in file_names: 102 | print ('Compressing %s...' % (fname)) 103 | text += strip_entire_pgn(fname, scale_factor, compact) 104 | 105 | return bz2.compress(text.encode()) 106 | -------------------------------------------------------------------------------- /Client/requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | psutil>=5.9.5 3 | py-cpuinfo>=9.0.0 4 | -------------------------------------------------------------------------------- /Config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "client_version" : 38, 3 | "client_repo_url" : "https://github.com/AndyGrant/OpenBench", 4 | "client_repo_ref" : "master", 5 | 6 | "use_cross_approval" : false, 7 | "require_login_to_view" : false, 8 | "require_manual_registration" : false, 9 | "balance_engine_throughputs" : false, 10 | 11 | "books" : [ 12 | "2moves_v1.epd", 13 | "3moves_FRC.epd", 14 | "4moves_noob.epd", 15 | "8moves_v3.epd", 16 | "DFRC.epd", 17 | "Endgames.epd", 18 | "Pohl.epd", 19 | "Pohl.pgn", 20 | "UHO_4060_v2.epd", 21 | "UHO_4060_vB.epd", 22 | "UHO_4060_vT.epd", 23 | "UHO_Lichess_4852_v1.epd" 24 | ], 25 | 26 | "engines" : [ 27 | "4ku", 28 | "Berserk", 29 | "Bit-Genie", 30 | "BlackMarlin", 31 | "Demolito", 32 | "Drofa", 33 | "Equisetum", 34 | "Ethereal", 35 | "FabChess", 36 | "Halogen", 37 | "Igel", 38 | "Koivisto", 39 | "Laser", 40 | "RubiChess", 41 | "Seer", 42 | "Stash", 43 | "Stockfish", 44 | "Weiss", 45 | "Winter", 46 | "Zahak" 47 | ] 48 | } -------------------------------------------------------------------------------- /Documentation/openbench.yml: -------------------------------------------------------------------------------- 1 | name: OpenBench Build 2 | on: 3 | push: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | build_and_archive: 8 | name: Build and Archive 9 | strategy: 10 | matrix: 11 | os: [ubuntu-latest] 12 | nnue_flags: [avx2, avx512] 13 | cpu_flags: [popcnt, pext] 14 | 15 | runs-on: ${{ matrix.os }} 16 | steps: 17 | - name: Setup Linux GCC ${{ matrix.version }} 18 | uses: egor-tensin/setup-gcc@v1 19 | with: 20 | version: 11 21 | platform: x86 22 | - name: Clone Ethereal 23 | uses: actions/checkout@v3 24 | - name: Build Ethereal ${{ matrix.flags }} 25 | run: make EVALFILE=none CC=gcc static=1 ${{ matrix.nnue_flags }}=1 ${{ matrix.cpu_flags }}=1 26 | - name: Archive ${{ matrix.nnue_flags }}-${{ matrix.cpu_flags }} 27 | uses: actions/upload-artifact@v3 28 | with: 29 | name: ${{ github.sha }}-linux-${{ matrix.nnue_flags }}-${{ matrix.cpu_flags }} 30 | path: ethereal -------------------------------------------------------------------------------- /Engines/4ku.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1198000, 4 | "source" : "https://github.com/kz04px/4ku", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.pgn", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.pgn", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Akimbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1075000, 4 | "source" : "https://github.com/jw1912/akimbo", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["cargo>=1.70.0"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "main", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32, 28 | "test_bounds" : "[0.00, 3.00]" 29 | }, 30 | 31 | "LTC" : { 32 | "both_options" : "Threads=1 Hash=128", 33 | "both_time_control" : "40.0+0.4", 34 | "workload_size" : 8 35 | }, 36 | 37 | "STC regression" : { 38 | "both_options" : "Threads=1 Hash=32", 39 | "both_time_control" : "8.0+0.08", 40 | "workload_size" : 32, 41 | "test_bounds" : "[-5.00, 0.00]" 42 | }, 43 | 44 | "LTC regression" : { 45 | "both_options" : "Threads=1 Hash=128", 46 | "both_time_control" : "40.0+0.4", 47 | "workload_size" : 8, 48 | "test_bounds" : "[-5.00, 0.00]" 49 | }, 50 | 51 | "STC progtest" : { 52 | "both_options" : "Threads=1 Hash=32", 53 | "both_time_control" : "8.0+0.08", 54 | "workload_size" : 32, 55 | "book_name" : "8moves_v3.epd", 56 | "test_max_games" : 4000 57 | }, 58 | 59 | "LTC progtest" : { 60 | "both_options" : "Threads=1 Hash=128", 61 | "both_time_control" : "60.0+0.6", 62 | "workload_size" : 8, 63 | "book_name" : "8moves_v3.epd", 64 | "test_max_games" : 2000 65 | } 66 | }, 67 | 68 | "tune_presets" : { 69 | 70 | "default" : { 71 | "book_name" : "Pohl.epd", 72 | "win_adj" : "movecount=3 score=400", 73 | "draw_adj" : "movenumber=40 movecount=8 score=10" 74 | } 75 | }, 76 | 77 | "datagen_presets" : { 78 | 79 | "default" : { 80 | "win_adj" : "None", 81 | "draw_adj" : "None", 82 | "workload_size" : 128 83 | }, 84 | 85 | "40k Nodes" : { 86 | "both_options" : "Threads=1 Hash=16", 87 | "both_time_control" : "N=40000" 88 | } 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /Engines/Alexandria.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1025000, 4 | "source" : "https://github.com/PGG106/Alexandria", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["g++"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 3.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=16", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC regression" : { 37 | "both_options" : "Threads=1 Hash=32", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-3.00, 1.00]" 41 | }, 42 | 43 | "LTC regression" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-3.00, 1.00]" 48 | }, 49 | 50 | "SMP STC" : { 51 | "both_options" : "Threads=8 Hash=64", 52 | "both_time_control" : "4.0+0.04", 53 | "workload_size" : 64 54 | }, 55 | 56 | "SMP LTC" : { 57 | "both_options" : "Threads=8 Hash=256", 58 | "both_time_control" : "16.0+0.16", 59 | "workload_size" : 16 60 | } 61 | }, 62 | 63 | "tune_presets" : { 64 | 65 | "default" : { 66 | "book_name" : "Pohl.epd", 67 | "win_adj" : "movecount=3 score=400", 68 | "draw_adj" : "movenumber=40 movecount=8 score=10" 69 | } 70 | }, 71 | 72 | "datagen_presets" : { 73 | 74 | "default" : { 75 | "win_adj" : "None", 76 | "draw_adj" : "None", 77 | "workload_size" : 128 78 | }, 79 | 80 | "40k Nodes" : { 81 | "both_options" : "Threads=1 Hash=16", 82 | "both_time_control" : "N=40000" 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /Engines/Altair.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 990000, 4 | "source" : "https://github.com/Alex2262/AltairChessEngine", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["clang++"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC Simple" : { 37 | "both_options" : "Threads=1 Hash=32", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-5.00, 0.00]" 41 | }, 42 | 43 | "LTC Simple" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-5.00, 0.00]" 48 | }, 49 | 50 | "STC Prog" : { 51 | "both_options" : "Threads=1 Hash=32", 52 | "both_time_control" : "8.0+0.08", 53 | "workload_size" : 32, 54 | "book_name" : "8moves_v3.epd", 55 | "test_max_games" : 3000 56 | }, 57 | 58 | "LTC Prog" : { 59 | "both_options" : "Threads=1 Hash=128", 60 | "both_time_control" : "40.0+0.4", 61 | "workload_size" : 8, 62 | "book_name" : "8moves_v3.epd", 63 | "test_max_games" : 1000 64 | } 65 | }, 66 | 67 | "tune_presets" : { 68 | 69 | "default" : { 70 | "book_name" : "Pohl.epd", 71 | "win_adj" : "movecount=3 score=400", 72 | "draw_adj" : "movenumber=40 movecount=8 score=10" 73 | } 74 | }, 75 | 76 | "datagen_presets" : { 77 | 78 | "default" : { 79 | "win_adj" : "None", 80 | "draw_adj" : "None", 81 | "workload_size" : 128 82 | }, 83 | 84 | "40k Nodes" : { 85 | "both_options" : "Threads=1 Hash=16", 86 | "both_time_control" : "N=40000" 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Engines/Berserk.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 750000, 4 | "source" : "https://github.com/jhonnold/berserk", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["clang", "gcc"], 9 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 10 | "systems" : ["Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "main", 17 | "book_name" : "UHO_4060_vB.epd", 18 | "test_bounds" : "[0.00, 2.00]", 19 | "test_confidence" : "[0.1, 0.05]", 20 | "win_adj" : "movecount=4 score=300", 21 | "draw_adj" : "movenumber=32 movecount=6 score=6" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "10.0+0.1", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "60.0+0.6", 33 | "workload_size" : 8, 34 | "test_bounds" : "[0.00, 2.50]" 35 | }, 36 | 37 | "STC Simplify" : { 38 | "both_options" : "Threads=1 Hash=8", 39 | "both_time_control" : "10.0+0.1", 40 | "workload_size" : 32, 41 | "test_bounds" : "[-2.00, 0.00]" 42 | }, 43 | 44 | "LTC Simplify" : { 45 | "both_options" : "Threads=1 Hash=64", 46 | "both_time_control" : "60.0+0.6", 47 | "workload_size" : 8, 48 | "test_bounds" : "[-2.00, 0.00]" 49 | }, 50 | 51 | "STC Fixed" : { 52 | "both_options" : "Threads=1 Hash=8", 53 | "both_time_control" : "10.0+0.1", 54 | "workload_size" : 32, 55 | "test_max_games" : 20000 56 | }, 57 | 58 | "LTC Fixed" : { 59 | "both_options" : "Threads=1 Hash=64", 60 | "both_time_control" : "60.0+0.6", 61 | "workload_size" : 8, 62 | "test_max_games" : 20000 63 | }, 64 | 65 | "SMP STC" : { 66 | "both_options" : "Threads=8 Hash=64", 67 | "both_time_control" : "5.0+0.05", 68 | "workload_size" : 64 69 | }, 70 | 71 | "SMP LTC" : { 72 | "both_options" : "Threads=8 Hash=256", 73 | "both_time_control" : "30.0+0.30", 74 | "workload_size" : 16 75 | } 76 | }, 77 | 78 | "tune_presets" : { 79 | 80 | "default" : { 81 | "book_name" : "UHO_4060_vB.epd", 82 | "win_adj" : "movecount=4 score=300", 83 | "draw_adj" : "movenumber=32 movecount=6 score=6" 84 | }, 85 | 86 | "STC" : { 87 | "dev_options" : "Threads=1 Hash=8", 88 | "dev_time_control" : "10.0+0.10" 89 | } 90 | }, 91 | 92 | "datagen_presets" : { 93 | 94 | "default" : { 95 | "win_adj" : "None", 96 | "draw_adj" : "None", 97 | "workload_size" : 128 98 | }, 99 | 100 | "40k Nodes" : { 101 | "both_options" : "Threads=1 Hash=16", 102 | "both_time_control" : "N=40000" 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /Engines/Bit-Genie.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1992000, 4 | "source" : "https://github.com/Aryan1508/Bit-Genie", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/BlackMarlin.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 925000, 4 | "source" : "https://github.com/dsekercioglu/blackmarlin", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["cargo>=1.57.0"], 9 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "main", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Caissa.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1340000, 4 | "source" : "https://github.com/Witek902/Caissa", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "UHO_Lichess_4852_v1.epd", 18 | "test_bounds" : "[0.00, 2.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=32 movecount=8 score=5" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=16", 26 | "both_time_control" : "10.0+0.1", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "60.0+0.6", 33 | "workload_size" : 8 34 | }, 35 | 36 | "LTC Fixed" : { 37 | "both_options" : "Threads=1 Hash=64", 38 | "both_time_control" : "60.0+0.6", 39 | "workload_size" : 8, 40 | "test_max_games" : 20000 41 | }, 42 | 43 | "SMP STC" : { 44 | "both_options" : "Threads=8 Hash=64", 45 | "both_time_control" : "5.0+0.05", 46 | "workload_size" : 64 47 | }, 48 | 49 | "SMP LTC" : { 50 | "both_options" : "Threads=8 Hash=256", 51 | "both_time_control" : "30.0+0.30", 52 | "workload_size" : 16 53 | } 54 | }, 55 | 56 | "tune_presets" : { 57 | 58 | "default" : { 59 | "book_name" : "UHO_4060_v2.epd", 60 | "win_adj" : "movecount=4 score=500", 61 | "draw_adj" : "movenumber=32 movecount=6 score=6" 62 | }, 63 | 64 | "STC" : { 65 | "dev_options" : "Threads=1 Hash=8", 66 | "dev_time_control" : "10.0+0.10" 67 | } 68 | }, 69 | 70 | "datagen_presets" : { 71 | 72 | "default" : { 73 | "win_adj" : "None", 74 | "draw_adj" : "None", 75 | "workload_size" : 128 76 | }, 77 | 78 | "40k Nodes" : { 79 | "both_options" : "Threads=1 Hash=16", 80 | "both_time_control" : "N=40000" 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /Engines/Carp.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 975000, 4 | "source" : "https://github.com/dede1751/carp", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["cargo>=1.70.0"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "dev", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=16", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC Reg" : { 37 | "both_options" : "Threads=1 Hash=16", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-4.00, 1.00]" 41 | }, 42 | 43 | "LTC Reg" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-4.00, 1.00]" 48 | }, 49 | 50 | "STC Prog" : { 51 | "both_options" : "Threads=1 Hash=16", 52 | "both_time_control" : "8.0+0.08", 53 | "workload_size" : 32, 54 | "test_max_games" : 3000 55 | }, 56 | 57 | "LTC Prog" : { 58 | "both_options" : "Threads=1 Hash=128", 59 | "both_time_control" : "60.0+0.6", 60 | "workload_size" : 8, 61 | "test_max_games" : 1000 62 | }, 63 | 64 | "SMP STC" : { 65 | "both_options" : "Threads=4 Hash=16", 66 | "both_time_control" : "8.0+0.08", 67 | "workload_size" : 32 68 | }, 69 | 70 | "SMP LTC" : { 71 | "both_options" : "Threads=4 Hash=128", 72 | "both_time_control" : "40.0+0.4", 73 | "workload_size" : 8 74 | } 75 | }, 76 | 77 | "tune_presets" : { 78 | 79 | "default" : { 80 | "book_name" : "Pohl.epd", 81 | "win_adj" : "movecount=3 score=400", 82 | "draw_adj" : "movenumber=40 movecount=8 score=10" 83 | } 84 | }, 85 | 86 | "datagen_presets" : { 87 | 88 | "default" : { 89 | "win_adj" : "None", 90 | "draw_adj" : "None", 91 | "workload_size" : 128 92 | }, 93 | 94 | "40k Nodes" : { 95 | "both_options" : "Threads=1 Hash=16", 96 | "both_time_control" : "N=40000" 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /Engines/Clover.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 850000, 4 | "source" : "https://github.com/lucametehau/CloverEngine", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["g++"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 3.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "4.0+0.04", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "16.0+0.16", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Demolito.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1382000, 4 | "source" : "https://github.com/lucasart/Demolito", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["clang", "gcc"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=32", 32 | "both_time_control" : "32.0+0.32", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=32", 38 | "both_time_control" : "4.0+0.04", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=128", 44 | "both_time_control" : "16.0+0.16", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Dragon.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : true, 3 | "nps" : 584000, 4 | "source" : "https://github.com/ChessCom/komodo", 5 | 6 | "build" : { 7 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 8 | "systems" : ["Linux"] 9 | }, 10 | 11 | "test_presets" : { 12 | 13 | "default" : { 14 | "base_branch" : "openbench", 15 | "book_name" : "UHO_4060_v2.epd", 16 | "test_bounds" : "[0.00, 2.00]", 17 | "test_confidence" : "[0.10, 0.05]", 18 | "win_adj" : "movecount=5 score=300", 19 | "draw_adj" : "movenumber=32 movecount=6 score=8" 20 | }, 21 | 22 | "STC" : { 23 | "both_options" : "Threads=1 Hash=16 Minimal=true", 24 | "both_time_control" : "10.0+0.10", 25 | "workload_size" : 32 26 | }, 27 | 28 | "LTC" : { 29 | "both_options" : "Threads=1 Hash=64 Minimal=true", 30 | "both_time_control" : "60.0+0.6", 31 | "workload_size" : 8, 32 | "test_bounds" : "[0.00, 2.25]", 33 | "upload_pgns" : "COMPACT" 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=6 Hash=128 Minimal=true", 38 | "both_time_control" : "10.0+0.1", 39 | "workload_size" : 64, 40 | "upload_pgns" : "COMPACT" 41 | }, 42 | 43 | "SMP LTC" : { 44 | "both_options" : "Threads=15 Hash=256 Minimal=true", 45 | "both_time_control" : "30.0+0.3", 46 | "workload_size" : 16, 47 | "test_bounds" : "[0.50, 2.50]", 48 | "upload_pgns" : "COMPACT" 49 | }, 50 | 51 | "STC Simplification" : { 52 | "both_options" : "Threads=1 Hash=16 Minimal=true", 53 | "both_time_control" : "10.0+0.10", 54 | "workload_size" : 32, 55 | "test_bounds" : "[-1.75, 0.25]" 56 | }, 57 | 58 | "LTC Simplification" : { 59 | "both_options" : "Threads=1 Hash=64 Minimal=true", 60 | "both_time_control" : "60.0+0.6", 61 | "workload_size" : 8, 62 | "test_bounds" : "[-1.75, 0.25]", 63 | "upload_pgns" : "COMPACT" 64 | }, 65 | 66 | "STC Regression" : { 67 | "both_options" : "Threads=1 Hash=16 Minimal=true", 68 | "both_time_control" : "10.0+0.10", 69 | "workload_size" : 32, 70 | "book_name" : "Pohl.epd", 71 | "test_max_games" : 40000 72 | }, 73 | 74 | "LTC Regression" : { 75 | "both_options" : "Threads=1 Hash=64 Minimal=true", 76 | "both_time_control" : "60.0+0.6", 77 | "workload_size" : 8, 78 | "book_name" : "Pohl.epd", 79 | "test_max_games" : 40000, 80 | "upload_pgns" : "COMPACT" 81 | }, 82 | 83 | "STC Fixed Games" : { 84 | "both_options" : "Threads=1 Hash=16 Minimal=true", 85 | "both_time_control" : "10.0+0.10", 86 | "workload_size" : 32, 87 | "test_max_games" : 40000 88 | }, 89 | 90 | "LTC Fixed Games" : { 91 | "both_options" : "Threads=1 Hash=64 Minimal=true", 92 | "both_time_control" : "60.0+0.6", 93 | "workload_size" : 8, 94 | "test_max_games" : 40000 95 | }, 96 | 97 | "57.5k Fixed Nodes" : { 98 | "both_options" : "Threads=1 Hash=64 Minimal=true", 99 | "both_time_control" : "N=57500", 100 | "workload_size" : 128, 101 | "test_max_games" : 40000 102 | } 103 | }, 104 | 105 | "tune_presets" : { 106 | 107 | "default" : { 108 | "book_name" : "UHO_4060_v2.epd", 109 | "win_adj" : "movecount=5 score=300", 110 | "draw_adj" : "movenumber=32 movecount=6 score=8" 111 | }, 112 | 113 | "STC" : { 114 | "dev_options" : "Threads=1 Hash=16 Minimal=true", 115 | "dev_time_control" : "10.0+0.10" 116 | }, 117 | 118 | "MTC" : { 119 | "dev_options" : "Threads=1 Hash=32 Minimal=true", 120 | "dev_time_control" : "30.0+0.30" 121 | }, 122 | 123 | "LTC" : { 124 | "dev_options" : "Threads=1 Hash=64 Minimal=true", 125 | "dev_time_control" : "60.0+0.60" 126 | }, 127 | 128 | "VLTC" : { 129 | "dev_options" : "Threads=1 Hash=128 Minimal=true", 130 | "dev_time_control" : "180.0+1.80" 131 | } 132 | }, 133 | 134 | "datagen_presets" : { 135 | 136 | "default" : { 137 | "win_adj" : "None", 138 | "draw_adj" : "None", 139 | "workload_size" : 128 140 | }, 141 | 142 | "40k Nodes" : { 143 | "both_options" : "Threads=1 Hash=16", 144 | "both_time_control" : "N=40000" 145 | } 146 | } 147 | } -------------------------------------------------------------------------------- /Engines/Drofa.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1165000, 4 | "source" : "https://github.com/justNo4b/Drofa", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "4moves_noob.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "4moves_noob.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Equisetum.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1100000, 4 | "source" : "https://github.com/justNo4b/Equisetum", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "main", 17 | "book_name" : "Pohl.pgn", 18 | "test_bounds" : "[0.00, 4.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.pgn", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Ethereal.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 975000, 4 | "source" : "https://github.com/AndyGrant/Ethereal", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["clang", "gcc"], 9 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "UHO_Lichess_4852_v1.epd", 18 | "test_bounds" : "[0.00, 3.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "10.0+0.1", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "60.0+0.6", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "UHO_Lichess_4852_v1.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | }, 56 | 57 | "STC" : { 58 | "dev_options" : "Threads=1 Hash=8", 59 | "dev_time_control" : "10.0+0.10" 60 | }, 61 | 62 | "MTC" : { 63 | "dev_options" : "Threads=1 Hash=32", 64 | "dev_time_control" : "30.0+0.30" 65 | }, 66 | 67 | "LTC" : { 68 | "dev_options" : "Threads=1 Hash=64", 69 | "dev_time_control" : "60.0+0.60" 70 | }, 71 | 72 | "VLTC" : { 73 | "dev_options" : "Threads=1 Hash=128", 74 | "dev_time_control" : "180.0+1.80" 75 | } 76 | }, 77 | 78 | "datagen_presets" : { 79 | 80 | "default" : { 81 | "win_adj" : "None", 82 | "draw_adj" : "None", 83 | "workload_size" : 128 84 | }, 85 | 86 | "40k Nodes" : { 87 | "both_options" : "Threads=1 Hash=16", 88 | "both_time_control" : "N=40000" 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /Engines/FabChess.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1056000, 4 | "source" : "https://github.com/fabianvdW/FabChess", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["cargo>=1.41.0"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Halogen.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1893000, 4 | "source" : "https://github.com/KierenP/Halogen", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["g++>=9.0.0", "clang++>=10.0.0"], 9 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "UHO_4060_v2.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8 OutputLevel=Minimal", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64 OutputLevel=Minimal", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64 OutputLevel=Minimal", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256 OutputLevel=Minimal", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "UHO_4060_v2.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Igel.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 483000, 4 | "source" : "https://github.com/vshcherbyna/igel", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 3.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "10.0+0.1", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "60.0+0.6", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Koivisto.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1327000, 4 | "source" : "https://github.com/Luecx/Koivisto", 5 | 6 | "build" : { 7 | "path" : "src_files", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 2.50]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Laser.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 933000, 4 | "source" : "https://github.com/jeffreyan11/uci-chess-engine", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Midnight.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 912000, 4 | "source" : "https://github.com/archishou/MidnightChessEngine", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["clang++", "g++"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC Simple" : { 37 | "both_options" : "Threads=1 Hash=32", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-5.00, 0.00]" 41 | }, 42 | 43 | "LTC Simple" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-5.00, 0.00]" 48 | }, 49 | 50 | "STC Prog" : { 51 | "both_options" : "Threads=1 Hash=32", 52 | "both_time_control" : "8.0+0.08", 53 | "workload_size" : 32, 54 | "book_name" : "8moves_v3.epd", 55 | "test_max_games" : 3000 56 | }, 57 | 58 | "LTC Prog" : { 59 | "both_options" : "Threads=1 Hash=128", 60 | "both_time_control" : "40.0+0.4", 61 | "workload_size" : 8, 62 | "book_name" : "8moves_v3.epd", 63 | "test_max_games" : 1000 64 | } 65 | }, 66 | 67 | "tune_presets" : { 68 | 69 | "default" : { 70 | "book_name" : "Pohl.epd", 71 | "win_adj" : "movecount=3 score=400", 72 | "draw_adj" : "movenumber=40 movecount=8 score=10" 73 | } 74 | }, 75 | 76 | "datagen_presets" : { 77 | 78 | "default" : { 79 | "win_adj" : "None", 80 | "draw_adj" : "None", 81 | "workload_size" : 128 82 | }, 83 | 84 | "40k Nodes" : { 85 | "both_options" : "Threads=1 Hash=16", 86 | "both_time_control" : "N=40000" 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Engines/Obsidian.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1000000, 4 | "base" : "main", 5 | "source" : "https://github.com/gab8192/Obsidian", 6 | 7 | "build" : { 8 | "path" : ".", 9 | "compilers" : ["gcc"], 10 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 11 | "systems" : ["Windows", "Linux"] 12 | }, 13 | 14 | "test_presets" : { 15 | 16 | "default" : { 17 | "base_branch" : "main", 18 | "book_name" : "UHO_4060_v2.epd", 19 | "test_bounds" : "[0.00, 3.00]", 20 | "test_confidence" : "[0.1, 0.05]", 21 | "win_adj" : "movecount=3 score=400", 22 | "draw_adj" : "movenumber=40 movecount=8 score=10" 23 | }, 24 | 25 | "STC" : { 26 | "both_options" : "Threads=1 Hash=16", 27 | "both_time_control" : "8.0+0.08", 28 | "workload_size" : 32 29 | }, 30 | 31 | "LTC" : { 32 | "both_options" : "Threads=1 Hash=64", 33 | "both_time_control" : "30.0+0.30", 34 | "workload_size" : 8 35 | } 36 | }, 37 | 38 | "tune_presets" : { 39 | 40 | "default" : { 41 | "book_name" : "UHO_4060_v2.epd", 42 | "win_adj" : "movecount=3 score=400", 43 | "draw_adj" : "movenumber=40 movecount=8 score=10", 44 | "spsa_iterations" : 5000 45 | }, 46 | 47 | "STC" : { 48 | "dev_options" : "Threads=1 Hash=16", 49 | "dev_time_control" : "8.0+0.08" 50 | }, 51 | 52 | "LTC" : { 53 | "dev_options" : "Threads=1 Hash=64", 54 | "dev_time_control" : "30.0+0.30" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } -------------------------------------------------------------------------------- /Engines/Polaris.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 2057000, 4 | "source" : "https://github.com/Ciekce/Polaris", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["clang++", "g++"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "main", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC regression" : { 37 | "both_options" : "Threads=1 Hash=32", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-5.00, 0.00]" 41 | }, 42 | 43 | "LTC regression" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-5.00, 0.00]" 48 | }, 49 | 50 | "STC progtest" : { 51 | "both_options" : "Threads=1 Hash=32", 52 | "both_time_control" : "8.0+0.08", 53 | "workload_size" : 32, 54 | "book_name" : "8moves_v3.epd", 55 | "test_max_games" : 3000 56 | }, 57 | 58 | "LTC progtest" : { 59 | "both_options" : "Threads=1 Hash=128", 60 | "both_time_control" : "60.0+0.6", 61 | "workload_size" : 8, 62 | "book_name" : "8moves_v3.epd", 63 | "test_max_games" : 1000 64 | } 65 | }, 66 | 67 | "tune_presets" : { 68 | 69 | "default" : { 70 | "book_name" : "Pohl.epd", 71 | "win_adj" : "movecount=3 score=400", 72 | "draw_adj" : "movenumber=40 movecount=8 score=10" 73 | } 74 | }, 75 | 76 | "datagen_presets" : { 77 | 78 | "default" : { 79 | "win_adj" : "None", 80 | "draw_adj" : "None", 81 | "workload_size" : 128 82 | }, 83 | 84 | "40k Nodes" : { 85 | "both_options" : "Threads=1 Hash=16", 86 | "both_time_control" : "N=40000" 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Engines/Pytteliten.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 5288029, 4 | "source" : "https://github.com/crippa1337/Pytteliten", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["clang++", "g++"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "4moves_noob.epd", 18 | "test_bounds" : "[0.00, 10.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC regression" : { 37 | "both_options" : "Threads=1 Hash=32", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-10.00, 0.00]" 41 | }, 42 | 43 | "LTC regression" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-10.00, 0.00]" 48 | }, 49 | 50 | "STC progtest" : { 51 | "both_options" : "Threads=1 Hash=32", 52 | "both_time_control" : "10.0+0.1", 53 | "workload_size" : 32, 54 | "book_name" : "8moves_v3.epd", 55 | "test_max_games" : 4000 56 | }, 57 | 58 | "LTC progtest" : { 59 | "both_options" : "Threads=1 Hash=128", 60 | "both_time_control" : "60.0+0.6", 61 | "workload_size" : 8, 62 | "book_name" : "8moves_v3.epd", 63 | "test_max_games" : 2000 64 | } 65 | }, 66 | 67 | "tune_presets" : { 68 | 69 | "default" : { 70 | "book_name" : "4moves_noob.epd", 71 | "win_adj" : "movecount=3 score=400", 72 | "draw_adj" : "movenumber=40 movecount=8 score=10" 73 | } 74 | }, 75 | 76 | "datagen_presets" : { 77 | 78 | "default" : { 79 | "win_adj" : "None", 80 | "draw_adj" : "None", 81 | "workload_size" : 128 82 | }, 83 | 84 | "40k Nodes" : { 85 | "both_options" : "Threads=1 Hash=16", 86 | "both_time_control" : "N=40000" 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Engines/RubiChess.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 760000, 4 | "source" : "https://github.com/Matthies/RubiChess", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "10.0+0.1", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "60.0+0.6", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Seer.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 785000, 4 | "source" : "https://github.com/connormcmonigle/seer-nnue", 5 | 6 | "build" : { 7 | "path" : "build", 8 | "compilers" : ["g++>=9.0.0"], 9 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "main", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Stash.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1615000, 4 | "source" : "https://github.com/mhouppin/stash-bot", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["gcc", "clang"], 9 | "cpuflags" : [], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "UHO_4060_v2.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=16", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "Nonreg STC" : { 37 | "both_options" : "Threads=1 Hash=16", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-4.00, 1.00]" 41 | }, 42 | 43 | "Nonreg LTC" : { 44 | "both_options" : "Threads=1 Hash=64", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-4.00, 1.00]" 48 | }, 49 | 50 | "SMP STC" : { 51 | "both_options" : "Threads=8 Hash=64", 52 | "both_time_control" : "5.0+0.05", 53 | "workload_size" : 64 54 | }, 55 | 56 | "SMP LTC" : { 57 | "both_options" : "Threads=8 Hash=256", 58 | "both_time_control" : "20.0+0.2", 59 | "workload_size" : 16 60 | } 61 | }, 62 | 63 | "tune_presets" : { 64 | 65 | "default" : { 66 | "book_name" : "UHO_4060_v2.epd", 67 | "win_adj" : "movecount=3 score=400", 68 | "draw_adj" : "movenumber=40 movecount=8 score=10" 69 | }, 70 | 71 | "STC" : { 72 | "both_options" : "Threads=1 Hash=16", 73 | "both_time_control" : "8.0+0.08" 74 | }, 75 | 76 | "LTC" : { 77 | "both_options" : "Threads=1 Hash=64", 78 | "both_time_control" : "40.0+0.4" 79 | } 80 | }, 81 | 82 | "datagen_presets" : { 83 | 84 | "default" : { 85 | "win_adj" : "movecount=3 score=1410", 86 | "draw_adj" : "movenumber=40 movecount=8 score=15", 87 | "workload_size" : 256 88 | }, 89 | 90 | "16k Nodes" : { 91 | "both_options" : "Threads=1 Hash=1 NormalizeScore=false", 92 | "both_time_control" : "N=16000" 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /Engines/Stockfish.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 435000, 4 | "source" : "https://github.com/AndyGrant/Stockfish", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["g++"], 9 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "ob_17.1", 17 | "book_name" : "UHO_Lichess_4852_v1.epd", 18 | "test_bounds" : "[0.00, 2.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=5 score=600", 21 | "draw_adj" : "movenumber=32 movecount=6 score=15" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=16", 26 | "both_time_control" : "10.0+0.10", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "60.0+0.6", 33 | "workload_size" : 8, 34 | "test_bounds" : "[0.50, 2.50]" 35 | }, 36 | 37 | "SMP STC" : { 38 | "both_options" : "Threads=7 Hash=64", 39 | "both_time_control" : "10.0+0.1", 40 | "workload_size" : 64 41 | }, 42 | 43 | "SMP LTC" : { 44 | "both_options" : "Threads=14 Hash=256", 45 | "both_time_control" : "30.0+0.3", 46 | "workload_size" : 16, 47 | "test_bounds" : "[0.50, 2.50]" 48 | }, 49 | 50 | "STC Simplification" : { 51 | "both_options" : "Threads=1 Hash=16", 52 | "both_time_control" : "10.0+0.10", 53 | "workload_size" : 32, 54 | "test_bounds" : "[-1.75, 0.25]" 55 | }, 56 | 57 | "LTC Simplification" : { 58 | "both_options" : "Threads=1 Hash=64", 59 | "both_time_control" : "60.0+0.6", 60 | "workload_size" : 8, 61 | "test_bounds" : "[-1.75, 0.25]" 62 | }, 63 | 64 | "STC Regression" : { 65 | "both_options" : "Threads=1 Hash=16", 66 | "both_time_control" : "10.0+0.10", 67 | "workload_size" : 32, 68 | "book_name" : "8moves_v3.epd", 69 | "test_max_games" : 40000 70 | }, 71 | 72 | "LTC Regression" : { 73 | "both_options" : "Threads=1 Hash=64", 74 | "both_time_control" : "60.0+0.6", 75 | "workload_size" : 8, 76 | "book_name" : "8moves_v3.epd", 77 | "test_max_games" : 40000 78 | }, 79 | 80 | "STC Fixed Games" : { 81 | "both_options" : "Threads=1 Hash=16", 82 | "both_time_control" : "10.0+0.10", 83 | "workload_size" : 32, 84 | "test_max_games" : 40000 85 | }, 86 | 87 | "LTC Fixed Games" : { 88 | "both_options" : "Threads=1 Hash=64", 89 | "both_time_control" : "60.0+0.6", 90 | "workload_size" : 8, 91 | "test_max_games" : 40000 92 | } 93 | }, 94 | 95 | "tune_presets" : { 96 | 97 | "default" : { 98 | "book_name" : "UHO_Lichess_4852_v1.epd", 99 | "win_adj" : "movecount=5 score=600", 100 | "draw_adj" : "movenumber=32 movecount=6 score=15" 101 | } 102 | }, 103 | 104 | "datagen_presets" : { 105 | 106 | "default" : { 107 | "win_adj" : "None", 108 | "draw_adj" : "None", 109 | "workload_size" : 128 110 | }, 111 | 112 | "40k Nodes" : { 113 | "both_options" : "Threads=1 Hash=16", 114 | "both_time_control" : "N=40000" 115 | } 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /Engines/Stormphrax.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 870000, 4 | "source" : "https://github.com/Ciekce/Stormphrax", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["clang++", "g++"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "main", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 3.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC regression" : { 37 | "both_options" : "Threads=1 Hash=32", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-5.00, 0.00]" 41 | }, 42 | 43 | "LTC regression" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-5.00, 0.00]" 48 | }, 49 | 50 | "STC progtest" : { 51 | "both_options" : "Threads=1 Hash=32", 52 | "both_time_control" : "8.0+0.08", 53 | "workload_size" : 32, 54 | "book_name" : "8moves_v3.epd", 55 | "test_max_games" : 3000 56 | }, 57 | 58 | "LTC progtest" : { 59 | "both_options" : "Threads=1 Hash=128", 60 | "both_time_control" : "60.0+0.6", 61 | "workload_size" : 8, 62 | "book_name" : "8moves_v3.epd", 63 | "test_max_games" : 1000 64 | } 65 | }, 66 | 67 | "tune_presets" : { 68 | 69 | "default" : { 70 | "book_name" : "Pohl.epd", 71 | "win_adj" : "movecount=3 score=400", 72 | "draw_adj" : "movenumber=40 movecount=8 score=10" 73 | } 74 | }, 75 | 76 | "datagen_presets" : { 77 | 78 | "default" : { 79 | "win_adj" : "None", 80 | "draw_adj" : "None", 81 | "workload_size" : 128 82 | }, 83 | 84 | "40k Nodes" : { 85 | "both_options" : "Threads=1 Hash=16", 86 | "both_time_control" : "N=40000" 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Engines/Svart.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1350000, 4 | "source" : "https://github.com/crippa1337/svart", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["cargo>=1.70.0"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC regression" : { 37 | "both_options" : "Threads=1 Hash=32", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-5.00, 0.00]" 41 | }, 42 | 43 | "LTC regression" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-5.00, 0.00]" 48 | }, 49 | 50 | "STC progtest" : { 51 | "both_options" : "Threads=1 Hash=32", 52 | "both_time_control" : "10.0+0.1", 53 | "workload_size" : 32, 54 | "book_name" : "8moves_v3.epd", 55 | "test_max_games" : 4000 56 | }, 57 | 58 | "LTC progtest" : { 59 | "both_options" : "Threads=1 Hash=128", 60 | "both_time_control" : "60.0+0.6", 61 | "workload_size" : 8, 62 | "book_name" : "8moves_v3.epd", 63 | "test_max_games" : 2000 64 | } 65 | }, 66 | 67 | "tune_presets" : { 68 | 69 | "default" : { 70 | "book_name" : "Pohl.epd", 71 | "win_adj" : "movecount=3 score=400", 72 | "draw_adj" : "movenumber=40 movecount=8 score=10" 73 | } 74 | }, 75 | 76 | "datagen_presets" : { 77 | 78 | "default" : { 79 | "win_adj" : "None", 80 | "draw_adj" : "None", 81 | "workload_size" : 128 82 | }, 83 | 84 | "40k Nodes" : { 85 | "both_options" : "Threads=1 Hash=16", 86 | "both_time_control" : "N=40000" 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Engines/Torch.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : true, 3 | "nps" : 376000, 4 | "source" : "https://github.com/ChessCom/TorchDev", 5 | 6 | "build" : { 7 | "cpuflags" : ["AVX2", "FMA", "POPCNT"], 8 | "systems" : ["Linux"] 9 | }, 10 | 11 | "test_presets" : { 12 | 13 | "default" : { 14 | "base_branch" : "master", 15 | "book_name" : "UHO_Lichess_4852_v1.epd", 16 | "test_bounds" : "[0.00, 2.00]", 17 | "test_confidence" : "[0.05, 0.05]", 18 | "win_adj" : "movecount=5 score=300", 19 | "draw_adj" : "movenumber=32 movecount=6 score=8" 20 | }, 21 | 22 | "STC" : { 23 | "both_options" : "Threads=1 Hash=16 Minimal=true", 24 | "both_time_control" : "15.0+0.15", 25 | "workload_size" : 32 26 | }, 27 | 28 | "LTC" : { 29 | "both_options" : "Threads=1 Hash=64 Minimal=true", 30 | "both_time_control" : "60.0+0.6", 31 | "workload_size" : 8, 32 | "test_bounds" : "[0.00, 2.25]", 33 | "upload_pgns" : "COMPACT" 34 | }, 35 | 36 | "STC 6-threads" : { 37 | "both_options" : "Threads=6 Hash=128 Minimal=true", 38 | "both_time_control" : "10.0+0.1", 39 | "workload_size" : 64, 40 | "upload_pgns" : "COMPACT" 41 | }, 42 | 43 | "LTC 15-threads" : { 44 | "both_options" : "Threads=15 Hash=512 Minimal=true", 45 | "both_time_control" : "30.0+0.3", 46 | "workload_size" : 16, 47 | "test_bounds" : "[0.50, 2.50]", 48 | "upload_pgns" : "COMPACT" 49 | }, 50 | 51 | "STC Simplification" : { 52 | "both_options" : "Threads=1 Hash=16 Minimal=true", 53 | "both_time_control" : "15.0+0.15", 54 | "workload_size" : 32, 55 | "test_bounds" : "[-1.75, 0.25]" 56 | }, 57 | 58 | "LTC Simplification" : { 59 | "both_options" : "Threads=1 Hash=64 Minimal=true", 60 | "both_time_control" : "60.0+0.6", 61 | "workload_size" : 8, 62 | "test_bounds" : "[-1.75, 0.25]", 63 | "upload_pgns" : "COMPACT" 64 | }, 65 | 66 | "Speed Test" : { 67 | "both_options" : "Threads=1 Hash=16 Minimal=true", 68 | "both_time_control" : "N=100000", 69 | "workload_size" : 128, 70 | "test_max_games" : 80000, 71 | "upload_pgns" : "VERBOSE" 72 | }, 73 | 74 | "LTC Fixed Games" : { 75 | "both_options" : "Threads=1 Hash=64 Minimal=true", 76 | "both_time_control" : "60.0+0.6", 77 | "workload_size" : 8, 78 | "test_max_games" : 40000 79 | } 80 | }, 81 | 82 | "tune_presets" : { 83 | 84 | "default" : { 85 | "book_name" : "UHO_Lichess_4852_v1.epd", 86 | "win_adj" : "movecount=5 score=300", 87 | "draw_adj" : "movenumber=32 movecount=6 score=8" 88 | }, 89 | 90 | "STC" : { 91 | "dev_options" : "Threads=1 Hash=16 Minimal=true", 92 | "dev_time_control" : "15.0+0.15" 93 | }, 94 | 95 | "LTC" : { 96 | "dev_options" : "Threads=1 Hash=64 Minimal=true", 97 | "dev_time_control" : "60.0+0.60" 98 | }, 99 | 100 | "VLTC" : { 101 | "dev_options" : "Threads=1 Hash=128 Minimal=true", 102 | "dev_time_control" : "180.0+1.80" 103 | }, 104 | 105 | "LTC 6-threads" : { 106 | "dev_options" : "Threads=6 Hash=512 Minimal=true", 107 | "dev_time_control" : "60.0+0.60" 108 | } 109 | }, 110 | 111 | "datagen_presets" : { 112 | 113 | "default" : { 114 | "both_options" : "Threads=1 Hash=16 Minimal=true Normalize=false UseSoftNodes=true NodeFudging=4000", 115 | "both_time_control" : "N=32000", 116 | "datagen_max_games" : 20000000, 117 | "draw_adj" : "None", 118 | "upload_pgns" : "COMPACT", 119 | "win_adj" : "None", 120 | "workload_size" : 64 121 | }, 122 | 123 | "Default + UHOLichess" : { 124 | "book_name" : "UHO_Lichess_4852_v1.epd" 125 | }, 126 | 127 | "Default + No Book" : { 128 | "book_name" : "None" 129 | } 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /Engines/Viridithas.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 865000, 4 | "source" : "https://github.com/cosmobobak/viridithas", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["cargo>=1.70.0"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 3.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=16", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC regression" : { 37 | "both_options" : "Threads=1 Hash=16", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-5.00, 0.00]" 41 | }, 42 | 43 | "LTC regression" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-5.00, 0.00]" 48 | }, 49 | 50 | "STC progtest" : { 51 | "both_options" : "Threads=1 Hash=16", 52 | "both_time_control" : "8.0+0.08", 53 | "workload_size" : 32, 54 | "test_max_games" : 3000 55 | }, 56 | 57 | "LTC progtest" : { 58 | "both_options" : "Threads=1 Hash=128", 59 | "both_time_control" : "60.0+0.6", 60 | "workload_size" : 8, 61 | "test_max_games" : 1000 62 | }, 63 | 64 | "SMP STC" : { 65 | "both_options" : "Threads=4 Hash=16", 66 | "both_time_control" : "8.0+0.08", 67 | "workload_size" : 32 68 | }, 69 | 70 | "SMP LTC" : { 71 | "both_options" : "Threads=4 Hash=128", 72 | "both_time_control" : "40.0+0.4", 73 | "workload_size" : 8 74 | } 75 | }, 76 | 77 | "tune_presets" : { 78 | 79 | "default" : { 80 | "book_name" : "UHO_4060_v2.epd", 81 | "win_adj" : "movecount=3 score=400", 82 | "draw_adj" : "movenumber=40 movecount=8 score=10" 83 | }, 84 | 85 | "STC" : { 86 | "dev_options" : "Threads=1 Hash=8", 87 | "dev_time_control" : "10.0+0.10" 88 | }, 89 | 90 | "MTC" : { 91 | "dev_options" : "Threads=1 Hash=32", 92 | "dev_time_control" : "30.0+0.30" 93 | }, 94 | 95 | "LTC" : { 96 | "dev_options" : "Threads=1 Hash=64", 97 | "dev_time_control" : "60.0+0.60" 98 | }, 99 | 100 | "VLTC" : { 101 | "dev_options" : "Threads=1 Hash=128", 102 | "dev_time_control" : "180.0+1.80" 103 | } 104 | }, 105 | 106 | "datagen_presets" : { 107 | 108 | "default" : { 109 | "win_adj" : "None", 110 | "draw_adj" : "None", 111 | "workload_size" : 128 112 | }, 113 | 114 | "40k Nodes" : { 115 | "both_options" : "Threads=1 Hash=16", 116 | "both_time_control" : "N=40000" 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /Engines/Wahoo.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 2680000, 4 | "source" : "https://github.com/spamdrew128/Wahoo", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["cargo>=1.60.0"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "dev", 17 | "book_name" : "noob_4moves.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "None", 21 | "draw_adj" : "None" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC Simple" : { 37 | "both_options" : "Threads=1 Hash=32", 38 | "both_time_control" : "8.0+0.08", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-5.00, 0.00]" 41 | }, 42 | 43 | "LTC Simple" : { 44 | "both_options" : "Threads=1 Hash=128", 45 | "both_time_control" : "40.0+0.4", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-5.00, 0.00]" 48 | }, 49 | 50 | "STC Prog" : { 51 | "both_options" : "Threads=1 Hash=32", 52 | "both_time_control" : "8.0+0.08", 53 | "workload_size" : 32, 54 | "book_name" : "8moves_v3.epd", 55 | "test_max_games" : 3000 56 | }, 57 | 58 | "LTC Prog" : { 59 | "both_options" : "Threads=1 Hash=128", 60 | "both_time_control" : "40.0+0.4", 61 | "workload_size" : 8, 62 | "book_name" : "8moves_v3.epd", 63 | "test_max_games" : 1000 64 | } 65 | }, 66 | 67 | "tune_presets" : { 68 | 69 | "default" : { 70 | "book_name" : "noob_4moves.epd", 71 | "win_adj" : "None", 72 | "draw_adj" : "None" 73 | } 74 | }, 75 | 76 | "datagen_presets" : { 77 | 78 | "default" : { 79 | "win_adj" : "None", 80 | "draw_adj" : "None", 81 | "workload_size" : 128 82 | }, 83 | 84 | "40k Nodes" : { 85 | "both_options" : "Threads=1 Hash=16", 86 | "both_time_control" : "N=40000" 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /Engines/Weiss.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 1090000, 4 | "source" : "https://github.com/TerjeKir/weiss", 5 | 6 | "build" : { 7 | "path" : "src", 8 | "compilers" : ["gcc"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "UHO_Lichess_4852_v1.epd", 18 | "test_bounds" : "[0.00, 3.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=32 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32 Minimal=true", 26 | "both_time_control" : "10.0+0.10", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128 Minimal=true", 32 | "both_time_control" : "60.0+0.6", 33 | "workload_size" : 8 34 | }, 35 | 36 | "STC Simplify" : { 37 | "both_options" : "Threads=1 Hash=32 Minimal=true", 38 | "both_time_control" : "10.0+0.10", 39 | "workload_size" : 32, 40 | "test_bounds" : "[-3.00, 0.00]" 41 | }, 42 | 43 | "LTC Simplify" : { 44 | "both_options" : "Threads=1 Hash=128 Minimal=true", 45 | "both_time_control" : "60.0+0.6", 46 | "workload_size" : 8, 47 | "test_bounds" : "[-3.00, 0.00]" 48 | }, 49 | 50 | "SMP STC" : { 51 | "both_options" : "Threads=8 Hash=128 Minimal=true", 52 | "both_time_control" : "5.0+0.05", 53 | "workload_size" : 64 54 | }, 55 | 56 | "SMP LTC" : { 57 | "both_options" : "Threads=8 Hash=512 Minimal=true", 58 | "both_time_control" : "20.0+0.2", 59 | "workload_size" : 16 60 | } 61 | }, 62 | 63 | "tune_presets" : { 64 | 65 | "default" : { 66 | "book_name" : "UHO_4060_v2.epd", 67 | "win_adj" : "movecount=3 score=400", 68 | "draw_adj" : "movenumber=32 movecount=8 score=10" 69 | }, 70 | 71 | "STC" : { 72 | "dev_options" : "Threads=1 Hash=32 Minimal=true", 73 | "dev_time_control" : "10.0+0.10" 74 | }, 75 | 76 | "LTC" : { 77 | "dev_options" : "Threads=1 Hash=128 Minimal=true", 78 | "dev_time_control" : "60.0+0.6" 79 | } 80 | }, 81 | 82 | "datagen_presets" : { 83 | 84 | "default" : { 85 | "win_adj" : "None", 86 | "draw_adj" : "None", 87 | "workload_size" : 128 88 | }, 89 | 90 | "40k Nodes" : { 91 | "both_options" : "Threads=1 Hash=16 Minimal=true", 92 | "both_time_control" : "N=40000" 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /Engines/Willow.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 850000, 4 | "source" : "https://github.com/Adam-Kulju/Willow", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["clang++", "g++"], 9 | "cpuflags" : [], 10 | "systems" : ["Linux", "Windows", "Darwin"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "main", 17 | "book_name" : "4moves_noob.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=32", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=128", 32 | "both_time_control" : "60.0+0.6", 33 | "workload_size" : 8 34 | } 35 | }, 36 | 37 | "tune_presets" : { 38 | 39 | "default" : { 40 | "book_name" : "4moves_noob.epd", 41 | "win_adj" : "movecount=3 score=400", 42 | "draw_adj" : "movenumber=40 movecount=8 score=10" 43 | } 44 | }, 45 | 46 | "datagen_presets" : { 47 | 48 | "default" : { 49 | "win_adj" : "None", 50 | "draw_adj" : "None", 51 | "workload_size" : 128 52 | }, 53 | 54 | "40k Nodes" : { 55 | "both_options" : "Threads=1 Hash=16", 56 | "both_time_control" : "N=40000" 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Engines/Winter.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 360000, 4 | "source" : "https://github.com/rosenthj/Winter", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["clang++", "g++"], 9 | "cpuflags" : ["POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Engines/Zahak.json: -------------------------------------------------------------------------------- 1 | { 2 | "private" : false, 3 | "nps" : 949000, 4 | "source" : "https://github.com/amanjpro/zahak", 5 | 6 | "build" : { 7 | "path" : "", 8 | "compilers" : ["go"], 9 | "cpuflags" : ["AVX", "POPCNT"], 10 | "systems" : ["Windows", "Linux"] 11 | }, 12 | 13 | "test_presets" : { 14 | 15 | "default" : { 16 | "base_branch" : "master", 17 | "book_name" : "Pohl.epd", 18 | "test_bounds" : "[0.00, 5.00]", 19 | "test_confidence" : "[0.05, 0.05]", 20 | "win_adj" : "movecount=3 score=400", 21 | "draw_adj" : "movenumber=40 movecount=8 score=10" 22 | }, 23 | 24 | "STC" : { 25 | "both_options" : "Threads=1 Hash=8", 26 | "both_time_control" : "8.0+0.08", 27 | "workload_size" : 32 28 | }, 29 | 30 | "LTC" : { 31 | "both_options" : "Threads=1 Hash=64", 32 | "both_time_control" : "40.0+0.4", 33 | "workload_size" : 8 34 | }, 35 | 36 | "SMP STC" : { 37 | "both_options" : "Threads=8 Hash=64", 38 | "both_time_control" : "5.0+0.05", 39 | "workload_size" : 64 40 | }, 41 | 42 | "SMP LTC" : { 43 | "both_options" : "Threads=8 Hash=256", 44 | "both_time_control" : "20.0+0.2", 45 | "workload_size" : 16 46 | } 47 | }, 48 | 49 | "tune_presets" : { 50 | 51 | "default" : { 52 | "book_name" : "Pohl.epd", 53 | "win_adj" : "movecount=3 score=400", 54 | "draw_adj" : "movenumber=40 movecount=8 score=10" 55 | } 56 | }, 57 | 58 | "datagen_presets" : { 59 | 60 | "default" : { 61 | "win_adj" : "None", 62 | "draw_adj" : "None", 63 | "workload_size" : 128 64 | }, 65 | 66 | "40k Nodes" : { 67 | "both_options" : "Threads=1 Hash=16", 68 | "both_time_control" : "N=40000" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /OpenBench/__init__.py: -------------------------------------------------------------------------------- 1 | default_app_config = 'OpenBench.apps.OpenBenchConfig' 2 | -------------------------------------------------------------------------------- /OpenBench/admin.py: -------------------------------------------------------------------------------- 1 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 2 | # # 3 | # OpenBench is a chess engine testing framework authored by Andrew Grant. # 4 | # # 5 | # # 6 | # OpenBench is free software: you can redistribute it and/or modify # 7 | # it under the terms of the GNU General Public License as published by # 8 | # the Free Software Foundation, either version 3 of the License, or # 9 | # (at your option) any later version. # 10 | # # 11 | # OpenBench is distributed in the hope that it will be useful, # 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 14 | # GNU General Public License for more details. # 15 | # # 16 | # You should have received a copy of the GNU General Public License # 17 | # along with this program. If not, see . # 18 | # # 19 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 20 | 21 | import django.contrib, OpenBench.models 22 | 23 | django.contrib.admin.site.register(OpenBench.models.Engine) 24 | django.contrib.admin.site.register(OpenBench.models.Profile) 25 | django.contrib.admin.site.register(OpenBench.models.Machine) 26 | django.contrib.admin.site.register(OpenBench.models.Result) 27 | django.contrib.admin.site.register(OpenBench.models.Test) 28 | django.contrib.admin.site.register(OpenBench.models.LogEvent) 29 | django.contrib.admin.site.register(OpenBench.models.Network) 30 | -------------------------------------------------------------------------------- /OpenBench/apps.py: -------------------------------------------------------------------------------- 1 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 2 | # # 3 | # OpenBench is a chess engine testing framework authored by Andrew Grant. # 4 | # # 5 | # # 6 | # OpenBench is free software: you can redistribute it and/or modify # 7 | # it under the terms of the GNU General Public License as published by # 8 | # the Free Software Foundation, either version 3 of the License, or # 9 | # (at your option) any later version. # 10 | # # 11 | # OpenBench is distributed in the hope that it will be useful, # 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 14 | # GNU General Public License for more details. # 15 | # # 16 | # You should have received a copy of the GNU General Public License # 17 | # along with this program. If not, see . # 18 | # # 19 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 20 | 21 | import atexit 22 | import os 23 | import threading 24 | import platform 25 | 26 | import django.apps 27 | 28 | # No imports of OpenBench.* are allowed here 29 | 30 | LOCKFILE_PATH = 'openbench_watchers.lock' 31 | CONFIG_LOCK = threading.Lock() 32 | IS_WINDOWS = platform.system() == 'Windows' 33 | 34 | def acquire_watcher_lockfile(): 35 | 36 | lockfile = None 37 | 38 | try: # Failed to open the file entirely 39 | lockfile = open(LOCKFILE_PATH, 'w') 40 | except: return None 41 | 42 | try: 43 | 44 | if IS_WINDOWS: 45 | import msvcrt 46 | msvcrt.locking(lockfile.fileno(), msvcrt.LK_NBLCK, 1) 47 | 48 | else: 49 | import fcntl 50 | fcntl.lockf(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) 51 | 52 | except: # Failed to acquire the lock, but must still close the file 53 | lockfile.close() 54 | return None 55 | 56 | return lockfile 57 | 58 | class OpenBenchConfig(django.apps.AppConfig): 59 | 60 | name = 'OpenBench' 61 | 62 | def ready(self): 63 | 64 | # Load all of the .json config files, only once per PROCESS. 65 | # This must be done before ANY other OpenBench includes are used. 66 | 67 | from OpenBench import config 68 | 69 | with CONFIG_LOCK: 70 | if config.OPENBENCH_CONFIG is None: 71 | config.OPENBENCH_CONFIG, config.OPENBENCH_CONFIG_CHECKSUM = config.create_openbench_config() 72 | 73 | # Attempt to spawn the Artifact and PGN Watchers, globally once 74 | 75 | from OpenBench.watcher import ArtifactWatcher 76 | from OpenBench.pgn_watcher import PGNWatcher 77 | 78 | # Result of fopen(LOCKFILE_PATH) after obtaining the lock, otherwise None 79 | self.lockfile = acquire_watcher_lockfile() 80 | 81 | if self.lockfile: 82 | 83 | # Signals to stop the watchers 84 | self.stop_artifact_watcher = threading.Event() 85 | self.stop_pgn_watcher = threading.Event() 86 | 87 | # Each watcher is a threading.Thread 88 | self.artifact_watcher = ArtifactWatcher(self.stop_artifact_watcher, daemon=True) 89 | self.pgn_watcher = PGNWatcher(self.stop_pgn_watcher, daemon=True) 90 | 91 | # Start everything 92 | self.artifact_watcher.start() 93 | self.pgn_watcher.start() 94 | 95 | # Ensure we cleanup upon exit 96 | atexit.register(self.shutdown) 97 | 98 | def shutdown(self): 99 | 100 | # Signal the Artifact Watcher to shutdown 101 | if hasattr(self, 'artifact_watcher') and self.artifact_watcher.is_alive(): 102 | self.stop_artifact_watcher.set() 103 | self.artifact_watcher.join() 104 | 105 | # Signal the PGN Watcher to shutdown 106 | if hasattr(self, 'pgn_watcher') and self.pgn_watcher.is_alive(): 107 | self.stop_pgn_watcher.set() 108 | self.pgn_watcher.join() 109 | 110 | # Cleanup Lockfile if we hold it 111 | if self.lockfile: 112 | self.lockfile.close() 113 | os.remove(LOCKFILE_PATH) 114 | -------------------------------------------------------------------------------- /OpenBench/model_utils.py: -------------------------------------------------------------------------------- 1 | from OpenBench.models import * 2 | 3 | from django.core.files.storage import FileSystemStorage 4 | from django.forms.models import model_to_dict 5 | 6 | def network_to_dict(network): 7 | return { **model_to_dict(network, exclude=['id']), 'created': str(network.created) } 8 | 9 | 10 | def network_delete(network) -> (str, bool): 11 | 12 | # Don't allow deletion of important networks 13 | if network.default or network.was_default: 14 | return 'You may not delete Default, or previous Default networks', False 15 | 16 | # Save information before deleting the Network Model 17 | status = 'Deleted %s for %s' % (network.name, network.engine) 18 | sha256 = network.sha256; network.delete() 19 | 20 | # Only delete the actual file if no other engines use it 21 | if not Network.objects.filter(sha256=sha256): 22 | FileSystemStorage().delete(sha256) 23 | 24 | return status, True -------------------------------------------------------------------------------- /OpenBench/pgn_watcher.py: -------------------------------------------------------------------------------- 1 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 2 | # # 3 | # OpenBench is a chess engine testing framework authored by Andrew Grant. # 4 | # # 5 | # # 6 | # OpenBench is free software: you can redistribute it and/or modify # 7 | # it under the terms of the GNU General Public License as published by # 8 | # the Free Software Foundation, either version 3 of the License, or # 9 | # (at your option) any later version. # 10 | # # 11 | # OpenBench is distributed in the hope that it will be useful, # 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 14 | # GNU General Public License for more details. # 15 | # # 16 | # You should have received a copy of the GNU General Public License # 17 | # along with this program. If not, see . # 18 | # # 19 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 20 | 21 | import os 22 | import sys 23 | import tarfile 24 | import threading 25 | import time 26 | import traceback 27 | 28 | from OpenBench.models import PGN 29 | 30 | from django.db import transaction, OperationalError 31 | from django.core.files.base import ContentFile 32 | from django.core.files.storage import FileSystemStorage 33 | 34 | class PGNWatcher(threading.Thread): 35 | 36 | def __init__(self, stop_event, *args, **kwargs): 37 | self.stop_event = stop_event 38 | super().__init__(*args, **kwargs) 39 | 40 | def process_pgn(self, pgn): 41 | 42 | tar_path = FileSystemStorage('Media/PGNs').path('%d.pgn.tar' % (pgn.test_id)) 43 | pgn_path = FileSystemStorage().path(pgn.filename()) 44 | 45 | with transaction.atomic(): 46 | 47 | # Ensure Media/PGNs exists 48 | dir_name = os.path.dirname(tar_path) 49 | if not os.path.exists(dir_name): 50 | os.makedirs(dir_name) 51 | 52 | # First PGN will create the initial .tar file 53 | mode = 'a' if os.path.exists(tar_path) else 'w' 54 | with tarfile.open(tar_path, mode) as tar: 55 | tar.add(pgn_path, arcname=pgn.filename()) 56 | 57 | # Delete the raw .pgn.bz2 file, and don't process it again 58 | FileSystemStorage().delete(pgn.filename()) 59 | pgn.processed = True 60 | pgn.save() 61 | 62 | def run(self): 63 | while not self.stop_event.wait(timeout=15): 64 | 65 | try: # Never exit on errors, to keep the watcher alive 66 | for pgn in PGN.objects.filter(processed=False): 67 | self.process_pgn(pgn) 68 | 69 | # Expect the database to be locked sometimes 70 | except OperationalError as error: 71 | if 'database is locked' not in str(error).lower(): 72 | traceback.print_exc() 73 | sys.stdout.flush() 74 | 75 | except: # Totally unknown error 76 | traceback.print_exc() 77 | sys.stdout.flush() -------------------------------------------------------------------------------- /OpenBench/static/base.css: -------------------------------------------------------------------------------- 1 | .w-25 { 2 | width: 25%; 3 | } 4 | 5 | .w-21 { 6 | width: 21%; 7 | } 8 | 9 | .w-50 { 10 | width: 50%; 11 | } 12 | 13 | .w-75 { 14 | width: 75%; 15 | } 16 | 17 | .w-100 { 18 | width: 100%; 19 | } 20 | 21 | .mw-25 { 22 | max-width: 25%; 23 | } 24 | 25 | .mw-50 { 26 | max-width: 50%; 27 | } 28 | 29 | .mw-75 { 30 | max-width: 75%; 31 | } 32 | 33 | .mw-100 { 34 | max-width: 100%; 35 | } 36 | 37 | .mt-0 { 38 | margin-top: 0.00rem; 39 | } 40 | 41 | .mt-1 { 42 | margin-top: 0.25rem; 43 | } 44 | 45 | .mt-2 { 46 | margin-top: 0.5rem; 47 | } 48 | 49 | .mt-3 { 50 | margin-top: 1rem; 51 | } 52 | 53 | .mt-4 { 54 | margin-top: 1.5rem; 55 | } 56 | 57 | .mt-5 { 58 | margin-top: 3rem; 59 | } 60 | 61 | .mb-0 { 62 | margin-bottom: 0.00rem; 63 | } 64 | 65 | .mb-1 { 66 | margin-bottom: 0.25rem; 67 | } 68 | 69 | .mb-2 { 70 | margin-bottom: 0.5rem; 71 | } 72 | 73 | .mb-3 { 74 | margin-bottom: 1rem; 75 | } 76 | 77 | .mb-4 { 78 | margin-bottom: 1.5rem; 79 | } 80 | 81 | .mb-5 { 82 | margin-bottom: 3rem; 83 | } 84 | 85 | .ml-0 { 86 | margin-left: 0.00rem; 87 | } 88 | 89 | .ml-1 { 90 | margin-left: 0.25rem; 91 | } 92 | 93 | .ml-2 { 94 | margin-left: 0.5rem; 95 | } 96 | 97 | .ml-3 { 98 | margin-left: 1rem; 99 | } 100 | 101 | .ml-4 { 102 | margin-left: 1.5rem; 103 | } 104 | 105 | .ml-5 { 106 | margin-left: 3rem; 107 | } 108 | 109 | .mr-0 { 110 | margin-right: 0.00rem; 111 | } 112 | 113 | .mr-1 { 114 | margin-right: 0.25rem; 115 | } 116 | 117 | .mr-2 { 118 | margin-right: 0.5rem; 119 | } 120 | 121 | .mr-3 { 122 | margin-right: 1rem; 123 | } 124 | 125 | .mr-4 { 126 | margin-right: 1.5rem; 127 | } 128 | 129 | .mr-5 { 130 | margin-right: 3rem; 131 | } 132 | 133 | .mx-1 { 134 | margin-left: 0.25rem; 135 | margin-right: 0.25rem; 136 | } 137 | 138 | .mx-2 { 139 | margin-left: 0.5rem; 140 | margin-right: 0.5rem; 141 | } 142 | 143 | .mx-3 { 144 | margin-left: 1rem; 145 | margin-right: 1rem; 146 | } 147 | 148 | .mx-4 { 149 | margin-left: 1.5rem; 150 | margin-right: 1.5rem; 151 | } 152 | 153 | .mx-5 { 154 | margin-left: 3rem; 155 | margin-right: 3rem; 156 | } 157 | 158 | .my-1 { 159 | margin-top: 0.25rem; 160 | margin-bottom: 0.25rem; 161 | } 162 | 163 | .my-2 { 164 | margin-top: 0.5rem; 165 | margin-bottom: 0.5rem; 166 | } 167 | 168 | .my-3 { 169 | margin-top: 1rem; 170 | margin-bottom: 1rem; 171 | } 172 | 173 | .my-4 { 174 | margin-top: 1.5rem; 175 | margin-bottom: 1.5rem; 176 | } 177 | 178 | .my-5 { 179 | margin-top: 3rem; 180 | margin-bottom: 3rem; 181 | } 182 | 183 | .p-1{ 184 | padding: 0.25rem; 185 | } 186 | 187 | .p-2{ 188 | padding: 0.5rem; 189 | } 190 | 191 | .p-3{ 192 | padding: 0.75rem; 193 | } 194 | 195 | .p-4{ 196 | padding: 1.0rem; 197 | } 198 | 199 | .p-5{ 200 | padding: 1.25rem; 201 | } 202 | 203 | .pt-1 { 204 | padding-top: 0.25rem; 205 | } 206 | 207 | .pt-2 { 208 | padding-top: 0.5rem; 209 | } 210 | 211 | .pt-3 { 212 | padding-top: 1rem; 213 | } 214 | 215 | .pt-4 { 216 | padding-top: 1.5rem; 217 | } 218 | 219 | .pt-5 { 220 | padding-top: 3rem; 221 | } 222 | 223 | .pb-1 { 224 | padding-bottom: 0.25rem; 225 | } 226 | 227 | .pb-2 { 228 | padding-bottom: 0.5rem; 229 | } 230 | 231 | .pb-3 { 232 | padding-bottom: 1rem; 233 | } 234 | 235 | .pb-4 { 236 | padding-bottom: 1.5rem; 237 | } 238 | 239 | .pb-5 { 240 | padding-bottom: 3rem; 241 | } 242 | 243 | .pl-half { 244 | padding-left: 0.125rem; 245 | } 246 | 247 | .pl-1 { 248 | padding-left: 0.25rem; 249 | } 250 | 251 | .pl-2 { 252 | padding-left: 0.5rem; 253 | } 254 | 255 | .pl-3 { 256 | padding-left: 1rem; 257 | } 258 | 259 | .pl-4 { 260 | padding-left: 1.5rem; 261 | } 262 | 263 | .pl-5 { 264 | padding-left: 3rem; 265 | } 266 | 267 | .pr-half { 268 | padding-right: 0.125rem; 269 | } 270 | 271 | .pr-1 { 272 | padding-right: 0.25rem; 273 | } 274 | 275 | .pr-2 { 276 | padding-right: 0.5rem; 277 | } 278 | 279 | .pr-3 { 280 | padding-right: 1rem; 281 | } 282 | 283 | .pr-4 { 284 | padding-right: 1.5rem; 285 | } 286 | 287 | .pr-5 { 288 | padding-right: 3rem; 289 | } 290 | 291 | .px-1 { 292 | padding-left: 0.25rem; 293 | padding-right: 0.25rem; 294 | } 295 | 296 | .px-2 { 297 | padding-left: 0.5rem; 298 | padding-right: 0.5rem; 299 | } 300 | 301 | .px-3 { 302 | padding-left: 1rem; 303 | padding-right: 1rem; 304 | } 305 | 306 | .px-4 { 307 | padding-left: 1.5rem; 308 | padding-right: 1.5rem; 309 | } 310 | 311 | .px-5 { 312 | padding-left: 3rem; 313 | padding-right: 3rem; 314 | } 315 | 316 | .py-1 { 317 | padding-top: 0.25rem; 318 | padding-bottom: 0.25rem; 319 | } 320 | 321 | .py-2 { 322 | padding-top: 0.5rem; 323 | padding-bottom: 0.5rem; 324 | } 325 | 326 | .py-3 { 327 | padding-top: 1rem; 328 | padding-bottom: 1rem; 329 | } 330 | 331 | .py-4 { 332 | padding-top: 1.5rem; 333 | padding-bottom: 1.5rem; 334 | } 335 | 336 | .py-5 { 337 | padding-top: 3rem; 338 | padding-bottom: 3rem; 339 | } -------------------------------------------------------------------------------- /OpenBench/static/copy_text.js: -------------------------------------------------------------------------------- 1 | 2 | function copy_text(element_id, keep_url) { 3 | 4 | var text = document.getElementById(element_id).innerHTML; 5 | text = text.replace(/
/g, "\n"); 6 | 7 | if (keep_url) 8 | text += "\n" + window.location.href; 9 | 10 | var area = document.createElement("textarea"); 11 | area.value = text; 12 | document.body.append(area); 13 | area.select(); 14 | 15 | try { 16 | document.execCommand("copy"); 17 | document.body.removeChild(area); 18 | } 19 | 20 | catch (err) { 21 | document.body.removeChild(area); 22 | console.error("Unable to copy to Clipboard"); 23 | } 24 | } -------------------------------------------------------------------------------- /OpenBench/static/default_text.js: -------------------------------------------------------------------------------- 1 | function enforce_default_text(id, text) { 2 | 3 | window.addEventListener('DOMContentLoaded', function() { 4 | 5 | var field = document.getElementById(id); 6 | 7 | if (!field) 8 | return; 9 | 10 | field.addEventListener('input', function() { 11 | 12 | if (field.value.startsWith(text) || field.value === text) 13 | return; 14 | 15 | if (field.value.endsWith('/')) 16 | field.value = text + field.value.substr(text.length).replace(/\/+$/, ''); 17 | else 18 | field.value = text + field.value.substr(text.length); 19 | }); 20 | }); 21 | } -------------------------------------------------------------------------------- /OpenBench/static/form.css: -------------------------------------------------------------------------------- 1 | #content .form .col-half { 2 | display: inline-block; 3 | width: 25%; 4 | white-space: normal; 5 | box-sizing: border-box; 6 | vertical-align: top; 7 | } 8 | 9 | #content .form .col { 10 | display: inline-block; 11 | width: 50%; 12 | white-space: normal; 13 | margin-left: 0; 14 | box-sizing: border-box; 15 | vertical-align: top; 16 | } 17 | 18 | #content .form .col-full { 19 | display: block; 20 | width: 100%; 21 | white-space: normal; 22 | margin-left: 0; 23 | box-sizing: border-box; 24 | vertical-align: top; 25 | } 26 | 27 | /* Styles for screen widths less than 600px */ 28 | 29 | @media (max-width: 1024px) { 30 | #content .form .col { 31 | display: block; 32 | width: 100%; 33 | } 34 | } 35 | 36 | #content .form h3 { 37 | font-size: 14px; 38 | color: var(--color-font3); 39 | text-align: left; 40 | padding-left: 1.5rem; 41 | } 42 | 43 | #content .form .row { 44 | display: flex; 45 | align-items: center; 46 | margin-bottom: 0.25rem; 47 | } 48 | 49 | #content .row label { 50 | font-size: 13px; 51 | width: 25%; 52 | min-width: 128px; 53 | margin-right: 1rem; 54 | text-align: right; 55 | color: var(--color-font2) 56 | } 57 | 58 | 59 | #content .row input, #content .row select, #content .row textarea { 60 | flex-grow: 1; 61 | min-width: 0; 62 | border: 1px solid var(--color3); 63 | border-radius: 4px; 64 | padding: 9px 6px 6px; 65 | background-color: var(--color2); 66 | color: var(--color-font2); 67 | font-family: "Courier Prime", serif; 68 | } 69 | 70 | #content .row input[type="file"]{ 71 | padding: 2px 2px; 72 | } 73 | 74 | #content .row input:focus, #content .row select:focus, #content .row textarea:focus { 75 | outline: none; 76 | border-color: var(--color3); 77 | box-shadow: 0 0 0 2px rgba(77, 144, 254, 0.75); 78 | background-color: var(--color2); 79 | color: var(--color-font2); 80 | } 81 | 82 | #content .row select > option{ 83 | font-family: "Helvetica", serif; 84 | } 85 | 86 | #content .row input[type="file"]::file-selector-button { 87 | background-color: var(--color3); 88 | border: 1px solid var(--color2); 89 | border-radius: 4px; 90 | padding: 6px 6px 3px; 91 | color: var(--color-font2); 92 | cursor: pointer; 93 | transition: background-color 0.3s, border-color 0.3s; 94 | font-family: "Courier Prime", serif; 95 | } 96 | 97 | #content .row input[type="file"]::file-selector-button:hover { 98 | background-color: rgba(77, 144, 254, 0.8); 99 | border-color: var(--color2); 100 | } 101 | 102 | #content .row input[readonly] { 103 | color: var(--color-font1); 104 | } 105 | 106 | #content .form .flex { 107 | display: flex; 108 | flex-wrap: wrap; 109 | max-width: 100%; 110 | justify-content: flex-start; 111 | } 112 | 113 | #content .form .flex button{ 114 | max-width: 100%; 115 | } 116 | 117 | #content #engines-container span { 118 | margin: 0px 4px 0px 4px; 119 | cursor: pointer; 120 | } 121 | 122 | #content #engines-container span input { 123 | cursor: pointer; 124 | } -------------------------------------------------------------------------------- /OpenBench/static/networks.js: -------------------------------------------------------------------------------- 1 | 2 | var Networks = JSON.parse(document.getElementById('json-networks').textContent); 3 | 4 | function is_greater_than(a, b, attrs) { 5 | 6 | for (const attr of attrs) { 7 | if (a[attr] === b[attr]) 8 | continue; 9 | return a[attr] > b[attr]; 10 | } 11 | 12 | return false; // Objects are equal 13 | } 14 | 15 | function swap_networks(index1, index2) { 16 | 17 | var temp = Networks[index1]; 18 | Networks[index1] = Networks[index2]; 19 | Networks[index2] = temp; 20 | 21 | var table = document.getElementById("network-table"); 22 | var temp_row = table.rows[index1+1].innerHTML 23 | table.rows[index1+1].innerHTML = table.rows[index2+1].innerHTML; 24 | table.rows[index2+1].innerHTML = temp_row; 25 | } 26 | 27 | function sort_networks(fields) { 28 | 29 | for (let i = 0; i != Networks.length; i++) 30 | for (let j = i + 1; j != Networks.length; j++) 31 | if (is_greater_than(Networks[j], Networks[i], fields)) 32 | swap_networks(i, j); 33 | } 34 | -------------------------------------------------------------------------------- /OpenBench/static/paging.css: -------------------------------------------------------------------------------- 1 | .pagination { 2 | display: inline-flex; 3 | justify-content: center; 4 | align-items: center; 5 | } 6 | 7 | #pagebrowse { 8 | display: flex; 9 | justify-content: center; 10 | } 11 | 12 | .pages { 13 | display: flex; 14 | } 15 | 16 | .page, .ellipsis { 17 | display: inline-block; 18 | padding: 6px 1rem; 19 | margin: 0; 20 | border-left: 1px solid var(--color1); 21 | border-right: 1px solid var(--color1); 22 | background-color: var(--color2); /* Dark background color */ 23 | color: var(--color-font2); 24 | text-decoration: none; 25 | cursor: pointer; 26 | transition: background-color 0.2s; /* Add a smooth transition effect to background color */ 27 | height: 24px; /* This is just an example, adjust according to your needs */ 28 | line-height: 24px; /* Should be same as height */ 29 | min-width: 1.6rem; 30 | text-align: center; 31 | vertical-align: middle; 32 | } 33 | 34 | .page:hover { 35 | background-color: var(--color3); /* Darker background color on hover */ 36 | } 37 | 38 | .previous { 39 | border-top-left-radius: 7px; 40 | border-bottom-left-radius: 7px; 41 | } 42 | 43 | .current { 44 | background-color: var(--color3); 45 | } 46 | 47 | .next { 48 | border-top-right-radius: 7px; 49 | border-bottom-right-radius: 7px; 50 | } 51 | 52 | .ellipsis, .fa-solid { 53 | /*margin: 0 4px;*/ 54 | pointer-events: none; /* Disable click events on ellipsis */ 55 | vertical-align: middle; /* Ensure icons are vertically centered */ 56 | } 57 | -------------------------------------------------------------------------------- /OpenBench/urls.py: -------------------------------------------------------------------------------- 1 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 2 | # # 3 | # OpenBench is a chess engine testing framework authored by Andrew Grant. # 4 | # # 5 | # # 6 | # OpenBench is free software: you can redistribute it and/or modify # 7 | # it under the terms of the GNU General Public License as published by # 8 | # the Free Software Foundation, either version 3 of the License, or # 9 | # (at your option) any later version. # 10 | # # 11 | # OpenBench is distributed in the hope that it will be useful, # 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 14 | # GNU General Public License for more details. # 15 | # # 16 | # You should have received a copy of the GNU General Public License # 17 | # along with this program. If not, see . # 18 | # # 19 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 20 | 21 | import django.urls, OpenBench.views 22 | 23 | urlpatterns = [ 24 | 25 | # Links for account management 26 | django.urls.path(r'register/', OpenBench.views.register), 27 | django.urls.path(r'login/', OpenBench.views.login), 28 | django.urls.path(r'logout/', OpenBench.views.logout), 29 | django.urls.path(r'profile/', OpenBench.views.profile), 30 | django.urls.path(r'profileConfig/', OpenBench.views.profile_config), 31 | 32 | # Links for viewing test tables 33 | django.urls.re_path(r'^index(?:/(?P\d+))?/$', OpenBench.views.index), 34 | django.urls.re_path(r'^user/(?P[^/]+)(?:/(?P\d+))?/$', OpenBench.views.user), 35 | django.urls.re_path(r'^greens(?:/(?P\d+))?/$', OpenBench.views.greens), 36 | 37 | django.urls.path(r'search/', OpenBench.views.search), 38 | 39 | # Links for viewing general information tables 40 | django.urls.path(r'users/', OpenBench.views.users), 41 | django.urls.path(r'event//', OpenBench.views.event), 42 | django.urls.re_path(r'^events(?:/(?P\d+))?/$', OpenBench.views.events_actions), 43 | django.urls.re_path(r'^errors(?:/(?P\d+))?/$', OpenBench.views.events_errors), 44 | django.urls.re_path(r'^machines(?:/(?P\d+))?/$', OpenBench.views.machines), 45 | 46 | # Links to create, view or manage Workloads (Tests, Tunes, Datagen) 47 | django.urls.re_path(r'^(?Ptune|test|datagen)/new/$', OpenBench.views.new_workload), 48 | django.urls.re_path(r'^(?Ptune|test|datagen)/(?P\d+)(?:/(?P\w+))?/$', OpenBench.views.workload), 49 | 50 | # Links for viewing and managing Networks 51 | django.urls.path(r'networks/', OpenBench.views.networks), 52 | django.urls.path(r'networks//', OpenBench.views.networks), 53 | django.urls.path(r'networks///', OpenBench.views.networks), 54 | django.urls.path(r'networks////', OpenBench.views.networks), 55 | django.urls.path(r'newNetwork/', OpenBench.views.network_form), 56 | 57 | # Links for interacting with OpenBench via scripting 58 | django.urls.path(r'scripts/', OpenBench.views.scripts), 59 | 60 | # Links for the Client to work with the Server 61 | django.urls.path(r'clientVersionRef/', OpenBench.views.client_version_ref), 62 | django.urls.path(r'clientGetBuildInfo/', OpenBench.views.client_get_build_info), 63 | django.urls.path(r'clientWorkerInfo/', OpenBench.views.client_worker_info), 64 | django.urls.path(r'clientGetWorkload/', OpenBench.views.client_get_workload), 65 | django.urls.path(r'clientGetNetwork///', OpenBench.views.client_get_network), 66 | django.urls.path(r'clientBenchError/', OpenBench.views.client_bench_error), 67 | django.urls.path(r'clientSubmitNPS/', OpenBench.views.client_submit_nps), 68 | django.urls.path(r'clientSubmitError/', OpenBench.views.client_submit_error), 69 | django.urls.path(r'clientSubmitResults/', OpenBench.views.client_submit_results), 70 | django.urls.path(r'clientHeartbeat/', OpenBench.views.client_heartbeat), 71 | django.urls.path(r'clientSubmitPGN/', OpenBench.views.client_submit_pgn), 72 | 73 | # Nice endpoints, which can be hit from the website or with credentials cleanly 74 | django.urls.path(r'api/config/', OpenBench.views.api_configs), 75 | django.urls.path(r'api/config//', OpenBench.views.api_configs), 76 | django.urls.path(r'api/networks//', OpenBench.views.api_networks), 77 | django.urls.path(r'api/networks///', OpenBench.views.api_network_download), 78 | django.urls.path(r'api/networks///delete/', OpenBench.views.api_network_delete), 79 | django.urls.path(r'api/buildinfo/', OpenBench.views.api_build_info), 80 | django.urls.path(r'api/pgns//', OpenBench.views.api_pgns), 81 | 82 | # Redirect anything else to the Index 83 | django.urls.path(r'', OpenBench.views.index), 84 | 85 | # Link for Ethereal Sales 86 | django.urls.path(r'Ethereal/', OpenBench.views.buyEthereal), 87 | ] 88 | -------------------------------------------------------------------------------- /OpenBench/watcher.py: -------------------------------------------------------------------------------- 1 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 2 | # # 3 | # OpenBench is a chess engine testing framework authored by Andrew Grant. # 4 | # # 5 | # # 6 | # OpenBench is free software: you can redistribute it and/or modify # 7 | # it under the terms of the GNU General Public License as published by # 8 | # the Free Software Foundation, either version 3 of the License, or # 9 | # (at your option) any later version. # 10 | # # 11 | # OpenBench is distributed in the hope that it will be useful, # 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 14 | # GNU General Public License for more details. # 15 | # # 16 | # You should have received a copy of the GNU General Public License # 17 | # along with this program. If not, see . # 18 | # # 19 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 20 | 21 | import requests 22 | import sys 23 | import threading 24 | import time 25 | import traceback 26 | 27 | from OpenBench.utils import get_awaiting_tests 28 | from OpenBench.utils import read_git_credentials 29 | from OpenBench.workloads.verify_workload import fetch_artifact_url 30 | 31 | from django.db import OperationalError 32 | 33 | class ArtifactWatcher(threading.Thread): 34 | 35 | def __init__(self, stop_event, *args, **kwargs): 36 | self.stop_event = stop_event 37 | super().__init__(*args, **kwargs) 38 | 39 | def update_test(self, test): 40 | 41 | # Public engines end their source with .zip. Private engines end 42 | # their source with /artifacts, iff the artifacts have been found 43 | 44 | dev_has = test.dev.source.endswith('artifacts') 45 | dev_has = test.dev.source.endswith('.zip') or dev_has 46 | 47 | base_has = test.base.source.endswith('artifacts') 48 | base_has = test.base.source.endswith('.zip') or base_has 49 | 50 | if not dev_has: # Check for new Artifacts for Dev 51 | dev_headers = read_git_credentials(test.dev_engine) 52 | data = [test.dev.source, test.dev_engine, dev_headers, test.dev.sha] 53 | test.dev.source, dev_has = fetch_artifact_url(*data) 54 | test.dev.save() 55 | 56 | if not base_has: # Check for new Artifacts for Base 57 | base_headers = read_git_credentials(test.base_engine) 58 | data = [test.base.source, test.base_engine, base_headers, test.base.sha] 59 | test.base.source, base_has = fetch_artifact_url(*data) 60 | test.base.save() 61 | 62 | # If both finished, flag the test as no longer awaiting 63 | if dev_has and base_has: 64 | test.awaiting = False 65 | test.save() 66 | 67 | def run(self): 68 | 69 | while not self.stop_event.wait(timeout=15): 70 | 71 | try: # Never exit on errors, to keep the watcher alive 72 | for test in get_awaiting_tests(): 73 | self.update_test(test) 74 | 75 | # Expect the database to be locked sometimes 76 | except OperationalError as error: 77 | if 'database is locked' not in str(error).lower(): 78 | traceback.print_exc() 79 | sys.stdout.flush() 80 | 81 | except: # Totally unknown error 82 | traceback.print_exc() 83 | sys.stdout.flush() -------------------------------------------------------------------------------- /OpenBench/workloads/modify_workload.py: -------------------------------------------------------------------------------- 1 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 2 | # # 3 | # OpenBench is a chess engine testing framework authored by Andrew Grant. # 4 | # # 5 | # # 6 | # OpenBench is free software: you can redistribute it and/or modify # 7 | # it under the terms of the GNU General Public License as published by # 8 | # the Free Software Foundation, either version 3 of the License, or # 9 | # (at your option) any later version. # 10 | # # 11 | # OpenBench is distributed in the hope that it will be useful, # 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 14 | # GNU General Public License for more details. # 15 | # # 16 | # You should have received a copy of the GNU General Public License # 17 | # along with this program. If not, see . # 18 | # # 19 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 20 | 21 | # Module serves a singular purpose, to invoke: 22 | # >>> modify_workload(request, id, action) 23 | # 24 | # Given a request, a workload id, and an action, attempt to modify the workload as 25 | # requested. This will return the user to the index, or a login page, with some 26 | # indication as to success, or a reason for failure. 27 | 28 | import OpenBench.views 29 | 30 | from OpenBench.models import * 31 | 32 | def modify_workload(request, id, action=None): 33 | 34 | actions = { 35 | 'APPROVE' : approve_workload, 'RESTART' : restart_workload, 36 | 'STOP' : stop_workload, 'DELETE' : delete_workload, 37 | 'RESTORE' : restore_workload, 'MODIFY' : tweak_workload, 38 | } 39 | 40 | # Make sure the requested Action is a known one 41 | if action not in actions.keys(): 42 | return OpenBench.views.redirect(request, '/index/', error='Unknown Workload action') 43 | 44 | # Make sure that the Test or Tune exists 45 | if not (workload := Test.objects.filter(id=id).first()): 46 | return OpenBench.views.redirect(request, '/index/', error='No such Workload exists') 47 | 48 | # Must be logged in to interact with Tests and Tunes 49 | if not request.user.is_authenticated: 50 | return OpenBench.views.redirect(request, '/login/', error='Only users may modify Workloads') 51 | 52 | # Must be an approver, or interacting with their own Test or Tune 53 | profile = Profile.objects.get(user=request.user) 54 | if not profile.approver and workload.author != request.user.username: 55 | return OpenBench.views.redirect(request, '/index/', error='You cannot interact with another user\'s Workload') 56 | 57 | # Make the change; Record the change; Save the change 58 | message = actions[action](request, profile, workload) 59 | LogEvent.objects.create(author=request.user.username, summary=action, log_file='', test_id=id) 60 | workload.save() 61 | 62 | # Send back to the index, notifying them of the success 63 | return OpenBench.views.redirect(request, '/index/', status=message) 64 | 65 | def approve_workload(request, profile, workload): 66 | workload.approved = True; 67 | return 'Workload was Approved!' 68 | 69 | def restart_workload(request, profile, workload): 70 | workload.finished = False; 71 | return 'Workload was Restarted!' 72 | 73 | def stop_workload(request, profile, workload): 74 | workload.finished = True; 75 | return 'Workload was Stopped!' 76 | 77 | def delete_workload(request, profile, workload): 78 | workload.deleted = True 79 | return 'Workload was Deleted!' 80 | 81 | def restore_workload(request, profile, workload): 82 | workload.deleted = False 83 | return 'Workload was Restored!' 84 | 85 | def tweak_workload(request, profile, workload): 86 | 87 | try: # Priority can be any integer value 88 | workload.priority = int(request.POST['priority']) 89 | except: pass 90 | 91 | try: # Throughput must be at least 1 92 | workload.throughput = max(1, int(request.POST['throughput'])) 93 | except: pass 94 | 95 | try: # Must be at least one. Cannot be changed for Tuning workloads 96 | if workload.test_mode != 'SPSA': 97 | workload.workload_size = max(1, int(request.POST['workload_size'])) 98 | except: pass 99 | 100 | return 'Workload was Modified!' 101 | -------------------------------------------------------------------------------- /OpenBench/workloads/view_workload.py: -------------------------------------------------------------------------------- 1 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 2 | # # 3 | # OpenBench is a chess engine testing framework authored by Andrew Grant. # 4 | # # 5 | # # 6 | # OpenBench is free software: you can redistribute it and/or modify # 7 | # it under the terms of the GNU General Public License as published by # 8 | # the Free Software Foundation, either version 3 of the License, or # 9 | # (at your option) any later version. # 10 | # # 11 | # OpenBench is distributed in the hope that it will be useful, # 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 14 | # GNU General Public License for more details. # 15 | # # 16 | # You should have received a copy of the GNU General Public License # 17 | # along with this program. If not, see . # 18 | # # 19 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 20 | 21 | # Module serves a singular purpose, to invoke: 22 | # >>> view_workload(request, workload, type) 23 | # 24 | # A Workload can be a "TEST", which is an SPRT, or FIXED type 25 | # A Workload can be a "TUNE", which is an SPSA tuning session 26 | # A Workload can be a "DATAGEN", which is a Data Generation session 27 | 28 | import datetime 29 | import OpenBench.views 30 | 31 | from django.utils import timezone 32 | from OpenBench.models import * 33 | 34 | def view_workload(request, workload, workload_type): 35 | 36 | assert workload_type in [ 'TEST', 'TUNE', 'DATAGEN' ] 37 | 38 | data = { 39 | 'workload' : workload, 40 | 'results' : [], 41 | } 42 | 43 | for result in Result.objects.filter(test=workload): 44 | data['results'].append({ 'data' : result, 'active' : is_active(result) }) 45 | 46 | if workload_type == 'TEST': 47 | data['type'] = workload_type 48 | data['dev_text'] = 'Dev' 49 | 50 | if workload_type == 'TUNE': 51 | data['type'] = workload_type 52 | data['dev_text'] = '' 53 | 54 | if workload_type == 'DATAGEN': 55 | data['type'] = workload_type 56 | data['dev_text'] = 'Dev' 57 | 58 | return OpenBench.views.render(request, 'workload.html', data) 59 | 60 | def is_active(result): 61 | 62 | # One minute prior to now 63 | target = datetime.datetime.utcnow() 64 | target = target.replace(tzinfo=timezone.utc) 65 | target = target - datetime.timedelta(minutes=1) 66 | 67 | return result.test.id == result.machine.workload and result.machine.updated >= target -------------------------------------------------------------------------------- /OpenSite/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndyGrant/OpenBench/53443bacfb9a6519217692ba4d25cadce5cefb2e/OpenSite/__init__.py -------------------------------------------------------------------------------- /OpenSite/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for OpenSite project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.0.6. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.0/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | # Quick-start development settings - unsuitable for production 19 | # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ 20 | # SECURITY WARNING: keep the secret key used in production secret! 21 | # SECURITY WARNING: don't run with debug turned on in production! 22 | SECRET_KEY = '@!zw2l8til1(0eb_nk+1w!(n78gqm&u)s)_v7#k6iseia@g9q0' 23 | DEBUG = True 24 | 25 | ALLOWED_HOSTS = ['*'] 26 | 27 | HTML_MINIFY = True 28 | APPEND_SLASH = True 29 | 30 | DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' 31 | 32 | # Application definition 33 | 34 | SETTINGS_DIR = os.path.dirname(__file__) 35 | PROJECT_PATH = os.path.join(SETTINGS_DIR, os.pardir) 36 | PROJECT_PATH = os.path.abspath(PROJECT_PATH) 37 | TEMPLATE_PATH = os.path.join(PROJECT_PATH, 'Templates') 38 | 39 | MEDIA_URL = '/Media/' 40 | MEDIA_ROOT = os.path.join(BASE_DIR, 'Media') 41 | 42 | INSTALLED_APPS = [ 43 | 'OpenBench', 44 | 'OpenBench.templatetags', 45 | 'django.contrib.admin', 46 | 'django.contrib.auth', 47 | 'django.contrib.contenttypes', 48 | 'django.contrib.sessions', 49 | 'django.contrib.messages', 50 | 'django.contrib.staticfiles', 51 | ] 52 | 53 | MIDDLEWARE = [ 54 | 'django.middleware.security.SecurityMiddleware', 55 | 'django.contrib.sessions.middleware.SessionMiddleware', 56 | 'django.middleware.common.CommonMiddleware', 57 | 'django.middleware.csrf.CsrfViewMiddleware', 58 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 59 | 'django.contrib.messages.middleware.MessageMiddleware', 60 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 61 | 'htmlmin.middleware.HtmlMinifyMiddleware', 62 | 'htmlmin.middleware.MarkRequestMiddleware', 63 | ] 64 | 65 | ROOT_URLCONF = 'OpenSite.urls' 66 | 67 | TEMPLATES = [ 68 | { 69 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 70 | 'DIRS': [TEMPLATE_PATH, ], 71 | 'APP_DIRS': True, 72 | 'OPTIONS': { 73 | 'context_processors': [ 74 | 'django.template.context_processors.debug', 75 | 'django.template.context_processors.request', 76 | 'django.contrib.auth.context_processors.auth', 77 | 'django.contrib.messages.context_processors.messages', 78 | 'django.template.context_processors.media', 79 | ], 80 | }, 81 | }, 82 | ] 83 | 84 | WSGI_APPLICATION = 'OpenSite.wsgi.application' 85 | 86 | 87 | # Database 88 | # https://docs.djangoproject.com/en/2.0/ref/settings/#databases 89 | 90 | DATABASES = { 91 | 'default': { 92 | 'ENGINE': 'django.db.backends.sqlite3', 93 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 94 | } 95 | } 96 | 97 | 98 | # Password validation 99 | # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators 100 | 101 | AUTH_PASSWORD_VALIDATORS = [ 102 | { 103 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 104 | }, 105 | { 106 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 107 | }, 108 | { 109 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 110 | }, 111 | { 112 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 113 | }, 114 | ] 115 | 116 | 117 | # Internationalization 118 | # https://docs.djangoproject.com/en/2.0/topics/i18n/ 119 | 120 | LANGUAGE_CODE = 'en-us' 121 | 122 | TIME_ZONE = 'UTC' 123 | 124 | USE_I18N = True 125 | 126 | USE_L10N = True 127 | 128 | USE_TZ = True 129 | 130 | 131 | # Static files (CSS, JavaScript, Images) 132 | # https://docs.djangoproject.com/en/2.0/howto/static-files/ 133 | 134 | STATIC_URL = '/static/' 135 | -------------------------------------------------------------------------------- /OpenSite/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | from django.contrib.staticfiles.urls import staticfiles_urlpatterns 4 | 5 | import OpenBench.urls 6 | 7 | urlpatterns = [ 8 | path(r'admin/', admin.site.urls), 9 | path(r'', include(OpenBench.urls.urlpatterns)), 10 | ] 11 | 12 | urlpatterns += staticfiles_urlpatterns() -------------------------------------------------------------------------------- /OpenSite/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for OpenSite project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "OpenSite.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenBench 2 | 3 | OpenBench is an open-source Chess Engine Testing Framework for UCI engines. OpenBench provides a lightweight interface and client to facilitate running fixed-game tests as well as SPRT tests to benchmark changes to engines for performance and stability. OpenBench supports [Fischer Random Chess](https://en.wikipedia.org/wiki/Chess960). 4 | 5 | OpenBench is the primary testing framework used for the development of [Ethereal.](https://github.com/AndyGrant/Ethereal) The primary instance of OpenBench can be found at [http://chess.grantnet.us](http://chess.grantnet.us/). The Primary instance of OpenBench supports development for 6 | [Berserk](https://github.com/jhonnold/berserk), [Bit-Genie](https://github.com/Aryan1508/Bit-Genie), [BlackMarlin](https://github.com/dsekercioglu/blackmarlin), [Demolito](https://github.com/lucasart/Demolito), [Drofa](https://github.com/justNo4b/Drofa), [Ethereal](https://github.com/AndyGrant/Ethereal), [FabChess](https://github.com/fabianvdW/FabChess), [Halogen](https://github.com/KierenP/Halogen), [Igel](https://github.com/vshcherbyna/igel), [Koivisto](https://github.com/Luecx/Koivisto), [Laser](https://github.com/jeffreyan11/laser-chess-engine), [RubiChess](https://github.com/Matthies/RubiChess), [Seer](https://github.com/connormcmonigle/seer-nnue), [Stash](https://github.com/mhouppin/stash-bot), [Weiss](https://github.com/TerjeKir/weiss), [Winter](https://github.com/rosenthj/Winter), and [Zahak](https://github.com/amanjpro/zahak). A dozen or more engines are using their own private, local instances of OpenBench. 7 | 8 | You can join OpenBench's [Discord server](https://discord.com/invite/9MVg7fBTpM) to join the discussion, see what developers are working on and talking about, or to find out how you can contribute to the project and become a part of it. OpenBench is heavily inspired by [Fishtest](https://github.com/glinscott/fishtest). The project is powered by the [Django Web Framework](https://www.djangoproject.com/) and [Cutechess](https://github.com/cutechess/cutechess). 9 | 10 | Documentation for OpenBench is available in the [Wiki](https://github.com/AndyGrant/OpenBench/wiki) -------------------------------------------------------------------------------- /Scripts/archive2pgns.py: -------------------------------------------------------------------------------- 1 | #!/bin/python3 2 | 3 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 4 | # # 5 | # OpenBench is a chess engine testing framework by Andrew Grant. # 6 | # # 7 | # # 8 | # OpenBench is free software: you can redistribute it and/or modify # 9 | # it under the terms of the GNU General Public License as published by # 10 | # the Free Software Foundation, either version 3 of the License, or # 11 | # (at your option) any later version. # 12 | # # 13 | # OpenBench is distributed in the hope that it will be useful, # 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 16 | # GNU General Public License for more details. # 17 | # # 18 | # You should have received a copy of the GNU General Public License # 19 | # along with this program. If not, see . # 20 | # # 21 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 22 | 23 | import argparse 24 | import bz2 25 | import tarfile 26 | 27 | if __name__ == '__main__': 28 | 29 | parser = argparse.ArgumentParser() 30 | parser.add_argument('archive', help='Path to the OpenBench pgn archive') 31 | args = parser.parse_args() 32 | 33 | data = {} 34 | with tarfile.open(args.archive, 'r') as tar: 35 | for member in filter(lambda x: x.isfile(), tar.getmembers()): 36 | if file := tar.extractfile(member): 37 | for line in bz2.decompress(file.read()).decode('utf-8').split('\n'): 38 | print (line) -------------------------------------------------------------------------------- /Scripts/bench_engine.py: -------------------------------------------------------------------------------- 1 | #!/bin/python3 2 | 3 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 4 | # # 5 | # OpenBench is a chess engine testing framework by Andrew Grant. # 6 | # # 7 | # # 8 | # OpenBench is free software: you can redistribute it and/or modify # 9 | # it under the terms of the GNU General Public License as published by # 10 | # the Free Software Foundation, either version 3 of the License, or # 11 | # (at your option) any later version. # 12 | # # 13 | # OpenBench is distributed in the hope that it will be useful, # 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 16 | # GNU General Public License for more details. # 17 | # # 18 | # You should have received a copy of the GNU General Public License # 19 | # along with this program. If not, see . # 20 | # # 21 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 22 | 23 | import argparse 24 | import os 25 | import sys 26 | 27 | # Needed to include from ../Client/*.py 28 | PARENT = os.path.join(os.path.dirname(__file__), os.path.pardir) 29 | sys.path.append(os.path.abspath(os.path.join(PARENT, 'Client'))) 30 | 31 | from bench import run_benchmark 32 | 33 | if __name__ == '__main__': 34 | 35 | p = argparse.ArgumentParser() 36 | p.add_argument('-E', '--engine' , help='Relative path to Binary', required=True) 37 | p.add_argument('-N', '--network' , help='Relative path to Network for Private Engines', required=False) 38 | p.add_argument('-T', '--threads' , help='Concurrent Benchmarks', required=True, type=int) 39 | p.add_argument('-S', '--sets' , help='Benchmark Sample Count', required=True, type=int) 40 | args = p.parse_args() 41 | 42 | private = args.network != None 43 | speed, bench = run_benchmark(args.engine, args.network, private, args.threads, args.sets) 44 | 45 | print('Bench for %s is %d' % (args.engine, bench)) 46 | print('Speed for %s is %d' % (args.engine, speed)) 47 | -------------------------------------------------------------------------------- /Scripts/create_test.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | # Basic Information: 4 | # Test options must contain 'Threads={} Hash={}' 5 | # Test Modes may either be of type 'SPRT' or 'GAMES' 6 | # Syzygy settings are { 'OPTIONAL', 'REQUIRED', 'DISABLED' } 7 | # Max Games is ignored unless test is of type 'GAMES' 8 | # Networks must be assigned using their SHA256, not their name 9 | # Networks with the value '' are used for tests without Networks 10 | 11 | URL = 'http://chess.grantnet.us/scripts/' 12 | 13 | data = { 14 | 15 | 'enginename' : '', 16 | 'source' : '', 17 | 18 | 'devbench' : '', 19 | 'devbranch' : '', 20 | 'devoptions' : '', 21 | 'devnetwork' : '', 22 | 23 | 'basebench' : '', 24 | 'basebranch' : '', 25 | 'baseoptions' : '', 26 | 'basenetwork' : '', 27 | 28 | 'bookname' : '', 29 | 'timecontrol' : '', 30 | 31 | 'test_mode' : '', 32 | 'bounds' : '', 33 | 'confidence' : '', 34 | 'max_games' : '', 35 | 36 | 'priority' : '', 37 | 'throughput' : '', 38 | 'syzygy_adj' : '', 39 | 'syzygy_wdl' : '', 40 | 41 | 'username' : '', 42 | 'password' : '', 43 | 'action' : 'CREATE_TEST', 44 | } 45 | 46 | r = requests.post(URL, data=data) 47 | 48 | print(r.text) -------------------------------------------------------------------------------- /Scripts/delete_networks.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 4 | # # 5 | # OpenBench is a chess engine testing framework by Andrew Grant. # 6 | # # 7 | # # 8 | # OpenBench is free software: you can redistribute it and/or modify # 9 | # it under the terms of the GNU General Public License as published by # 10 | # the Free Software Foundation, either version 3 of the License, or # 11 | # (at your option) any later version. # 12 | # # 13 | # OpenBench is distributed in the hope that it will be useful, # 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 16 | # GNU General Public License for more details. # 17 | # # 18 | # You should have received a copy of the GNU General Public License # 19 | # along with this program. If not, see . # 20 | # # 21 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 22 | 23 | import argparse 24 | import datetime 25 | import os 26 | import requests 27 | 28 | def url_join(*args): 29 | # Join a set of URL paths while maintaining the correct format 30 | return '/'.join([f.lstrip('/').rstrip('/') for f in args]) + '/' 31 | 32 | 33 | def delete_network(args, network): 34 | 35 | # Not from the requested author 36 | if network['author'] != args.author: 37 | return 38 | 39 | # Network name does not contain the critical text 40 | if args.contains and args.contains not in network['name']: 41 | return 42 | 43 | # Server won't let us delete such networks 44 | if network['default'] or network['was_default']: 45 | return 46 | 47 | # Network is more recent than we are willing to erase 48 | dt = datetime.datetime.fromisoformat(network['created']) 49 | now = datetime.datetime.now(datetime.timezone.utc) 50 | if (now - dt).days < int(args.days): 51 | return 52 | 53 | if args.dry: 54 | print ('Dry run... deleting %s' % (network['name'])) 55 | 56 | else: 57 | url = url_join(args.server, 'api', 'networks', args.engine, network['name'], 'delete') 58 | data = { 'username' : args.username, 'password' : args.password } 59 | print (requests.post(url, data=data).json()) 60 | 61 | def delete_networks(): 62 | 63 | # We can use ENV variables for Username, Password, and Server 64 | req_user = required=('OPENBENCH_USERNAME' not in os.environ) 65 | req_pass = required=('OPENBENCH_PASSWORD' not in os.environ) 66 | req_server = required=('OPENBENCH_SERVER' not in os.environ) 67 | 68 | help_user = 'Username. May also be passed as OPENBENCH_USERNAME environment variable' 69 | help_pass = 'Password. May also be passed as OPENBENCH_PASSWORD environment variable' 70 | help_server = ' Server. May also be passed as OPENBENCH_SERVER environment variable' 71 | 72 | p = argparse.ArgumentParser() 73 | p.add_argument('-U', '--username', help=help_user , required=req_user ) 74 | p.add_argument('-P', '--password', help=help_pass , required=req_pass ) 75 | p.add_argument('-S', '--server' , help=help_server , required=req_server) 76 | p.add_argument('-E', '--engine' , help='Engine' , required=True ) 77 | p.add_argument('-A', '--author' , help='Network Author' , required=True ) 78 | p.add_argument( '--days' , help='Delete iff N+ days old', required=True ) 79 | p.add_argument( '--contains', help='Delete iif in name' , required=False ) 80 | p.add_argument( '--dry' , help='Mock run' , action='store_true') 81 | args = p.parse_args() 82 | 83 | # Fallback on ENV variables for Username, Password, and Server 84 | args.username = args.username if args.username else os.environ['OPENBENCH_USERNAME'] 85 | args.password = args.password if args.password else os.environ['OPENBENCH_PASSWORD'] 86 | args.server = args.server if args.server else os.environ['OPENBENCH_SERVER' ] 87 | 88 | url = url_join(args.server, 'api', 'networks', args.engine) 89 | data = { 'username' : args.username, 'password' : args.password } 90 | nets = requests.post(url, data=data).json()['networks'] 91 | 92 | for network in nets: 93 | delete_network(args, network) 94 | 95 | if __name__ == '__main__': 96 | delete_networks() -------------------------------------------------------------------------------- /Scripts/genfens_engine.py: -------------------------------------------------------------------------------- 1 | #!/bin/python3 2 | 3 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 4 | # # 5 | # OpenBench is a chess engine testing framework by Andrew Grant. # 6 | # # 7 | # # 8 | # OpenBench is free software: you can redistribute it and/or modify # 9 | # it under the terms of the GNU General Public License as published by # 10 | # the Free Software Foundation, either version 3 of the License, or # 11 | # (at your option) any later version. # 12 | # # 13 | # OpenBench is distributed in the hope that it will be useful, # 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 16 | # GNU General Public License for more details. # 17 | # # 18 | # You should have received a copy of the GNU General Public License # 19 | # along with this program. If not, see . # 20 | # # 21 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 22 | 23 | import argparse 24 | import os 25 | import sys 26 | import random 27 | 28 | # Needed to include from ../Client/*.py 29 | PARENT = os.path.join(os.path.dirname(__file__), os.path.pardir) 30 | sys.path.append(os.path.abspath(os.path.join(PARENT, 'Client'))) 31 | 32 | import genfens 33 | 34 | if __name__ == '__main__': 35 | 36 | p = argparse.ArgumentParser() 37 | p.add_argument('--engine' , help='Binary' , required=True ) 38 | p.add_argument('--threads' , help='Threads to generate with' , required=True ) 39 | p.add_argument('--count-per' , help='Openings to generate per thread', required=True ) 40 | p.add_argument('--book-path' , help='Path to base Book, if any' , default='None') 41 | p.add_argument('--extra' , help='Extra genfens arguments' , default='' ) 42 | p.add_argument('--network' , help='Network, for Private Engines' , default=None ) 43 | args = p.parse_args() 44 | 45 | # Same way that get_workload.py generates seeds 46 | seeds = [random.randint(0, 2**31 - 1) for x in range(int(args.threads))] 47 | 48 | with open('example_genfens.epd', 'w') as fout: 49 | 50 | genfen_args = { 51 | 'N' : int(args.count_per), 52 | 'book' : args.book_path, 53 | 'seeds' : seeds, 54 | 'extra' : args.extra, 55 | 'private' : args.network != None, 56 | 'engine' : args.engine, 57 | 'network' : args.network, 58 | 'threads' : int(args.threads), 59 | 'output' : fout, 60 | } 61 | 62 | genfens.create_genfens_opening_book(genfen_args) 63 | -------------------------------------------------------------------------------- /Scripts/upload_net.py: -------------------------------------------------------------------------------- 1 | #!/bin/python3 2 | 3 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 4 | # # 5 | # OpenBench is a chess engine testing framework by Andrew Grant. # 6 | # # 7 | # # 8 | # OpenBench is free software: you can redistribute it and/or modify # 9 | # it under the terms of the GNU General Public License as published by # 10 | # the Free Software Foundation, either version 3 of the License, or # 11 | # (at your option) any later version. # 12 | # # 13 | # OpenBench is distributed in the hope that it will be useful, # 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 16 | # GNU General Public License for more details. # 17 | # # 18 | # You should have received a copy of the GNU General Public License # 19 | # along with this program. If not, see . # 20 | # # 21 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 22 | 23 | import argparse 24 | import os 25 | import re 26 | import requests 27 | 28 | def url_join(*args): 29 | # Join a set of URL paths while maintaining the correct format 30 | return '/'.join([f.lstrip('/').rstrip('/') for f in args]) + '/' 31 | 32 | def upload_network(): 33 | 34 | # We can use ENV variables for Username, Password, and Server 35 | req_user = required=('OPENBENCH_USERNAME' not in os.environ) 36 | req_pass = required=('OPENBENCH_PASSWORD' not in os.environ) 37 | req_server = required=('OPENBENCH_SERVER' not in os.environ) 38 | 39 | # For clarity, seperate out this help text 40 | help_user = 'Username. May also be passed as OPENBENCH_USERNAME environment variable' 41 | help_pass = 'Password. May also be passed as OPENBENCH_PASSWORD environment variable' 42 | help_server = ' Server. May also be passed as OPENBENCH_SERVER environment variable' 43 | 44 | # Parse all arguments, all of which must exist in some form 45 | p = argparse.ArgumentParser() 46 | p.add_argument('-U', '--username', help=help_user , required=req_user ) 47 | p.add_argument('-P', '--password', help=help_pass , required=req_pass ) 48 | p.add_argument('-S', '--server' , help=help_server , required=req_server) 49 | p.add_argument('-E', '--engine' , help='Engine' , required=True ) 50 | p.add_argument('-N', '--name' , help='Network Name', required=True ) 51 | p.add_argument('-F', '--file' , help='File Name' , required=True ) 52 | args = p.parse_args() 53 | 54 | # Fallback on ENV variables for Username, Password, and Server 55 | args.username = args.username if args.username else os.environ['OPENBENCH_USERNAME'] 56 | args.password = args.password if args.password else os.environ['OPENBENCH_PASSWORD'] 57 | args.server = args.server if args.server else os.environ['OPENBENCH_SERVER' ] 58 | 59 | # All scripts connect through this API point, with an action in the POST data 60 | url = url_join(args.server, 'scripts') 61 | 62 | # POST payload must contain an action value 63 | data = { 64 | 'username' : args.username, 65 | 'password' : args.password, 66 | 'engine' : args.engine, 67 | 'name' : args.name, 68 | 'action' : 'UPLOAD_NETWORK', 69 | } 70 | 71 | # Upload the file and report the status code 72 | with open(args.file, 'rb') as network: 73 | r = requests.post(url, data=data, files={ 'netfile' : network }) 74 | print ('Code : %s' % (r.status_code)) 75 | 76 | # Report any error messages 77 | pattern = r'
\s*
(.*?)
\s*
' 78 | if matches := re.findall(pattern, r.text, re.DOTALL): 79 | print ('Error : %s' % (matches[0].strip())) 80 | 81 | # Report any status messages 82 | pattern = r'
\s*
(.*?)
\s*
' 83 | if matches := re.findall(pattern, r.text, re.DOTALL): 84 | print ('Status: %s' % (matches[0].strip())) 85 | 86 | if __name__ == '__main__': 87 | upload_network() -------------------------------------------------------------------------------- /Templates/OpenBench/Blocks/pagebrowser.html: -------------------------------------------------------------------------------- 1 |
2 | {% if paging.prev != paging.next %} 3 | 22 | {% endif %} 23 |
24 | -------------------------------------------------------------------------------- /Templates/OpenBench/Blocks/testsummary.html: -------------------------------------------------------------------------------- 1 | {% load mytags %} 2 | {{test.author|capfirst|slice:":6"}} 3 | {{test.dev_engine}} 4 | 5 | {{test|prettyDevName}} 6 | {% if test.error %} * {% endif %} 7 | {% if test|test_is_fischer %} * {% endif %} 8 | 9 | diff 10 | 11 | {{test.dev_time_control}} 12 | {% if test|test_is_time_odds %} * {% endif %} 13 | {% if test|test_is_smp_odds %} * {% endif %} 14 | 15 | {{test|shortStatBlock|linebreaksbr}} 16 | -------------------------------------------------------------------------------- /Templates/OpenBench/buyEthereal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% load static %} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Ethereal 14.25 (NNUE) 16 | 17 | 77 | 78 | 79 | 80 |
81 | 82 |

Ethereal 14.25

83 | 84 |
85 | 86 |

Ethereal 14.25 (NNUE) has been released, after a long series of steady gains, made over the last year, through a number of different dimensions; Noteably to the quality of the neural networks, and to the speed at which they run. This new version will soon be seen on rating lists like CCRL, SPCC, CEGT, and Ipman, as well as in touraments like TCEC and CCC.

87 | 88 |

As many engine fans know, a great deal of my time is now spent heading up the efforts on Torch, on behalf of Chess.com. Torch has rapdily rose to contend with Leela, hoping to some day knock on Stockfish's door. Therefore my time spent developing Ethereal directly is greatly reduced, but it is not all bad news. Many of the tools I work on for Torch, also benefit Ethereal, and the vast majority of engines that are making use of my OpenBench project. All of this is to say... Ethereal is not forgotten. Even in weeks where I have no time to work on Ethereal, I still have data generating, or tuning sessions running. I'm looking forward to having some free time to catch Ethereal up with the latest developments in the engine space.

89 | 90 |

With this release, I hope to establish Ethereal once again as one of the gatekeepers between the top dogs like Stockfish, Torch, Leela, and the rest of the steadily improving engine field. Regression tests show gains of 62 elo on Stefan Pohl's Unbalanced Opening Books, and gains of 30 elo in Fischer Random on more drawish books.

91 | 92 |
93 | 94 |

For new users, Stripe will verify your payment of $60 USD. Afterwards, you will receive an email from andrew@grantnet.us within 24 hours containing a download link for the Standard and Fischer NNUE files, as well as the binary or executable files for Windows and Linux. You will continue to receive updates for versions 14.50, and 14.75 as they are available, as well as lifelong bug fixes.

95 | 96 |

If you purchased Ethereal 14.00 or later, or if you paid the $20 upgrade from a prior version, you should have received an email containing updates to 14.25. If you did not, and the email cannot be found in your spam folder, please reach out to me.

97 | 98 |
99 | 100 | Buy Ethereal 14.25 (NNUE) 101 | 102 |
103 | 104 | 105 | -------------------------------------------------------------------------------- /Templates/OpenBench/errors.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% load mytags %} 4 | 5 | {% block content %} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | {% for event in events %} 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | {% endfor %} 28 | 29 |
Date#UserTestSummaryLogs
{{event.created|date:'U'}}{{event.machine_id}}{{event.author|capfirst}}{{event.test_id|testIdToPrettyName}}{{event.summary}}{% if event.log_file %}View{% endif %}
30 | 31 | {% include "OpenBench/Blocks/pagebrowser.html" %} 32 | 33 | {% endblock %} 34 | -------------------------------------------------------------------------------- /Templates/OpenBench/event.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
{{content}}
6 | 7 | 8 | -------------------------------------------------------------------------------- /Templates/OpenBench/events.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% load mytags %} 4 | 5 | {% block content %} 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {% for event in events %} 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | {% endfor %} 26 | 27 |
DateUserTestTCSummary
{{event.created|date:'U'}}{{event.author|capfirst}}{{event.test_id|testIdToPrettyName}}{{event.test_id|testIdToTimeControl}}{{event.summary}}
28 | 29 | {% include "OpenBench/Blocks/pagebrowser.html" %} 30 | 31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /Templates/OpenBench/index.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% load mytags %} 4 | 5 | {% block content %} 6 | 7 |
8 | 9 | 10 | {% if paging.page == 1 %} 11 | 12 | 13 | {% if pending %} 14 | 15 | {% for test in pending %} 16 | 17 | {% include "OpenBench/Blocks/testsummary.html" %} 18 | 19 | {% endfor %} 20 | 21 | {% endif %} 22 | 23 | 24 | {% if awaiting %} 25 | 26 | {% for test in awaiting %} 27 | 28 | {% include "OpenBench/Blocks/testsummary.html" %} 29 | 30 | {% endfor %} 31 | 32 | {% endif %} 33 | 34 | 35 | {% if active %} 36 | 37 | {% for test in active %} 38 | 39 | 40 | {% with prev_test=active|previous:forloop.counter0 %} 41 | {% if prev_test and prev_test.priority != test.priority %} 42 | 43 | 44 | {% endif %} 45 | {% endwith %} 46 | 47 | 48 | {% include "OpenBench/Blocks/testsummary.html" %} 49 | 50 | {% endfor %} 51 | 52 | {% endif %} 53 | 54 | {% endif %} 55 | 56 | 57 | 58 | {% for test in completed %} 59 | 60 | {% include "OpenBench/Blocks/testsummary.html" %} 61 | 62 | {% endfor %} 63 | 64 |
Pending
Awaiting Artifacts
Active {{status}}
Finished
65 | 66 | {% include "OpenBench/Blocks/pagebrowser.html" %} 67 | 68 | {% endblock %} 69 | -------------------------------------------------------------------------------- /Templates/OpenBench/login.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 | {% csrf_token %} 7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | 16 |
17 |
18 |
19 | 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /Templates/OpenBench/machine.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% load mytags %} 4 | 5 | {% block style %} 6 | {% load static %} 7 | {% endblock %} 8 | 9 | {% block content %} 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | {% if machine.info.tokens|length > 0 %} 35 | 36 | {% endif %} 37 | 38 | {% if machine.info.compilers|length > 0 %} 39 | 40 | {% endif %} 41 | 42 |
User{{machine.user.username}}
Machine Name{{machine.info.machine_name}}
Client Version{{machine.info.client_ver}}
Python Version{{machine.info.python_ver}}
System Version{{machine.info.os_name}} {{machine.info.os_ver}}
Last Seen{{machine.updated|date:'U'}}

CPU Name{{machine.info.cpu_name}}
CPU Flags
{{machine|cpuflagsBlock}}
Logical Cores{{machine.info.logical_cores}}
Physical Cores{{machine.info.physical_cores}}
Total RAM (MB){{machine.info.ram_total_mb}}
Syzygy WDL{{machine.info.syzygy_max}}-Man
Init Args--threads {{machine.info.concurrency}} --nsockets {{machine.info.sockets}} --focus {{machine.info.focus}}

Tokens{{machine.info.tokens|join:" "}}
Compilers
{{machine|compilerBlock}}
43 | 44 |
45 | 46 | {% endblock %} 47 | 48 | 49 | system_info = { 50 | 'compilers' : SYSTEM_COMPILERS, # Key: Engine, Value: (Compiler, Version) 51 | 'tokens' : SYSTEM_GIT_TOKENS, # Key: Engine, Value: True, for tokens we have 52 | 'cpu_flags' : SYSTEM_CPU_FLAGS, # List of CPU flags found in the Client or Server 53 | } 54 | -------------------------------------------------------------------------------- /Templates/OpenBench/machines.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% load mytags %} 4 | 5 | {% block content %} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | {% for machine in machines %} 20 | 21 | 22 | 23 | 24 | 25 | 34 | 35 | 36 | 37 | {% endfor %} 38 | 39 |
#UserNameSystemWorkloadThreadsNPS
{{machine.id}}{{machine.user.username|capfirst}}{{machine.info.machine_name}}{{machine.info.os_name}} 26 | {% if machine.workload %} 27 | 28 | {{machine.workload|workload_pretty_name}} 29 | 30 | {% else %} 31 | None 32 | {% endif %} 33 | {{machine.info.concurrency}}{{machine.dev_mnps|twoDigitPrecision}}M / {{machine.base_mnps|twoDigitPrecision}}M
40 | 41 | {% endblock %} 42 | -------------------------------------------------------------------------------- /Templates/OpenBench/network.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% load static %} 4 | 5 | {% block content %} 6 | 7 |
8 | {% csrf_token %} 9 |
10 |
11 | 12 |
13 | 14 | 15 |
16 | 17 |
18 | 19 | 20 |
21 | 22 |
23 | 24 | 25 |
26 | 27 |
28 | 29 | 30 |
31 | 32 |
33 | 34 | 35 |
36 | 37 |
38 | 39 | 48 |
49 | 50 |
51 | 52 | 61 |
62 | 63 | 64 |
65 |
66 |
67 | 68 | {% endblock %} 69 | -------------------------------------------------------------------------------- /Templates/OpenBench/networks.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% load static %} 4 | 5 | {% block scripts %} 6 | 7 | {{ networks|json_script:"json-networks" }} 8 | 9 | 10 | 11 | 18 | 19 | {% endblock %} 20 | 21 | {% block content %} 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | {% for network in networks %} 36 | 37 | {% if network.default %} 38 | 39 | {% elif network.was_default %} 40 | 42 | {% else %} 43 | 45 | {% endif %} 46 | 47 | 48 | 49 | 50 | 51 | 52 | 57 | 58 | 69 | 70 | {% endfor %} 71 | 72 |
EngineAuthorNameHash
41 | 44 | {{network.engine}}{{network.author|capfirst}}{{network.name}}{{network.sha256}} 53 | 54 | 55 | 56 | 59 | {% if not network.default and not network.was_default %} 60 | 62 | 63 | {% else %} 64 | 66 | 67 | {% endif %} 68 |
73 | 74 | {% endblock %} 75 | -------------------------------------------------------------------------------- /Templates/OpenBench/profile.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% load static %} 4 | {% load mytags %} 5 | 6 | {% block scripts %} 7 | 8 | 9 | 12 | {% endblock %} 13 | 14 | {% block content %} 15 | 16 |
17 | {% csrf_token %} 18 |
19 |
20 |
21 | 22 | 23 |
24 |
25 | 26 | 27 |
28 | 29 |
30 | 31 | 32 |
33 |
34 | 35 | 36 |
37 | 38 |
39 |
40 |
41 | 42 |
43 | 44 |
45 | {% csrf_token %} 46 |
47 |
48 | 49 | 50 | {% for engine, repo in profile.repos.items %} 51 |
52 | 53 | 54 | 55 | 56 | 58 | 59 | 60 | 61 | 62 | 63 |
64 | {% endfor %} 65 | 66 |
67 | 77 | 78 |
79 | 80 | 81 | 82 |
83 |
84 |
85 | 86 | 111 | 112 | 113 | {% endblock %} -------------------------------------------------------------------------------- /Templates/OpenBench/register.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 | {% csrf_token %} 7 |
8 |
9 |
10 | 11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |
19 | 20 |
21 | 22 |
23 |
24 |
25 | 26 | {% endblock %} 27 | -------------------------------------------------------------------------------- /Templates/OpenBench/uploadnet.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% block scripts %} 4 | 5 | 27 | 28 | {% endblock %} 29 | 30 | {% block content %} 31 | 32 |
33 | {% csrf_token %} 34 |
35 |
36 |
37 | 38 | 39 |
40 |
41 | 42 | 43 |
44 |
45 | 46 | 55 |
56 | 57 |
58 |
59 | 60 | 61 | {% endblock %} 62 | -------------------------------------------------------------------------------- /Templates/OpenBench/users.html: -------------------------------------------------------------------------------- 1 | {% extends "OpenBench/base.html" %} 2 | 3 | {% load mytags %} 4 | 5 | {% block content %} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {% for profile in profiles %} 18 | {% if profile.games or profile.tests or profile.approver %} 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | {% endif %} 27 | {% endfor %} 28 | 29 |
UsernameGamesTestsEngineCreated
{{profile.user.username|capfirst}}{{profile.games|insertCommas}}{{profile.tests|insertCommas}}{{profile.engine}}{{profile.user.date_joined|date:'U'}}
30 | 31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /UnitTests/example1.pgn: -------------------------------------------------------------------------------- 1 | [Event "?"] 2 | [Site "?"] 3 | [Date "2024.05.26"] 4 | [Round "1"] 5 | [White "Torch"] 6 | [Black "Torch"] 7 | [Result "1-0"] 8 | [FEN "rnb1k1nr/pp1pbppp/8/q1p1p3/P4P2/R3PN2/1PPP2PP/1NBQKB1R w Kkq - 0 1"] 9 | [GameDuration "00:00:04"] 10 | [GameEndTime "2024-05-26T12:57:02.148 EDT"] 11 | [GameStartTime "2024-05-26T12:56:57.601 EDT"] 12 | [PlyCount "139"] 13 | [SetUp "1"] 14 | [TimeControl "inf"] 15 | 16 | 1. fxe5 {+4.23 12/14 75} d5 {-4.15 12/17 48 40000} 17 | 2. Nc3 {+3.70 12/17 40000} Be6 {-4.38 14/19 41 40000} 18 | 3. Bb5+ {+4.18 14 40 40000} Nc6 {-4.35 14/17 38 40000} 19 | 4. e4 {+4.10 17 40 40000} dxe4 {-3.98 14/21 39 40002} 20 | 5. Nxe4 {+3.96 13/15 40 40000} Nh6 {-4.20 14/23 36 40000} 21 | 6. O-O {+4.28 41 40000} Qb6 {-4.51 12/17 41 40000} 22 | 7. Nd6+ {12/17 41 40000} Bxd6 {-3.81 13/20 40 40000} 23 | 8. exd6 {436 13/19 41 40000} O-O-O {-3.89 13/18 39 40000} 24 | 9. d4 {+4.69 14/17 35 40000} Nxd4 {-3.97 12/18 40 40000} 25 | 10. Nxd4 {+4.41 13/18 38 40000} cxd4 {-4.09 13/17 36 40000} 26 | 11. h3 {+4 13/18 42 40000} Nf5 {-3.62 13/18 39 40000} 27 | 12. d7+ {+4.43 14/19 40 40001} Kb8 {-3.91 13/16 37 40000} 28 | 13. Qd3 {+4.12 12/18 36 40001} Ne3 {-3.91 14/22 34 40000} 29 | 14. Bxe3 {+5.07 15/23 32 40000} dxe3 {-5.90 15/23 33 40000} 30 | 15. a5 {+5.32 13/20 36 40000} Qc7 {-5.98 13/20 36 40000} 31 | 16. Qxe3 {+5.68 14/19 37 40000} a6 {-5.93 13/20 38 40002} 32 | 17. Ba4 {+6.14 14/20 37 40000} Ka8 {-6.14 13/19 38 40000} 33 | 18. Rf4 {+5.60 14/19 39 40000} Rhg8 {-5.94 12/18 37 40001} 34 | 19. Rf1 {+4.28 13/16 40 40001} g5 {-4.66 14/20 38 40000} 35 | 20. Qb6 {+3.63 14/24 37 40000} Qxb6+ {-3.52 16/21 34 40000} 36 | 21. axb6 {+4.35 16/25 33 40002} Bxd7 {-4.17 15/23 33 40000} 37 | 22. Rxf7 {+4.37 14/20 34 40000} Bxa4 {-3.97 15/21 30 40000} 38 | 23. Rxa4 {+4.24 15/22 32 40000} Rd6 {-3.85 14/18 33 40001} 39 | 24. Rb4 {+3.71 15/21 31 40000} h6 {-3.72 13/15 31 40000} 40 | 25. c4 {+2.92 14/17 32 40000} Rd4 {-2.68 15/17 34 40000} 41 | 26. Rf6 {+2.18 13/14 34 40000} Kb8 {-2.56 14/17 34 40002} 42 | 27. Rb3 {+3.34 15/20 32 40000} Rxc4 {-2.93 15/22 35 40000} 43 | 28. Rxh6 {+5.84 15/18 32 40001} Rc6 {-2.19 16/25 32 40000} 44 | 29. Rxc6 {+7.27 16/22 31 40002} bxc6 {-2.19 14/15 35 40002} 45 | 30. Rg3 {+7.90 15/19 26 40000} Kb7 {-7.07 13/20 35 40001} 46 | 31. h4 {+8.10 15/20 28 40001} g4 {-7.38 14/18 31 40000} 47 | 32. Kh2 {+8.30 13/14 30 40000} a5 {-7.79 13/14 32 40000} 48 | 33. Rb3 {+8.78 14/19 30 40001} c5 {-8.12 13/16 31 40002} 49 | 34. Rb5 {+9.45 14/5 32 40001} Kc6 {-8.91 13/18 32 40001} 50 | 35. Rxa5 {+9.40 14/20 34 40001} Kxb6 {-9.75 12/18 32 40000} 51 | 36. Ra1 {+9.77 15/20 33 40000} g3+ {-10.13 13/17 32 40000} 52 | 37. Kh3 {+10.06 15/19 34 40000} Kc6 {-10.70 13/15 35 40001} 53 | 38. Rc1 {+10.48 15/17 31 40000} Kd5 {-10.75 13/19 33 40000} 54 | 39. b3 {+11.46 14/13 29 40000} Re8 {-11.41 12/15 31 40000} 55 | 40. Rd1+ {+12.66 15/17 30 40000} Kc6 {-12.90 13/16 34 40001} 56 | 41. Rd3 {+13.29 13/14 30 40000} Re2 {-12.95 12/12 34 40000} 57 | 42. Kxg3 {+13.85 14/16 32 40000} Kb5 {-13.77 13/18 35 40001} 58 | 43. h5 {+14.23 14/13 31 40000} Kb4 {-14.39 12/17 31 40000} 59 | 44. Kh2 {+15.02 13/14 28 40000} Re8 {-14.73 12/13 31 40001} 60 | 45. Rh3 {+15.39 15/19 29 40000} c4 {-15.21 13/13 35 40001} 61 | 46. bxc4 {+15.80 14/19 30 40000} Kxc4 {-15.35 15/24 32 40000} 62 | 47. g4 {+16.17 13/13 26 40000} Kd5 {-15.95 11/13 31 40000} 63 | 48. Rf3 {+16.60 13/15 27 40000} Ke4 {-16.43 12/14 29 40000} 64 | 49. Kg3 {+16.95 12/15 26 40000} Re6 {-17.21 12/14 31 40000} 65 | 50. Rf5 {+18.09 14/15 22 40000} Rh6 {-18.72 11/14 30 40001} 66 | 51. Kh4 {+18.99 13/14 21 40000} Rh7 {-19.14 11/17 25 40001} 67 | 52. Rf1 {+19.70 12/13 22 40001} Rh8 68 | 53. g5 {+21.12 12/18 31 40000} Kd3 69 | 54. h6 {+21.65 13/17 28 40001} Re8 70 | 55. h7 {+22.79 12/16 29 40001} Ke2 71 | 56. Rf6 {+23.44 12/17 27 40000} Rb8 72 | 57. g6 {+25.41 13/19 35 40001} Rb1 {-24.83 13/16 34 40000} 73 | 58. Kg5 {+26.55 12/21 31 40007} Rh1 {-26.82 12/17 36 40000} 74 | 59. Rf4 {+27.35 13/18 32 40000} Rg1+ {-27.39 14/20 34 40000} 75 | 60. Rg4 {+28.67 13/21 33 40000} Rh1 {-29.83 14/17 34 40000} 76 | 61. Rh4 {+28.79 13/17 28 40000} Rg1+ {-33.19 13/17 30 40001} 77 | 62. Kh6 {+32.81 12/16 30 40000} Kf2 {-40.18 13/14 34 40000} 78 | 63. Rh5 {+36.19 12/18 33 40000} Ke2 {-36.84 12/16 32 40000} 79 | 64. g7 {+38.23 12/14 32 40000} Rxg7 {-39.91 13/18 33 40000} 80 | 65. Kxg7 {+40.41 14/20 26 40000} Kd3 {-44.12 14/19 27 40000} 81 | 66. Kg8 {+49.68 14/22 22 40000} Kc2 {-M54 16/25 18 40000} 82 | 67. Rh3 {+M9 23/10 20 40000} Kc1 {-M50 12/8 6 40001} 68. Rh2 {+M5 31/6 6 40000} 83 | Kb1 {-M4 96/5 4 36036} 69. h8=Q {+M3 96/4 5 35602} Kc1 { 0/1 8 40000} 84 | 70. Qa1# {+M1 96/2 0 2516, White mates} 1-0 -------------------------------------------------------------------------------- /UnitTests/example2.pgn: -------------------------------------------------------------------------------- 1 | [Event "?"] 2 | [Site "?"] 3 | [Date "2024.05.26"] 4 | [Round "1"] 5 | [White "Torch"] 6 | [Black "Torch"] 7 | [Result "1-0"] 8 | [FEN "rnb1k1nr/pp1pbppp/8/q1p1p3/P4P2/R3PN2/1PPP2PP/1NBQKB1R w Kkq - 0 1"] 9 | [GameDuration "00:00:04"] 10 | [GameEndTime "2024-05-26T12:57:30.145 EDT"] 11 | [GameStartTime "2024-05-26T12:57:25.472 EDT"] 12 | [PlyCount "139"] 13 | [SetUp "1"] 14 | [TimeControl "inf"] 15 | 16 | 1. fxe5 {+4.23 12/16 42 39485} d5 {-4.15 12/17 43 38473} 17 | 2. Nc3 {+3.83 12/17 40 34560} Be6 {-4.30 13/22 39 36002} 18 | 3. Bb5+ {+4.18 14/14 38 38924} Nc6 {-4.35 14/18 37 34854} 19 | 4. e4 {+4.18 13/17 42 28288} dxe4 {-3.98 14/21 39 32608} 20 | 5. Nxe4 {+3.96 13/12 40 29723} Nh6 {-4.20 14/23 36 35760} 21 | 6. O-O {+4.28 12/17 41 35389} Qb6 {-4.26 12/17 41 35735} 22 | 7. Nd6+ {+3.50 12/17 42 37697} Bxd6 {-3.81 13/18 41 38274} 23 | 8. exd6 {+4.36 13/19 42 38645} O-O-O {-3.89 13/18 40 39048} 24 | 9. d4 {+4.69 14/17 36 39006} Nxd4 {-3.97 12/17 40 34214} 25 | 10. Nxd4 {+4.41 13/18 39 36786} cxd4 {-4.09 13/17 39 34846} 26 | 11. h3 {+4.22 12/17 43 17157} Nf5 {-3.41 13/13 41 34143} 27 | 12. d7+ {+4.43 14/17 43 33165} Kb8 {-3.91 13/20 40 39120} 28 | 13. Qd3 {+4.04 12/18 39 37958} Ne3 {-3.91 14/22 38 39962} 29 | 14. Bxe3 {+5.07 15/23 35 39261} dxe3 {-5.90 15/20 37 37377} 30 | 15. a5 {+5.32 13/20 38 39290} Qc7 {-5.13 13/20 37 31953} 31 | 16. Qxe3 {+5.68 14/17 36 34560} a6 {-5.93 13/20 38 35655} 32 | 17. Ba4 {+6.14 14/20 39 33272} Ka8 {-6.14 13/17 40 39677} 33 | 18. Rf4 {+5.60 14/19 43 39488} Rhg8 {-5.46 12/18 42 33699} 34 | 19. Rf1 {+4.60 13/14 43 31456} g5 {-4.41 14/20 42 36233} 35 | 20. Qb6 {+3.63 14/26 41 36607} Qxb6+ {-3.52 16/19 38 37826} 36 | 21. axb6 {+4.35 16/26 39 39192} Bxd7 {-4.17 15/23 38 38646} 37 | 22. Rxf7 {+4.37 14/19 35 39040} Bxa4 {-3.97 15/21 32 37259} 38 | 23. Rxa4 {+4.24 15/21 34 38881} Rd6 {-3.85 14/18 35 36911} 39 | 24. Rb4 {+3.71 15/21 32 39209} h6 {-3.72 13/20 33 34852} 40 | 25. c4 {+3.69 14/13 35 26237} Rd4 {-2.68 15/14 37 33902} 41 | 26. Rf6 {+2.39 13/13 35 39084} Kb8 {-2.26 13/18 36 37450} 42 | 27. Rb3 {+3.34 15/20 34 37710} Rxc4 {-2.93 15/20 38 37205} 43 | 28. Rxh6 {+5.84 15/15 35 36844} Rc6 {-2.19 16/17 37 37014} 44 | 29. Rxc6 {+7.27 16/18 34 33813} bxc6 {-2.19 14/26 37 35564} 45 | 30. Rg3 {+7.90 15/22 28 37624} Kb7 {-7.07 13/19 40 38243} 46 | 31. h4 {+8.10 15/17 32 33634} g4 {-7.38 14/15 33 37494} 47 | 32. Kh2 {+8.30 13/14 31 37907} a5 {-7.79 13/14 33 39481} 48 | 33. Rb3 {+8.78 14/19 29 36379} c5 {-8.02 13/13 32 38286} 49 | 34. Rb5 {+9.45 14/19 34 39981} Kc6 {-8.91 13/18 35 35241} 50 | 35. Rxa5 {+9.40 14/20 36 35616} Kxb6 {-9.75 12/15 33 36732} 51 | 36. Ra1 {+9.80 15/18 33 39301} g3+ {-10.15 12/18 34 30587} 52 | 37. Kh3 {+10.06 15/17 34 33600} Kc6 {-10.70 13/12 36 35603} 53 | 38. Rc1 {+10.72 15/16 32 36443} Kd5 {-10.75 13/19 34 39733} 54 | 39. b3 {+11.46 14/13 30 33084} Re8 {-11.41 12/15 32 35252} 55 | 40. Rd1+ {+12.66 15/13 32 35486} Kc6 {-12.90 13/16 35 36189} 56 | 41. Rd3 {+13.29 13/14 31 36697} Re2 {-12.98 11/15 33 33955} 57 | 42. Kxg3 {+13.85 14/15 32 32920} Kb5 {-13.77 13/16 36 36298} 58 | 43. h5 {+14.23 14/13 32 34421} Kb4 {-14.47 11/17 32 36183} 59 | 44. Kh2 {+15.02 13/18 28 32803} Re8 {-14.66 11/12 32 37600} 60 | 45. Rh3 {+15.39 15/19 29 35793} c4 {-15.29 12/19 35 36843} 61 | 46. bxc4 {+15.80 14/19 29 37057} Kxc4 {-15.35 15/20 31 36507} 62 | 47. g4 {+16.17 13/13 26 35516} Kd5 {-15.76 11/12 32 33904} 63 | 48. Rf3 {+16.60 13/14 29 32251} Ke4 {-16.43 12/14 31 35541} 64 | 49. Kg3 {+16.95 12/15 27 28203} Re6 {-16.96 12/14 31 35219} 65 | 50. Rf5 {+18.09 14/15 22 32595} Rh6 {-18.03 11/14 30 20617} 66 | 51. Kh4 {+18.99 13/14 20 39864} Rh7 {-18.99 11/17 25 29705} 67 | 52. Rf1 {+19.70 12/15 21 39612} Rh8 {-19.75 10/12 24 37115} 68 | 53. g5 {+21.12 12/15 31 25717} Kd3 {-21.16 12/15 31 31037} 69 | 54. h6 {+21.65 13/17 30 39824} Re8 {-21.76 11/14 30 25120} 70 | 55. h7 {+22.79 12/14 30 35242} Ke2 {-22.47 12/14 31 18311} 71 | 56. Rf6 {+23.44 12/13 28 24765} Rb8 {-23.70 13/18 33 37862} 72 | 57. g6 {+25.41 13/18 34 23189} Rb1 {-24.83 13/16 33 38798} 73 | 58. Kg5 {+26.55 12/17 31 29398} Rh1 {-25.17 11/13 36 5389} 74 | 59. Rf4 {+27.35 13/21 33 30750} Rg1+ {-27.39 14/17 36 33050} 75 | 60. Rg4 {+28.67 13/19 34 32747} Rh1 {-29.83 14/14 35 34343} 76 | 61. Rh4 {+28.79 13/17 29 33671} Rg1+ {-29.30 13/17 30 33229} 77 | 62. Kh6 {+32.81 12/16 31 26657} Kf2 {-29.33 13/8 34 35604} 78 | 63. Rh5 {+36.19 12/14 33 28525} Ke2 {-36.84 12/16 33 27852} 79 | 64. g7 {+38.23 12/18 33 39867} Rxg7 {-37.88 12/12 34 24254} 80 | 65. Kxg7 {+40.41 14/19 26 29276} Kd3 {-44.12 14/17 27 31734} 81 | 66. Kg8 {+49.68 14/22 21 35430} Kc2 {-52.79 15/21 17 27360} 82 | 67. Rh3 {+M9 22/10 20 38234} Kc1 {-M50 12/17 6 39103} 68. Rh2 {+M5 30/6 6 37836} 83 | Kb1 {-M4 96/5 9 36036} 69. h8=Q {+M3 96/4 10 35602} Kc1 84 | 70. Qa1# {+M1 96/2 3 2516, White mates} 1-0 -------------------------------------------------------------------------------- /UnitTests/test_pgn_util.py: -------------------------------------------------------------------------------- 1 | #!/bin/python3 2 | 3 | import os 4 | import sys 5 | import re 6 | 7 | # Needed to include from ../Client/*.py 8 | PARENT = os.path.join(os.path.dirname(__file__), os.path.pardir) 9 | sys.path.append(os.path.abspath(os.path.join(PARENT, 'Client'))) 10 | 11 | from pgn_util import pgn_iterator, pgn_strip_movelist 12 | from pgn_util import REGEX_COMMENT_COMPACT, REGEX_COMMENT_VERBOSE 13 | 14 | def verify_stripped_move_list(move_list, compact): 15 | 16 | special_comments = [ 'book', 'unknown' ] 17 | comment_regex = re.compile(REGEX_COMMENT_COMPACT if compact else REGEX_COMMENT_VERBOSE) 18 | 19 | for move, comment in re.findall(r'([a-zA-Z0-9+=#-]+)\s\{([^}]*)\}', move_list): 20 | assert comment in special_comments or comment_regex.match(comment) 21 | 22 | if __name__ == '__main__': 23 | for example_pgn in [ 'example1.pgn', 'example2.pgn', 'example3.pgn', ]: 24 | for headers, move_list in pgn_iterator(example_pgn): 25 | for compact in [ True, False ]: 26 | verify_stripped_move_list(pgn_strip_movelist(move_list, compact), compact) 27 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "OpenSite.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError as exc: 10 | raise ImportError( 11 | "Couldn't import Django. Are you sure it's installed and " 12 | "available on your PYTHONPATH environment variable? Did you " 13 | "forget to activate a virtual environment?" 14 | ) from exc 15 | execute_from_command_line(sys.argv) 16 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Django==4.2.1 2 | django-htmlmin==0.11.0 3 | requests 4 | scipy 5 | --------------------------------------------------------------------------------