acpc_dealer 2.0.6 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +4 -2
- data/lib/acpc_dealer.rb +6 -2
- data/lib/acpc_dealer/version.rb +1 -1
- data/vendor/project_acpc_server/Makefile +12 -2
- data/vendor/project_acpc_server/README +1 -0
- data/vendor/project_acpc_server/example_player.limit.2p.sh +2 -1
- data/vendor/project_acpc_server/example_player.limit.3p.sh +2 -1
- data/vendor/project_acpc_server/example_player.nolimit.2p.sh +2 -1
- data/vendor/project_acpc_server/example_player.nolimit.3p.sh +2 -1
- data/vendor/project_acpc_server/kuhn.limit.3p.game +14 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player.sf1.sh +3 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player.sf2.sh +3 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player.sf3.sh +3 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/LICENCE +23 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/Makefile +128 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/README.md +35 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/CExceptionConfig.h +12 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/dealer_connection.c +49 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/dealer_connection.h +22 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/kuhn_3p_equilibrium_player.c +483 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/kuhn_3p_equilibrium_player.h +107 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/main.c +84 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/player_config.c +252 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/src/player_config.h +21 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/support/test_helper.c +45 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/support/test_helper.h +27 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/test_kuhn_3p_equilibrium_player.c +698 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/test_kuhn_3p_equilibrium_player_sub_family_1.c +324 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/test_kuhn_3p_equilibrium_player_sub_family_2.c +262 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/test/test_kuhn_3p_equilibrium_player_sub_family_3.c +177 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/CExceptionSummary.odt +0 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/CExceptionSummary.pdf +0 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/license.txt +30 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/docs/readme.txt +242 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/lib/CException.c +43 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/lib/CException.h +86 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/release/build.info +2 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cexception/release/version.info +2 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/config/production_environment.rb +14 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/config/test_environment.rb +16 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/docs/CMock Summary.odt +0 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/docs/CMock Summary.pdf +0 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/docs/CMock_Summary.md +356 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/docs/license.txt +31 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/Resource/SAM7_FLASH.mac +71 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/Resource/SAM7_RAM.mac +94 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/Resource/SAM7_SIM.mac +67 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/Resource/at91SAM7X256_FLASH.xcl +185 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/Resource/at91SAM7X256_RAM.xcl +185 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/Resource/ioat91sam7x256.ddf +2259 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/cmock_demo.dep +3691 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/cmock_demo.ewd +1696 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/cmock_demo.ewp +2581 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/cmock_demo.eww +10 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X-EK.h +61 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X256.inc +2314 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X256.rdf +4704 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X256.tcl +3407 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/incIAR/AT91SAM7X256_inc.h +2268 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/incIAR/ioat91sam7x256.h +4380 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/incIAR/lib_AT91SAM7X256.h +4211 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/settings/cmock_demo.cspy.bat +32 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/settings/cmock_demo.dbgdt +86 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/settings/cmock_demo.dni +42 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/settings/cmock_demo.wsdt +76 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/srcIAR/Cstartup.s79 +266 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v4/srcIAR/Cstartup_SAM7.c +98 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/Resource/SAM7_FLASH.mac +71 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/Resource/SAM7_RAM.mac +94 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/Resource/SAM7_SIM.mac +67 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/Resource/at91SAM7X256_FLASH.icf +43 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/Resource/at91SAM7X256_RAM.icf +42 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/cmock_demo.dep +4204 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/cmock_demo.ewd +1906 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/cmock_demo.ewp +2426 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/cmock_demo.eww +26 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/incIAR/AT91SAM7X-EK.h +61 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/incIAR/AT91SAM7X256_inc.h +2268 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/incIAR/lib_AT91SAM7X256.h +4211 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/incIAR/project.h +30 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X.cspy.bat +33 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X.dbgdt +5 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X.dni +18 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X.wsdt +74 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/BasicInterrupt_SAM7X_FLASH_Debug.jlink +12 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/cmock_demo.cspy.bat +33 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/cmock_demo.dbgdt +85 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/cmock_demo.dni +44 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/cmock_demo.wsdt +73 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/cmock_demo_Binary.jlink +12 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/cmock_demo_FLASH_Debug.jlink +12 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/settings/cmock_demo_RAM_Debug.jlink +12 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/srcIAR/Cstartup.s +299 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/iar/iar_v5/srcIAR/Cstartup_SAM7.c +98 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock.rb +65 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_config.rb +129 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_file_writer.rb +33 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_generator.rb +195 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_generator_plugin_array.rb +57 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_generator_plugin_callback.rb +78 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_generator_plugin_cexception.rb +51 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_generator_plugin_expect.rb +86 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_generator_plugin_ignore.rb +95 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_generator_plugin_ignore_arg.rb +44 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_generator_plugin_return_thru_ptr.rb +74 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_generator_utils.rb +202 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_header_parser.rb +277 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_plugin_manager.rb +40 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/lib/cmock_unityhelper_parser.rb +75 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/release/build.info +2 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/release/version.info +2 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/src/cmock.c +176 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/src/cmock.h +31 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/src/cmock_internals.h +43 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/targets/gcc.yml +53 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/targets/iar_arm_v4.yml +108 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/cmock/targets/iar_arm_v5.yml +93 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/History.md +27 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/Makefile +8 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/Readme.md +103 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/package.json +9 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/src/commander.c +250 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/src/commander.h +88 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/commander.c/test.c +34 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/colour_prompt.rb +94 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/colour_reporter.rb +39 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/generate_config.yml +36 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/generate_module.rb +202 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/generate_test_runner.rb +316 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/test_file_filter.rb +23 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/auto/unity_test_summary.rb +139 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/docs/Unity Summary.odt +0 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/docs/Unity Summary.pdf +0 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/docs/Unity Summary.txt +216 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/docs/license.txt +31 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/release/build.info +2 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/release/version.info +2 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/src/unity.c +1146 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/src/unity.h +245 -0
- data/vendor/project_acpc_server/kuhn_3p_equilibrium_player/vendor/unity/src/unity_internals.h +546 -0
- data/vendor/project_acpc_server/net.c +0 -0
- data/vendor/project_acpc_server/net.h +1 -0
- data/vendor/project_acpc_server/tags +298 -0
- metadata +158 -26
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 84b73326801489cffe4fff1438b8afc890e36d7f
|
|
4
|
+
data.tar.gz: bfd427d17ccbc771a118140a6535d1d7604bca7f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e2f156daf439f1cb7d0993f81ddd173582ab56ef26e34290522f4f148f5028150937a26be240ce91eff5089bc035c2feb4e76b6c3b5df31ea4c51e77633b1bfb
|
|
7
|
+
data.tar.gz: 38133b40d10f1c3613dba9a705a27ab805bbb492694bbaf32ac0fda20a60e5d379ffe52117bde395da4fc0680e2fb7d205168d7045355d0fa028a9d3fd1852e9
|
data/Rakefile
CHANGED
|
@@ -9,11 +9,13 @@ require 'rubygems/package_task'
|
|
|
9
9
|
require File.expand_path('../lib/acpc_dealer/version', __FILE__)
|
|
10
10
|
|
|
11
11
|
desc 'Build gem'
|
|
12
|
-
task :default => [:
|
|
12
|
+
task :default => [:test]
|
|
13
13
|
|
|
14
14
|
task :compile => ['dealer:clean', 'dealer:compile']
|
|
15
15
|
|
|
16
|
-
task :
|
|
16
|
+
task :test => :compile
|
|
17
|
+
|
|
18
|
+
task :build => :clean
|
|
17
19
|
|
|
18
20
|
Rake::TestTask.new do |t|
|
|
19
21
|
t.libs << "lib" << 'spec/support'
|
data/lib/acpc_dealer.rb
CHANGED
|
@@ -14,7 +14,8 @@ module AcpcDealer
|
|
|
14
14
|
3 =>
|
|
15
15
|
{
|
|
16
16
|
limit: "#{DEALER_DIRECTORY}/holdem.limit.3p.game",
|
|
17
|
-
nolimit: "#{DEALER_DIRECTORY}/holdem.nolimit.3p.game"
|
|
17
|
+
nolimit: "#{DEALER_DIRECTORY}/holdem.nolimit.3p.game",
|
|
18
|
+
kuhn: "#{DEALER_DIRECTORY}/kuhn.limit.3p.game"
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
DEALER_PATH = "#{DEALER_DIRECTORY}/dealer"
|
|
@@ -28,7 +29,10 @@ module AcpcDealer
|
|
|
28
29
|
3 =>
|
|
29
30
|
{
|
|
30
31
|
limit: "#{DEALER_DIRECTORY}/example_player.limit.3p.sh",
|
|
31
|
-
nolimit: "#{DEALER_DIRECTORY}/example_player.nolimit.3p.sh"
|
|
32
|
+
nolimit: "#{DEALER_DIRECTORY}/example_player.nolimit.3p.sh",
|
|
33
|
+
kuhn_sf1: "#{DEALER_DIRECTORY}/kuhn_3p_equilibrium_player.sf1.sh",
|
|
34
|
+
kuhn_sf2: "#{DEALER_DIRECTORY}/kuhn_3p_equilibrium_player.sf2.sh",
|
|
35
|
+
kuhn_sf3: "#{DEALER_DIRECTORY}/kuhn_3p_equilibrium_player.sf3.sh"
|
|
32
36
|
}
|
|
33
37
|
}
|
|
34
38
|
|
data/lib/acpc_dealer/version.rb
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
|
+
|
|
2
|
+
THIS_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
|
|
3
|
+
|
|
1
4
|
CC = gcc
|
|
2
5
|
CFLAGS = -O3 -Wall
|
|
3
6
|
|
|
7
|
+
KUHN_3P_E_BASE = kuhn_3p_equilibrium_player
|
|
8
|
+
KUHN_3P_E_PLAYER := $(KUHN_3P_E_BASE)
|
|
9
|
+
KUHN_3P_E_DIR := $(KUHN_3P_E_BASE)
|
|
10
|
+
|
|
4
11
|
PROGRAMS = bm_server bm_widget dealer example_player
|
|
5
12
|
|
|
6
|
-
all: $(PROGRAMS)
|
|
13
|
+
all: $(PROGRAMS) $(KUHN_3P_E_DIR)/$(KUHN_3P_E_PLAYER)
|
|
7
14
|
|
|
8
15
|
clean:
|
|
9
|
-
rm -f $(PROGRAMS)
|
|
16
|
+
rm -f $(PROGRAMS) && cd $(KUHN_3P_E_DIR) && make clean
|
|
10
17
|
|
|
11
18
|
|
|
12
19
|
bm_server: bm_server.c game.c game.h rng.c rng.h net.c net.h
|
|
@@ -20,3 +27,6 @@ dealer: game.c game.h evalHandTables rng.c rng.h dealer.c net.c net.h
|
|
|
20
27
|
|
|
21
28
|
example_player: game.c game.h evalHandTables rng.c rng.h example_player.c net.c net.h
|
|
22
29
|
$(CC) $(CFLAGS) -o $@ game.c rng.c example_player.c net.c
|
|
30
|
+
|
|
31
|
+
$(KUHN_3P_E_DIR)/$(KUHN_3P_E_PLAYER):
|
|
32
|
+
cd $(KUHN_3P_E_DIR) && make
|
|
@@ -111,3 +111,4 @@ If you are creating your own game definitions, please note that game.h defines
|
|
|
111
111
|
some constants for maximums in games (e.g., number of rounds). These may need
|
|
112
112
|
to be changed for games outside of the what is being run for the Annual
|
|
113
113
|
Computer Poker Competition.
|
|
114
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
Copyright (C) 2013 by the Computer Poker Research Group, University of Alberta
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
5
|
+
the Software without restriction, including without limitation the rights to
|
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicence, and/or sell copies
|
|
7
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
|
8
|
+
so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
Except as contained in this notice, the name(s) of the above copyright holders
|
|
14
|
+
shall not be used in advertising or otherwise to promote the sale, use or other
|
|
15
|
+
dealings in this Software without prior written authorization.
|
|
16
|
+
|
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
SOFTWARE.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
THIS_DIR := $(CURDIR)/$(dir $(lastword $(MAKEFILE_LIST)))
|
|
2
|
+
PROJECT_DIR := $(THIS_DIR)/../
|
|
3
|
+
|
|
4
|
+
CC = gcc -std=gnu99
|
|
5
|
+
CFLAGS = -O0 -g
|
|
6
|
+
LIBS = -lm
|
|
7
|
+
TARGET_SYMBOLS = -DCEXCEPTION_USE_CONFIG_FILE
|
|
8
|
+
|
|
9
|
+
VENDOR_DIR := $(THIS_DIR)/vendor/
|
|
10
|
+
COMMANDER_DIR := $(VENDOR_DIR)/commander.c
|
|
11
|
+
TARGET_INCLUDES = -I$(PROJECT_DIR) -I$(THIS_DIR)/src -I$(CEXCEPTION_LIB) -I$(COMMANDER_DIR)/src
|
|
12
|
+
|
|
13
|
+
CEXCEPTION_DIR := $(VENDOR_DIR)/cexception/
|
|
14
|
+
CEXCEPTION_LIB := $(CEXCEPTION_DIR)/lib
|
|
15
|
+
CEXCEPTION_SRC := $(CEXCEPTION_LIB)/CException.c
|
|
16
|
+
|
|
17
|
+
TARGET_BASE = kuhn_3p_equilibrium_player
|
|
18
|
+
TARGET_SRC_DIR := $(THIS_DIR)/src
|
|
19
|
+
TARGET_SRC := $(TARGET_SRC_DIR)/$(TARGET_BASE).c $(CEXCEPTION_SRC)
|
|
20
|
+
|
|
21
|
+
PROJECT_SRC := $(PROJECT_DIR)/game.c $(PROJECT_DIR)/rng.c $(PROJECT_DIR)/net.c
|
|
22
|
+
|
|
23
|
+
BUILD_PREFIX := $(CC) $(CFLAGS) $(TARGET_SYMBOLS)
|
|
24
|
+
|
|
25
|
+
TARGET := $(THIS_DIR)/$(TARGET_BASE)
|
|
26
|
+
|
|
27
|
+
default: $(TARGET)
|
|
28
|
+
|
|
29
|
+
# Build target
|
|
30
|
+
#==============
|
|
31
|
+
$(TARGET): $(TARGET_SRC) $(PROJECT_DIR)/evalHandTables $(PROJECT_DIR)/game.h $(PROJECT_DIR)/net.h $(PROJECT_DIR)/rng.h
|
|
32
|
+
$(BUILD_PREFIX) -Wall $(TARGET_INCLUDES) $(TARGET_SRC) $(TARGET_SRC_DIR)/main.c $(TARGET_SRC_DIR)/player_config.c $(TARGET_SRC_DIR)/dealer_connection.c $(COMMANDER_DIR)/src/commander.c $(LIBS) -o $@ $(PROJECT_SRC)
|
|
33
|
+
chmod 755 $@
|
|
34
|
+
|
|
35
|
+
# Testing
|
|
36
|
+
#===========
|
|
37
|
+
UNITY_DIR := $(VENDOR_DIR)/unity
|
|
38
|
+
CMOCK_DIR := $(VENDOR_DIR)/cmock
|
|
39
|
+
TEST_DIR := $(THIS_DIR)/test
|
|
40
|
+
TEST_SUPPORT_DIR := $(TEST_DIR)/support
|
|
41
|
+
INC_DIRS := -I$(UNITY_DIR)/src -I$(TEST_SUPPORT_DIR) -I$(THIS_DIR)/src $(TARGET_INCLUDES)
|
|
42
|
+
SYMBOLS = -DTEST -DUNITY_FLOAT_TYPE=double -DUNITY_FLOAT_VERBOSE
|
|
43
|
+
TEST_BASE := $(TEST_DIR)/test_$(TARGET_BASE)
|
|
44
|
+
ifeq ($(OS),Windows_NT)
|
|
45
|
+
TEST_EXTENSION=.exe
|
|
46
|
+
else
|
|
47
|
+
TEST_EXTENSION=.out
|
|
48
|
+
endif
|
|
49
|
+
|
|
50
|
+
# Test 1
|
|
51
|
+
#-------------
|
|
52
|
+
TEST1_BASE := $(TEST_BASE)
|
|
53
|
+
TEST1_SRC := $(TEST1_BASE).c
|
|
54
|
+
TEST1 := $(TEST1_BASE)$(TEST_EXTENSION)
|
|
55
|
+
TEST1_RUNNER := $(TEST1_BASE)_Runner.c
|
|
56
|
+
|
|
57
|
+
$(TEST1_RUNNER):
|
|
58
|
+
ruby $(UNITY_DIR)/auto/generate_test_runner.rb $(TEST1_SRC) $(TEST1_RUNNER)
|
|
59
|
+
|
|
60
|
+
$(TEST1): $(TARGET) $(TEST1_RUNNER)
|
|
61
|
+
$(BUILD_PREFIX) $(SYMBOLS) $(INC_DIRS) $(TARGET_SRC) $(PROJECT_SRC) $(TEST_SUPPORT_DIR)/test_helper.c $(UNITY_DIR)/src/unity.c $(TEST1_SRC) $(TEST1_RUNNER) $(LIBS) -o $(TEST1)
|
|
62
|
+
|
|
63
|
+
# Test 2
|
|
64
|
+
#-------------
|
|
65
|
+
TEST2_BASE := $(TEST_BASE)_sub_family_1
|
|
66
|
+
TEST2_SRC := $(TEST2_BASE).c
|
|
67
|
+
TEST2 := $(TEST2_BASE)$(TEST_EXTENSION)
|
|
68
|
+
TEST2_RUNNER := $(TEST2_BASE)_Runner.c
|
|
69
|
+
|
|
70
|
+
$(TEST2_RUNNER):
|
|
71
|
+
ruby $(UNITY_DIR)/auto/generate_test_runner.rb $(TEST2_SRC) $(TEST2_RUNNER)
|
|
72
|
+
|
|
73
|
+
$(TEST2): $(TARGET) $(TEST2_RUNNER)
|
|
74
|
+
$(BUILD_PREFIX) $(SYMBOLS) $(INC_DIRS) $(TARGET_SRC) $(PROJECT_SRC) $(TEST_SUPPORT_DIR)/test_helper.c $(UNITY_DIR)/src/unity.c $(TEST2_SRC) $(TEST2_RUNNER) $(LIBS) -o $(TEST2)
|
|
75
|
+
|
|
76
|
+
# Test 3
|
|
77
|
+
#-------------
|
|
78
|
+
TEST3_BASE := $(TEST_BASE)_sub_family_2
|
|
79
|
+
TEST3_SRC := $(TEST3_BASE).c
|
|
80
|
+
TEST3 := $(TEST3_BASE)$(TEST_EXTENSION)
|
|
81
|
+
TEST3_RUNNER := $(TEST3_BASE)_Runner.c
|
|
82
|
+
|
|
83
|
+
$(TEST3_RUNNER):
|
|
84
|
+
ruby $(UNITY_DIR)/auto/generate_test_runner.rb $(TEST3_SRC) $(TEST3_RUNNER)
|
|
85
|
+
|
|
86
|
+
$(TEST3): $(TARGET) $(TEST3_RUNNER)
|
|
87
|
+
$(BUILD_PREFIX) $(SYMBOLS) $(INC_DIRS) $(TARGET_SRC) $(PROJECT_SRC) $(TEST_SUPPORT_DIR)/test_helper.c $(UNITY_DIR)/src/unity.c $(TEST3_SRC) $(TEST3_RUNNER) $(LIBS) -o $(TEST3)
|
|
88
|
+
|
|
89
|
+
# Test 4
|
|
90
|
+
#-------------
|
|
91
|
+
TEST4_BASE := $(TEST_BASE)_sub_family_3
|
|
92
|
+
TEST4_SRC := $(TEST4_BASE).c
|
|
93
|
+
TEST4 := $(TEST4_BASE)$(TEST_EXTENSION)
|
|
94
|
+
TEST4_RUNNER := $(TEST4_BASE)_Runner.c
|
|
95
|
+
|
|
96
|
+
$(TEST4_RUNNER):
|
|
97
|
+
ruby $(UNITY_DIR)/auto/generate_test_runner.rb $(TEST4_SRC) $(TEST4_RUNNER)
|
|
98
|
+
|
|
99
|
+
$(TEST4): $(TARGET) $(TEST4_RUNNER)
|
|
100
|
+
$(BUILD_PREFIX) $(SYMBOLS) $(INC_DIRS) $(TARGET_SRC) $(PROJECT_SRC) $(TEST_SUPPORT_DIR)/test_helper.c $(UNITY_DIR)/src/unity.c $(TEST4_SRC) $(TEST4_RUNNER) $(LIBS) -o $(TEST4)
|
|
101
|
+
|
|
102
|
+
# Basic functionality exercise with the dealer
|
|
103
|
+
#-------------------------------
|
|
104
|
+
$(PROJECT_DIR)/dealer:
|
|
105
|
+
cd $(PROJECT_DIR) && make
|
|
106
|
+
|
|
107
|
+
dealer_test: clean $(TARGET) $(PROJECT_DIR)/dealer
|
|
108
|
+
cd $(PROJECT_DIR) && ./dealer m kuhn.limit.3p.game 100 1 p1 p2 p3 &
|
|
109
|
+
sleep 0.1 # Ensure the dealer has started and is ready to accept connections
|
|
110
|
+
./kuhn_3p_equilibrium_player -0 0.0 -1 0.25 -2 0.25 -4 0.9375 --c33 0.0 --c34 1.0 -p 18791 -g ../kuhn.limit.3p.game & # Sub-family 1
|
|
111
|
+
./kuhn_3p_equilibrium_player --c11 0.5 --b11 0.25 --b21 0.0 --b23 0.125 --b32 0.75 --c33 0.0 --c34 0.75 -p 18374 -g ../kuhn.limit.3p.game & # Sub-family 2
|
|
112
|
+
./kuhn_3p_equilibrium_player --c11 0.33 --b11 0.166667 --b32 0.791667 --c33 0.0 --c34 0.75 -p 59497 -g ../kuhn.limit.3p.game & # Sub-family 3
|
|
113
|
+
|
|
114
|
+
# Automatic tests (require Ruby)
|
|
115
|
+
#--------------------------------
|
|
116
|
+
test: clean $(TEST1) $(TEST2) $(TEST3) $(TEST4)
|
|
117
|
+
$(TEST1)
|
|
118
|
+
$(TEST2)
|
|
119
|
+
$(TEST3)
|
|
120
|
+
$(TEST4)
|
|
121
|
+
|
|
122
|
+
# Clean
|
|
123
|
+
#============
|
|
124
|
+
clean:
|
|
125
|
+
rm -f $(TARGET) *.o *.il *.out $(TEST1) $(TEST2) $(TEST3) $(TEST4) $(TEST1_RUNNER) $(TEST2_RUNNER) $(TEST3_RUNNER) $(TEST4_RUNNER) $(THIS_DIR)/test/*.out
|
|
126
|
+
|
|
127
|
+
dist_clean: clean
|
|
128
|
+
rm -f *~ core
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
Acknowledgements
|
|
31
|
+
----------------
|
|
32
|
+
This project includes software developed for
|
|
33
|
+
the CException Project, by Mark VanderVoord and other
|
|
34
|
+
contributors, as well as the CMock and Unity Projects, by Mike Karlesky,
|
|
35
|
+
Mark VanderVoord, and Greg Williams and other contributors.
|
|
@@ -0,0 +1,49 @@
|
|
|
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* this)
|
|
23
|
+
{
|
|
24
|
+
assert(this);
|
|
25
|
+
|
|
26
|
+
int sock = connectTo(this->host, this->port);
|
|
27
|
+
if( sock < 0 ) {
|
|
28
|
+
exit( EXIT_FAILURE );
|
|
29
|
+
}
|
|
30
|
+
this->toServer = fdopen( sock, "w" );
|
|
31
|
+
this->fromServer = fdopen( sock, "r" );
|
|
32
|
+
if(!(this->toServer && this->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
|
+
this->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(this->toServer);
|
|
49
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
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[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* this);
|
|
21
|
+
|
|
22
|
+
#endif
|
|
@@ -0,0 +1,483 @@
|
|
|
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 const* 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 const* params,
|
|
243
|
+
uint8_t card_rank,
|
|
244
|
+
const State const* 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 const* params,
|
|
313
|
+
uint8_t card_rank,
|
|
314
|
+
const State const* 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 const* game_def,
|
|
390
|
+
const double const* 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 const* 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
|
+
}
|