Skip to content

--stockfish-- evaluation#9

Open
winapiadmin wants to merge 54 commits into
HandcraftedEnginefrom
sf_eval
Open

--stockfish-- evaluation#9
winapiadmin wants to merge 54 commits into
HandcraftedEnginefrom
sf_eval

Conversation

@winapiadmin

Copy link
Copy Markdown
Owner

not the stockfish as the branch name guaranteed

splitted piece middlegame and endgame values

Passed STC: https://github.com/winapiadmin/cppchess_engine/actions/runs/29553686707

Passed LTC: https://github.com/winapiadmin/cppchess_engine/actions/runs/30164194393

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@winapiadmin, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 35 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 91344956-695e-45ae-adb1-42f51515df34

📥 Commits

Reviewing files that changed from the base of the PR and between bd14390 and e1a38be.

📒 Files selected for processing (4)
  • .github/workflows/games.yml
  • Weights.h
  • eval.cpp
  • tune_cmd.cpp
📝 Walkthrough

Walkthrough

The PR splits evaluation values into middlegame and endgame parameters, enables additional evaluation terms, updates search and tuning calculations, adds PGN pentanomial extraction, and restructures CI benchmark and SPSA workflows.

Changes

Evaluation and benchmark pipeline

Layer / File(s) Summary
MG/EG evaluation model
Weights.h, eval.h, eval.cpp, movepick.cpp, search.cpp
Piece values, phase scaling, evaluation blending, and enabled heuristics now use separate middlegame/endgame paths; move ordering and qsearch use middlegame values.
Tuning and weight generation
tune_cmd.cpp, tune.cpp, spsa.py
Tuning phase normalization, gradient accumulation, score calculation, SPSA updates, and generated weight output are aligned with the revised evaluation model.
PGN pentanomial extraction
extract_ptnml.py
Fastchess PGNs are parsed into WDL and validated pentanomial statistics for SPRT processing.
Sharded benchmark and evaluation workflow
.github/workflows/games.yml
Tool preparation, sharded Fastchess execution, PGN merging, Ordo ratings, and SPRT artifact generation are split into workflow jobs.
SPSA workflow configuration
.github/workflows/spsa.yml
Configurable checkout input is removed, iterations are reduced, and artifact selection and compression are updated.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant prepare_tools
  participant test
  participant evaluate
  participant Ordo
  participant stats_sprt
  prepare_tools->>test: staged benchmark tools
  test->>test: execute Fastchess shard matrix
  test->>evaluate: upload shard PGNs and results
  evaluate->>Ordo: merge PGNs and generate ratings
  evaluate->>stats_sprt: calculate SPRT from extracted statistics
  stats_sprt-->>evaluate: write sprt.txt
Loading

Possibly related PRs

Poem

I’m a rabbit with weights in my paws,
MG and EG hop past old laws.
Shards race, PGNs bloom,
Ratings fill the room—
And SPRT thumps its tiny applause.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.52% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is vague, but it is still related to the evaluation changes in this PR.
Description check ✅ Passed The description matches the change set by describing the split of middlegame and endgame piece values.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sf_eval

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tune_cmd.cpp (1)

746-775: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Gradient doesn't account for the new sf and rule50 damping in the forward pass.

Lines 746-757 scale the score by sf/64 and by (100 - rule50)/100, but phase_mg/phase_eg at Lines 771-772 only carry the phase split. For a pawnless ≤4-piece position the forward score is halved on the eg side while the eg gradient is still computed at full weight, and at rule50 = 100 the forward score is 0 while the gradient is unchanged — the gradient no longer matches the loss it's supposed to descend.

Folding the same factors into the phase weights keeps them consistent:

♻️ Proposed fix
-                double phase_mg = comp.phase / 128.0;
-                double phase_eg = (128 - comp.phase) / 128.0;
+                double damp = (sf / 64.0) * ((100 - rule50) / 100.0);
+                double phase_mg = damp * comp.phase / 128.0;
+                double phase_eg = damp * (sf / 64.0) * (128 - comp.phase) / 128.0;

(Note sf appears twice on the eg path because it multiplies comp.eg before the taper; adjust to taste, but the two paths need to agree.)

Also worth noting: eval_loss (Line 80) measures loss via eval::eval(pos), while the gradient worker computes its own score here. The line search and the gradient are therefore optimizing slightly different objectives.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tune_cmd.cpp` around lines 746 - 775, Update the gradient calculation in the
worker around accumulate_gradient so phase_mg and phase_eg include the same sf
scaling and rule50 damping applied when computing v. Preserve the distinct mg/eg
taper while ensuring both gradient paths match the forward score, including zero
contribution when rule50 reaches 100. Also align eval_loss with the worker’s
score calculation so line search and gradient optimize the same objective.
🧹 Nitpick comments (6)
spsa.py (2)

373-378: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Gradient denominator ignores clamping.

plus/minus are clamped to [min, max] at Lines 355-358, but ghat divides by the nominal 2 * ck[n] * deltas[n]. For a parameter resting on a bound the realized perturbation is asymmetric (or zero on one side), so the estimated gradient is inflated exactly where the parameter is least able to move. Using the actual realized difference (plus[n] - minus[n]) as the denominator avoids this.

-            ghat = score / (
-                2 * ck[n] * deltas[n]
-            )
+            spread = plus[n] - minus[n]
+            if abs(spread) < 1e-9:
+                continue
+            ghat = score / spread
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@spsa.py` around lines 373 - 378, The SPSA gradient calculation in the
parameter update must account for clamped perturbations. In the code producing
ghat, replace the nominal denominator based on ck[n] and deltas[n] with the
realized difference plus[n] - minus[n], while preserving the existing score
numerator and value clamping behavior.

65-72: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

SPRT is enabled inside the SPSA match template.

"enabled": True means fastchess may stop an iteration's match early once an SPRT bound is reached, which truncates the sample and biases f_plus/f_minus for that iteration. For a fixed-budget gradient estimate you want all args.pairs rounds played.

     "sprt": {
         "alpha": 0.05,
         "beta": 0.05,
         "elo0": 0.0,
         "elo1": 5.0,
         "model": "normalized",
-        "enabled": True
+        "enabled": False
     },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@spsa.py` around lines 65 - 72, Disable SPRT in the SPSA match template by
changing the enabled setting in the "sprt" configuration used by the match
setup. Ensure each iteration plays the full args.pairs budget so f_plus and
f_minus are computed from complete samples.
eval.cpp (1)

262-263: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

developedEg is now a no-op but still tuned.

With Line 263 commented out, developedEg no longer affects eval, yet it remains registered at Line 67 (TUNE(SetRange(1, 20), developedMg, SetRange(1, 20), developedEg)) and is emitted to Weights.h. SPSA/texel will spend budget perturbing a parameter with zero effect. Same applies to the endgame half of earlyQueenPenalty (Lines 274-275), though that one shares a single parameter so it's harmless.

Consider dropping developedEg from the TUNE list while it's disabled.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@eval.cpp` around lines 262 - 263, Remove developedEg from the TUNE
registration so it is no longer tuned or emitted while its endgame evaluation
contribution remains disabled. Leave the developedMg tuning and the
commented-out evaluation line unchanged.
tune_cmd.cpp (1)

135-150: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Remove dead compute_game_phase code

texel_tune now gets the phase from comp.phase, and compute_game_phase has no call sites, so this helper, its constants, and any phase-masking code that depended on it are no longer reachable.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tune_cmd.cpp` around lines 135 - 150, Remove the unused compute_game_phase
helper and its associated phase constants from tune_cmd.cpp. Also remove any
phase-masking or related code that depended exclusively on this helper, while
preserving the existing comp.phase-based phase flow.
.github/workflows/games.yml (1)

112-115: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

fail-fast: true on a 30-shard matrix cancels all in-progress shards on a single failure.

A single flaky shard (network hiccup, one engine crash) will cancel the other 29 shards, wasting substantial already-completed game-play compute. Consider fail-fast: false so shard failures are isolated.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/games.yml around lines 112 - 115, Update the matrix
strategy containing the 30-entry shard list to set fail-fast to false, so a
failure in one shard does not cancel other in-progress shards.
extract_ptnml.py (1)

82-87: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

Validation is unreachable dead code.

scores[0]/scores[1] are always drawn from {-1, 0, 1}, so their sum is always in {-2, -1, 0, 1, 2} — exactly PTNML_INDEX's keys. This raise RuntimeError can never fire, despite the comment implying it verifies the pair is a genuine repeat (e.g., colors swapped). Consider removing this dead check or replacing it with an actual pairing-integrity check (e.g., confirming White/Black are swapped between the two games).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@extract_ptnml.py` around lines 82 - 87, The check against PTNML_INDEX in the
repeat-pair processing block is unreachable and does not validate pairing
integrity. Remove it or replace it with a check that confirms the two games have
swapped White/Black participants, while preserving the existing ptnml update and
pairs_count increment for valid pairs.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/games.yml:
- Around line 172-193: Update the SPRT workflow step and its artifact
configuration so they use a consistent output file: either redirect the SPRT
output to create sprt.txt, or remove the stale sprt.txt entry from the
upload-artifact paths. Preserve results.txt for the extracted and appended
results, and keep ratings.txt unchanged.
- Around line 133-142: Fix the fastchess command continuation in the workflow by
adding the missing space before the backslash after the -startup-ms,
-ucinewgame-ms, and -ping-ms arguments. Preserve the existing command structure
so the next line remains a separate -rounds argument.

In `@eval.cpp`:
- Around line 731-760: The tapered scoring pipeline is duplicated and handles
draw positions inconsistently. In eval.cpp lines 731-760, extract the complete
post-eval_components scoring, including the zero-component sentinel and K-vs-K
early returns, into a shared score_from_components helper and have eval() call
it; in tune_cmd.cpp lines 746-759, replace the inline scaling, tapering,
quantization, rule50, side-to-move, and tempo logic with that helper so both
paths are identical.

In `@extract_ptnml.py`:
- Around line 13-24: Update score_from_new to explicitly handle the "*" Result
before the win/loss branches, returning the appropriate neutral or non-counting
outcome required by the WDL/PTNML consumers instead of treating it as a loss;
preserve the existing decisive-result scoring and draw handling.

In `@spsa.py`:
- Around line 242-271: Update the subprocess.CalledProcessError handler around
the fastchess invocation to return the neutral `(0.5, 0.5)` result after logging
diagnostics, or re-raise the failure through existing handling so execution
cannot reach result-dependent logic without an assigned result. Preserve the
normal successful path in the surrounding evaluation function.
- Line 200: Update the row-parsing exception handling in load_params to
distinguish expected non-CSV UCI stdout lines from genuine malformed parameter
rows, reporting or propagating real parse failures instead of silently skipping
them and preserving a non-zero failure outcome. Also clean up the delete=False
temporary file created in the stdout-scraping fallback by unlinking it after the
recursive load_params call, including failure paths.
- Around line 349-367: Remove the initial unused deltas assignment and the
redundant plus_int/minus_int recomputation and unreachable equality guard around
the perturbation loop. In the gradient-update logic following this block, update
only parameters n where plus_int[n] differs from minus_int[n], while preserving
updates for parameters with an effective integer perturbation.

In `@tune.cpp`:
- Around line 79-80: Update the SPSA learning-gain value emitted by the tune.cpp
output so column 6 matches spsa.py’s local ak formula rather than Fishtest R_end
scaling. Ensure the generated gain is large enough for integer parameter
perturbations to change across 40 iterations, or reduce the stable_offset passed
to spsa.py accordingly.

---

Outside diff comments:
In `@tune_cmd.cpp`:
- Around line 746-775: Update the gradient calculation in the worker around
accumulate_gradient so phase_mg and phase_eg include the same sf scaling and
rule50 damping applied when computing v. Preserve the distinct mg/eg taper while
ensuring both gradient paths match the forward score, including zero
contribution when rule50 reaches 100. Also align eval_loss with the worker’s
score calculation so line search and gradient optimize the same objective.

---

Nitpick comments:
In @.github/workflows/games.yml:
- Around line 112-115: Update the matrix strategy containing the 30-entry shard
list to set fail-fast to false, so a failure in one shard does not cancel other
in-progress shards.

In `@eval.cpp`:
- Around line 262-263: Remove developedEg from the TUNE registration so it is no
longer tuned or emitted while its endgame evaluation contribution remains
disabled. Leave the developedMg tuning and the commented-out evaluation line
unchanged.

In `@extract_ptnml.py`:
- Around line 82-87: The check against PTNML_INDEX in the repeat-pair processing
block is unreachable and does not validate pairing integrity. Remove it or
replace it with a check that confirms the two games have swapped White/Black
participants, while preserving the existing ptnml update and pairs_count
increment for valid pairs.

In `@spsa.py`:
- Around line 373-378: The SPSA gradient calculation in the parameter update
must account for clamped perturbations. In the code producing ghat, replace the
nominal denominator based on ck[n] and deltas[n] with the realized difference
plus[n] - minus[n], while preserving the existing score numerator and value
clamping behavior.
- Around line 65-72: Disable SPRT in the SPSA match template by changing the
enabled setting in the "sprt" configuration used by the match setup. Ensure each
iteration plays the full args.pairs budget so f_plus and f_minus are computed
from complete samples.

In `@tune_cmd.cpp`:
- Around line 135-150: Remove the unused compute_game_phase helper and its
associated phase constants from tune_cmd.cpp. Also remove any phase-masking or
related code that depended exclusively on this helper, while preserving the
existing comp.phase-based phase flow.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6f6a622c-3b32-4e0d-8a1c-82ecb9215b68

📥 Commits

Reviewing files that changed from the base of the PR and between 9336e6b and 6da4c89.

📒 Files selected for processing (11)
  • .github/workflows/games.yml
  • .github/workflows/spsa.yml
  • Weights.h
  • eval.cpp
  • eval.h
  • extract_ptnml.py
  • movepick.cpp
  • search.cpp
  • spsa.py
  • tune.cpp
  • tune_cmd.cpp

Comment thread .github/workflows/games.yml
Comment thread .github/workflows/games.yml
Comment thread eval.cpp Outdated
Comment thread extract_ptnml.py
Comment thread spsa.py Outdated
Comment thread spsa.py
Comment thread spsa.py Outdated
Comment thread tune.cpp Outdated
winapiadmin and others added 4 commits July 26, 2026 11:30
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6da4c8915c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/games.yml Outdated
Comment thread eval.cpp
Comment thread tune_cmd.cpp Outdated
Comment thread eval.cpp
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
eval.cpp (1)

251-275: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Do not treat a captured queen as early queen development.

The condition is true when the side has no queen, so queenless positions with undeveloped minors receive earlyQueenPenalty. Require a queen to exist before treating its absence from the starting square as a move; mirror this predicate in tune_cmd.cpp.

Proposed fix
-        if (!(board.pieces(QUEEN, c) & (1ULL << qStart))) {
+        Bitboard queens = board.pieces(QUEEN, c);
+        if (queens && !(queens & (1ULL << qStart))) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@eval.cpp` around lines 251 - 275, Update the early queen development
condition in the evaluation loop to first require that the side still has a
queen, then check whether it is absent from its starting square before applying
earlyQueenPenalty. Mirror the same queen-existence predicate in the
corresponding tuning logic in tune_cmd.cpp.
tune_cmd.cpp (1)

758-782: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Differentiate the scorer used by the loss.

score_from_components() multiplies the raw score by (100 - rule50) / 100 and returns a constant zero for the component sentinel, but common_factor ignores both. This overstates gradients in rule-50 positions and updates parameters for forced-zero evaluations.

Skip accumulate_gradient() for the sentinel case and multiply common_factor by the rule-50 factor before accumulating gradients.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tune_cmd.cpp` around lines 758 - 782, Update the gradient path around
score_from_components and accumulate_gradient: skip accumulation when the
component sentinel produces a forced-zero score, and scale common_factor by the
scorer’s rule-50 factor (100 - rule50) / 100 before calling accumulate_gradient.
Preserve the existing loss calculation and other gradient behavior for
non-sentinel positions.
🧹 Nitpick comments (1)
eval.cpp (1)

263-263: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the unused developedEg tuning parameter.

developedEg is still registered in the TUNE list, but this term no longer contributes to evaluation or gradients. Remove it from the tunable set, or restore its endgame contribution.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@eval.cpp` at line 263, Remove the unused developedEg parameter from the TUNE
registration and any associated tuning declarations, since the developed-piece
endgame term is disabled and no longer affects evaluation or gradients.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/games.yml:
- Line 138: Update the workflow command around the rounds argument to pass
github.event.inputs.rounds through an environment variable instead of
interpolating it into shell arithmetic. In the script, validate the value as a
decimal integer before calculating the per-shard rounds value, then use that
validated value for the command argument.

---

Outside diff comments:
In `@eval.cpp`:
- Around line 251-275: Update the early queen development condition in the
evaluation loop to first require that the side still has a queen, then check
whether it is absent from its starting square before applying earlyQueenPenalty.
Mirror the same queen-existence predicate in the corresponding tuning logic in
tune_cmd.cpp.

In `@tune_cmd.cpp`:
- Around line 758-782: Update the gradient path around score_from_components and
accumulate_gradient: skip accumulation when the component sentinel produces a
forced-zero score, and scale common_factor by the scorer’s rule-50 factor (100 -
rule50) / 100 before calling accumulate_gradient. Preserve the existing loss
calculation and other gradient behavior for non-sentinel positions.

---

Nitpick comments:
In `@eval.cpp`:
- Line 263: Remove the unused developedEg parameter from the TUNE registration
and any associated tuning declarations, since the developed-piece endgame term
is disabled and no longer affects evaluation or gradients.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5fe80412-e773-466d-90f4-d1e697a769a8

📥 Commits

Reviewing files that changed from the base of the PR and between 6da4c89 and bd14390.

📒 Files selected for processing (6)
  • .github/workflows/games.yml
  • eval.cpp
  • eval.h
  • spsa.py
  • tune.cpp
  • tune_cmd.cpp
🚧 Files skipped from review as they are similar to previous changes (2)
  • eval.h
  • spsa.py

Comment thread .github/workflows/games.yml Outdated
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants