acpc_dealer 2.4.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/Brickfile +6 -0
  3. data/README.md +7 -6
  4. data/Rakefile +30 -14
  5. data/acpc_dealer.gemspec +2 -1
  6. data/bin/acpc_dealer +4 -0
  7. data/ext/hand_evaluator/extconf.rb +10 -0
  8. data/lib/acpc_dealer/version.rb +1 -1
  9. data/lib/hand_evaluator.bundle +0 -0
  10. data/spec/dealer_runner_spec.rb +76 -72
  11. metadata +19 -82
  12. data/vendor/project_acpc_server/LICENCE +0 -23
  13. data/vendor/project_acpc_server/Makefile +0 -35
  14. data/vendor/project_acpc_server/README +0 -113
  15. data/vendor/project_acpc_server/README.submission +0 -42
  16. data/vendor/project_acpc_server/acpc_play_match.pl +0 -101
  17. data/vendor/project_acpc_server/bm_run_matches.c +0 -238
  18. data/vendor/project_acpc_server/bm_server.c +0 -1604
  19. data/vendor/project_acpc_server/bm_server.config +0 -78
  20. data/vendor/project_acpc_server/bm_widget.c +0 -230
  21. data/vendor/project_acpc_server/dealer.c +0 -1293
  22. data/vendor/project_acpc_server/evalHandTables +0 -4269
  23. data/vendor/project_acpc_server/example_player.c +0 -204
  24. data/vendor/project_acpc_server/example_player.limit.2p.sh +0 -3
  25. data/vendor/project_acpc_server/example_player.limit.3p.sh +0 -3
  26. data/vendor/project_acpc_server/example_player.nolimit.2p.sh +0 -3
  27. data/vendor/project_acpc_server/example_player.nolimit.3p.sh +0 -3
  28. data/vendor/project_acpc_server/game.c +0 -1792
  29. data/vendor/project_acpc_server/game.h +0 -253
  30. data/vendor/project_acpc_server/holdem.limit.2p.reverse_blinds.game +0 -13
  31. data/vendor/project_acpc_server/holdem.limit.3p.game +0 -13
  32. data/vendor/project_acpc_server/holdem.nolimit.2p.reverse_blinds.game +0 -12
  33. data/vendor/project_acpc_server/holdem.nolimit.3p.game +0 -12
  34. data/vendor/project_acpc_server/kuhn.limit.3p.game +0 -14
  35. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player.sf1.sh +0 -3
  36. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player.sf2.sh +0 -3
  37. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player.sf3.sh +0 -3
  38. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/LICENCE +0 -23
  39. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/Makefile +0 -127
  40. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/README.md +0 -35
  41. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/CExceptionConfig.h +0 -12
  42. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/dealer_connection.c +0 -49
  43. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/dealer_connection.h +0 -22
  44. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/kuhn_3p_equilibrium_player.c +0 -483
  45. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/kuhn_3p_equilibrium_player.h +0 -108
  46. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/main.c +0 -84
  47. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/player_config.c +0 -253
  48. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/player_config.h +0 -21
  49. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/support/test_helper.c +0 -45
  50. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/support/test_helper.h +0 -27
  51. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/test_kuhn_3p_equilibrium_player.c +0 -698
  52. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/test_kuhn_3p_equilibrium_player_sub_family_1.c +0 -324
  53. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/test_kuhn_3p_equilibrium_player_sub_family_2.c +0 -262
  54. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/test_kuhn_3p_equilibrium_player_sub_family_3.c +0 -177
  55. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/license.txt +0 -30
  56. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/readme.txt +0 -242
  57. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/lib/CException.c +0 -43
  58. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/lib/CException.h +0 -86
  59. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/release/build.info +0 -2
  60. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/release/version.info +0 -2
  61. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/History.md +0 -27
  62. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/Makefile +0 -8
  63. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/Readme.md +0 -103
  64. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/package.json +0 -9
  65. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/src/commander.c +0 -250
  66. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/src/commander.h +0 -88
  67. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/test.c +0 -34
  68. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/colour_prompt.rb +0 -94
  69. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/colour_reporter.rb +0 -39
  70. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/generate_config.yml +0 -36
  71. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/generate_module.rb +0 -202
  72. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/generate_test_runner.rb +0 -316
  73. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/test_file_filter.rb +0 -23
  74. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/unity_test_summary.rb +0 -139
  75. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/docs/Unity Summary.txt +0 -216
  76. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/docs/license.txt +0 -31
  77. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/release/build.info +0 -2
  78. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/release/version.info +0 -2
  79. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/src/unity.c +0 -1146
  80. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/src/unity.h +0 -245
  81. data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/src/unity_internals.h +0 -546
  82. data/vendor/project_acpc_server/net.c +0 -218
  83. data/vendor/project_acpc_server/net.h +0 -62
  84. data/vendor/project_acpc_server/play_match.pl +0 -99
  85. data/vendor/project_acpc_server/protocol.md +0 -239
  86. data/vendor/project_acpc_server/protocol.odt +0 -0
  87. data/vendor/project_acpc_server/protocol.pdf +0 -0
  88. data/vendor/project_acpc_server/rng.c +0 -139
  89. data/vendor/project_acpc_server/rng.h +0 -63
  90. data/vendor/project_acpc_server/validate_submission.pl +0 -546
@@ -1,35 +0,0 @@
1
- Kuhn 3-Player Equilibrium Player
2
- =================================
3
- `kuhn_3p_equilibrium_player` is an ACPC compatible player that connects to the
4
- ACPC dealer and plays 3-player Kuhn poker with an equilibrium component
5
- strategy specified by its arguments from one of those specified by
6
- [*A Parameterized Family of Equilibrium Profiles for Three-Player Kuhn
7
- Poker*](http://poker.cs.ualberta.ca/publications/2013-techreport-nl-size.pdf),
8
- written by Duane Szafron, Richard Gibson, and Nathan Sturtevant, found in
9
- *Proceedings of the Twelfth International Conference on Autonomous Agents and
10
- Multiagent Systems (AAMAS-13)* in May 2013.
11
-
12
- Equilibrium sub-families
13
- --------------------------
14
- There are three sub-families of equilibria identified by Szafron, Gibson, and
15
- Sturtevant, each defined by a different value of parameter `c11`. Depending on
16
- the sub-family, different parameters must necessarily be provided, except for
17
- `c11`, `b11`, `b32`, `c33`, and `c34`, which are always necessary. Please
18
- see
19
- [the paper](http://poker.cs.ualberta.ca/publications/2013-techreport-nl-size.pdf)
20
- for the domain of each paramter.
21
-
22
- - `c11 = 0.0` sub-family: `b21` must also be provided.
23
- - `c11 = 1/2.0` sub-family: `b21` and `b23` must also be provided.
24
- - `0.0 < c11 < 1/2.0` sub-family: No futher parameters are necessary.
25
-
26
- License
27
- -------
28
- MIT license (see `LICENCE`).
29
-
30
- Acknowledgments
31
- ----------------
32
- This project includes software developed for
33
- the CException Project, by Mark VanderVoord and other
34
- contributors, as well as the Unity Project, by Mike Karlesky,
35
- Mark VanderVoord, and Greg Williams and other contributors.
@@ -1,12 +0,0 @@
1
- /*
2
- Copyright (C) 2013 by the Computer Poker Research Group, University of Alberta
3
- */
4
-
5
- #ifndef __CEXCEPTION_CONFIG_H__
6
- #define __CEXCEPTION_CONFIG_H__
7
-
8
- #include <stdlib.h>
9
-
10
- #define CEXCEPTION_NO_CATCH_HANDLER(id) exit(id)
11
-
12
- #endif
@@ -1,49 +0,0 @@
1
- /*
2
- Copyright (C) 2013 by the Computer Poker Research Group, University of Alberta
3
- */
4
-
5
- #include <stdlib.h>
6
- #include <assert.h>
7
- #include "dealer_connection.h"
8
- #include "game.h"
9
-
10
- DealerConnection new_dealer_connection()
11
- {
12
- DealerConnection this = {
13
- .host = "localhost",
14
- .port = 0,
15
- .toServer = NULL,
16
- .fromServer = NULL
17
- };
18
-
19
- return this;
20
- }
21
-
22
- void connect_to_dealer(DealerConnection* thisPtr)
23
- {
24
- assert(thisPtr);
25
-
26
- int sock = connectTo(thisPtr->host, thisPtr->port);
27
- if( sock < 0 ) {
28
- exit( EXIT_FAILURE );
29
- }
30
- thisPtr->toServer = fdopen( sock, "w" );
31
- thisPtr->fromServer = fdopen( sock, "r" );
32
- if(!(thisPtr->toServer && thisPtr->fromServer)) {
33
- fprintf( stderr, "ERROR: could not get socket streams\n" );
34
- exit( EXIT_FAILURE );
35
- }
36
-
37
- /* send version string to dealer */
38
- if(
39
- fprintf(
40
- thisPtr->toServer,
41
- "VERSION:%"PRIu32".%"PRIu32".%"PRIu32"\n",
42
- VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION
43
- ) != 14
44
- ) {
45
- fprintf( stderr, "ERROR: could not get send version to server\n" );
46
- exit(EXIT_FAILURE);
47
- }
48
- fflush(thisPtr->toServer);
49
- }
@@ -1,22 +0,0 @@
1
- /*
2
- Copyright (C) 2013 by the Computer Poker Research Group, University of Alberta
3
- */
4
-
5
- #ifndef __DEALER_CONNECTION_H__
6
- #define __DEALER_CONNECTION_H__
7
-
8
- #include <limits.h>
9
- #include <stdint.h>
10
- #include <stdio.h>
11
-
12
- typedef struct {
13
- char host[_POSIX_HOST_NAME_MAX];
14
- uint16_t port;
15
- FILE *toServer;
16
- FILE *fromServer;
17
- } DealerConnection;
18
-
19
- DealerConnection new_dealer_connection();
20
- void connect_to_dealer(DealerConnection* thisPtr);
21
-
22
- #endif
@@ -1,483 +0,0 @@
1
- /*
2
- Copyright (C) 2013 by the Computer Poker Research Group, University of Alberta
3
- */
4
-
5
- #include <stdio.h>
6
- #include <stdlib.h>
7
- #include <string.h>
8
- #include <stdbool.h>
9
- #include <math.h>
10
- #include <assert.h>
11
-
12
- #include <CException.h>
13
- void print_and_throw_error(const char const *message)
14
- {
15
- fprintf(stderr, "ERROR: %s", message);
16
- Throw(1);
17
- }
18
-
19
- #include "kuhn_3p_equilibrium_player.h"
20
-
21
- double beta(const Kuhn3pEquilibriumPlayer* kuhn_3p_e_player)
22
- {
23
- assert(kuhn_3p_e_player);
24
-
25
- return fmax(
26
- kuhn_3p_e_player->params[B11_INDEX], kuhn_3p_e_player->params[B21_INDEX]
27
- );
28
- }
29
-
30
- /* Based on Unity's UnityAssertDoublesWithin function */
31
- static bool doublesAboutEqual(double d1, double d2) {
32
- static const double DOUBLE_PRECISION = 1e-12f;
33
-
34
- double diff = fabs(d2 - d1);
35
- double delta = fabs(d2 * DOUBLE_PRECISION);
36
-
37
- //This first part of this condition will catch any NaN or Infinite values
38
- return !((diff * 0.0 != 0.0) || (delta < diff));
39
- }
40
-
41
- static bool is_3p_kuhn_poker_game(const Game const *game_def)
42
- {
43
- assert(game_def);
44
- return (
45
- game_def->bettingType == limitBetting &&
46
- game_def->numRounds == 1 && game_def->maxRaises[0] == 1 &&
47
- game_def->numSuits == 1 && game_def->numRanks == 4 &&
48
- game_def->numHoleCards == 1 &&
49
- game_def->numBoardCards[0] == 0 &&
50
- game_def->numPlayers == 3
51
- );
52
- }
53
-
54
- static void check_c11_b11_and_b21(Kuhn3pEquilibriumPlayer* kuhn_3p_e_player) {
55
- assert(kuhn_3p_e_player);
56
-
57
- if (kuhn_3p_e_player->params[C11_INDEX] > (1/2.0)) {
58
- print_and_throw_error(
59
- "kuhn_3p_equilibrium_player: c11 greater than 1/2\n"
60
- );
61
- return;
62
- }
63
- if (doublesAboutEqual(0.0, kuhn_3p_e_player->params[C11_INDEX])) {
64
- if (kuhn_3p_e_player->params[B21_INDEX] > (1/4.0)) {
65
- print_and_throw_error(
66
- "kuhn_3p_equilibrium_player: b21 greater than 1/4\n"
67
- );
68
- }
69
- if (
70
- kuhn_3p_e_player->params[B11_INDEX] >
71
- kuhn_3p_e_player->params[B21_INDEX]
72
- ) {
73
- print_and_throw_error(
74
- "kuhn_3p_equilibrium_player: b11 greater than b21\n"
75
- );
76
- }
77
- } else {
78
- if (kuhn_3p_e_player->params[B11_INDEX] > (1/4.0)) {
79
- print_and_throw_error(
80
- "kuhn_3p_equilibrium_player: b11 greater than 1/4\n"
81
- );
82
- }
83
- if (kuhn_3p_e_player->params[C11_INDEX] < (1/2.0)) {
84
- if (
85
- kuhn_3p_e_player->params[B11_INDEX] > (1/6.0) && (
86
- kuhn_3p_e_player->params[C11_INDEX] > (
87
- (2 - kuhn_3p_e_player->params[B11_INDEX]) /
88
- (3 + 4 * kuhn_3p_e_player->params[B11_INDEX])
89
- )
90
- )
91
- ) {
92
- print_and_throw_error(
93
- "kuhn_3p_equilibrium_player: c11 too large\n"
94
- );
95
- }
96
-
97
- kuhn_3p_e_player->params[B21_INDEX] =
98
- kuhn_3p_e_player->params[B11_INDEX];
99
- } else if (
100
- kuhn_3p_e_player->params[B21_INDEX] > fmin(
101
- kuhn_3p_e_player->params[B11_INDEX],
102
- (1/2.0) - 2 * kuhn_3p_e_player->params[B11_INDEX]
103
- )
104
- ) {
105
- print_and_throw_error(
106
- "kuhn_3p_equilibrium_player: b21 too large\n"
107
- );
108
- }
109
- }
110
- }
111
-
112
- static void check_b32(Kuhn3pEquilibriumPlayer* kuhn_3p_e_player) {
113
- assert(kuhn_3p_e_player);
114
-
115
- if (
116
- kuhn_3p_e_player->params[B32_INDEX] > (
117
- (1 / 2.0) + (3 / 4.0) * (
118
- kuhn_3p_e_player->params[B11_INDEX] +
119
- kuhn_3p_e_player->params[B21_INDEX]
120
- ) + (beta(kuhn_3p_e_player) / 4.0)
121
- )
122
- ) {
123
- print_and_throw_error(
124
- "kuhn_3p_equilibrium_player: b32 too large\n");
125
- }
126
- }
127
-
128
- static void check_c33(Kuhn3pEquilibriumPlayer* kuhn_3p_e_player) {
129
- assert(kuhn_3p_e_player);
130
-
131
- if (
132
- kuhn_3p_e_player->params[C33_INDEX] < (
133
- (1 / 2.0) - kuhn_3p_e_player->params[B32_INDEX])
134
- ) {
135
- print_and_throw_error(
136
- "kuhn_3p_equilibrium_player: c33 too small\n");
137
- }
138
- if (
139
- kuhn_3p_e_player->params[C33_INDEX] > (
140
- (1 / 2.0) - kuhn_3p_e_player->params[B32_INDEX] + (3 / 4.0) * (
141
- kuhn_3p_e_player->params[B11_INDEX] +
142
- kuhn_3p_e_player->params[B21_INDEX]
143
- ) + (beta(kuhn_3p_e_player) / 4.0)
144
- )
145
- ) {
146
- print_and_throw_error(
147
- "kuhn_3p_equilibrium_player: c33 too large\n"
148
- );
149
- }
150
- }
151
-
152
- static void check_b23(Kuhn3pEquilibriumPlayer* kuhn_3p_e_player) {
153
- if (
154
- kuhn_3p_e_player->params[B23_INDEX] > fmax(
155
- 0.0,
156
- (
157
- kuhn_3p_e_player->params[B11_INDEX] -
158
- kuhn_3p_e_player->params[B21_INDEX]
159
- ) /
160
- (2 * (1.0 - kuhn_3p_e_player->params[B21_INDEX]))
161
- )
162
- ) {
163
- print_and_throw_error("kuhn_3p_equilibrium_player: b23 too large\n");
164
- }
165
- }
166
-
167
- static void check_params(Kuhn3pEquilibriumPlayer* kuhn_3p_e_player)
168
- {
169
- assert(kuhn_3p_e_player);
170
-
171
- check_c11_b11_and_b21(kuhn_3p_e_player);
172
-
173
- check_b23(kuhn_3p_e_player);
174
- kuhn_3p_e_player->params[B33_INDEX] = (
175
- (1 / 2.0) + (1 / 2.0)*(
176
- kuhn_3p_e_player->params[B11_INDEX] +
177
- kuhn_3p_e_player->params[B21_INDEX]
178
- ) +
179
- (beta(kuhn_3p_e_player) / 2.0) - kuhn_3p_e_player->params[B23_INDEX] * (
180
- 1 - kuhn_3p_e_player->params[B21_INDEX]
181
- )
182
- );
183
- kuhn_3p_e_player->params[B41_INDEX] = (
184
- 2 * kuhn_3p_e_player->params[B11_INDEX] +
185
- 2 * kuhn_3p_e_player->params[B21_INDEX]
186
- );
187
-
188
- check_b32(kuhn_3p_e_player);
189
- check_c33(kuhn_3p_e_player);
190
-
191
- kuhn_3p_e_player->params[B41_INDEX] = (
192
- 2 * kuhn_3p_e_player->params[B11_INDEX] +
193
- 2 * kuhn_3p_e_player->params[B21_INDEX]
194
- );
195
- kuhn_3p_e_player->params[C21_INDEX] = (
196
- (1 / 2.0) - kuhn_3p_e_player->params[C11_INDEX]
197
- );
198
-
199
- for (size_t i = 0; i < NUM_PARAMS; ++i) {
200
- if (
201
- kuhn_3p_e_player->params[i] < 0.0 ||
202
- kuhn_3p_e_player->params[i] > 1.0
203
- ) {
204
- print_and_throw_error(
205
- "kuhn_3p_equilibrium_player: strategy parameters must be in [0,1]\n"
206
- );
207
- }
208
- }
209
- return;
210
- }
211
-
212
- static void action_probs_p0(
213
- uint8_t card_rank,
214
- const State* state,
215
- double* probs
216
- ) {
217
- assert(probs);
218
- assert(state);
219
-
220
- size_t situation_index = 0;
221
-
222
- if (0 == state->numActions[0]) { // Situation 1
223
- probs[a_fold] = 0.0;
224
- probs[a_call] = 1.0 - A[card_rank - JACK_RANK][0];
225
- probs[a_raise] = A[card_rank - JACK_RANK][0];
226
- return;
227
- } else if (a_call == state->action[0][1].type) { // Situation 2
228
- situation_index = 1;
229
- } else if (a_fold == state->action[0][2].type) { // Situation 3
230
- situation_index = 2;
231
- } else { // Situation 4
232
- situation_index = 3;
233
- }
234
- probs[a_fold] = 1.0 - A[card_rank - JACK_RANK][situation_index];
235
- probs[a_call] = A[card_rank - JACK_RANK][situation_index];
236
- probs[a_raise] = 0.0;
237
-
238
- return;
239
- }
240
-
241
- static void action_probs_p1(
242
- const double* params,
243
- uint8_t card_rank,
244
- const State* state,
245
- double* probs
246
- ) {
247
- assert(params);
248
- assert(probs);
249
- assert(state);
250
-
251
- double param;
252
-
253
- // Situation 1 or 2
254
- if (1 == state->numActions[0]) {
255
- if (a_call == state->action[0][0].type) { // Situation 1
256
- if (JACK_RANK == card_rank) {
257
- param = params[B11_INDEX];
258
- } else if (QUEEN_RANK == card_rank) {
259
- param = params[B21_INDEX];
260
- } else if (KING_RANK == card_rank) {
261
- param = B31;
262
- } else {
263
- param = params[B41_INDEX];
264
- }
265
- probs[a_fold] = 0.0;
266
- probs[a_call] = 1.0 - param;
267
- probs[a_raise] = param;
268
- return;
269
- } else { // Situation 2
270
- if (JACK_RANK == card_rank) {
271
- param = B12;
272
- } else if (QUEEN_RANK == card_rank) {
273
- param = B22;
274
- } else if (KING_RANK == card_rank) {
275
- param = params[B32_INDEX];
276
- } else {
277
- param = B42;
278
- }
279
- }
280
- } else { // Situation 3 or 4
281
- if (a_fold == state->action[0][3].type) { // Situation 3
282
- if (JACK_RANK == card_rank) {
283
- param = B13;
284
- } else if (QUEEN_RANK == card_rank) {
285
- param = params[B23_INDEX];
286
- } else if (KING_RANK == card_rank) {
287
- param = params[B33_INDEX];
288
- } else {
289
- param = B43;
290
- }
291
- } else { // Situation 4
292
- if (JACK_RANK == card_rank) {
293
- param = B14;
294
- } else if (QUEEN_RANK == card_rank) {
295
- param = B24;
296
- } else if (KING_RANK == card_rank) {
297
- param = B34;
298
- } else {
299
- param = B44;
300
- }
301
- }
302
- }
303
-
304
- probs[a_fold] = 1.0 - param;
305
- probs[a_call] = param;
306
- probs[a_raise] = 0.0;
307
-
308
- return;
309
- }
310
-
311
- static void action_probs_p2(
312
- const double* params,
313
- uint8_t card_rank,
314
- const State* state,
315
- double* probs
316
- )
317
- {
318
- assert(params);
319
- assert(probs);
320
- assert(state);
321
-
322
- double param;
323
-
324
- // Situation 1
325
- if (a_call == state->action[0][0].type) {
326
- if (a_call == state->action[0][1].type) { // Situation 1
327
- if (JACK_RANK == card_rank) {
328
- param = params[C11_INDEX];
329
- } else if (QUEEN_RANK == card_rank) {
330
- param = params[C21_INDEX];
331
- } else if (KING_RANK == card_rank) {
332
- param = C31;
333
- } else {
334
- param = C4[0];
335
- }
336
- probs[a_fold] = 0.0;
337
- probs[a_call] = 1.0 - param;
338
- probs[a_raise] = param;
339
- return;
340
- } else { // Situation 2
341
- if (JACK_RANK == card_rank) {
342
- param = C12;
343
- } else if (QUEEN_RANK == card_rank) {
344
- param = C22;
345
- } else if (KING_RANK == card_rank) {
346
- param = C32;
347
- } else {
348
- param = C4[1];
349
- }
350
- }
351
- } else { // Situation 3 or 4
352
- if (a_fold == state->action[0][1].type) { // Situation 3
353
- if (JACK_RANK == card_rank) {
354
- param = C13;
355
- } else if (QUEEN_RANK == card_rank) {
356
- param = C23;
357
- } else if (KING_RANK == card_rank) {
358
- param = params[C33_INDEX];
359
- } else {
360
- param = C4[2];
361
- }
362
- } else { // Situation 4
363
- if (JACK_RANK == card_rank) {
364
- param = C14;
365
- } else if (QUEEN_RANK == card_rank) {
366
- param = C24;
367
- } else if (KING_RANK == card_rank) {
368
- param = params[C34_INDEX];
369
- } else {
370
- param = C4[3];
371
- }
372
- }
373
- }
374
-
375
- probs[a_fold] = 1.0 - param;
376
- probs[a_call] = param;
377
- probs[a_raise] = 0.0;
378
-
379
- return;
380
- }
381
-
382
- /*********************************/
383
- /****** Player Interface *********/
384
- /*********************************/
385
-
386
- /* create any private space needed for future calls
387
- game_def is a private copy allocated by the dealer for the player's use */
388
- Kuhn3pEquilibriumPlayer new_kuhn_3p_equilibrium_player(
389
- const Game* game_def,
390
- const double* params,
391
- uint32_t seed
392
- )
393
- {
394
- assert(game_def);
395
- assert(params);
396
-
397
- Kuhn3pEquilibriumPlayer kuhn_3p_e_player;
398
-
399
- /* This player cannot be used outside of Kuhn poker */
400
- if(!is_3p_kuhn_poker_game(game_def)) {
401
- print_and_throw_error(
402
- "kuhn_3p_equilibrium_player used in non-Kuhn game\n"
403
- );
404
- return kuhn_3p_e_player;
405
- }
406
-
407
- kuhn_3p_e_player.game_def = game_def;
408
-
409
- memset(
410
- kuhn_3p_e_player.params,
411
- 0,
412
- NUM_PARAMS * sizeof(*kuhn_3p_e_player.params)
413
- );
414
- for (size_t i = 0; i < NUM_PARAMS; ++i) {
415
- kuhn_3p_e_player.params[i] = params[i];
416
- }
417
-
418
- kuhn_3p_e_player.seed = seed;
419
-
420
- CEXCEPTION_T e = 0;
421
- Try {
422
- check_params(&kuhn_3p_e_player);
423
- } Catch(e) {
424
- Throw(e);
425
- }
426
-
427
- /* Create our random number generators */
428
- init_genrand(&kuhn_3p_e_player.get_action_rng, kuhn_3p_e_player.seed);
429
-
430
- return kuhn_3p_e_player;
431
- }
432
-
433
- /* return a (valid!) action at the information state described by view */
434
- Action action(
435
- Kuhn3pEquilibriumPlayer* player,
436
- MatchState view
437
- )
438
- {
439
- assert(player);
440
-
441
- double probs[NUM_ACTION_TYPES];
442
- memset(probs, 0, NUM_ACTION_TYPES * sizeof(*probs));
443
- action_probs(player, view, probs);
444
-
445
- double r = genrand_real2(&player->get_action_rng);
446
-
447
- enum ActionType i = a_fold;
448
- for (; i < NUM_ACTION_TYPES - 1; ++i) {
449
- if (r <= probs[i]) {
450
- break;
451
- }
452
- r -= probs[i];
453
- }
454
-
455
- Action a = {a.type = i, a.size = 0};
456
-
457
- return a;
458
- }
459
-
460
- /* Returns a distribution of actions in action_triple
461
- This is an extra function, and does _NOT_ need to be implemented
462
- to be considered a valid player.h interface. */
463
- void action_probs(
464
- const Kuhn3pEquilibriumPlayer* player,
465
- MatchState view,
466
- double* probs
467
- )
468
- {
469
- assert(player);
470
- assert(probs);
471
-
472
- uint8_t card_rank = rankOfCard(view.state.holeCards[view.viewingPlayer][0]);
473
-
474
- if (0 == view.viewingPlayer) {
475
- action_probs_p0(card_rank, &view.state, probs);
476
- } else if (1 == view.viewingPlayer) {
477
- action_probs_p1(player->params, card_rank, &view.state, probs);
478
- } else {
479
- action_probs_p2(player->params, card_rank, &view.state, probs);
480
- }
481
-
482
- return;
483
- }