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.
What happens when you click Solve
The solver goes through several phases:
- 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.
- Precomputing showdowns — builds the hand-strength tables for every possible board runout. This can take a few seconds on flop solves.
- Solving — runs DCFR iterations. This is where the time goes.
- 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.
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)…orPrecomputing 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).
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.