ART/GTO
Solving

Running a solve

Once you have set a board, ranges, and bet sizing, click the Solve button to start. ARTGTO solves on background threads, so the UI stays responsive while the solver works.

Iterations and target exploitability

A solve runs iteratively. Each iteration brings the strategy closer to Nash equilibrium. You control two stopping conditions:

  • Max iterations — the hard cap. Default 250.
  • Target exploitability — the solver stops early when exploitability drops below this threshold. Default 0.30% of the pot.

"Exploitability 0.30% of pot" means that in a 100-chip pot, a perfect exploiter could gain at most 0.30 chips against the computed strategy. For almost all study purposes, 0.30% is accurate enough. Lower targets (like 0.10%) take more iterations and time but produce tighter strategies.

Tip
If the solve hits max iterations before reaching the target, the result is still usable — just slightly less precise. The final exploitability is shown when the solve completes.

What happens when you click Solve

The solver goes through several phases:

  1. Building game tree — constructs the decision tree from your bet sizes. This takes a fraction of a second for most configurations. Suit isomorphism is applied by default, collapsing equivalent branches to save memory.
  2. Precomputing showdowns — builds the hand-strength tables for every possible board runout. This can take a few seconds on flop solves.
  3. Solving — runs DCFR iterations. This is where the time goes.
  4. Computing EVs — after the last iteration, the solver computes expected values for the strategy browser. Quick.

Live progress display

While solving, the status bar at the bottom of the window shows:

Solving — iter 47/250 · exploit 1.234%
  • iter 47/250 — current iteration out of the maximum.
  • exploit 1.234% — the most recent exploitability measurement (as a percentage of the pot). This updates periodically, not every iteration, because computing exploitability requires an expensive best-response pass.

An elapsed timer runs next to the status, so you can see how long the solve has been going.

Note
The very first iteration may show only Solving — iter 1/250 with no exploitability number. The first best-response check has not fired yet. This is normal.

The status bar

The bottom bar shows the current state of the solver at all times:

  • Idle — no solve running.
  • Preparing — building the tree, allocating memory, or precomputing showdowns. You will see messages like Building game tree (iso)… or Precomputing showdowns….
  • Solving — the iteration loop is running.
  • Done — solve finished. Shows the iteration count, elapsed time, and final exploitability. Example: Done — 183 iters in 2:34 · exploit 0.298%.
  • Failed — something went wrong. The message explains why (empty range, out of memory, etc.).

If the solver used the low-memory river-bucketing fallback, the done message includes river-bucketed @ N, where N is the number of strength buckets used. See Memory: big spots & fallbacks for details.

Stopping a solve

Click the same button (now labeled Cancel or Stop) to cancel a running solve. The solver finishes its current iteration and stops. No result is produced — you get the "Idle" state back.

There is no pause-and-resume for single solves. If you want to stop early and keep a partial result, let it run to at least a few dozen iterations (the strategy is already useful, just less converged).

Warning
Cancelling discards the work done so far. If you just want a quick answer, lower the max iterations or raise the target exploitability before starting, rather than cancelling mid-solve.

Solver cores

The solver uses multiple CPU cores in parallel. By default it uses all logical cores on your machine. You can change this in Settings → Performance → Solver cores. The setting takes effect on the next solve — no restart needed.

screenshot
status bar showing a solve in progress