Read model table of all rules in the config.
| 461 | |
| 462 | /// Read model table of all rules in the config. |
| 463 | void Config::readModel(const cpptoml::table &t) |
| 464 | { |
| 465 | const Rule Rules[] = {FREESTYLE, STANDARD, RENJU}; |
| 466 | const char *RuleName[] = {"freestyle", "standard", "renju"}; |
| 467 | |
| 468 | std::string modelPath = t.get_as<std::string>("binary_file").value_or(""); |
| 469 | if (!modelPath.empty()) { |
| 470 | if (!Command::loadModelFromFile(modelPath)) |
| 471 | throw std::runtime_error("failed to load classic model file"); |
| 472 | } |
| 473 | else { |
| 474 | // Read Eval & Score |
| 475 | if (auto eval = t.get_table("eval")) { |
| 476 | bool hasAsymmetryRenjuEval = false; |
| 477 | for (Rule r : Rules) { |
| 478 | auto setEvalBlack = [r](PatternCode pcode, Eval ev) { |
| 479 | EVALS[r + BLACK][pcode] = ev; |
| 480 | }; |
| 481 | auto setEvalWhite = [r](PatternCode pcode, Eval ev) { |
| 482 | EVALS[r + WHITE][pcode] = ev; |
| 483 | }; |
| 484 | auto ruleEval = eval->get_table(RuleName[r]); |
| 485 | if (!ruleEval) // fallback |
| 486 | ruleEval = eval; |
| 487 | else if (r == RENJU) { |
| 488 | auto blackEval = ruleEval->get_table("black"); |
| 489 | auto whiteEval = ruleEval->get_table("white"); |
| 490 | auto fallbackEval = ruleEval->get_as<int64_t>("model_type") ? ruleEval : eval; |
| 491 | if (hasAsymmetryRenjuEval = blackEval || whiteEval; hasAsymmetryRenjuEval) { |
| 492 | readValueModel<Eval, -16384, 16383>(*(blackEval ? blackEval : fallbackEval), |
| 493 | setEvalBlack); |
| 494 | readValueModel<Eval, -16384, 16383>(*(whiteEval ? whiteEval : fallbackEval), |
| 495 | setEvalWhite); |
| 496 | } |
| 497 | } |
| 498 | |
| 499 | if (!hasAsymmetryRenjuEval) { |
| 500 | if (r == RENJU) { |
| 501 | readValueModel<Eval, -16384, 16383>(*ruleEval, setEvalBlack); |
| 502 | readValueModel<Eval, -16384, 16383>(*ruleEval, setEvalWhite); |
| 503 | } |
| 504 | else { |
| 505 | readValueModel<Eval, -16384, 16383>(*ruleEval, setEvalBlack); |
| 506 | } |
| 507 | } |
| 508 | } |
| 509 | } |
| 510 | |
| 511 | if (auto score = t.get_table("score")) { |
| 512 | auto readScore = [](const cpptoml::table &t, int tableIdx) { |
| 513 | auto selfTable = t.get_table("self"); |
| 514 | auto oppoTable = t.get_table("oppo"); |
| 515 | readValueModel<Score, -8192, 8191>(selfTable ? *selfTable : t, |
| 516 | [tableIdx](PatternCode pcode, Score score) { |
| 517 | P4SCORES[tableIdx][pcode][0] = score; |
| 518 | }); |
| 519 | readValueModel<Score, -8192, 8191>(oppoTable ? *oppoTable : t, |
| 520 | [tableIdx](PatternCode pcode, Score score) { |
nothing calls this directly
no test coverage detected