Figure 3.1 shows Loki-1's architecture and the interactions between the main system components. In the diagram, rectangles are major components, rounded rectangles are major data structures, and ovals are actions. The data follows the arrows between components. An annotated arrow indicates how many times data moves between the components for each of Loki-1's betting decisions (on the flop, in this case).
To make a betting decision, the Bettor calls the Hand Evaluator to obtain an assessment of the strength of Loki-1's hole cards. The Bettor uses the hand evaluation, the public information about the state of the game, and expert-defined betting rules to generate an action (fold, check/call or bet/raise). The probability distribution of the opponents' hands after the flop is not uniform. For example, hole cards of Ace-Ace are more likely held by the opponents than hole cards of 7-2, since most players will fold 7-2 in the preflop. The Opponent Modeler maintains an array for each opponent with the probabilities (weights) of each possible hand being held by each opponent. The Hand Evaluator uses these weights to estimate the strength of a hand. Thus, the assessment of the strength of a hand is sensitive to the actions of the opponents. Loki-1's hand evaluation decreases if the opponents have shown signs of strength (by raising) during the game, and increases if all the opponents have only checked or called.
The Opponent Modeler modifies an opponent's weight table after it observes an action of this opponent taking into account the entire game context (community cards). Updating the probabilities for all hands is a process called reweighting. After each opponent action, the Opponent Modeler calls the Hand Evaluator once for each possible hand and modifies the weight for that case to be consistent with the new information.