From 462df452ffd0197cdadaf080a56ea66ebcf37766 Mon Sep 17 00:00:00 2001 From: David Wu Date: Fri, 19 May 2023 14:37:04 -0400 Subject: [PATCH] Clean up match pairing logic, fix segfault with extraPairs, remove blackPriority, add extraPairsAreOneSidedBW --- .gitignore | 2 + cpp/command/gatekeeper.cpp | 13 +- cpp/command/match.cpp | 89 +++++++-- cpp/program/play.cpp | 149 ++-------------- cpp/program/play.h | 35 +--- cpp/runcmdtests.sh | 43 +++++ cpp/tests/data/configs/matchtest.cfg | 62 +++++++ cpp/tests/data/configs/matchtest2.cfg | 63 +++++++ cpp/tests/results/match.txt | 248 ++++++++++++++++++++++++++ 9 files changed, 530 insertions(+), 174 deletions(-) create mode 100644 cpp/tests/data/configs/matchtest.cfg create mode 100644 cpp/tests/data/configs/matchtest2.cfg create mode 100644 cpp/tests/results/match.txt diff --git a/.gitignore b/.gitignore index e9182aec0..717ae53a8 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,5 @@ models/ python/startposesupload.txt for_release/ +tests/results/matchsgfs/ +tests/results/matchsgfs2/ \ No newline at end of file diff --git a/cpp/command/gatekeeper.cpp b/cpp/command/gatekeeper.cpp index 34a26b3d9..f60046319 100644 --- a/cpp/command/gatekeeper.cpp +++ b/cpp/command/gatekeeper.cpp @@ -100,11 +100,16 @@ namespace { noResultUtilityForWhite = baseParams.noResultUtilityForWhite; //Initialize object for randomly pairing bots. Actually since this is only selfplay, this only - //ever gives is the trivial self-pairing, but we use it also for keeping the game count and some logging. - bool forSelfPlay = false; - bool forGateKeeper = true; + //ever gives is the trivial base-vs-candidate pairing, but we use it also for keeping the game count and some logging. + int64_t numGamesTotal = cfg.getInt64("numGamesPerGating",0,((int64_t)1) << 24); matchPairer = new MatchPairer( - cfg, 2, {modelNameBaseline,modelNameCandidate}, {nnEvalBaseline,nnEvalCandidate}, {baseParams, baseParams}, forSelfPlay, forGateKeeper + cfg, + 2, + {modelNameBaseline,modelNameCandidate}, + {nnEvalBaseline,nnEvalCandidate}, + {baseParams, baseParams}, + {{0,1},{1,0}}, + numGamesTotal ); } diff --git a/cpp/command/match.cpp b/cpp/command/match.cpp index 4bf082009..b9c2d0a7a 100644 --- a/cpp/command/match.cpp +++ b/cpp/command/match.cpp @@ -70,13 +70,75 @@ int MainCmds::match(const vector& args) { assert(paramss.size() > 0); int numBots = (int)paramss.size(); - //Load a filter on what bots we actually want to run - vector excludeBot(numBots); - if(cfg.contains("includeBots")) { - vector includeBots = cfg.getInts("includeBots",0,Setup::MAX_BOT_PARAMS_FROM_CFG); + //Figure out all pairs of bots that will be playing. + std::vector> matchupsPerRound; + { + //Load a filter on what bots we actually want to run. By default, include everything. + vector includeBot(numBots); + if(cfg.contains("includeBots")) { + vector includeBotIdxs = cfg.getInts("includeBots",0,Setup::MAX_BOT_PARAMS_FROM_CFG); + for(int i = 0; i secondaryBotIdxs; + if(cfg.contains("secondaryBots")) + secondaryBotIdxs = cfg.getInts("secondaryBots",0,Setup::MAX_BOT_PARAMS_FROM_CFG); + for(int i = 0; i= 0 && secondaryBotIdxs[i] < numBots); + for(int i = 0; i pairStrs = Global::split(pairsStr,','); + for(const string& pairStr: pairStrs) { + if(Global::trim(pairStr).size() <= 0) + continue; + std::vector pieces = Global::split(Global::trim(pairStr),'-'); + if(pieces.size() != 2) { + throw IOError("Could not parse pair: " + pairStr); + } + bool suc; + int p0; + int p1; + suc = Global::tryStringToInt(pieces[0],p0); + if(!suc) + throw IOError("Could not parse pair: " + pairStr); + suc = Global::tryStringToInt(pieces[1],p1); + if(!suc) + throw IOError("Could not parse pair: " + pairStr); + if(p0 < 0 || p0 >= numBots) + throw IOError("Invalid player index in pair: " + pairStr); + if(p1 < 0 || p1 >= numBots) + throw IOError("Invalid player index in pair: " + pairStr); + + if(cfg.contains("extraPairsAreOneSidedBW") && cfg.getBool("extraPairsAreOneSidedBW")) { + matchupsPerRound.push_back(std::make_pair(p0,p1)); + } + else { + matchupsPerRound.push_back(std::make_pair(p0,p1)); + matchupsPerRound.push_back(std::make_pair(p1,p0)); + } + } } } @@ -99,11 +161,17 @@ int MainCmds::match(const vector& args) { nnModelFilesByBot[i] = cfg.getString("nnModelFile"); } + vector botIsUsed(numBots); + for(const std::pair pair: matchupsPerRound) { + botIsUsed[pair.first] = true; + botIsUsed[pair.second] = true; + } + //Dedup and load each necessary model exactly once vector nnModelFiles; vector whichNNModel(numBots); for(int i = 0; i& args) { vector nnEvalsByBot(numBots); for(int i = 0; i& args) { assert(patternBonusTables.size() == numBots); //Initialize object for randomly pairing bots - bool forSelfPlay = false; - bool forGateKeeper = false; - MatchPairer* matchPairer = new MatchPairer(cfg,numBots,botNames,nnEvalsByBot,paramss,forSelfPlay,forGateKeeper,excludeBot); + int64_t numGamesTotal = cfg.getInt64("numGamesTotal",1,((int64_t)1) << 62); + MatchPairer* matchPairer = new MatchPairer(cfg,numBots,botNames,nnEvalsByBot,paramss,matchupsPerRound,numGamesTotal); //Check for unused config keys cfg.warnUnusedKeys(cerr,&logger); diff --git a/cpp/program/play.cpp b/cpp/program/play.cpp index 41ba9f50b..1f4dacc2f 100644 --- a/cpp/program/play.cpp +++ b/cpp/program/play.cpp @@ -601,96 +601,29 @@ MatchPairer::MatchPairer( const vector& bNames, const vector& nEvals, const vector& bParamss, - bool forSelfPlay, - bool forGateKeeper -): MatchPairer(cfg,nBots,bNames,nEvals,bParamss,forSelfPlay,forGateKeeper,vector(nBots)) -{} - - -MatchPairer::MatchPairer( - ConfigParser& cfg, - int nBots, - const vector& bNames, - const vector& nEvals, - const vector& bParamss, - bool forSelfPlay, - bool forGateKeeper, - const vector& exclude + const std::vector>& matchups, + int64_t numGames ) :numBots(nBots), botNames(bNames), nnEvals(nEvals), baseParamss(bParamss), - excludeBot(exclude), - secondaryBots(), - blackPriority(), + matchupsPerRound(matchups), nextMatchups(), - nextMatchupsBuf(), rand(), - matchRepFactor(1), - repsOfLastMatchup(0), numGamesStartedSoFar(0), - numGamesTotal(), + numGamesTotal(numGames), logGamesEvery(), getMatchupMutex() { - assert(!(forSelfPlay && forGateKeeper)); assert(botNames.size() == numBots); assert(nnEvals.size() == numBots); assert(baseParamss.size() == numBots); - assert(exclude.size() == numBots); - if(forSelfPlay) { - assert(numBots == 1); - numGamesTotal = cfg.getInt64("numGamesTotal",1,((int64_t)1) << 62); - } - else if(forGateKeeper) { - assert(numBots == 2); - numGamesTotal = cfg.getInt64("numGamesPerGating",0,((int64_t)1) << 24); - } - else { - if(cfg.contains("secondaryBots")) - secondaryBots = cfg.getInts("secondaryBots",0,Setup::MAX_BOT_PARAMS_FROM_CFG); - for(int i = 0; i= 0 && secondaryBots[i] < numBots); - for(int i = 0; i pairStrs = Global::split(pairsStr,','); - for(const string& pairStr: pairStrs) { - if(Global::trim(pairStr).size() <= 0) - continue; - std::vector pieces = Global::split(Global::trim(pairStr),'-'); - if(pieces.size() != 2) { - throw IOError("Could not parse pair: " + pairStr); - } - bool suc; - int p0; - int p1; - suc = Global::tryStringToInt(pieces[0],p0); - if(!suc) - throw IOError("Could not parse pair: " + pairStr); - suc = Global::tryStringToInt(pieces[1],p1); - if(!suc) - throw IOError("Could not parse pair: " + pairStr); - if(p0 < 0 || p0 >= nBots) - throw IOError("Invalid player index in pair: " + pairStr); - if(p1 < 0 || p1 >= nBots) - throw IOError("Invalid player index in pair: " + pairStr); - extraPairs.push_back(std::make_pair(p0,p1)); - } - } + if(matchupsPerRound.size() <= 0) + throw StringError("MatchPairer: no matchups specified"); + if(matchupsPerRound.size() > 0xFFFFFF) + throw StringError("MatchPairer: too many matchups"); logGamesEvery = cfg.getInt64("logGamesEvery",1,1000000); } @@ -728,9 +661,6 @@ bool MatchPairer::getMatchup( } pair matchup = getMatchupPairUnsynchronized(); - if(blackPriority.size() > 0 && blackPriority.size() == numBots && blackPriority[matchup.first] < blackPriority[matchup.second]) { - matchup = make_pair(matchup.second,matchup.first); - } botSpecB.botIdx = matchup.first; botSpecB.botName = botNames[matchup.first]; @@ -749,69 +679,22 @@ pair MatchPairer::getMatchupPairUnsynchronized() { if(nextMatchups.size() <= 0) { if(numBots == 0) throw StringError("MatchPairer::getMatchupPairUnsynchronized: no bots to match up"); - if(numBots == 1) - return make_pair(0,0); - nextMatchupsBuf.clear(); - //First generate the pairs only in a one-sided manner - for(int i = 0; i& extraPair: extraPairs) { - nextMatchupsBuf.push_back(extraPair); - } - - if(nextMatchupsBuf.size() <= 0) - throw StringError("MatchPairer::getMatchupPairUnsynchronized: no matchups generated"); - if(nextMatchupsBuf.size() > 0xFFFFFF) - throw StringError("MatchPairer::getMatchupPairUnsynchronized: too many matchups"); + //Append all matches for the next round + nextMatchups.clear(); + nextMatchups.insert(nextMatchups.begin(), matchupsPerRound.begin(), matchupsPerRound.end()); //Shuffle - for(int i = (int)nextMatchupsBuf.size()-1; i >= 1; i--) { + for(int i = (int)nextMatchups.size()-1; i >= 1; i--) { int j = (int)rand.nextUInt(i+1); - pair tmp = nextMatchupsBuf[i]; - nextMatchupsBuf[i] = nextMatchupsBuf[j]; - nextMatchupsBuf[j] = tmp; - } - - //Then expand each pair into each player starting first - for(int i = 0; i p = nextMatchupsBuf[i]; - pair swapped = make_pair(p.second,p.first); - if(rand.nextBool(0.5)) { - nextMatchups.push_back(p); - nextMatchups.push_back(swapped); - } - else { - nextMatchups.push_back(swapped); - nextMatchups.push_back(p); - } + pair tmp = nextMatchups[i]; + nextMatchups[i] = nextMatchups[j]; + nextMatchups[j] = tmp; } } pair matchup = nextMatchups.back(); - - //Swap pair every other matchup if doing more than one rep - if(repsOfLastMatchup % 2 == 1) { - pair tmp = make_pair(matchup.second,matchup.first); - matchup = tmp; - } - - if(repsOfLastMatchup >= matchRepFactor-1) { - nextMatchups.pop_back(); - repsOfLastMatchup = 0; - } - else { - repsOfLastMatchup++; - } + nextMatchups.pop_back(); return matchup; } diff --git a/cpp/program/play.h b/cpp/program/play.h index a3f66d6f8..25a52755e 100644 --- a/cpp/program/play.h +++ b/cpp/program/play.h @@ -191,18 +191,8 @@ class MatchPairer { const std::vector& botNames, const std::vector& nnEvals, const std::vector& baseParamss, - bool forSelfPlay, - bool forGateKeeper - ); - MatchPairer( - ConfigParser& cfg, - int numBots, - const std::vector& botNames, - const std::vector& nnEvals, - const std::vector& baseParamss, - bool forSelfPlay, - bool forGateKeeper, - const std::vector& excludeBot + const std::vector>& matchupsPerRound, + int64_t numGamesTotal ); ~MatchPairer(); @@ -226,24 +216,17 @@ class MatchPairer { ); private: - int numBots; - std::vector botNames; - std::vector nnEvals; - std::vector baseParamss; - - std::vector excludeBot; - std::vector secondaryBots; - std::vector blackPriority; - std::vector> extraPairs; + const int numBots; + const std::vector botNames; + const std::vector nnEvals; + const std::vector baseParamss; + const std::vector> matchupsPerRound; + std::vector> nextMatchups; - std::vector> nextMatchupsBuf; Rand rand; - int matchRepFactor; - int repsOfLastMatchup; - int64_t numGamesStartedSoFar; - int64_t numGamesTotal; + const int64_t numGamesTotal; int64_t logGamesEvery; std::mutex getMatchupMutex; diff --git a/cpp/runcmdtests.sh b/cpp/runcmdtests.sh index 600510b71..5bb98b5ef 100755 --- a/cpp/runcmdtests.sh +++ b/cpp/runcmdtests.sh @@ -55,6 +55,49 @@ cat tests/analysis/pvvisits.txt | ./katago analysis -config configs/analysis_exa echo "checkbook" ./katago checkbook -book-file tests/data/test.katabook > tests/results/checkbook.txt + +echo "match" +rm -f tests/results/matchsgfs/* +rm -f tests/results/matchsgfs2/* +rm tests/results/match.txt + +./katago match -config tests/data/configs/matchtest.cfg -sgf-output-dir tests/results/matchsgfs/ >> tests/results/match.txt +mv tests/results/matchsgfs/* tests/results/matchsgfs/games.sgfs +./katago match -config tests/data/configs/matchtest2.cfg -sgf-output-dir tests/results/matchsgfs2/ >> tests/results/match.txt +mv tests/results/matchsgfs2/* tests/results/matchsgfs2/games.sgfs + +function countSides() { + echo $1 >> tests/results/match.txt + ( + echo "Black AAA "; grep 'PB\[AAA\]' $1 | wc -l + echo "Black BBB "; grep 'PB\[BBB\]' $1 | wc -l + echo "Black CCC "; grep 'PB\[CCC\]' $1 | wc -l + echo "Black DDD "; grep 'PB\[DDD\]' $1 | wc -l + echo "Black EEE "; grep 'PB\[EEE\]' $1 | wc -l + echo "Black FFF "; grep 'PB\[FFF\]' $1 | wc -l + echo "Black GGG "; grep 'PB\[GGG\]' $1 | wc -l + echo "Black HHH "; grep 'PB\[HHH\]' $1 | wc -l + ) >> tests/results/match.txt + ( + echo "White AAA "; grep 'PW\[AAA\]' $1 | wc -l + echo "White BBB "; grep 'PW\[BBB\]' $1 | wc -l + echo "White CCC "; grep 'PW\[CCC\]' $1 | wc -l + echo "White DDD "; grep 'PW\[DDD\]' $1 | wc -l + echo "White EEE "; grep 'PW\[EEE\]' $1 | wc -l + echo "White FFF "; grep 'PW\[FFF\]' $1 | wc -l + echo "White GGG "; grep 'PW\[GGG\]' $1 | wc -l + echo "White HHH "; grep 'PW\[HHH\]' $1 | wc -l + ) >> tests/results/match.txt +} +grep -v 'Avg move time used' tests/results/match.txt > tests/results/match.txt.tmp +mv tests/results/match.txt.tmp tests/results/match.txt +sed -i 's/nnRandSeed. = .*$/nnRandSeed = ###/g' tests/results/match.txt +sed -i 's/Git revision: .*$/Git revision: ###/g' tests/results/match.txt +countSides tests/results/matchsgfs/games.sgfs +countSides tests/results/matchsgfs2/games.sgfs + echo "Done" + + diff --git a/cpp/tests/data/configs/matchtest.cfg b/cpp/tests/data/configs/matchtest.cfg new file mode 100644 index 000000000..ef1b00973 --- /dev/null +++ b/cpp/tests/data/configs/matchtest.cfg @@ -0,0 +1,62 @@ + +logTimeStamp = false +logSearchInfo = false +logMoves = false +logGamesEvery = 20 +logToStdout = true + +numBots=8 +includeBots = 0,1,2,3,4 +secondaryBots = 2,3,4 +extraPairs = 2-0,2-4,1-5,7-5 + +botName0=AAA +botName1=BBB +botName2=CCC +botName3=DDD +botName4=EEE +botName5=FFF +botName6=GGG +botName7=HHH + +nnModelFile0=MODELB +nnModelFile1=MODELA +nnModelFile2=MODELA +nnModelFile3=MODELC +nnModelFile4=MODELA +nnModelFile5=MODELC +nnModelFile6=MODELD +nnModelFile7=MODELE + +debugSkipNeuralNet = true +maxPlayouts = 10 + +numGameThreads=1 +numGamesTotal=44 +maxMovesPerGame=2 + +allowResignation = true +resignThreshold = -0.95 +resignConsecTurns = 3 + +koRules = SIMPLE +scoringRules = AREA +taxRules = NONE +multiStoneSuicideLegals = false +hasButtons = false +bSizes = 9 +bSizeRelProbs = 1 + +komiMean = 7 +handicapProb = 0.0 +handicapCompensateKomiProb = 1.0 + +numSearchThreads = 1 + +nnMaxBatchSize = 64 +nnCacheSizePowerOfTwo = 15 +nnMutexPoolSizePowerOfTwo = 10 +nnRandomize = true + +numNNServerThreadsPerModel = 1 + diff --git a/cpp/tests/data/configs/matchtest2.cfg b/cpp/tests/data/configs/matchtest2.cfg new file mode 100644 index 000000000..f81f45d65 --- /dev/null +++ b/cpp/tests/data/configs/matchtest2.cfg @@ -0,0 +1,63 @@ + +logTimeStamp = false +logSearchInfo = false +logMoves = false +logGamesEvery = 20 +logToStdout = true + +numBots=8 +includeBots = 0,1,2,3,4 +secondaryBots = 2,3,4 +extraPairs = 2-0,2-4,1-5,7-5 +extraPairsAreOneSidedBW = true + +botName0=AAA +botName1=BBB +botName2=CCC +botName3=DDD +botName4=EEE +botName5=FFF +botName6=GGG +botName7=HHH + +nnModelFile0=MODELB +nnModelFile1=MODELA +nnModelFile2=MODELA +nnModelFile3=MODELC +nnModelFile4=MODELA +nnModelFile5=MODELC +nnModelFile6=MODELD +nnModelFile7=MODELE + +debugSkipNeuralNet = true +maxPlayouts = 10 + +numGameThreads=1 +numGamesTotal=36 +maxMovesPerGame=2 + +allowResignation = true +resignThreshold = -0.95 +resignConsecTurns = 3 + +koRules = SIMPLE +scoringRules = AREA +taxRules = NONE +multiStoneSuicideLegals = false +hasButtons = false +bSizes = 9 +bSizeRelProbs = 1 + +komiMean = 7 +handicapProb = 0.0 +handicapCompensateKomiProb = 1.0 + +numSearchThreads = 1 + +nnMaxBatchSize = 64 +nnCacheSizePowerOfTwo = 15 +nnMutexPoolSizePowerOfTwo = 10 +nnRandomize = true + +numNNServerThreadsPerModel = 1 + diff --git a/cpp/tests/results/match.txt b/cpp/tests/results/match.txt new file mode 100644 index 000000000..c15a1f6e5 --- /dev/null +++ b/cpp/tests/results/match.txt @@ -0,0 +1,248 @@ +: Running with following config: +allowResignation = true +bSizeRelProbs = 1 +bSizes = 9 +botName0 = AAA +botName1 = BBB +botName2 = CCC +botName3 = DDD +botName4 = EEE +botName5 = FFF +botName6 = GGG +botName7 = HHH +debugSkipNeuralNet = true +extraPairs = 2-0,2-4,1-5,7-5 +handicapCompensateKomiProb = 1.0 +handicapProb = 0.0 +hasButtons = false +includeBots = 0,1,2,3,4 +koRules = SIMPLE +komiMean = 7 +logGamesEvery = 20 +logMoves = false +logSearchInfo = false +logTimeStamp = false +logToStdout = true +maxMovesPerGame = 2 +maxPlayouts = 10 +multiStoneSuicideLegals = false +nnCacheSizePowerOfTwo = 15 +nnMaxBatchSize = 64 +nnModelFile0 = MODELB +nnModelFile1 = MODELA +nnModelFile2 = MODELA +nnModelFile3 = MODELC +nnModelFile4 = MODELA +nnModelFile5 = MODELC +nnModelFile6 = MODELD +nnModelFile7 = MODELE +nnMutexPoolSizePowerOfTwo = 10 +nnRandomize = true +numBots = 8 +numGameThreads = 1 +numGamesTotal = 44 +numNNServerThreadsPerModel = 1 +numSearchThreads = 1 +resignConsecTurns = 3 +resignThreshold = -0.95 +scoringRules = AREA +secondaryBots = 2,3,4 +taxRules = NONE + +: Match Engine starting... +: Git revision: ### +: nnRandSeed = ### +: After dedups: nnModelFile0 = MODELB useFP16 auto useNHWC auto +: Initializing neural net buffer to be size 9 * 9 exactly +: nnRandSeed = ### +: After dedups: nnModelFile1 = MODELA useFP16 auto useNHWC auto +: Initializing neural net buffer to be size 9 * 9 exactly +: nnRandSeed = ### +: After dedups: nnModelFile2 = MODELC useFP16 auto useNHWC auto +: Initializing neural net buffer to be size 9 * 9 exactly +: nnRandSeed = ### +: After dedups: nnModelFile3 = MODELE useFP16 auto useNHWC auto +: Initializing neural net buffer to be size 9 * 9 exactly +: Loaded neural net +: Loaded all config stuff, starting matches +: Started 20 games +: Started 40 games +: Match loop thread terminating +: MODELB +: NN rows: 0 +: NN batches: 0 +: NN avg batch size: -nan +: GPU -1 finishing, processed 0 rows 0 batches +: MODELA +: NN rows: 0 +: NN batches: 0 +: NN avg batch size: -nan +: GPU -1 finishing, processed 0 rows 0 batches +: MODELC +: NN rows: 0 +: NN batches: 0 +: NN avg batch size: -nan +: GPU -1 finishing, processed 0 rows 0 batches +: MODELE +: NN rows: 0 +: NN batches: 0 +: NN avg batch size: -nan +: GPU -1 finishing, processed 0 rows 0 batches +: All cleaned up, quitting +: Running with following config: +allowResignation = true +bSizeRelProbs = 1 +bSizes = 9 +botName0 = AAA +botName1 = BBB +botName2 = CCC +botName3 = DDD +botName4 = EEE +botName5 = FFF +botName6 = GGG +botName7 = HHH +debugSkipNeuralNet = true +extraPairs = 2-0,2-4,1-5,7-5 +extraPairsAreOneSidedBW = true +handicapCompensateKomiProb = 1.0 +handicapProb = 0.0 +hasButtons = false +includeBots = 0,1,2,3,4 +koRules = SIMPLE +komiMean = 7 +logGamesEvery = 20 +logMoves = false +logSearchInfo = false +logTimeStamp = false +logToStdout = true +maxMovesPerGame = 2 +maxPlayouts = 10 +multiStoneSuicideLegals = false +nnCacheSizePowerOfTwo = 15 +nnMaxBatchSize = 64 +nnModelFile0 = MODELB +nnModelFile1 = MODELA +nnModelFile2 = MODELA +nnModelFile3 = MODELC +nnModelFile4 = MODELA +nnModelFile5 = MODELC +nnModelFile6 = MODELD +nnModelFile7 = MODELE +nnMutexPoolSizePowerOfTwo = 10 +nnRandomize = true +numBots = 8 +numGameThreads = 1 +numGamesTotal = 36 +numNNServerThreadsPerModel = 1 +numSearchThreads = 1 +resignConsecTurns = 3 +resignThreshold = -0.95 +scoringRules = AREA +secondaryBots = 2,3,4 +taxRules = NONE + +: Match Engine starting... +: Git revision: ### +: nnRandSeed = ### +: After dedups: nnModelFile0 = MODELB useFP16 auto useNHWC auto +: Initializing neural net buffer to be size 9 * 9 exactly +: nnRandSeed = ### +: After dedups: nnModelFile1 = MODELA useFP16 auto useNHWC auto +: Initializing neural net buffer to be size 9 * 9 exactly +: nnRandSeed = ### +: After dedups: nnModelFile2 = MODELC useFP16 auto useNHWC auto +: Initializing neural net buffer to be size 9 * 9 exactly +: nnRandSeed = ### +: After dedups: nnModelFile3 = MODELE useFP16 auto useNHWC auto +: Initializing neural net buffer to be size 9 * 9 exactly +: Loaded neural net +: Loaded all config stuff, starting matches +: Started 20 games +: Match loop thread terminating +: MODELB +: NN rows: 0 +: NN batches: 0 +: NN avg batch size: -nan +: GPU -1 finishing, processed 0 rows 0 batches +: MODELA +: NN rows: 0 +: NN batches: 0 +: NN avg batch size: -nan +: GPU -1 finishing, processed 0 rows 0 batches +: MODELC +: NN rows: 0 +: NN batches: 0 +: NN avg batch size: -nan +: GPU -1 finishing, processed 0 rows 0 batches +: MODELE +: NN rows: 0 +: NN batches: 0 +: NN avg batch size: -nan +: GPU -1 finishing, processed 0 rows 0 batches +: All cleaned up, quitting +tests/results/matchsgfs/games.sgfs +Black AAA +10 +Black BBB +10 +Black CCC +8 +Black DDD +4 +Black EEE +6 +Black FFF +4 +Black GGG +0 +Black HHH +2 +White AAA +10 +White BBB +10 +White CCC +8 +White DDD +4 +White EEE +6 +White FFF +4 +White GGG +0 +White HHH +2 +tests/results/matchsgfs2/games.sgfs +Black AAA +8 +Black BBB +10 +Black CCC +8 +Black DDD +4 +Black EEE +4 +Black FFF +0 +Black GGG +0 +Black HHH +2 +White AAA +10 +White BBB +8 +White CCC +4 +White DDD +4 +White EEE +6 +White FFF +4 +White GGG +0 +White HHH +0