Click here to see flat version of this file.

No javascript!

Your browser has disabled javascript. Some elements may be displayed incorrectly.

We hope this manual will be helfpul, however it's not intended to be exhaustive nor complete.

This document has been last updated in June 2021 (PioSolver 2.0.6, PioViewer 2.0.6.8)

In PioSOLVER betting structure of a tree is specified as the list of lines. The line is a betting sequence consisting of checks, bets, raises, calls and folds etc.

In consequence it's not possible to specify different betting line on different runouts. I.e. A player can't have different betting sizes on different turn card.

In Piosolver postflop tree configuration you can specify tree betting structure by providing betsize formulas separately for each street (Flop, Turn, River) for both players (IP and OOP) and for bets, raises and donk bets for OOP player.

We can specify several bet sizes for each case as comma separated list of expressions.

For bet sizes available expressions are

  • % of the pot (40 on the picture),
  • fixed chip amount (20c on the picture),
  • geometrical bet size (e on the picture)

Basic betsizes

Geometrical(exponential) betsize expression ‘e’ is a betsize that will split the whole effective stack into number of bets (3 on the flop, 2 on the turn) that are the same size in % of the pot. First picture shows the geometric betsize on the Flop, Turn and River.

Geometric betsize on the flop

The second picture shows the geometrical betsize on the Turn and River. Geometrical betsize on the River is all-in.

Geometric betsize on the turn

We can add an all-in bet with expression “a”. This will always add an all-in bet.

bet_all_in_expression

An all-in bet can also be added with the “Add all-in” checkbox.

However this will only add an all-in if all following conditions are met:

  • at least one betsize is already specified for this situation (i.e. it won’t add an all-in donk bet on the Turn if no donk bet is specified at all
  • if an all-in bet would be larger than specified threshold

bet_add_all_in_checkbox

For raise it's possible to use the same expressions as for bet sizes.

Additionaly for raise sizes it’s possible to specify raise size as multiplier of an opponent’s bet (e.g. 3x).

  • 2x is the minimum legal raise.

bet_add_all_in_checkbox

Multiple raises and reraises:

bet_add_all_in_checkbox

If this option is specified then IP player will have no raise option if the action goes OOP check, IP Bet, OOP Raise.

bet_no_3bet

If a regular bet would mean that the player has put more than X% of his starting stack it’s converted to an all-in.

allin_threshold

If mimumum bet size is specified than smaller betsizes will be converted to minimum

minbet

there was a raise before.

If this option is selected then in lines where there was already a raise before (e.g. turn play after raise on the flop) the formula specified with this settings will be used instead of a formula from regular settings.

This feature only works for lines where at least one size is specified in regular settings.

minbet

Sometimes it’s useful to have together betsizes specified with different formulas (e.g. 45% of the pot, 2.8x and geometric raise sizes).

But in some lines these raise sizes could be very close to each other so that they make each other redundant.

In this situation it’s beneficial to use merge similar betsizes option.

merging1

It will leave the highest of the bets which are within specified threshold.

merging2

The exact bebavior can be explored by clicking “how does this work?”

  • Force OOP Bet

equivalent to removing OOP Check option on the Flop

  • Force OOP Check / IP Bet

equivalent to removing OOP Bet and to removing IP Check on the FLOP

Limits the number of Bets that can be made on a single street.

There is a NL mode (where the last allowed bet is converted to all-in) or Limit HE mode (where only call is allowed after last bet on the street)

cap

If all other tree building options are not enough it's possible to add and remove lines using "Add extra lines" and "Remove lines" fields.

The syntax for adding and removing lines is relatively simple however it's recommended to start using this feature using a graphical interface (Add and remove lines with visual editor) instead of adding lines manually in text editor.

In PioSOLVER the Node Locking functionality consists of two things:

  • Change strategy - changes strategy stored in the tree.
  • Lock range - prevent solver from resolving certain hands in a node.
    • Lock full range - strategy will not be changed in this node when resolving.
    • Combo lock - strategy will not change in this node for selected combos/strategy but solving will change strategy for remaining hands.

It makes sense to change strategy and observe how the EV of earlier actions change.

It also makes sense to change strategy, lock it and solve the tree again to see what is the equilibrium strategy for both players if some part of the tree is locked.

The basic workflow is selecting some hands (by default all are selected) and adjusting strategy with sliders (e.g. adding 10% folds).

You can then lock strategy for some hands, and continue adjusting strategy for other hands. E.g. you could first set all top_pairs to raise, lock it and then adjust strategy for all remaining hands.

The next step is either locking all or part of the range and click "Save and Close". Only then the strategy change and locking is applied on the actual tree.

The top menu has following options:

  • Util: Shortcuts for operations on Selected Range.
  • Select: Shortcut for select range in Range Explorer
  • View options: Controls display functions on a 13x13 grid (e.g. square size proportional to weight and others)
  • Copy / Paste: Functions to copy and paste current strategy
  • Settings: Advanced settings

Top menu

The currently edited Node is indicated in the section below the top menu.

Node check

The presentation setting controls what is displaed on the 13x13 grid.

Presentation menu

You can choose which hands are highlighted on the grid (either Selected hands, locked and / or unlocked).

By hovering the mouse over the grid you can see details of the category in a separate panel. By holding ALT key you can prevent currently displayed group from changing.

hands display

There are several ways to select range.

  1. Clicking on the main grid. You can also click single combos on the small panel. By holding ALT key you can prevent currently displayed group from changing.
  2. Using the standard range selector.
  3. Through the expression box, a list of available expressions can be viewed by clicking help link.
  4. Using Range Explorer.
  5. Clear Selection button clears selection.

range selection

You can use Selection criterion to limit selected hands to locked and / or unlocked.

selection criterion menu

You can change the strategy for selected range by either using the sliders or typing in the checkboxes. This will increase or reduce frequency of selected action by choosing the best hands using ev difference.

It's possible to prevent adjustment of certain actions by clicking checkbox beside the slider.

slider

The new strategy will be immediately visible on the grid (if Adjusted Strategy is selected).

The top bar always shows the strategy for whole range, while the smaller bar on the right shows strategy for currently selected Range.

For locking hands you can use Menu Actions or buttons within the window.

  1. In the bottom menuthere are buttons to lock and unlock all hands.
  2. In the panel on the right you can perform actions on selected range: lock, unlock and revert to the original strategy.

lock and unlock

In node locking 2.0 changing frequency of one action results in changing frequency for all other actions (except if they've been explicitely disabled). When we increase frequency of a given action we are first reducing strategy for those actions and those hands for which the EV's loss is the smallest.

However if more hands have similar EV loss we will add mixing of both of them. The similarity is defined as 1% of the pot EV difference (where the 1% is a setting that can be changed from the viewer).

Let's consider the following example. We consider few hands and 3 actions.

Strategy in %


Hand Raise Call Fold
AA 100 0 0
KK 60 40 0
JJ 0 100 0
77 0 0 100
22 0 0 100

EV in % of the pot


Hand Raise Call Fold
AA 99.9 100 0
KK 80 79.5 0
JJ 55 66 0
77 -80 -0.1 0
22 -120 -60 0

Let's say we want to add 0.5 combo to the Call. We calulate preference of playing a call for all hands (EV of call - current EV):


Hand Call preference. Calculation
AA 0.1 100 - 99.9
KK -0.3 79.5 - 79.8
JJ 0 66 - 66
77 -0.1 -0.1 - 0
22 -60 -60 - 0

We see that the best hand to Add a call is AA because it's call preference is the highest. However the resulting strategy won't move AA:0.5 from raise to call because there are other hands within 1% of the pot EV preference.

From the hands in within the 1% of the pot we have AA, KK, JJ and 77. We can't move any JJ combo becuase it's already at 100%. As a result we will probabaly see something like AA:0.35, 77:0.1, KK: 0.05 being move to the call. And the exact numbers are being calculated with relatively complex mechanism that is out of scope of this manual.

If however we would want to add 3 combos to the call. We will add all 2.6 combos of AA, KK, and 77 that isn't calling yet before we start adding 22:0.4 which is a bad call.

PioSOLVER node locking interface from version 1.0 is also available as a separate tool.

Top menu

The board section is shown right below the top menu and the node can be seen beside the window name over the top.

Board check

The main grid display is similar as in 2.0.

presentation menu

side display

Strategy adjustment

The strategies menu on the right side allows setting strategy for each action.

You can select strategy range for an action with one of the following:

  • Regular range selector
  • Range Explorer
  • Trough the expression box (click expressions help link for list of available expressions)

range_selection

Proportional and fixed setting function allow you to manipulate the weight of the actions on the ranges.

proportional_fixed

The new strategy is displayed on the strategy bar which is located in the top right corner.

strategy_bar

After setting the strategies you can close the window using "Set strategy and close button". At the same time you have to specify if you want to lock the strategy. You can either:

  • Don't lock strategy
  • Lock all hands
  • lock selected combos (select the tiny range selector square next to "lock selected combos" radio button)

strategy_bar

In PioSOLVER, the fundamental concept is the range. A player's range refers to the set of possible hands that a player may hold at a given point in the game. In the context of poker, it is often valuable to consider the range of an opponent in order to make more informed decisions.

One way to practice this concept is through playing a variant of Texas Hold'em in which players do not see their own hole cards. The rules of the game are otherwise identical to standard Hold'em, with each player being dealt two cards at the beginning of each hand. However, instead of looking at their own cards, players must develop a strategy for each possible hand within their range. This may involve creating a list of actions to take for different combinations of hole cards, such as: "If my hand is 2c2h, then my action is X" or "If my hand is 2c2d, then my action is X."

After the player has determined their strategy for all possible hands within their range, they can pass their notes to an assistant who is allowed to view the player's actual hole cards and announce the appropriate action based on the strategy provided. Despite not knowing their exact holdings, the player knows that their hand is one of the hands they have decided to take a particular action with.

At the beginning of a hand, a player's range is considered to be 100% of all possible hands. As the hand progresses and the player is faced with decisions, their range is narrowed down to a subset of hands consistent with their actions. This process of range-splitting can be challenging to execute in practice, as it requires players to dissociate their strategy from their actual hole cards and avoid giving away any tells. Nevertheless, this is the problem that PioSOLVER is designed to solve.

Above we talked about strategy being an action selected for a hand. In practice the player can sometimes do a different thing in the exactly same situation and his strategy might be "with hand H, do X 90% of the time and do Y 10% of the time". In this case if player plays X then the range for action X will contain 90% of the hand H from before the action.

So at the start of the hand, each possible holding is equally likely and has 100% weight, and everytime a player has action he defines strategy for each hand (which is a probability distribution for each action). And the resulting action range is the range before the action multiplied by the strategy for the selected hand.

In PioSOLVER, the range can be interpreted as a relative probability distribution between hands, with a higher weight indicating a higher likelihood of that hand being held by the player. However, it is important to note that the relative probability of hands within a range can be affected by external factors such as the distribution of community cards and the ranges of other players.

For example, in a standard Texas Hold'em game even if a player has a hand such as two black Aces as 100% in their range, they would no longer be able to hold that hand if an Ace of Spades is revealed on the flop.

For example, imagine a scenario in One-Card Poker in which one player's range is (A, K, Q) and the second player's range is (A, K) all cards with 100% weight. The naive calculation would suggest that player 1 is equally likely to have A, K, Q. However, once the second player's range is taken into account, the probability distribution of hands in Player's 1 range changes. In this scenario, both an Ace and a King in Player 1 range can match only 1 combo in the second player's range, while Queen can match 2 combos. Therefore, the real probability is A:25%, K:25%, Q:50%. Even though all those hands have the same weight in the range.

In PioSolver it's possible to see both of those probabilities (the default value is controlled by a setting and both are visible when hovering over action squares in the Browser tab).

In PioSOLVER, the concept of Matchups is used to compute the real frequency of hands and lines in a range. A matchup is defined as a single hand of weight 1 playing against another hand of weight 1. For example, in a river case where the out of position (OOP) player has a total of 2 combinations and the in position (IP) player has 4 combinations, there will be a total of 8 matchups.

It's important to note that the weight of each hand is considered when calculating matchups. A matchup between hands with smaller weights (e.g. 0.5 against 0.4) will be counted as the multiplication of their weights (0.5 * 0.4 = 0.2 in this case).

In addition, matchups at a split point (e.g. decision of a new street) are calculated as the sum of matchups in children, and expected values are averages of expected values in children weighted with matchups.

Matchups have several properties that are worth noting:

  • The total number of matchups for the OOP player will be equal to the total number of matchups for the IP player, as each matchup is played by both players.
  • The number of matchups from equity calculation will be equal to the number of matchups from expected value calculation, as they both iterate the same number of hands.
  • In the aggregation plugin, the sum of matchups for all flops will be the same number as the sum of matchups of all player's hands, as it's the same thing, but split by different criteria.

Matchups can be used to compute the real frequency of hands in a range, as well as the real frequency of certain lines. For example, even if a strategy is 50%-50% when counting combinations, the real action frequency might be 55%-45%.

Matchups can also be used to compute the real frequency of certain flops. For example, if ranges are not symmetrical (as is the case with most practical ranges in Hold'em), some flops may be more likely than others.

In order to determine the relative likelihood of a specific flop (e.g. 222 vs AAA) for a 3-bet scenario, one can calculate the number of matchups for the starting ranges on each board. For instance, using the default 3BetPot ranges from PioSOLVER, one can obtain 123'956'613 matchups on the AAA board and 190'261'566 matchups on the 222 board. This indicates that the 222 flop is approximately 50% more likely to occur in this scenario.

Equity, in its most basic form, is defined as the percentage of the pot that a player will win on average in the absence of further betting. The method for calculating equity involves enumerating all possible matchups and classifying them into three groups: matchups won, tied, and lost.

The equity is then calculated as follows: (matchups won * 100% + matchups tied * 50%) / (total matchups)

When using the calc_eq or calc_eq_node command in PioSOLVER, the output will be the equity for each hand, as well as the total number of matchups for each hand.

Expected Value (EV) is a measure of the average profit that a player will make over all possible matchups and following a specified strategy across the entire game tree. In order to calculate EV, it is necessary to have an explicit game tree with all possible bets, community cards, etc. and fixed strategies for both players in all possible spots.

The EV of a single matchup is equivalent to the result of the hand, i.e. profit for the winner and loss for the loser. For example, in the following scenario: Starting Pot = 100 Out of Position (OOP) player bets 50, In Position (IP) player raises 150, OOP player folds

The EV from this matchup for OOP is -50 and for IP is 100 + 50 = 150.

Expected value is calculated by taking all possible matchups and all possible betting sequences, computing the average, and weighting it by the matchup probability.

The Maximum Exploitability Strategy (MES) EV for a certain player is the result of an EV calculation where the strategy of that player is replaced with the one that yields the highest EV. The exploitability is defined as the difference between the EV of the current strategy and the MES EV.

It's worth noting that minimizing the EV of the opponent is not the same as maximizing the MES EV. In zero-sum two-player games, the two concepts are equivalent. However, in PioSOLVER, it is possible to perform calculations that include rake and ICM, which make the game no longer zero-sum. Therefore, in a non-zero-sum EV model, a solution with zero exploitability could mean that one player can change their strategy to hurt the EV of his opponent without increasing his own EV.

The exploitability number reported in the PioSolver is calculated as (MES(OOP) - EV(OOP) + MES(IP) - EV(IP)) / 2