From 737b1faffb96d3a8b2d157cc1f482631716b80e7 Mon Sep 17 00:00:00 2001 From: Brunozml Date: Thu, 18 Apr 2024 18:27:12 +0200 Subject: [PATCH 1/6] added ME dominoes, including playthrough --- .../playthroughs/python_dominoes.txt | 1577 +++++++++++++++++ open_spiel/python/games/dominoes.py | 407 +++++ open_spiel/python/games/dominoes_test.py | 146 ++ 3 files changed, 2130 insertions(+) create mode 100644 open_spiel/integration_tests/playthroughs/python_dominoes.txt create mode 100644 open_spiel/python/games/dominoes.py create mode 100644 open_spiel/python/games/dominoes_test.py diff --git a/open_spiel/integration_tests/playthroughs/python_dominoes.txt b/open_spiel/integration_tests/playthroughs/python_dominoes.txt new file mode 100644 index 0000000000..263dddf3c1 --- /dev/null +++ b/open_spiel/integration_tests/playthroughs/python_dominoes.txt @@ -0,0 +1,1577 @@ +game: python_dominoes + +GameType.chance_mode = ChanceMode.EXPLICIT_STOCHASTIC +GameType.dynamics = Dynamics.SEQUENTIAL +GameType.information = Information.IMPERFECT_INFORMATION +GameType.long_name = "Python Dominoes (4 players)" +GameType.max_num_players = 4 +GameType.min_num_players = 4 +GameType.parameter_specification = [] +GameType.provides_information_state_string = True +GameType.provides_information_state_tensor = True +GameType.provides_observation_string = True +GameType.provides_observation_tensor = True +GameType.provides_factored_observation_string = True +GameType.reward_model = RewardModel.TERMINAL +GameType.short_name = "python_dominoes" +GameType.utility = Utility.ZERO_SUM + +NumDistinctActions() = 308 +PolicyTensorShape() = [308] +MaxChanceOutcomes() = 28 +GetParameters() = {} +NumPlayers() = 4 +MinUtility() = -100.0 +MaxUtility() = 100.0 +UtilitySum() = 0.0 +InformationStateTensorShape() = player: [4], hand: [7, 3], actions_history: [25, 5] +InformationStateTensorLayout() = TensorLayout.CHW +InformationStateTensorSize() = 150 +ObservationTensorShape() = player: [4], hand: [7, 3], last_action: [4], hand_sizes: [4] +ObservationTensorLayout() = TensorLayout.CHW +ObservationTensorSize() = 33 +MaxGameLength() = 28 +ToString() = "python_dominoes()" + +# State 0 +# hand0:[] +# hand1:[] +# hand2:[] +# hand3:[] +# +# board: [] +IsTerminal() = False +History() = [] +HistoryString() = "" +IsChanceNode() = True +IsSimultaneousNode() = False +CurrentPlayer() = PlayerId.CHANCE +InformationStateString(0) = "p0 hand:[] history:[]" +InformationStateString(1) = "p1 hand:[] history:[]" +InformationStateString(2) = "p2 hand:[] history:[]" +InformationStateString(3) = "p3 hand:[] history:[]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(0).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(1).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(2).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(3).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +ObservationString(0) = "p0 hand:[]" +ObservationString(1) = "p1 hand:[]" +ObservationString(2) = "p2 hand:[]" +ObservationString(3) = "p3 hand:[]" +PublicObservationString() = "p0" +PrivateObservationString(0) = "p0 hand:[]" +PrivateObservationString(1) = "p1 hand:[]" +PrivateObservationString(2) = "p2 hand:[]" +PrivateObservationString(3) = "p3 hand:[]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(0).last_action: ◯◯◯◯ +ObservationTensor(0).hand_sizes: ◯◯◯◯ +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(1).last_action: ◯◯◯◯ +ObservationTensor(1).hand_sizes: ◯◯◯◯ +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(2).last_action: ◯◯◯◯ +ObservationTensor(2).hand_sizes: ◯◯◯◯ +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(3).last_action: ◯◯◯◯ +ObservationTensor(3).hand_sizes: ◯◯◯◯ +ChanceOutcomes() = [(0,0.0357143), (1,0.0357143), (2,0.0357143), (3,0.0357143), (4,0.0357143), (5,0.0357143), (6,0.0357143), (7,0.0357143), (8,0.0357143), (9,0.0357143), (10,0.0357143), (11,0.0357143), (12,0.0357143), (13,0.0357143), (14,0.0357143), (15,0.0357143), (16,0.0357143), (17,0.0357143), (18,0.0357143), (19,0.0357143), (20,0.0357143), (21,0.0357143), (22,0.0357143), (23,0.0357143), (24,0.0357143), (25,0.0357143), (26,0.0357143), (27,0.0357143)] +LegalActions() = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] +StringLegalActions() = ["Deal (0.0, 0.0)", "Deal (0.0, 1.0)", "Deal (0.0, 2.0)", "Deal (0.0, 3.0)", "Deal (0.0, 4.0)", "Deal (0.0, 5.0)", "Deal (0.0, 6.0)", "Deal (1.0, 1.0)", "Deal (1.0, 2.0)", "Deal (1.0, 3.0)", "Deal (1.0, 4.0)", "Deal (1.0, 5.0)", "Deal (1.0, 6.0)", "Deal (2.0, 2.0)", "Deal (2.0, 3.0)", "Deal (2.0, 4.0)", "Deal (2.0, 5.0)", "Deal (2.0, 6.0)", "Deal (3.0, 3.0)", "Deal (3.0, 4.0)", "Deal (3.0, 5.0)", "Deal (3.0, 6.0)", "Deal (4.0, 4.0)", "Deal (4.0, 5.0)", "Deal (4.0, 6.0)", "Deal (5.0, 5.0)", "Deal (5.0, 6.0)", "Deal (6.0, 6.0)"] + +# Apply action "Deal (1.0, 3.0)" +action: 9 + +# State 1 +# hand0:['(1.0, 3.0)'] +# hand1:[] +# hand2:[] +# hand3:[] +# +# board: [] +IsTerminal() = False +History() = [9] +HistoryString() = "9" +IsChanceNode() = True +IsSimultaneousNode() = False +CurrentPlayer() = PlayerId.CHANCE +InformationStateString(0) = "p0 hand:[(1.0, 3.0)] history:[]" +InformationStateString(1) = "p1 hand:[] history:[]" +InformationStateString(2) = "p2 hand:[] history:[]" +InformationStateString(3) = "p3 hand:[] history:[]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(1).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(2).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(3).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +ObservationString(0) = "p0 hand:[(1.0, 3.0)]" +ObservationString(1) = "p1 hand:[]" +ObservationString(2) = "p2 hand:[]" +ObservationString(3) = "p3 hand:[]" +PublicObservationString() = "p0" +PrivateObservationString(0) = "p0 hand:[(1.0, 3.0)]" +PrivateObservationString(1) = "p1 hand:[]" +PrivateObservationString(2) = "p2 hand:[]" +PrivateObservationString(3) = "p3 hand:[]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action: ◯◯◯◯ +ObservationTensor(0).hand_sizes: ◉◯◯◯ +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(1).last_action: ◯◯◯◯ +ObservationTensor(1).hand_sizes: ◯◉◯◯ +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(2).last_action: ◯◯◯◯ +ObservationTensor(2).hand_sizes: ◯◯◯◯ +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(3).last_action: ◯◯◯◯ +ObservationTensor(3).hand_sizes: ◯◯◯◯ +ChanceOutcomes() = [(0,0.037037), (1,0.037037), (2,0.037037), (3,0.037037), (4,0.037037), (5,0.037037), (6,0.037037), (7,0.037037), (8,0.037037), (10,0.037037), (11,0.037037), (12,0.037037), (13,0.037037), (14,0.037037), (15,0.037037), (16,0.037037), (17,0.037037), (18,0.037037), (19,0.037037), (20,0.037037), (21,0.037037), (22,0.037037), (23,0.037037), (24,0.037037), (25,0.037037), (26,0.037037), (27,0.037037)] +LegalActions() = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] +StringLegalActions() = ["Deal (0.0, 0.0)", "Deal (0.0, 1.0)", "Deal (0.0, 2.0)", "Deal (0.0, 3.0)", "Deal (0.0, 4.0)", "Deal (0.0, 5.0)", "Deal (0.0, 6.0)", "Deal (1.0, 1.0)", "Deal (1.0, 2.0)", "Deal (1.0, 4.0)", "Deal (1.0, 5.0)", "Deal (1.0, 6.0)", "Deal (2.0, 2.0)", "Deal (2.0, 3.0)", "Deal (2.0, 4.0)", "Deal (2.0, 5.0)", "Deal (2.0, 6.0)", "Deal (3.0, 3.0)", "Deal (3.0, 4.0)", "Deal (3.0, 5.0)", "Deal (3.0, 6.0)", "Deal (4.0, 4.0)", "Deal (4.0, 5.0)", "Deal (4.0, 6.0)", "Deal (5.0, 5.0)", "Deal (5.0, 6.0)", "Deal (6.0, 6.0)"] + +# Apply action "Deal (3.0, 3.0)" +action: 18 + +# State 2 +# Apply action "Deal (0.0, 5.0)" +action: 5 + +# State 3 +# Apply action "Deal (1.0, 5.0)" +action: 11 + +# State 4 +# Apply action "Deal (2.0, 3.0)" +action: 14 + +# State 5 +# Apply action "Deal (2.0, 4.0)" +action: 15 + +# State 6 +# Apply action "Deal (3.0, 4.0)" +action: 19 + +# State 7 +# Apply action "Deal (1.0, 6.0)" +action: 12 + +# State 8 +# Apply action "Deal (5.0, 6.0)" +action: 26 + +# State 9 +# Apply action "Deal (3.0, 6.0)" +action: 21 + +# State 10 +# Apply action "Deal (6.0, 6.0)" +action: 27 + +# State 11 +# Apply action "Deal (3.0, 5.0)" +action: 20 + +# State 12 +# Apply action "Deal (1.0, 1.0)" +action: 7 + +# State 13 +# Apply action "Deal (0.0, 6.0)" +action: 6 + +# State 14 +# Apply action "Deal (0.0, 4.0)" +action: 4 + +# State 15 +# Apply action "Deal (0.0, 1.0)" +action: 1 + +# State 16 +# Apply action "Deal (5.0, 5.0)" +action: 25 + +# State 17 +# Apply action "Deal (4.0, 6.0)" +action: 24 + +# State 18 +# Apply action "Deal (1.0, 2.0)" +action: 8 + +# State 19 +# Apply action "Deal (4.0, 5.0)" +action: 23 + +# State 20 +# Apply action "Deal (0.0, 3.0)" +action: 3 + +# State 21 +# Apply action "Deal (1.0, 4.0)" +action: 10 + +# State 22 +# Apply action "Deal (2.0, 6.0)" +action: 17 + +# State 23 +# Apply action "Deal (0.0, 2.0)" +action: 2 + +# State 24 +# Apply action "Deal (4.0, 4.0)" +action: 22 + +# State 25 +# Apply action "Deal (2.0, 2.0)" +action: 13 + +# State 26 +# Apply action "Deal (2.0, 5.0)" +action: 16 + +# State 27 +# Apply action "Deal (0.0, 0.0)" +action: 0 + +# State 28 +# hand0:['(0.0, 3.0)', '(1.0, 1.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# hand1:['(0.0, 6.0)', '(1.0, 4.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(1.0, 6.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 0 +InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 1.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[]" +InformationStateString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] history:[]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] history:[]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +InformationStateTensor(0).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 4.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0] +InformationStateTensor(1).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] +InformationStateTensor(2).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] +InformationStateTensor(3).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 1.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +ObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)]" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" +PublicObservationString() = "p0" +PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 1.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +ObservationTensor(0).last_action: ◯◯◯◯ +ObservationTensor(0).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 4.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0] +ObservationTensor(1).last_action: ◯◯◯◯ +ObservationTensor(1).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] +ObservationTensor(2).last_action: ◯◯◯◯ +ObservationTensor(2).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] +ObservationTensor(3).last_action: ◯◯◯◯ +ObservationTensor(3).hand_sizes = [7.0, 7.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [8, 20, 25, 39, 62, 70, 72] +StringLegalActions() = ["p0 tile:(0.0, 3.0) pip:None", "p0 tile:(1.0, 1.0) pip:None", "p0 tile:(1.0, 3.0) pip:None", "p0 tile:(2.0, 3.0) pip:None", "p0 tile:(4.0, 4.0) pip:None", "p0 tile:(5.0, 5.0) pip:None", "p0 tile:(5.0, 6.0) pip:None"] + +# Apply action "p0 tile:(1.0, 1.0) pip:None" +action: 20 + +# State 29 +# hand0:['(0.0, 3.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# hand1:['(0.0, 6.0)', '(1.0, 4.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(1.0, 6.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(1.0, 1.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 1 +InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None]" +InformationStateString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history: ◉◉◯◯◉ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 4.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0] +InformationStateTensor(1).actions_history: ◉◉◯◯◉ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] +InformationStateTensor(2).actions_history: ◉◉◯◯◉ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] +InformationStateTensor(3).actions_history: ◉◉◯◯◉ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p0 tile:(1.0, 1.0) pip:None" +ObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p0 tile:(1.0, 1.0) pip:None" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] last_action:p0 tile:(1.0, 1.0) pip:None" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] last_action:p0 tile:(1.0, 1.0) pip:None" +PublicObservationString() = "p0 last_action:p0 tile:(1.0, 1.0) pip:None" +PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action: ◉◉◯◯ +ObservationTensor(0).hand_sizes = [6.0, 7.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 4.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0] +ObservationTensor(1).last_action: ◉◉◯◯ +ObservationTensor(1).hand_sizes = [7.0, 6.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] +ObservationTensor(2).last_action: ◉◉◯◯ +ObservationTensor(2).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] +ObservationTensor(3).last_action: ◉◉◯◯ +ObservationTensor(3).hand_sizes = [7.0, 7.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [106] +StringLegalActions() = ["p1 tile:(1.0, 4.0) pip:1.0"] + +# Apply action "p1 tile:(1.0, 4.0) pip:1.0" +action: 106 + +# State 30 +# hand0:['(0.0, 3.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# hand1:['(0.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(1.0, 6.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(4.0, 1.0), (1.0, 1.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 2 +InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0]" +InformationStateString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p1 tile:(1.0, 4.0) pip:1.0" +ObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p1 tile:(1.0, 4.0) pip:1.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] last_action:p1 tile:(1.0, 4.0) pip:1.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] last_action:p1 tile:(1.0, 4.0) pip:1.0" +PublicObservationString() = "p0 last_action:p1 tile:(1.0, 4.0) pip:1.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [1.0, 4.0, 1.0, 1.0] +ObservationTensor(0).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [1.0, 4.0, 1.0, 1.0] +ObservationTensor(1).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] +ObservationTensor(2).last_action = [1.0, 4.0, 1.0, 1.0] +ObservationTensor(2).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] +ObservationTensor(3).last_action = [1.0, 4.0, 1.0, 1.0] +ObservationTensor(3).hand_sizes = [7.0, 7.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [167, 177, 209] +StringLegalActions() = ["p2 tile:(0.0, 4.0) pip:4.0", "p2 tile:(1.0, 2.0) pip:1.0", "p2 tile:(3.0, 4.0) pip:4.0"] + +# Apply action "p2 tile:(3.0, 4.0) pip:4.0" +action: 209 + +# State 31 +# hand0:['(0.0, 3.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# hand1:['(0.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(1.0, 6.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(3.0, 4.0), (4.0, 1.0), (1.0, 1.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 3 +InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0]" +InformationStateString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p2 tile:(3.0, 4.0) pip:4.0" +ObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p2 tile:(3.0, 4.0) pip:4.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p2 tile:(3.0, 4.0) pip:4.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] last_action:p2 tile:(3.0, 4.0) pip:4.0" +PublicObservationString() = "p0 last_action:p2 tile:(3.0, 4.0) pip:4.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [3.0, 4.0, 4.0, 2.0] +ObservationTensor(0).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [3.0, 4.0, 4.0, 2.0] +ObservationTensor(1).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [3.0, 4.0, 4.0, 2.0] +ObservationTensor(2).hand_sizes = [6.0, 7.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] +ObservationTensor(3).last_action = [3.0, 4.0, 4.0, 2.0] +ObservationTensor(3).hand_sizes = [7.0, 6.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [235, 263, 266, 288] +StringLegalActions() = ["p3 tile:(0.0, 1.0) pip:1.0", "p3 tile:(1.0, 5.0) pip:1.0", "p3 tile:(1.0, 6.0) pip:1.0", "p3 tile:(3.0, 5.0) pip:3.0"] + +# Apply action "p3 tile:(1.0, 6.0) pip:1.0" +action: 266 + +# State 32 +# hand0:['(0.0, 3.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# hand1:['(0.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 0 +InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0]" +InformationStateString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p3 tile:(1.0, 6.0) pip:1.0" +ObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p3 tile:(1.0, 6.0) pip:1.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p3 tile:(1.0, 6.0) pip:1.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p3 tile:(1.0, 6.0) pip:1.0" +PublicObservationString() = "p0 last_action:p3 tile:(1.0, 6.0) pip:1.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [1.0, 6.0, 1.0, 3.0] +ObservationTensor(0).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [1.0, 6.0, 1.0, 3.0] +ObservationTensor(1).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [1.0, 6.0, 1.0, 3.0] +ObservationTensor(2).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [1.0, 6.0, 1.0, 3.0] +ObservationTensor(3).hand_sizes = [6.0, 6.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [10, 27, 41, 74] +StringLegalActions() = ["p0 tile:(0.0, 3.0) pip:3.0", "p0 tile:(1.0, 3.0) pip:3.0", "p0 tile:(2.0, 3.0) pip:3.0", "p0 tile:(5.0, 6.0) pip:6.0"] + +# Apply action "p0 tile:(0.0, 3.0) pip:3.0" +action: 10 + +# State 33 +# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# hand1:['(0.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 1 +InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0]" +InformationStateString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p0 tile:(0.0, 3.0) pip:3.0" +ObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p0 tile:(0.0, 3.0) pip:3.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p0 tile:(0.0, 3.0) pip:3.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p0 tile:(0.0, 3.0) pip:3.0" +PublicObservationString() = "p0 last_action:p0 tile:(0.0, 3.0) pip:3.0" +PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [0.0, 3.0, 3.0, 0.0] +ObservationTensor(0).hand_sizes = [5.0, 6.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [0.0, 3.0, 3.0, 0.0] +ObservationTensor(1).hand_sizes = [6.0, 5.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [0.0, 3.0, 3.0, 0.0] +ObservationTensor(2).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [0.0, 3.0, 3.0, 0.0] +ObservationTensor(3).hand_sizes = [6.0, 6.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [95, 96, 138, 146] +StringLegalActions() = ["p1 tile:(0.0, 6.0) pip:0.0", "p1 tile:(0.0, 6.0) pip:6.0", "p1 tile:(3.0, 6.0) pip:6.0", "p1 tile:(4.0, 6.0) pip:6.0"] + +# Apply action "p1 tile:(0.0, 6.0) pip:6.0" +action: 96 + +# State 34 +# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 2 +InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0]" +InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p1 tile:(0.0, 6.0) pip:6.0" +ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p1 tile:(0.0, 6.0) pip:6.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p1 tile:(0.0, 6.0) pip:6.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p1 tile:(0.0, 6.0) pip:6.0" +PublicObservationString() = "p0 last_action:p1 tile:(0.0, 6.0) pip:6.0" +PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [0.0, 6.0, 6.0, 1.0] +ObservationTensor(0).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [0.0, 6.0, 6.0, 1.0] +ObservationTensor(1).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [0.0, 6.0, 6.0, 1.0] +ObservationTensor(2).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [0.0, 6.0, 6.0, 1.0] +ObservationTensor(3).hand_sizes = [6.0, 6.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [166, 169] +StringLegalActions() = ["p2 tile:(0.0, 4.0) pip:0.0", "p2 tile:(0.0, 5.0) pip:0.0"] + +# Apply action "p2 tile:(0.0, 5.0) pip:0.0" +action: 169 + +# State 35 +# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 3 +InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0]" +InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p2 tile:(0.0, 5.0) pip:0.0" +ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p2 tile:(0.0, 5.0) pip:0.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p2 tile:(0.0, 5.0) pip:0.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p2 tile:(0.0, 5.0) pip:0.0" +PublicObservationString() = "p0 last_action:p2 tile:(0.0, 5.0) pip:0.0" +PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [0.0, 5.0, 0.0, 2.0] +ObservationTensor(0).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [0.0, 5.0, 0.0, 2.0] +ObservationTensor(1).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [0.0, 5.0, 0.0, 2.0] +ObservationTensor(2).hand_sizes = [5.0, 6.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [0.0, 5.0, 0.0, 2.0] +ObservationTensor(3).hand_sizes = [6.0, 5.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [232, 234, 237, 264, 289, 297] +StringLegalActions() = ["p3 tile:(0.0, 0.0) pip:0.0", "p3 tile:(0.0, 1.0) pip:0.0", "p3 tile:(0.0, 2.0) pip:0.0", "p3 tile:(1.0, 5.0) pip:5.0", "p3 tile:(3.0, 5.0) pip:5.0", "p3 tile:(4.0, 5.0) pip:5.0"] + +# Apply action "p3 tile:(0.0, 1.0) pip:0.0" +action: 234 + +# State 36 +# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 0 +InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0]" +InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p3 tile:(0.0, 1.0) pip:0.0" +ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p3 tile:(0.0, 1.0) pip:0.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p3 tile:(0.0, 1.0) pip:0.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p3 tile:(0.0, 1.0) pip:0.0" +PublicObservationString() = "p0 last_action:p3 tile:(0.0, 1.0) pip:0.0" +PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [0.0, 1.0, 0.0, 3.0] +ObservationTensor(0).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [0.0, 1.0, 0.0, 3.0] +ObservationTensor(1).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [0.0, 1.0, 0.0, 3.0] +ObservationTensor(2).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [0.0, 1.0, 0.0, 3.0] +ObservationTensor(3).hand_sizes = [5.0, 5.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [26, 71, 73] +StringLegalActions() = ["p0 tile:(1.0, 3.0) pip:1.0", "p0 tile:(5.0, 5.0) pip:5.0", "p0 tile:(5.0, 6.0) pip:5.0"] + +# Apply action "p0 tile:(5.0, 5.0) pip:5.0" +action: 71 + +# State 37 +# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 6.0)'] +# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(5.0, 5.0), (5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 2 +InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0]" +InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)] last_action:p0 tile:(5.0, 5.0) pip:5.0" +ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p0 tile:(5.0, 5.0) pip:5.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p0 tile:(5.0, 5.0) pip:5.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p0 tile:(5.0, 5.0) pip:5.0" +PublicObservationString() = "p0 last_action:p0 tile:(5.0, 5.0) pip:5.0" +PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [5.0, 5.0, 5.0, 0.0] +ObservationTensor(0).hand_sizes = [4.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [5.0, 5.0, 5.0, 0.0] +ObservationTensor(1).hand_sizes = [5.0, 4.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [5.0, 5.0, 5.0, 0.0] +ObservationTensor(2).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [5.0, 5.0, 5.0, 0.0] +ObservationTensor(3).hand_sizes = [5.0, 5.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [177, 201] +StringLegalActions() = ["p2 tile:(1.0, 2.0) pip:1.0", "p2 tile:(2.0, 5.0) pip:5.0"] + +# Apply action "p2 tile:(2.0, 5.0) pip:5.0" +action: 201 + +# State 38 +# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 6.0)'] +# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 6.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(2.0, 5.0), (5.0, 5.0), (5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 3 +InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0]" +InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)] last_action:p2 tile:(2.0, 5.0) pip:5.0" +ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p2 tile:(2.0, 5.0) pip:5.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)] last_action:p2 tile:(2.0, 5.0) pip:5.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p2 tile:(2.0, 5.0) pip:5.0" +PublicObservationString() = "p0 last_action:p2 tile:(2.0, 5.0) pip:5.0" +PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [2.0, 5.0, 5.0, 2.0] +ObservationTensor(0).hand_sizes = [4.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [2.0, 5.0, 5.0, 2.0] +ObservationTensor(1).hand_sizes = [5.0, 4.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [2.0, 5.0, 5.0, 2.0] +ObservationTensor(2).hand_sizes = [4.0, 5.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [2.0, 5.0, 5.0, 2.0] +ObservationTensor(3).hand_sizes = [5.0, 4.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [238, 263] +StringLegalActions() = ["p3 tile:(0.0, 2.0) pip:2.0", "p3 tile:(1.0, 5.0) pip:1.0"] + +# Apply action "p3 tile:(1.0, 5.0) pip:1.0" +action: 263 + +# State 39 +# Apply action "p0 tile:(2.0, 3.0) pip:2.0" +action: 40 + +# State 40 +# hand0:['(1.0, 3.0)', '(4.0, 4.0)', '(5.0, 6.0)'] +# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] +# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 6.0)', '(6.0, 6.0)'] +# hand3:['(0.0, 0.0)', '(0.0, 2.0)', '(3.0, 5.0)', '(4.0, 5.0)'] +# +# board: [(3.0, 2.0), (2.0, 5.0), (5.0, 5.0), (5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0), (1.0, 5.0)] +IsTerminal() = False +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201, 263, 40] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201, 263, 40" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 1 +InformationStateString(0) = "p0 hand:[(1.0, 3.0), (4.0, 4.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0]" +InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0]" +InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0]" +InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(1.0, 3.0), (4.0, 4.0), (5.0, 6.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" +ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" +ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" +ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (3.0, 5.0), (4.0, 5.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" +PublicObservationString() = "p0 last_action:p0 tile:(2.0, 3.0) pip:2.0" +PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (4.0, 4.0), (5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (3.0, 5.0), (4.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [1.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [2.0, 3.0, 2.0, 0.0] +ObservationTensor(0).hand_sizes = [3.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [2.0, 3.0, 2.0, 0.0] +ObservationTensor(1).hand_sizes = [5.0, 3.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [2.0, 3.0, 2.0, 0.0] +ObservationTensor(2).hand_sizes = [4.0, 4.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [2.0, 3.0, 2.0, 0.0] +ObservationTensor(3).hand_sizes = [4.0, 4.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [129, 137] +StringLegalActions() = ["p1 tile:(3.0, 3.0) pip:3.0", "p1 tile:(3.0, 6.0) pip:3.0"] + +# Apply action "p1 tile:(3.0, 3.0) pip:3.0" +action: 129 + +# State 41 +# Apply action "p3 tile:(4.0, 5.0) pip:5.0" +action: 297 + +# State 42 +# Apply action "p0 tile:(4.0, 4.0) pip:4.0" +action: 63 + +# State 43 +# Apply action "p1 tile:(4.0, 6.0) pip:4.0" +action: 145 + +# State 44 +# Apply action "p2 tile:(2.0, 6.0) pip:6.0" +action: 204 + +# State 45 +# Apply action "p3 tile:(0.0, 2.0) pip:2.0" +action: 238 + +# State 46 +# Apply action "p0 tile:(1.0, 3.0) pip:3.0" +action: 27 + +# State 47 +# Apply action "p2 tile:(1.0, 2.0) pip:1.0" +action: 177 + +# State 48 +# Apply action "p3 tile:(0.0, 0.0) pip:0.0" +action: 232 + +# State 49 +# Apply action "p1 tile:(2.0, 2.0) pip:2.0" +action: 115 + +# State 50 +# Apply action "p2 tile:(0.0, 4.0) pip:0.0" +action: 166 + +# State 51 +# Apply action "p1 tile:(2.0, 4.0) pip:2.0" +action: 120 + +# State 52 +# hand0:['(5.0, 6.0)'] +# hand1:['(3.0, 6.0)'] +# hand2:['(6.0, 6.0)'] +# hand3:['(3.0, 5.0)'] +# +# board: [(4.0, 2.0), (2.0, 2.0), (2.0, 1.0), (1.0, 3.0), (3.0, 3.0), (3.0, 2.0), (2.0, 5.0), (5.0, 5.0), (5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0), (1.0, 5.0), (5.0, 4.0), (4.0, 4.0), (4.0, 6.0), (6.0, 2.0), (2.0, 0.0), (0.0, 0.0), (0.0, 4.0)] +IsTerminal() = True +History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201, 263, 40, 129, 297, 63, 145, 204, 238, 27, 177, 232, 115, 166, 120] +HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201, 263, 40, 129, 297, 63, 145, 204, 238, 27, 177, 232, 115, 166, 120" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = PlayerId.TERMINAL +InformationStateString(0) = "p0 hand:[(5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0, p1 tile:(3.0, 3.0) pip:3.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(4.0, 4.0) pip:4.0, p1 tile:(4.0, 6.0) pip:4.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(0.0, 2.0) pip:2.0, p0 tile:(1.0, 3.0) pip:3.0, p2 tile:(1.0, 2.0) pip:1.0, p3 tile:(0.0, 0.0) pip:0.0, p1 tile:(2.0, 2.0) pip:2.0, p2 tile:(0.0, 4.0) pip:0.0, p1 tile:(2.0, 4.0) pip:2.0]" +InformationStateString(1) = "p1 hand:[(3.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0, p1 tile:(3.0, 3.0) pip:3.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(4.0, 4.0) pip:4.0, p1 tile:(4.0, 6.0) pip:4.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(0.0, 2.0) pip:2.0, p0 tile:(1.0, 3.0) pip:3.0, p2 tile:(1.0, 2.0) pip:1.0, p3 tile:(0.0, 0.0) pip:0.0, p1 tile:(2.0, 2.0) pip:2.0, p2 tile:(0.0, 4.0) pip:0.0, p1 tile:(2.0, 4.0) pip:2.0]" +InformationStateString(2) = "p2 hand:[(6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0, p1 tile:(3.0, 3.0) pip:3.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(4.0, 4.0) pip:4.0, p1 tile:(4.0, 6.0) pip:4.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(0.0, 2.0) pip:2.0, p0 tile:(1.0, 3.0) pip:3.0, p2 tile:(1.0, 2.0) pip:1.0, p3 tile:(0.0, 0.0) pip:0.0, p1 tile:(2.0, 2.0) pip:2.0, p2 tile:(0.0, 4.0) pip:0.0, p1 tile:(2.0, 4.0) pip:2.0]" +InformationStateString(3) = "p3 hand:[(3.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0, p1 tile:(3.0, 3.0) pip:3.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(4.0, 4.0) pip:4.0, p1 tile:(4.0, 6.0) pip:4.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(0.0, 2.0) pip:2.0, p0 tile:(1.0, 3.0) pip:3.0, p2 tile:(1.0, 2.0) pip:1.0, p3 tile:(0.0, 0.0) pip:0.0, p1 tile:(2.0, 2.0) pip:2.0, p2 tile:(0.0, 4.0) pip:0.0, p1 tile:(2.0, 4.0) pip:2.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 3.0, 3.0, 3.0, 1.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 4.0, 4.0, 4.0, 0.0, 1.0, 4.0, 6.0, 4.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 0.0, 2.0, 2.0, 3.0, 1.0, 1.0, 3.0, 3.0, 0.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, 3.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [3.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 3.0, 3.0, 3.0, 1.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 4.0, 4.0, 4.0, 0.0, 1.0, 4.0, 6.0, 4.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 0.0, 2.0, 2.0, 3.0, 1.0, 1.0, 3.0, 3.0, 0.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, 3.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 3.0, 3.0, 3.0, 1.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 4.0, 4.0, 4.0, 0.0, 1.0, 4.0, 6.0, 4.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 0.0, 2.0, 2.0, 3.0, 1.0, 1.0, 3.0, 3.0, 0.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, 3.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 3.0, 3.0, 3.0, 1.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 4.0, 4.0, 4.0, 0.0, 1.0, 4.0, 6.0, 4.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 0.0, 2.0, 2.0, 3.0, 1.0, 1.0, 3.0, 3.0, 0.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, 3.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(5.0, 6.0)] last_action:p1 tile:(2.0, 4.0) pip:2.0" +ObservationString(1) = "p1 hand:[(3.0, 6.0)] last_action:p1 tile:(2.0, 4.0) pip:2.0" +ObservationString(2) = "p2 hand:[(6.0, 6.0)] last_action:p1 tile:(2.0, 4.0) pip:2.0" +ObservationString(3) = "p3 hand:[(3.0, 5.0)] last_action:p1 tile:(2.0, 4.0) pip:2.0" +PublicObservationString() = "p0 last_action:p1 tile:(2.0, 4.0) pip:2.0" +PrivateObservationString(0) = "p0 hand:[(5.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(3.0, 6.0)]" +PrivateObservationString(2) = "p2 hand:[(6.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(3.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [2.0, 4.0, 2.0, 1.0] +ObservationTensor(0).hand_sizes: ◉◉◯◯ +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [3.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [2.0, 4.0, 2.0, 1.0] +ObservationTensor(1).hand_sizes: ◉◉◯◯ +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [2.0, 4.0, 2.0, 1.0] +ObservationTensor(2).hand_sizes: ◉◉◯◯ +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [2.0, 4.0, 2.0, 1.0] +ObservationTensor(3).hand_sizes: ◉◉◯◯ +Rewards() = [-23, 23, -23, 23] +Returns() = [-23, 23, -23, 23] diff --git a/open_spiel/python/games/dominoes.py b/open_spiel/python/games/dominoes.py new file mode 100644 index 0000000000..f7b7b446ce --- /dev/null +++ b/open_spiel/python/games/dominoes.py @@ -0,0 +1,407 @@ +# Copyright 2019 DeepMind Technologies Limited +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as python3 +""" Dominoes (4 players) implemented in Python. + +https://en.wikipedia.org/wiki/Dominoes#Middle_Eastern_Version + +""" + +import copy +import itertools +import collections + +import numpy as np + +import pyspiel + +_NUM_PLAYERS = 4 +_PIPS = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0] +_DECK = list(itertools.combinations_with_replacement(_PIPS, 2)) +_EDGES = [None, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0] + + +class Action: + """Represent player possible action.""" + + def __init__(self, player, tile, edge): + self.player = player + self.tile = tile + self.edge = edge + + def __str__(self): + return f"p{self.player} tile:{self.tile} pip:{self.edge}" + + def __repr__(self): + return self.__str__() + + +def create_possible_actions(): + actions = [] + for player in range(_NUM_PLAYERS): + for tile in _DECK: + for edge in _EDGES: + if edge in tile or edge is None: + actions.append(Action(player, tile, edge)) + return actions + + +_ACTIONS = create_possible_actions() +_ACTIONS_STR = [str(action) for action in _ACTIONS] + +_HAND_SIZE = 7 + +_MAX_GAME_LENGTH = 28 + +_GAME_TYPE = pyspiel.GameType( + short_name="python_dominoes", + long_name="Python Dominoes (4 players)", + dynamics=pyspiel.GameType.Dynamics.SEQUENTIAL, + chance_mode=pyspiel.GameType.ChanceMode.EXPLICIT_STOCHASTIC, + information=pyspiel.GameType.Information.IMPERFECT_INFORMATION, + utility=pyspiel.GameType.Utility.ZERO_SUM, + reward_model=pyspiel.GameType.RewardModel.TERMINAL, + max_num_players=_NUM_PLAYERS, + min_num_players=_NUM_PLAYERS, + provides_information_state_string=True, + provides_information_state_tensor=True, + provides_observation_string=True, + provides_observation_tensor=True, + provides_factored_observation_string=True, +) +_GAME_INFO = pyspiel.GameInfo( + num_distinct_actions=len(_ACTIONS), + max_chance_outcomes=len(_DECK), + min_utility=-100, + max_utility=100, + num_players=_NUM_PLAYERS, + # deal: 28 chance nodes + play: 28 player nodes + max_game_length=_MAX_GAME_LENGTH, + utility_sum=0.0, +) + + +class DominoesGame(pyspiel.Game): + """A Python version of Block Dominoes.""" + + def __init__(self, params=None): + super().__init__(_GAME_TYPE, _GAME_INFO, params or dict()) + + def new_initial_state(self): + """Returns a state corresponding to the start of a game.""" + return DominoesState(self) + + def make_py_observer(self, iig_obs_type=None, params=None): + """Returns an object used for observing game state.""" + return DominoesObserver( + iig_obs_type or pyspiel.IIGObservationType(perfect_recall=False), params + ) + + +class DominoesState(pyspiel.State): + """A python version of the Block Dominoes state.""" + + def __init__(self, game): + """Constructor; should only be called by Game.new_initial_state.""" + super().__init__(game) + self.actions_history = [] + self.open_edges = [] + self.hands = [[] for _ in range(_NUM_PLAYERS)] + self.deck = copy.deepcopy(_DECK) + self._game_over = False + self._next_player = pyspiel.PlayerId.CHANCE + self._current_deal_player = 0 # NEW ATTRIBUTE + + # OpenSpiel (PySpiel) API functions are below. This is the standard set that + # should be implemented by every sequential-move game with chance. + + def current_player(self): + """Returns id of the next player to move, or TERMINAL if game is over.""" + if self._game_over: + return pyspiel.PlayerId.TERMINAL + if len(self.deck) > 0: # deal phase + return pyspiel.PlayerId.CHANCE + return self._next_player + + def _legal_actions(self, player): + """Returns a list of legal actions, sorted in ascending order.""" + assert player >= 0 + assert player == self._next_player + return self.get_legal_actions(player) + + def get_legal_actions(self, player): + """Returns a list of legal actions.""" + assert player >= 0 + + actions = [] + hand = self.hands[player] + + # first move, no open edges + if not self.open_edges: + for tile in hand: + actions.append(Action(player, tile, None)) + else: + for tile in hand: + if tile[0] in self.open_edges: + actions.append(Action(player, tile, tile[0])) + if tile[0] != tile[1] and tile[1] in self.open_edges: + actions.append(Action(player, tile, tile[1])) + + actions_idx = [_ACTIONS_STR.index(str(action)) for action in actions] + actions_idx.sort() + return actions_idx + + def chance_outcomes(self): + """Returns the possible chance outcomes and their probabilities.""" + assert self.is_chance_node() + p = 1.0 / len(self.deck) + return [(_DECK.index(i), p) for i in self.deck] + + def _apply_action(self, action): + """Applies the specified action to the state.""" + if self.is_chance_node(): + # Deal tiles to players in order (0, 1, 2, 3) + hand_to_add_tile = self.hands[self._current_deal_player] + tile = _DECK[action] + self.deck.remove(tile) + hand_to_add_tile.append(tile) + self._current_deal_player = (self._current_deal_player + 1) % 4 + + # Check if all hands are of _HAND_SIZE + if not all(len(hand) == _HAND_SIZE for hand in self.hands): + return # more tiles to deal + + for hand in self.hands: + hand.sort() + + self._next_player = 0 + else: + action = _ACTIONS[action] + self.actions_history.append(action) + my_idx = self.current_player() + my_hand = self.hands[my_idx] + my_hand.remove(action.tile) + self.update_open_edges(action) + + if not my_hand: + self._game_over = True # player played his last tile + return + + for i in range(1,5): + next_idx = (my_idx + i) % 4 + next_legal_actions = self.get_legal_actions(next_idx) + + if next_legal_actions: + self._next_player = next_idx + return + + # Check if a team has played all their tiles. + if not (self.hands[0] or self.hands[2]) or not (self.hands[1] or self.hands[3]): + self._game_over = True + return + + # all players are blocked. Game is stuck. + self._game_over = True + + def update_open_edges(self, action): + if not self.open_edges: + self.open_edges = list(action.tile) + else: + self.open_edges.remove(action.edge) + new_edge = ( + action.tile[0] if action.tile[0] != action.edge else action.tile[1] + ) + self.open_edges.append(new_edge) + + self.open_edges.sort() + + def _action_to_string(self, player, action): + """Action -> string.""" + if player == pyspiel.PlayerId.CHANCE: + return f"Deal {_DECK[action]}" + return _ACTIONS_STR[action] + + def is_terminal(self): + """Returns True if the game is over.""" + return self._game_over + + def returns(self): + """Total reward for each player over the course of the game so far.""" + if not self.is_terminal(): + return [0 for _ in range(_NUM_PLAYERS)] + + sum_of_pips0 = sum(t[0] + t[1] for t in (self.hands[0] + self.hands[2])) + sum_of_pips1 = sum(t[0] + t[1] for t in (self.hands[1] + self.hands[3])) + + if sum_of_pips1 == sum_of_pips0: + return [0 for _ in range(_NUM_PLAYERS)] + + if sum_of_pips1 > sum_of_pips0: + return [sum_of_pips1, -sum_of_pips1, sum_of_pips1, -sum_of_pips1] + return [-sum_of_pips0, sum_of_pips0, -sum_of_pips0, sum_of_pips0] + + def __str__(self): + """String for debug purposes. No particular semantics are required.""" + hand0 = [str(c) for c in self.hands[0]] + hand1 = [str(c) for c in self.hands[1]] + hand2 = [str(c) for c in self.hands[2]] + hand3 = [str(c) for c in self.hands[3]] + history = [str(a) for a in self.actions_history] + board = self.draw_board() + return ( + f"hand0:{hand0}\n" + f"hand1:{hand1}\n" + f"hand2:{hand2}\n" + f"hand3:{hand3}\n\n" + # f"history:{history}\n" + f"board: {board}" + ) + + def draw_board(self): + '''Draw the board' in a human readable format''' + board = collections.deque() + current_open_edges = None + for action in self.actions_history: + # check if action is played on an empty board + if action.edge is None: + board.append(action.tile) + current_open_edges = list(action.tile) + # check if action edge matches last played edge in the left or right + elif action.edge == current_open_edges[0]: + # invert the tile if the edge is on the right: + tile = (action.tile[1], action.tile[0]) if action.tile[0] == current_open_edges[0] else action.tile + board.appendleft(tile) + + elif action.edge == current_open_edges[1]: + # invert the tile if the edge is on the left: + tile = (action.tile[1], action.tile[0]) if action.tile[1] == current_open_edges[1] else action.tile + board.append(tile) + + current_open_edges = board[0][0], board[-1][1] + + assert len(board) == len(self.actions_history) # TODO: move this to a test + return list(board) + + +class DominoesObserver: + """Observer, conforming to the PyObserver interface (see observation.py).""" + + def __init__(self, iig_obs_type, params): + """Initializes an empty observation tensor.""" + if params: + raise ValueError(f"Observation parameters not supported; passed {params}") + + # Determine which observation pieces we want to include. + pieces = [("player", 4, (4,))] + + if iig_obs_type.private_info == pyspiel.PrivateInfoType.SINGLE_PLAYER: + # each tile is represented using 3 integers: + # 2 for the pips, and 1 to distinguish between (0,0) to empty slot for + # a tile. + pieces.append(("hand", 21, (7, 3))) # TODO: what does the 21 mean? + + if iig_obs_type.public_info: + if iig_obs_type.perfect_recall: + # list of all played actions, each action is represented using 5 + # integers: + # 2 for the played tile (0-6), + # 1 for the covered edge (0-6), + # 1 for which player (0,1,3,4), + # 1 to distinguish between actual move and empty slot for a move (0/1). + # the None (play on an empty board) edge represented using 0. + pieces.append(("actions_history", 125, (25, 5))) + else: + # last action, represented in the same way as in "actions_history" + # but without the last integer. + pieces.append(("last_action", 4, (4,))) + pieces.append(("hand_sizes", 4, (4,))) + + # Build the single flat tensor. + total_size = sum(size for name, size, shape in pieces) + self.tensor = np.zeros(total_size, np.float32) + + # Build the named & reshaped views of the bits of the flat tensor. + self.dict = {} + index = 0 + for name, size, shape in pieces: + self.dict[name] = self.tensor[index : index + size].reshape(shape) + index += size + + def set_from(self, state, player): + """Updates `tensor` and `dict` to reflect `state` from PoV of `player`.""" + + self.tensor.fill(0) + + if "player" in self.dict: + self.dict["player"][player] = 1 + self.dict["player"][1 - player] = 0 + + if "hand_sizes" in self.dict: + my_hand_size = len(state.hands[player]) + opp_hand_size = len(state.hands[1 - player]) + self.dict["hand_sizes"][0] = my_hand_size + self.dict["hand_sizes"][1] = opp_hand_size + + if "edges" in self.dict: + if state.open_edges: + self.dict["edges"][0] = state.open_edges[0] + self.dict["edges"][1] = state.open_edges[1] + else: + self.dict["edges"][0] = 0.0 + self.dict["edges"][1] = 0.0 + + if "hand" in self.dict: + for i, tile in enumerate(state.hands[player]): + self.dict["hand"][i][0] = tile[0] + self.dict["hand"][i][1] = tile[1] + self.dict["hand"][i][2] = 1.0 + + if "actions_history" in self.dict: + for i, action in enumerate(state.actions_history): + self.dict["actions_history"][i][0] = action.tile[0] + self.dict["actions_history"][i][1] = action.tile[1] + self.dict["actions_history"][i][2] = ( + action.edge if action.edge is not None else 0.0 + ) + self.dict["actions_history"][i][3] = action.player + self.dict["actions_history"][i][4] = 1.0 + + if "last_action" in self.dict: + if state.actions_history: + action = state.actions_history[-1] + self.dict["last_action"][0] = action.tile[0] + self.dict["last_action"][1] = action.tile[1] + self.dict["last_action"][2] = ( + action.edge if action.edge is not None else 0.0 + ) + self.dict["last_action"][3] = action.player + + def string_from(self, state, player): + """Observation of `state` from the PoV of `player`, as a string.""" + pieces = [] + if "player" in self.dict: + pieces.append(f"p{player}") + if "hand" in self.dict: + pieces.append(f"hand:{state.hands[player]}") + if "actions_history" in self.dict: + pieces.append(f"history:{str(state.actions_history)}") + if "last_action" in self.dict and state.actions_history: + pieces.append(f"last_action:{str(state.actions_history[-1])}") + return " ".join(str(p) for p in pieces) + + +# Register the game with the OpenSpiel library + +pyspiel.register_game(_GAME_TYPE, DominoesGame) \ No newline at end of file diff --git a/open_spiel/python/games/dominoes_test.py b/open_spiel/python/games/dominoes_test.py new file mode 100644 index 0000000000..ed7eea5986 --- /dev/null +++ b/open_spiel/python/games/dominoes_test.py @@ -0,0 +1,146 @@ +# Copyright 2019 DeepMind Technologies Limited +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Lint as python3 +"""Tests for Middle Eastern Python Dominoes.""" + + +from absl.testing import absltest +from open_spiel.python.games import dominoes +import pyspiel + + +class DominoesTest(absltest.TestCase): + + def test_game_from_cc(self): + """Runs our standard game tests, checking API consistency.""" + game = pyspiel.load_game("python_dominoes") + pyspiel.random_sim_test(game, num_sims=100, serialize=False, verbose=True) + + def test_single_deterministic_game_1(self): + """Runs a single game where tiles and actions chose deterministically.""" + game = pyspiel.load_game("python_dominoes") + state = game.new_initial_state() + hand0 = [(1.0, 3.0), (0.0, 5.0), (1.0, 1.0), (2.0, 3.0), (4.0, 5.0), (3.0, 5.0), (0.0, 1.0)] + hand1= [(2.0, 5.0), (3.0, 4.0), (2.0, 2.0), (0.0, 4.0), (3.0, 3.0), (2.0, 6.0), (1.0, 6.0)] + hand2 = [(5.0, 6.0), (6.0, 6.0), (1.0, 4.0), (2.0, 4.0), (4.0, 4.0), (0.0, 0.0), (1.0, 5.0)] + hand3 = [(4.0, 6.0), (0.0, 2.0), (0.0, 3.0), (3.0, 6.0), (5.0, 5.0), (1.0, 2.0), (0.0, 6.0)] + + + self.deal_hands(state, [hand0, hand1, hand2, hand3]) + + self.apply_action(state, dominoes.Action(0, (3.0, 4.0), None)) + self.apply_action(state, dominoes.Action(1, (2.0, 4.0), 4.0)) + self.apply_action(state, dominoes.Action(2, (1.0, 2.0), 2.0)) + self.apply_action(state, dominoes.Action(3, (0.0, 3.0), 3.0)) + + self.apply_action(state, dominoes.Action(0, (1.0, 3.0), 1.0)) + self.apply_action(state, dominoes.Action(1, (3.0, 5.0), 3.0)) + self.apply_action(state, dominoes.Action(2, (0.0, 2.0), 0.0)) + self.apply_action(state, dominoes.Action(3, (2.0, 5.0), 2.0)) + + self.apply_action(state, dominoes.Action(0, (1.0, 5.0), 5.0)) + self.apply_action(state, dominoes.Action(1, (0.0, 5.0), 5.0)) + self.apply_action(state, dominoes.Action(2, (1.0, 1.0), 1.0)) + self.apply_action(state, dominoes.Action(3, (0.0, 6.0), 0.0)) + + self.apply_action(state, dominoes.Action(0, (3.0, 6.0), 6.0)) + self.apply_action(state, dominoes.Action(1, (1.0, 6.0), 1.0)) + self.apply_action(state, dominoes.Action(2, (5.0, 6.0), 6.0)) + self.apply_action(state, dominoes.Action(3, (3.0, 3.0), 3.0)) + + self.apply_action(state, dominoes.Action(0, (4.0, 5.0), 5.0)) + self.apply_action(state, dominoes.Action(1, (4.0, 6.0), 4.0)) + self.apply_action(state, dominoes.Action(3, (6.0, 6.0), 6.0)) + + self.apply_action(state, dominoes.Action(0, (2.0, 6.0), 6.0)) + self.apply_action(state, dominoes.Action(1, (2.0, 2.0), 2.0)) + self.apply_action(state, dominoes.Action(3, (2.0, 3.0), 3.0)) + # Game is stuck! No player can play any tile as all 2.0s are played + + + self.assertTrue(state.is_terminal()) + self.assertEqual(state.returns()[0], -18) + self.assertEqual(state.returns()[1], 18) + self.assertEqual(state.returns()[2], -18) + self.assertEqual(state.returns()[3], 18) + + def test_single_deterministic_game_2(self): + """Runs a single game where tiles and actions chose deterministically.""" + game = pyspiel.load_game("python_dominoes") + state = game.new_initial_state() + hand0 = [(0.0, 6.0), (3.0, 6.0), (1.0, 3.0), (1.0, 4.0), (5.0, 5.0), (0.0, 0.0), (2.0, 6.0)] + hand1= [(1.0, 5.0), (2.0, 2.0), (0.0, 2.0), (0.0, 3.0), (4.0, 5.0), (6.0, 6.0), (5.0, 6.0)] + hand2 = [(2.0, 4.0), (3.0, 4.0), (3.0, 3.0), (0.0, 4.0), (1.0, 1.0), (1.0, 6.0), (3.0, 5.0)] + hand3 = [(0.0, 5.0), (0.0, 1.0), (4.0, 4.0), (2.0, 3.0), (1.0, 2.0), (2.0, 5.0), (4.0, 6.0)] + + self.deal_hands(state, [hand0, hand1, hand2, hand3]) + + self.apply_action(state, dominoes.Action(0, (0.0, 6.0), None)) + self.apply_action(state, dominoes.Action(1, (0.0, 5.0), 0.0)) + self.apply_action(state, dominoes.Action(2, (2.0, 6.0), 6.0)) + self.apply_action(state, dominoes.Action(3, (1.0, 5.0), 5.0)) + + self.apply_action(state, dominoes.Action(0, (2.0, 3.0), 2.0)) + self.apply_action(state, dominoes.Action(1, (3.0, 6.0), 3.0)) + self.apply_action(state, dominoes.Action(2, (1.0, 3.0), 1.0)) + self.apply_action(state, dominoes.Action(3, (1.0, 6.0), 6.0)) + + self.apply_action(state, dominoes.Action(0, (3.0, 5.0),3.0)) + self.apply_action(state, dominoes.Action(1, (5.0, 6.0), 5.0)) + self.apply_action(state, dominoes.Action(2, (1.0, 1.0), 1.0)) + self.apply_action(state, dominoes.Action(3, (4.0, 6.0), 6.0)) + + # skipped player 0 (has no 4.0 or 1.0 to play) + self.apply_action(state, dominoes.Action(1, (0.0, 4.0), 4.0)) + self.apply_action(state, dominoes.Action(2, (0.0, 1.0), 1.0)) + # skipped player 3 (has no 0.0s to play) + + # skipped over player 0 (has no 0.0s to play) + self.apply_action(state, dominoes.Action(1, (0.0, 0.0), 0.0)) + self.apply_action(state, dominoes.Action(2, (0.0, 3.0), 0.0)) + self.apply_action(state, dominoes.Action(3, (3.0, 4.0), 3.0)) + + # skipped over player 0 (has no 0.0s nor 4.0s to play) + self.apply_action(state, dominoes.Action(1, (0.0, 2.0), 0.0)) + self.apply_action(state, dominoes.Action(2, (2.0, 4.0), 2.0)) + self.apply_action(state, dominoes.Action(3, (1.0, 4.0), 4.0)) + + # skipped over player 0 (has no 1.0s nor 4.0s to play) + self.apply_action(state, dominoes.Action(1, (1.0, 2.0), 1.0)) + # player 1 won (no more tiles to play) + + + + self.assertTrue(state.is_terminal()) + self.assertEqual(state.returns()[0], -39) + self.assertEqual(state.returns()[1], 39) + self.assertEqual(state.returns()[2], -39) + self.assertEqual(state.returns()[3], 39) + + @staticmethod + def apply_action(state, action): + actions_str = dominoes._ACTIONS_STR + state.apply_action(actions_str.index(str(action))) + + @staticmethod + def deal_hands(state, hands): + deck = dominoes._DECK + for hand in hands: + for t in hand: + state.apply_action(deck.index(t)) + + +if __name__ == "__main__": + absltest.main() From 342492080e80728c8d00176b629c5f272c76a7a1 Mon Sep 17 00:00:00 2001 From: Brunozml Date: Tue, 23 Apr 2024 11:10:21 +0200 Subject: [PATCH 2/6] updated boilerplate code. Added game to games documentation --- docs/games.md | 12 ++++++++++++ open_spiel/python/CMakeLists.txt | 1 + open_spiel/python/games/__init__.py | 1 + open_spiel/python/games/dominoes.py | 2 +- open_spiel/python/games/dominoes_test.py | 2 +- open_spiel/python/tests/pyspiel_test.py | 1 + 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/games.md b/docs/games.md index c757f4577b..08003882bc 100644 --- a/docs/games.md +++ b/docs/games.md @@ -44,6 +44,7 @@ Status | Game 🔶 | [Hex](#hex) 🔶 | [Kriegspiel](#Kriegspiel) 🟢 | [Kuhn poker](#kuhn-poker) +🔶 | [Latin American Dominoes](#latin-american-dominoes) 🔶 | [Laser Tag](#laser-tag) 🟢 | [Leduc poker](#leduc-poker) 🔶 | [Lewis Signaling](#lewis-signaling) @@ -480,6 +481,17 @@ Status | Game * 2 players. * [Wikipedia](https://en.wikipedia.org/wiki/Kuhn_poker) +### Latin American Dominoes + +* Team version of dominoes. +* Consists of 28 tiles, featuring all combinations of spot counts (also called + pips or dots) between zero and six. +* Traditional game. +* Non-deterministic. +* Imperfect information. +* 4 players. +* [Wikipedia](https://en.wikipedia.org/wiki/Dominoes#Latin_American_Version) + ### Laser Tag * Agents see a local part of the grid, and attempt to tag each other with diff --git a/open_spiel/python/CMakeLists.txt b/open_spiel/python/CMakeLists.txt index 3c99192f3b..5aa135168e 100644 --- a/open_spiel/python/CMakeLists.txt +++ b/open_spiel/python/CMakeLists.txt @@ -219,6 +219,7 @@ set(PYTHON_TESTS ${PYTHON_TESTS} games/chat_game_test.py games/chat_games/envs/base_envs/base_envs_test.py games/data_test.py + games/dominoes_test.py games/dynamic_routing_test.py games/dynamic_routing_utils_test.py games/liars_poker_test.py diff --git a/open_spiel/python/games/__init__.py b/open_spiel/python/games/__init__.py index e7b28f1008..438a9e317c 100644 --- a/open_spiel/python/games/__init__.py +++ b/open_spiel/python/games/__init__.py @@ -29,6 +29,7 @@ from open_spiel.python.games import block_dominoes from open_spiel.python.games import chat_game from open_spiel.python.games import dynamic_routing +from open_spiel.python.games import dominoes from open_spiel.python.games import iterated_prisoners_dilemma from open_spiel.python.games import kuhn_poker from open_spiel.python.games import liars_poker diff --git a/open_spiel/python/games/dominoes.py b/open_spiel/python/games/dominoes.py index f7b7b446ce..5581d6fae6 100644 --- a/open_spiel/python/games/dominoes.py +++ b/open_spiel/python/games/dominoes.py @@ -15,7 +15,7 @@ # Lint as python3 """ Dominoes (4 players) implemented in Python. -https://en.wikipedia.org/wiki/Dominoes#Middle_Eastern_Version +https://en.wikipedia.org/wiki/Dominoes#Latin_American_Version """ diff --git a/open_spiel/python/games/dominoes_test.py b/open_spiel/python/games/dominoes_test.py index ed7eea5986..d3607b802c 100644 --- a/open_spiel/python/games/dominoes_test.py +++ b/open_spiel/python/games/dominoes_test.py @@ -13,7 +13,7 @@ # limitations under the License. # Lint as python3 -"""Tests for Middle Eastern Python Dominoes.""" +"""Tests for Latin American Python Dominoes.""" from absl.testing import absltest diff --git a/open_spiel/python/tests/pyspiel_test.py b/open_spiel/python/tests/pyspiel_test.py index b4524936f1..46519a50cc 100644 --- a/open_spiel/python/tests/pyspiel_test.py +++ b/open_spiel/python/tests/pyspiel_test.py @@ -107,6 +107,7 @@ "phantom_ttt_ir", "pig", "python_block_dominoes", + "python_dominoes", "python_dynamic_routing", "python_iterated_prisoners_dilemma", "python_mfg_crowd_avoidance", From f161762f6dd8721d2a38ecf0e4f1ed562b991a3b Mon Sep 17 00:00:00 2001 From: Brunozml Date: Tue, 23 Apr 2024 11:24:50 +0200 Subject: [PATCH 3/6] resolved changes to latest games.md version --- docs/games.md | 177 +++++++++++++++++++++++++++----------------------- 1 file changed, 96 insertions(+), 81 deletions(-) diff --git a/docs/games.md b/docs/games.md index 5466244b17..c898c82e58 100644 --- a/docs/games.md +++ b/docs/games.md @@ -6,87 +6,102 @@ ❌: known issues (see notes below and code for details). -Status | Game ----------------- | ---------------------------- -🔶 | [2048](#2048) -🔶 | [Amazons](#amazons) -🔶 | [Atari](#atari) -🟢 | [Backgammon](#backgammon) -🔶 | [Bargaining](#bargaining) -🔶 | [Battleship](#battleship) -🔶 | [Blackjack](#blackjack) -🔶 | [Block Dominoes](#block-dominoes) -🟢 | [Breakthrough](#breakthrough) -🟢 | [Bridge](#bridge) -🟢 | [(Uncontested) Bridge bidding](#uncontested-bridge-bidding) -🔶 | [Catch](#catch) -🔶 | [Checkers](#checkers) -🔶 | [Cliff Walking](#cliff-walking) -🔶 | [Clobber](#clobber) -🔶 | [Coin Game](#coin-game) -🔶 | [Colored Trails](#colored-trails) -🟢 | [Connect Four](#connect-four) -🔶 | [Cooperative Box-Pushing](#cooperative-box-pushing) -🟢 | [Chess](#chess) -🔶 | [Crazy Eights](#crazy-eights) -🔶 | [Dark Hex](#dark-hex) -🔶 | [Deep Sea](#deep-sea) -🟢 | [Dots and Boxes](#dots-and-boxes) -🔶 | [Dou Dizhu](#dou-dizhu) -🔶 | [Euchre](#euchre) -🟢 | [First-price Sealed-Bid Auction](#first-price-sealed-bid-auction) -🟢 | [Gin Rummy](#gin-rummy) -🟢 | [Go](#go) -🟢 | [Goofspiel](#goofspiel) -🟢 | [Hanabi](#hanabi) -🟢 | [Havannah](#havannah) -🟢 | [Hearts](#hearts) -🔶 | [Hex](#hex) -🔶 | [Kriegspiel](#Kriegspiel) -🟢 | [Kuhn poker](#kuhn-poker) -🔶 | [Laser Tag](#laser-tag) -🟢 | [Leduc poker](#leduc-poker) -🔶 | [Lewis Signaling](#lewis-signaling) -🟢 | [Liar's Dice](#liars-dice) -🔶 | [Liar's Poker](#liars-poker) -🔶 | [Mensch ärgere Dich nicht](#mensch-aergere-dich-nicht) -🔶 | [Mancala](#mancala) -🔶 | [Markov Soccer](#markov-soccer) -🟢 | [Matching Pennies (Three-player)](#matching-pennies-three-player) -🟢 | [Mean Field Game : garnet](#mean_field_game_garnet) -🟢 | [Mean Field Game : crowd modelling](#mean_field_game_crowd_modelling) -🟢 | [Mean Field Game : crowd modelling 2d](#mean_field_game_crowd_modelling_2d) -🟢 | [Mean Field Game : linear quadratic](#mean-field-game--linear-quadratic) -🟢 | [Mean Field Game : predator prey](#mean_field_game_predator_prey) -🟢 | [Mean Field Game : routing](#mean-field-game--routing) -🔶 | [Morpion Solitaire (4D)](#morpion-solitaire-4d) -🟢 | [Negotiation](#negotiation) -🔶 | [Nim](#nim) -🔶 | [Nine men's morris](#nine_mens_morris) -🔶 | [Oh Hell](#oh-hell) -🟢 | [Oshi-Zumo](#oshi-zumo) -🟢 | [Oware](#oware) -🔶 | [Pathfinding](#pathfinding) -🟢 | [Pentago](#pentago) -🔶 | [Phantom Go](#phantom-go) -🔶 | [Phantom Tic-Tac-Toe](#phantom-tic-tac-toe) -🟢 | [Pig](#pig) -🟢 | [Prisoner's Dilemma](#prisoner's-dilemma) -❌ | [Poker (Hold 'em)](#poker-hold-em) -❌ | [Quoridor](#quoridor) -❌ | [Reconnaissance Blind Chess](#reconnaissance-blind-chess) -🟢 | [Routing game](#routing-game) -🔶 | [Sheriff](#sheriff) -🔶 | [Slovenian Tarok](#slovenian-tarok) -🔶 | [Skat (simplified bidding)](#skat-simplified-bidding) -🔶 | [Solitaire (K+)](#solitaire-k) -🟢 | [Tic-Tac-Toe](#tic-tac-toe) -🟢 | [Tiny Bridge](#tiny-bridge) -🟢 | [Tiny Hanabi](#tiny-hanabi) -🟢 | [Trade Comm](#trade-comm) -🔶 | [Ultimate Tic-Tac-Toe](#ultimate-tic-tac-toe) -🔶 | [Weighted Voting Games](#weighted-voting-games) -🟢 | [Y](#y) +| Status | Game | +| ------ | ----------------------------------------------- | +| 🔶 | [2048](#2048) | +| 🔶 | [Amazons](#amazons) | +| 🔶 | [Atari](#atari) | +| 🟢 | [Backgammon](#backgammon) | +| 🔶 | [Bargaining](#bargaining) | +| 🔶 | [Battleship](#battleship) | +| 🔶 | [Blackjack](#blackjack) | +| 🔶 | [Block Dominoes](#block-dominoes) | +| 🟢 | [Breakthrough](#breakthrough) | +| 🟢 | [Bridge](#bridge) | +| 🟢 | [(Uncontested) Bridge | +: : bidding](#uncontested-bridge-bidding) : +| 🔶 | [Catch](#catch) | +| 🔶 | [Checkers](#checkers) | +| 🔶 | [Cliff Walking](#cliff-walking) | +| 🔶 | [Clobber](#clobber) | +| 🔶 | [Coin Game](#coin-game) | +| 🔶 | [Colored Trails](#colored-trails) | +| 🟢 | [Connect Four](#connect-four) | +| 🔶 | [Cooperative | +: : Box-Pushing](#cooperative-box-pushing) : +| 🟢 | [Chess](#chess) | +| 🔶 | [Crazy Eights](#crazy-eights) | +| 🔶 | [Dark Hex](#dark-hex) | +| 🔶 | [Deep Sea](#deep-sea) | +| 🟢 | [Dots and Boxes](#dots-and-boxes) | +| 🔶 | [Dou Dizhu](#dou-dizhu) | +| 🔶 | [Euchre](#euchre) | +| 🟢 | [First-price Sealed-Bid | +: : Auction](#first-price-sealed-bid-auction) : +| 🟢 | [Gin Rummy](#gin-rummy) | +| 🟢 | [Go](#go) | +| 🟢 | [Goofspiel](#goofspiel) | +| 🟢 | [Hanabi](#hanabi) | +| 🟢 | [Havannah](#havannah) | +| 🟢 | [Hearts](#hearts) | +| 🔶 | [Hex](#hex) | +| 🔶 | [Kriegspiel](#Kriegspiel) | +| 🟢 | [Kuhn poker](#kuhn-poker) | +| 🔶 | [Latin American Dominoes](#latin-american-dominoes)| +| 🔶 | [Laser Tag](#laser-tag) | +| 🟢 | [Leduc poker](#leduc-poker) | +| 🔶 | [Lewis Signaling](#lewis-signaling) | +| 🟢 | [Liar's Dice](#liars-dice) | +| 🔶 | [Liar's Poker](#liars-poker) | +| 🔶 | [Mensch ärgere Dich | +: : nicht](#mensch-aergere-dich-nicht) : +| 🔶 | [Mancala](#mancala) | +| 🔶 | [Markov Soccer](#markov-soccer) | +| 🟢 | [Matching Pennies | +: : (Three-player)](#matching-pennies-three-player) : +| 🟢 | [Mean Field Game : | +: : garnet](#mean_field_game_garnet) : +| 🟢 | [Mean Field Game : crowd | +: : modelling](#mean_field_game_crowd_modelling) : +| 🟢 | [Mean Field Game : crowd modelling | +: : 2d](#mean_field_game_crowd_modelling_2d) : +| 🟢 | [Mean Field Game : linear | +: : quadratic](#mean-field-game--linear-quadratic) : +| 🟢 | [Mean Field Game : predator | +: : prey](#mean_field_game_predator_prey) : +| 🟢 | [Mean Field Game : | +: : routing](#mean-field-game--routing) : +| 🔶 | [Morpion Solitaire (4D)](#morpion-solitaire-4d) | +| 🟢 | [Negotiation](#negotiation) | +| 🔶 | [Nim](#nim) | +| 🔶 | [Nine men's morris](#nine_mens_morris) | +| 🔶 | [Oh Hell](#oh-hell) | +| 🟢 | [Oshi-Zumo](#oshi-zumo) | +| 🟢 | [Oware](#oware) | +| 🔶 | [Pathfinding](#pathfinding) | +| 🟢 | [Pentago](#pentago) | +| 🔶 | [Phantom Go](#phantom-go) | +| 🔶 | [Phantom Tic-Tac-Toe](#phantom-tic-tac-toe) | +| 🟢 | [Pig](#pig) | +| 🟢 | [Prisoner's Dilemma](#prisoner's-dilemma) | +| ❌ | [Poker (Hold 'em)](#poker-hold-em) | +| ❌ | [Quoridor](#quoridor) | +| ❌ | [Reconnaissance Blind | +: : Chess](#reconnaissance-blind-chess) : +| 🟢 | [Routing game](#routing-game) | +| 🔶 | [Sheriff](#sheriff) | +| 🔶 | [Slovenian Tarok](#slovenian-tarok) | +| 🔶 | [Skat (simplified | +: : bidding)](#skat-simplified-bidding) : +| 🔶 | [Solitaire (K+)](#solitaire-k) | +| 🟢 | [Tic-Tac-Toe](#tic-tac-toe) | +| 🟢 | [Tiny Bridge](#tiny-bridge) | +| 🟢 | [Tiny Hanabi](#tiny-hanabi) | +| 🟢 | [Trade Comm](#trade-comm) | +| 🔶 | [TwixT](#twixt) | +| 🔶 | [Ultimate Tic-Tac-Toe](#ultimate-tic-tac-toe) | +| 🔶 | [Weighted Voting Games](#weighted-voting-games) | +| 🟢 | [Y](#y) | ## Details From db142a46cedbb0b6477dd5ddb5927f63bbf5c447 Mon Sep 17 00:00:00 2001 From: Brunozml Date: Wed, 24 Apr 2024 09:32:29 +0200 Subject: [PATCH 4/6] renamed game to team_dominoes --- open_spiel/python/CMakeLists.txt | 2 +- open_spiel/python/games/__init__.py | 2 +- .../games/{dominoes.py => team_dominoes.py} | 7 +- ...dominoes_test.py => team_dominoes_test.py} | 102 +++++++++--------- open_spiel/python/tests/pyspiel_test.py | 2 +- 5 files changed, 57 insertions(+), 58 deletions(-) rename open_spiel/python/games/{dominoes.py => team_dominoes.py} (98%) rename open_spiel/python/games/{dominoes_test.py => team_dominoes_test.py} (51%) diff --git a/open_spiel/python/CMakeLists.txt b/open_spiel/python/CMakeLists.txt index f2205a6838..a0da0c3ffc 100644 --- a/open_spiel/python/CMakeLists.txt +++ b/open_spiel/python/CMakeLists.txt @@ -219,7 +219,7 @@ set(PYTHON_TESTS ${PYTHON_TESTS} games/chat_game_test.py games/chat_games/envs/base_envs/base_envs_test.py games/data_test.py - games/dominoes_test.py + games/team_dominoes_test.py games/dynamic_routing_test.py games/dynamic_routing_utils_test.py games/liars_poker_test.py diff --git a/open_spiel/python/games/__init__.py b/open_spiel/python/games/__init__.py index 438a9e317c..33945e0673 100644 --- a/open_spiel/python/games/__init__.py +++ b/open_spiel/python/games/__init__.py @@ -29,8 +29,8 @@ from open_spiel.python.games import block_dominoes from open_spiel.python.games import chat_game from open_spiel.python.games import dynamic_routing -from open_spiel.python.games import dominoes from open_spiel.python.games import iterated_prisoners_dilemma from open_spiel.python.games import kuhn_poker from open_spiel.python.games import liars_poker +from open_spiel.python.games import team_dominoes from open_spiel.python.games import tic_tac_toe diff --git a/open_spiel/python/games/dominoes.py b/open_spiel/python/games/team_dominoes.py similarity index 98% rename from open_spiel/python/games/dominoes.py rename to open_spiel/python/games/team_dominoes.py index 5581d6fae6..2e4a220020 100644 --- a/open_spiel/python/games/dominoes.py +++ b/open_spiel/python/games/team_dominoes.py @@ -66,8 +66,8 @@ def create_possible_actions(): _MAX_GAME_LENGTH = 28 _GAME_TYPE = pyspiel.GameType( - short_name="python_dominoes", - long_name="Python Dominoes (4 players)", + short_name="python_team_dominoes", + long_name="Python Team Dominoes (4 players)", dynamics=pyspiel.GameType.Dynamics.SEQUENTIAL, chance_mode=pyspiel.GameType.ChanceMode.EXPLICIT_STOCHASTIC, information=pyspiel.GameType.Information.IMPERFECT_INFORMATION, @@ -310,8 +310,7 @@ def __init__(self, iig_obs_type, params): # each tile is represented using 3 integers: # 2 for the pips, and 1 to distinguish between (0,0) to empty slot for # a tile. - pieces.append(("hand", 21, (7, 3))) # TODO: what does the 21 mean? - + pieces.append(("hand", 21, (7, 3))) # 7 tiles per hand if iig_obs_type.public_info: if iig_obs_type.perfect_recall: # list of all played actions, each action is represented using 5 diff --git a/open_spiel/python/games/dominoes_test.py b/open_spiel/python/games/team_dominoes_test.py similarity index 51% rename from open_spiel/python/games/dominoes_test.py rename to open_spiel/python/games/team_dominoes_test.py index d3607b802c..f178d2041d 100644 --- a/open_spiel/python/games/dominoes_test.py +++ b/open_spiel/python/games/team_dominoes_test.py @@ -17,7 +17,7 @@ from absl.testing import absltest -from open_spiel.python.games import dominoes +from open_spiel.python.games import team_dominoes import pyspiel @@ -40,33 +40,33 @@ def test_single_deterministic_game_1(self): self.deal_hands(state, [hand0, hand1, hand2, hand3]) - self.apply_action(state, dominoes.Action(0, (3.0, 4.0), None)) - self.apply_action(state, dominoes.Action(1, (2.0, 4.0), 4.0)) - self.apply_action(state, dominoes.Action(2, (1.0, 2.0), 2.0)) - self.apply_action(state, dominoes.Action(3, (0.0, 3.0), 3.0)) - - self.apply_action(state, dominoes.Action(0, (1.0, 3.0), 1.0)) - self.apply_action(state, dominoes.Action(1, (3.0, 5.0), 3.0)) - self.apply_action(state, dominoes.Action(2, (0.0, 2.0), 0.0)) - self.apply_action(state, dominoes.Action(3, (2.0, 5.0), 2.0)) - - self.apply_action(state, dominoes.Action(0, (1.0, 5.0), 5.0)) - self.apply_action(state, dominoes.Action(1, (0.0, 5.0), 5.0)) - self.apply_action(state, dominoes.Action(2, (1.0, 1.0), 1.0)) - self.apply_action(state, dominoes.Action(3, (0.0, 6.0), 0.0)) - - self.apply_action(state, dominoes.Action(0, (3.0, 6.0), 6.0)) - self.apply_action(state, dominoes.Action(1, (1.0, 6.0), 1.0)) - self.apply_action(state, dominoes.Action(2, (5.0, 6.0), 6.0)) - self.apply_action(state, dominoes.Action(3, (3.0, 3.0), 3.0)) - - self.apply_action(state, dominoes.Action(0, (4.0, 5.0), 5.0)) - self.apply_action(state, dominoes.Action(1, (4.0, 6.0), 4.0)) - self.apply_action(state, dominoes.Action(3, (6.0, 6.0), 6.0)) - - self.apply_action(state, dominoes.Action(0, (2.0, 6.0), 6.0)) - self.apply_action(state, dominoes.Action(1, (2.0, 2.0), 2.0)) - self.apply_action(state, dominoes.Action(3, (2.0, 3.0), 3.0)) + self.apply_action(state, team_dominoes.Action(0, (3.0, 4.0), None)) + self.apply_action(state, team_dominoes.Action(1, (2.0, 4.0), 4.0)) + self.apply_action(state, team_dominoes.Action(2, (1.0, 2.0), 2.0)) + self.apply_action(state, team_dominoes.Action(3, (0.0, 3.0), 3.0)) + + self.apply_action(state, team_dominoes.Action(0, (1.0, 3.0), 1.0)) + self.apply_action(state, team_dominoes.Action(1, (3.0, 5.0), 3.0)) + self.apply_action(state, team_dominoes.Action(2, (0.0, 2.0), 0.0)) + self.apply_action(state, team_dominoes.Action(3, (2.0, 5.0), 2.0)) + + self.apply_action(state, team_dominoes.Action(0, (1.0, 5.0), 5.0)) + self.apply_action(state, team_dominoes.Action(1, (0.0, 5.0), 5.0)) + self.apply_action(state, team_dominoes.Action(2, (1.0, 1.0), 1.0)) + self.apply_action(state, team_dominoes.Action(3, (0.0, 6.0), 0.0)) + + self.apply_action(state, team_dominoes.Action(0, (3.0, 6.0), 6.0)) + self.apply_action(state, team_dominoes.Action(1, (1.0, 6.0), 1.0)) + self.apply_action(state, team_dominoes.Action(2, (5.0, 6.0), 6.0)) + self.apply_action(state, team_dominoes.Action(3, (3.0, 3.0), 3.0)) + + self.apply_action(state, team_dominoes.Action(0, (4.0, 5.0), 5.0)) + self.apply_action(state, team_dominoes.Action(1, (4.0, 6.0), 4.0)) + self.apply_action(state, team_dominoes.Action(3, (6.0, 6.0), 6.0)) + + self.apply_action(state, team_dominoes.Action(0, (2.0, 6.0), 6.0)) + self.apply_action(state, team_dominoes.Action(1, (2.0, 2.0), 2.0)) + self.apply_action(state, team_dominoes.Action(3, (2.0, 3.0), 3.0)) # Game is stuck! No player can play any tile as all 2.0s are played @@ -87,38 +87,38 @@ def test_single_deterministic_game_2(self): self.deal_hands(state, [hand0, hand1, hand2, hand3]) - self.apply_action(state, dominoes.Action(0, (0.0, 6.0), None)) - self.apply_action(state, dominoes.Action(1, (0.0, 5.0), 0.0)) - self.apply_action(state, dominoes.Action(2, (2.0, 6.0), 6.0)) - self.apply_action(state, dominoes.Action(3, (1.0, 5.0), 5.0)) + self.apply_action(state, team_dominoes.Action(0, (0.0, 6.0), None)) + self.apply_action(state, team_dominoes.Action(1, (0.0, 5.0), 0.0)) + self.apply_action(state, team_dominoes.Action(2, (2.0, 6.0), 6.0)) + self.apply_action(state, team_dominoes.Action(3, (1.0, 5.0), 5.0)) - self.apply_action(state, dominoes.Action(0, (2.0, 3.0), 2.0)) - self.apply_action(state, dominoes.Action(1, (3.0, 6.0), 3.0)) - self.apply_action(state, dominoes.Action(2, (1.0, 3.0), 1.0)) - self.apply_action(state, dominoes.Action(3, (1.0, 6.0), 6.0)) + self.apply_action(state, team_dominoes.Action(0, (2.0, 3.0), 2.0)) + self.apply_action(state, team_dominoes.Action(1, (3.0, 6.0), 3.0)) + self.apply_action(state, team_dominoes.Action(2, (1.0, 3.0), 1.0)) + self.apply_action(state, team_dominoes.Action(3, (1.0, 6.0), 6.0)) - self.apply_action(state, dominoes.Action(0, (3.0, 5.0),3.0)) - self.apply_action(state, dominoes.Action(1, (5.0, 6.0), 5.0)) - self.apply_action(state, dominoes.Action(2, (1.0, 1.0), 1.0)) - self.apply_action(state, dominoes.Action(3, (4.0, 6.0), 6.0)) + self.apply_action(state, team_dominoes.Action(0, (3.0, 5.0),3.0)) + self.apply_action(state, team_dominoes.Action(1, (5.0, 6.0), 5.0)) + self.apply_action(state, team_dominoes.Action(2, (1.0, 1.0), 1.0)) + self.apply_action(state, team_dominoes.Action(3, (4.0, 6.0), 6.0)) # skipped player 0 (has no 4.0 or 1.0 to play) - self.apply_action(state, dominoes.Action(1, (0.0, 4.0), 4.0)) - self.apply_action(state, dominoes.Action(2, (0.0, 1.0), 1.0)) + self.apply_action(state, team_dominoes.Action(1, (0.0, 4.0), 4.0)) + self.apply_action(state, team_dominoes.Action(2, (0.0, 1.0), 1.0)) # skipped player 3 (has no 0.0s to play) # skipped over player 0 (has no 0.0s to play) - self.apply_action(state, dominoes.Action(1, (0.0, 0.0), 0.0)) - self.apply_action(state, dominoes.Action(2, (0.0, 3.0), 0.0)) - self.apply_action(state, dominoes.Action(3, (3.0, 4.0), 3.0)) + self.apply_action(state, team_dominoes.Action(1, (0.0, 0.0), 0.0)) + self.apply_action(state, team_dominoes.Action(2, (0.0, 3.0), 0.0)) + self.apply_action(state, team_dominoes.Action(3, (3.0, 4.0), 3.0)) # skipped over player 0 (has no 0.0s nor 4.0s to play) - self.apply_action(state, dominoes.Action(1, (0.0, 2.0), 0.0)) - self.apply_action(state, dominoes.Action(2, (2.0, 4.0), 2.0)) - self.apply_action(state, dominoes.Action(3, (1.0, 4.0), 4.0)) + self.apply_action(state, team_dominoes.Action(1, (0.0, 2.0), 0.0)) + self.apply_action(state, team_dominoes.Action(2, (2.0, 4.0), 2.0)) + self.apply_action(state, team_dominoes.Action(3, (1.0, 4.0), 4.0)) # skipped over player 0 (has no 1.0s nor 4.0s to play) - self.apply_action(state, dominoes.Action(1, (1.0, 2.0), 1.0)) + self.apply_action(state, team_dominoes.Action(1, (1.0, 2.0), 1.0)) # player 1 won (no more tiles to play) @@ -131,12 +131,12 @@ def test_single_deterministic_game_2(self): @staticmethod def apply_action(state, action): - actions_str = dominoes._ACTIONS_STR + actions_str = team_dominoes._ACTIONS_STR state.apply_action(actions_str.index(str(action))) @staticmethod def deal_hands(state, hands): - deck = dominoes._DECK + deck = team_dominoes._DECK for hand in hands: for t in hand: state.apply_action(deck.index(t)) diff --git a/open_spiel/python/tests/pyspiel_test.py b/open_spiel/python/tests/pyspiel_test.py index d58b53fc3d..c25ef77f9f 100644 --- a/open_spiel/python/tests/pyspiel_test.py +++ b/open_spiel/python/tests/pyspiel_test.py @@ -107,7 +107,6 @@ "phantom_ttt_ir", "pig", "python_block_dominoes", - "python_dominoes", "python_dynamic_routing", "python_iterated_prisoners_dilemma", "python_mfg_crowd_avoidance", @@ -116,6 +115,7 @@ "python_mfg_periodic_aversion", "python_mfg_predator_prey", "python_kuhn_poker", + "python_team_dominoes", "python_tic_tac_toe", "python_liars_poker", "quoridor", From 20035e16167bb0308340280514f5e28e2aad63d4 Mon Sep 17 00:00:00 2001 From: Brunozml Date: Wed, 24 Apr 2024 09:40:08 +0200 Subject: [PATCH 5/6] added playthrough and changed games.md to new name. --- docs/games.md | 4 +- .../playthroughs/python_dominoes.txt | 1577 ---------------- .../playthroughs/python_team_dominoes.txt | 1585 +++++++++++++++++ 3 files changed, 1587 insertions(+), 1579 deletions(-) delete mode 100644 open_spiel/integration_tests/playthroughs/python_dominoes.txt create mode 100644 open_spiel/integration_tests/playthroughs/python_team_dominoes.txt diff --git a/docs/games.md b/docs/games.md index c898c82e58..03c4c9f86e 100644 --- a/docs/games.md +++ b/docs/games.md @@ -47,7 +47,6 @@ | 🔶 | [Hex](#hex) | | 🔶 | [Kriegspiel](#Kriegspiel) | | 🟢 | [Kuhn poker](#kuhn-poker) | -| 🔶 | [Latin American Dominoes](#latin-american-dominoes)| | 🔶 | [Laser Tag](#laser-tag) | | 🟢 | [Leduc poker](#leduc-poker) | | 🔶 | [Lewis Signaling](#lewis-signaling) | @@ -94,6 +93,7 @@ | 🔶 | [Skat (simplified | : : bidding)](#skat-simplified-bidding) : | 🔶 | [Solitaire (K+)](#solitaire-k) | +| 🔶 | [Team Dominoes](#team-dominoes) | | 🟢 | [Tic-Tac-Toe](#tic-tac-toe) | | 🟢 | [Tiny Bridge](#tiny-bridge) | | 🟢 | [Tiny Hanabi](#tiny-hanabi) | @@ -495,7 +495,7 @@ * 2 players. * [Wikipedia](https://en.wikipedia.org/wiki/Kuhn_poker) -### Latin American Dominoes +### Team Dominoes * Team version of dominoes. * Consists of 28 tiles, featuring all combinations of spot counts (also called diff --git a/open_spiel/integration_tests/playthroughs/python_dominoes.txt b/open_spiel/integration_tests/playthroughs/python_dominoes.txt deleted file mode 100644 index 263dddf3c1..0000000000 --- a/open_spiel/integration_tests/playthroughs/python_dominoes.txt +++ /dev/null @@ -1,1577 +0,0 @@ -game: python_dominoes - -GameType.chance_mode = ChanceMode.EXPLICIT_STOCHASTIC -GameType.dynamics = Dynamics.SEQUENTIAL -GameType.information = Information.IMPERFECT_INFORMATION -GameType.long_name = "Python Dominoes (4 players)" -GameType.max_num_players = 4 -GameType.min_num_players = 4 -GameType.parameter_specification = [] -GameType.provides_information_state_string = True -GameType.provides_information_state_tensor = True -GameType.provides_observation_string = True -GameType.provides_observation_tensor = True -GameType.provides_factored_observation_string = True -GameType.reward_model = RewardModel.TERMINAL -GameType.short_name = "python_dominoes" -GameType.utility = Utility.ZERO_SUM - -NumDistinctActions() = 308 -PolicyTensorShape() = [308] -MaxChanceOutcomes() = 28 -GetParameters() = {} -NumPlayers() = 4 -MinUtility() = -100.0 -MaxUtility() = 100.0 -UtilitySum() = 0.0 -InformationStateTensorShape() = player: [4], hand: [7, 3], actions_history: [25, 5] -InformationStateTensorLayout() = TensorLayout.CHW -InformationStateTensorSize() = 150 -ObservationTensorShape() = player: [4], hand: [7, 3], last_action: [4], hand_sizes: [4] -ObservationTensorLayout() = TensorLayout.CHW -ObservationTensorSize() = 33 -MaxGameLength() = 28 -ToString() = "python_dominoes()" - -# State 0 -# hand0:[] -# hand1:[] -# hand2:[] -# hand3:[] -# -# board: [] -IsTerminal() = False -History() = [] -HistoryString() = "" -IsChanceNode() = True -IsSimultaneousNode() = False -CurrentPlayer() = PlayerId.CHANCE -InformationStateString(0) = "p0 hand:[] history:[]" -InformationStateString(1) = "p1 hand:[] history:[]" -InformationStateString(2) = "p2 hand:[] history:[]" -InformationStateString(3) = "p3 hand:[] history:[]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -InformationStateTensor(0).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -InformationStateTensor(1).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -InformationStateTensor(2).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -InformationStateTensor(3).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -ObservationString(0) = "p0 hand:[]" -ObservationString(1) = "p1 hand:[]" -ObservationString(2) = "p2 hand:[]" -ObservationString(3) = "p3 hand:[]" -PublicObservationString() = "p0" -PrivateObservationString(0) = "p0 hand:[]" -PrivateObservationString(1) = "p1 hand:[]" -PrivateObservationString(2) = "p2 hand:[]" -PrivateObservationString(3) = "p3 hand:[]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -ObservationTensor(0).last_action: ◯◯◯◯ -ObservationTensor(0).hand_sizes: ◯◯◯◯ -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -ObservationTensor(1).last_action: ◯◯◯◯ -ObservationTensor(1).hand_sizes: ◯◯◯◯ -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -ObservationTensor(2).last_action: ◯◯◯◯ -ObservationTensor(2).hand_sizes: ◯◯◯◯ -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -ObservationTensor(3).last_action: ◯◯◯◯ -ObservationTensor(3).hand_sizes: ◯◯◯◯ -ChanceOutcomes() = [(0,0.0357143), (1,0.0357143), (2,0.0357143), (3,0.0357143), (4,0.0357143), (5,0.0357143), (6,0.0357143), (7,0.0357143), (8,0.0357143), (9,0.0357143), (10,0.0357143), (11,0.0357143), (12,0.0357143), (13,0.0357143), (14,0.0357143), (15,0.0357143), (16,0.0357143), (17,0.0357143), (18,0.0357143), (19,0.0357143), (20,0.0357143), (21,0.0357143), (22,0.0357143), (23,0.0357143), (24,0.0357143), (25,0.0357143), (26,0.0357143), (27,0.0357143)] -LegalActions() = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] -StringLegalActions() = ["Deal (0.0, 0.0)", "Deal (0.0, 1.0)", "Deal (0.0, 2.0)", "Deal (0.0, 3.0)", "Deal (0.0, 4.0)", "Deal (0.0, 5.0)", "Deal (0.0, 6.0)", "Deal (1.0, 1.0)", "Deal (1.0, 2.0)", "Deal (1.0, 3.0)", "Deal (1.0, 4.0)", "Deal (1.0, 5.0)", "Deal (1.0, 6.0)", "Deal (2.0, 2.0)", "Deal (2.0, 3.0)", "Deal (2.0, 4.0)", "Deal (2.0, 5.0)", "Deal (2.0, 6.0)", "Deal (3.0, 3.0)", "Deal (3.0, 4.0)", "Deal (3.0, 5.0)", "Deal (3.0, 6.0)", "Deal (4.0, 4.0)", "Deal (4.0, 5.0)", "Deal (4.0, 6.0)", "Deal (5.0, 5.0)", "Deal (5.0, 6.0)", "Deal (6.0, 6.0)"] - -# Apply action "Deal (1.0, 3.0)" -action: 9 - -# State 1 -# hand0:['(1.0, 3.0)'] -# hand1:[] -# hand2:[] -# hand3:[] -# -# board: [] -IsTerminal() = False -History() = [9] -HistoryString() = "9" -IsChanceNode() = True -IsSimultaneousNode() = False -CurrentPlayer() = PlayerId.CHANCE -InformationStateString(0) = "p0 hand:[(1.0, 3.0)] history:[]" -InformationStateString(1) = "p1 hand:[] history:[]" -InformationStateString(2) = "p2 hand:[] history:[]" -InformationStateString(3) = "p3 hand:[] history:[]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -InformationStateTensor(1).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -InformationStateTensor(2).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -InformationStateTensor(3).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -ObservationString(0) = "p0 hand:[(1.0, 3.0)]" -ObservationString(1) = "p1 hand:[]" -ObservationString(2) = "p2 hand:[]" -ObservationString(3) = "p3 hand:[]" -PublicObservationString() = "p0" -PrivateObservationString(0) = "p0 hand:[(1.0, 3.0)]" -PrivateObservationString(1) = "p1 hand:[]" -PrivateObservationString(2) = "p2 hand:[]" -PrivateObservationString(3) = "p3 hand:[]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action: ◯◯◯◯ -ObservationTensor(0).hand_sizes: ◉◯◯◯ -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -ObservationTensor(1).last_action: ◯◯◯◯ -ObservationTensor(1).hand_sizes: ◯◉◯◯ -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -ObservationTensor(2).last_action: ◯◯◯◯ -ObservationTensor(2).hand_sizes: ◯◯◯◯ -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand: ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ - ◯◯◯ -ObservationTensor(3).last_action: ◯◯◯◯ -ObservationTensor(3).hand_sizes: ◯◯◯◯ -ChanceOutcomes() = [(0,0.037037), (1,0.037037), (2,0.037037), (3,0.037037), (4,0.037037), (5,0.037037), (6,0.037037), (7,0.037037), (8,0.037037), (10,0.037037), (11,0.037037), (12,0.037037), (13,0.037037), (14,0.037037), (15,0.037037), (16,0.037037), (17,0.037037), (18,0.037037), (19,0.037037), (20,0.037037), (21,0.037037), (22,0.037037), (23,0.037037), (24,0.037037), (25,0.037037), (26,0.037037), (27,0.037037)] -LegalActions() = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] -StringLegalActions() = ["Deal (0.0, 0.0)", "Deal (0.0, 1.0)", "Deal (0.0, 2.0)", "Deal (0.0, 3.0)", "Deal (0.0, 4.0)", "Deal (0.0, 5.0)", "Deal (0.0, 6.0)", "Deal (1.0, 1.0)", "Deal (1.0, 2.0)", "Deal (1.0, 4.0)", "Deal (1.0, 5.0)", "Deal (1.0, 6.0)", "Deal (2.0, 2.0)", "Deal (2.0, 3.0)", "Deal (2.0, 4.0)", "Deal (2.0, 5.0)", "Deal (2.0, 6.0)", "Deal (3.0, 3.0)", "Deal (3.0, 4.0)", "Deal (3.0, 5.0)", "Deal (3.0, 6.0)", "Deal (4.0, 4.0)", "Deal (4.0, 5.0)", "Deal (4.0, 6.0)", "Deal (5.0, 5.0)", "Deal (5.0, 6.0)", "Deal (6.0, 6.0)"] - -# Apply action "Deal (3.0, 3.0)" -action: 18 - -# State 2 -# Apply action "Deal (0.0, 5.0)" -action: 5 - -# State 3 -# Apply action "Deal (1.0, 5.0)" -action: 11 - -# State 4 -# Apply action "Deal (2.0, 3.0)" -action: 14 - -# State 5 -# Apply action "Deal (2.0, 4.0)" -action: 15 - -# State 6 -# Apply action "Deal (3.0, 4.0)" -action: 19 - -# State 7 -# Apply action "Deal (1.0, 6.0)" -action: 12 - -# State 8 -# Apply action "Deal (5.0, 6.0)" -action: 26 - -# State 9 -# Apply action "Deal (3.0, 6.0)" -action: 21 - -# State 10 -# Apply action "Deal (6.0, 6.0)" -action: 27 - -# State 11 -# Apply action "Deal (3.0, 5.0)" -action: 20 - -# State 12 -# Apply action "Deal (1.0, 1.0)" -action: 7 - -# State 13 -# Apply action "Deal (0.0, 6.0)" -action: 6 - -# State 14 -# Apply action "Deal (0.0, 4.0)" -action: 4 - -# State 15 -# Apply action "Deal (0.0, 1.0)" -action: 1 - -# State 16 -# Apply action "Deal (5.0, 5.0)" -action: 25 - -# State 17 -# Apply action "Deal (4.0, 6.0)" -action: 24 - -# State 18 -# Apply action "Deal (1.0, 2.0)" -action: 8 - -# State 19 -# Apply action "Deal (4.0, 5.0)" -action: 23 - -# State 20 -# Apply action "Deal (0.0, 3.0)" -action: 3 - -# State 21 -# Apply action "Deal (1.0, 4.0)" -action: 10 - -# State 22 -# Apply action "Deal (2.0, 6.0)" -action: 17 - -# State 23 -# Apply action "Deal (0.0, 2.0)" -action: 2 - -# State 24 -# Apply action "Deal (4.0, 4.0)" -action: 22 - -# State 25 -# Apply action "Deal (2.0, 2.0)" -action: 13 - -# State 26 -# Apply action "Deal (2.0, 5.0)" -action: 16 - -# State 27 -# Apply action "Deal (0.0, 0.0)" -action: 0 - -# State 28 -# hand0:['(0.0, 3.0)', '(1.0, 1.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] -# hand1:['(0.0, 6.0)', '(1.0, 4.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(1.0, 6.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 0 -InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 1.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[]" -InformationStateString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] history:[]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] history:[]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] -InformationStateTensor(0).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 4.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0] -InformationStateTensor(1).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] -InformationStateTensor(2).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] -InformationStateTensor(3).actions_history: ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 1.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -ObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)]" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" -PublicObservationString() = "p0" -PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 1.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] -ObservationTensor(0).last_action: ◯◯◯◯ -ObservationTensor(0).hand_sizes = [7.0, 7.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 4.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0] -ObservationTensor(1).last_action: ◯◯◯◯ -ObservationTensor(1).hand_sizes = [7.0, 7.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] -ObservationTensor(2).last_action: ◯◯◯◯ -ObservationTensor(2).hand_sizes = [7.0, 7.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] -ObservationTensor(3).last_action: ◯◯◯◯ -ObservationTensor(3).hand_sizes = [7.0, 7.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [8, 20, 25, 39, 62, 70, 72] -StringLegalActions() = ["p0 tile:(0.0, 3.0) pip:None", "p0 tile:(1.0, 1.0) pip:None", "p0 tile:(1.0, 3.0) pip:None", "p0 tile:(2.0, 3.0) pip:None", "p0 tile:(4.0, 4.0) pip:None", "p0 tile:(5.0, 5.0) pip:None", "p0 tile:(5.0, 6.0) pip:None"] - -# Apply action "p0 tile:(1.0, 1.0) pip:None" -action: 20 - -# State 29 -# hand0:['(0.0, 3.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] -# hand1:['(0.0, 6.0)', '(1.0, 4.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(1.0, 6.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(1.0, 1.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 1 -InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None]" -InformationStateString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history: ◉◉◯◯◉ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 4.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0] -InformationStateTensor(1).actions_history: ◉◉◯◯◉ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] -InformationStateTensor(2).actions_history: ◉◉◯◯◉ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] -InformationStateTensor(3).actions_history: ◉◉◯◯◉ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ - ◯◯◯◯◯ -ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p0 tile:(1.0, 1.0) pip:None" -ObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p0 tile:(1.0, 1.0) pip:None" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] last_action:p0 tile:(1.0, 1.0) pip:None" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] last_action:p0 tile:(1.0, 1.0) pip:None" -PublicObservationString() = "p0 last_action:p0 tile:(1.0, 1.0) pip:None" -PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 4.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action: ◉◉◯◯ -ObservationTensor(0).hand_sizes = [6.0, 7.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 4.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0] -ObservationTensor(1).last_action: ◉◉◯◯ -ObservationTensor(1).hand_sizes = [7.0, 6.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] -ObservationTensor(2).last_action: ◉◉◯◯ -ObservationTensor(2).hand_sizes = [7.0, 7.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] -ObservationTensor(3).last_action: ◉◉◯◯ -ObservationTensor(3).hand_sizes = [7.0, 7.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [106] -StringLegalActions() = ["p1 tile:(1.0, 4.0) pip:1.0"] - -# Apply action "p1 tile:(1.0, 4.0) pip:1.0" -action: 106 - -# State 30 -# hand0:['(0.0, 3.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] -# hand1:['(0.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(1.0, 6.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(4.0, 1.0), (1.0, 1.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 2 -InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0]" -InformationStateString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p1 tile:(1.0, 4.0) pip:1.0" -ObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p1 tile:(1.0, 4.0) pip:1.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)] last_action:p1 tile:(1.0, 4.0) pip:1.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] last_action:p1 tile:(1.0, 4.0) pip:1.0" -PublicObservationString() = "p0 last_action:p1 tile:(1.0, 4.0) pip:1.0" -PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (3.0, 4.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [1.0, 4.0, 1.0, 1.0] -ObservationTensor(0).hand_sizes = [6.0, 6.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [1.0, 4.0, 1.0, 1.0] -ObservationTensor(1).hand_sizes = [6.0, 6.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 6.0, 6.0, 1.0] -ObservationTensor(2).last_action = [1.0, 4.0, 1.0, 1.0] -ObservationTensor(2).hand_sizes = [7.0, 7.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] -ObservationTensor(3).last_action = [1.0, 4.0, 1.0, 1.0] -ObservationTensor(3).hand_sizes = [7.0, 7.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [167, 177, 209] -StringLegalActions() = ["p2 tile:(0.0, 4.0) pip:4.0", "p2 tile:(1.0, 2.0) pip:1.0", "p2 tile:(3.0, 4.0) pip:4.0"] - -# Apply action "p2 tile:(3.0, 4.0) pip:4.0" -action: 209 - -# State 31 -# hand0:['(0.0, 3.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] -# hand1:['(0.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(1.0, 6.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(3.0, 4.0), (4.0, 1.0), (1.0, 1.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 3 -InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0]" -InformationStateString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p2 tile:(3.0, 4.0) pip:4.0" -ObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p2 tile:(3.0, 4.0) pip:4.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p2 tile:(3.0, 4.0) pip:4.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)] last_action:p2 tile:(3.0, 4.0) pip:4.0" -PublicObservationString() = "p0 last_action:p2 tile:(3.0, 4.0) pip:4.0" -PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (1.0, 6.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [3.0, 4.0, 4.0, 2.0] -ObservationTensor(0).hand_sizes = [6.0, 6.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [3.0, 4.0, 4.0, 2.0] -ObservationTensor(1).hand_sizes = [6.0, 6.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [3.0, 4.0, 4.0, 2.0] -ObservationTensor(2).hand_sizes = [6.0, 7.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 1.0, 6.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0] -ObservationTensor(3).last_action = [3.0, 4.0, 4.0, 2.0] -ObservationTensor(3).hand_sizes = [7.0, 6.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [235, 263, 266, 288] -StringLegalActions() = ["p3 tile:(0.0, 1.0) pip:1.0", "p3 tile:(1.0, 5.0) pip:1.0", "p3 tile:(1.0, 6.0) pip:1.0", "p3 tile:(3.0, 5.0) pip:3.0"] - -# Apply action "p3 tile:(1.0, 6.0) pip:1.0" -action: 266 - -# State 32 -# hand0:['(0.0, 3.0)', '(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] -# hand1:['(0.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 0 -InformationStateString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0]" -InformationStateString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p3 tile:(1.0, 6.0) pip:1.0" -ObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p3 tile:(1.0, 6.0) pip:1.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p3 tile:(1.0, 6.0) pip:1.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p3 tile:(1.0, 6.0) pip:1.0" -PublicObservationString() = "p0 last_action:p3 tile:(1.0, 6.0) pip:1.0" -PrivateObservationString(0) = "p0 hand:[(0.0, 3.0), (1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [0.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [1.0, 6.0, 1.0, 3.0] -ObservationTensor(0).hand_sizes = [6.0, 6.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [1.0, 6.0, 1.0, 3.0] -ObservationTensor(1).hand_sizes = [6.0, 6.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [1.0, 6.0, 1.0, 3.0] -ObservationTensor(2).hand_sizes = [6.0, 6.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(3).last_action = [1.0, 6.0, 1.0, 3.0] -ObservationTensor(3).hand_sizes = [6.0, 6.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [10, 27, 41, 74] -StringLegalActions() = ["p0 tile:(0.0, 3.0) pip:3.0", "p0 tile:(1.0, 3.0) pip:3.0", "p0 tile:(2.0, 3.0) pip:3.0", "p0 tile:(5.0, 6.0) pip:6.0"] - -# Apply action "p0 tile:(0.0, 3.0) pip:3.0" -action: 10 - -# State 33 -# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] -# hand1:['(0.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 1 -InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0]" -InformationStateString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p0 tile:(0.0, 3.0) pip:3.0" -ObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p0 tile:(0.0, 3.0) pip:3.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p0 tile:(0.0, 3.0) pip:3.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p0 tile:(0.0, 3.0) pip:3.0" -PublicObservationString() = "p0 last_action:p0 tile:(0.0, 3.0) pip:3.0" -PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [0.0, 3.0, 3.0, 0.0] -ObservationTensor(0).hand_sizes = [5.0, 6.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [0.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [0.0, 3.0, 3.0, 0.0] -ObservationTensor(1).hand_sizes = [6.0, 5.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [0.0, 3.0, 3.0, 0.0] -ObservationTensor(2).hand_sizes = [6.0, 6.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(3).last_action = [0.0, 3.0, 3.0, 0.0] -ObservationTensor(3).hand_sizes = [6.0, 6.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [95, 96, 138, 146] -StringLegalActions() = ["p1 tile:(0.0, 6.0) pip:0.0", "p1 tile:(0.0, 6.0) pip:6.0", "p1 tile:(3.0, 6.0) pip:6.0", "p1 tile:(4.0, 6.0) pip:6.0"] - -# Apply action "p1 tile:(0.0, 6.0) pip:6.0" -action: 96 - -# State 34 -# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] -# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(0.0, 5.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 2 -InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0]" -InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p1 tile:(0.0, 6.0) pip:6.0" -ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p1 tile:(0.0, 6.0) pip:6.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p1 tile:(0.0, 6.0) pip:6.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p1 tile:(0.0, 6.0) pip:6.0" -PublicObservationString() = "p0 last_action:p1 tile:(0.0, 6.0) pip:6.0" -PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (0.0, 5.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [0.0, 6.0, 6.0, 1.0] -ObservationTensor(0).hand_sizes = [5.0, 5.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [0.0, 6.0, 6.0, 1.0] -ObservationTensor(1).hand_sizes = [5.0, 5.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 0.0, 5.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [0.0, 6.0, 6.0, 1.0] -ObservationTensor(2).hand_sizes = [6.0, 6.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(3).last_action = [0.0, 6.0, 6.0, 1.0] -ObservationTensor(3).hand_sizes = [6.0, 6.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [166, 169] -StringLegalActions() = ["p2 tile:(0.0, 4.0) pip:0.0", "p2 tile:(0.0, 5.0) pip:0.0"] - -# Apply action "p2 tile:(0.0, 5.0) pip:0.0" -action: 169 - -# State 35 -# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] -# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 3 -InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0]" -InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p2 tile:(0.0, 5.0) pip:0.0" -ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p2 tile:(0.0, 5.0) pip:0.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p2 tile:(0.0, 5.0) pip:0.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p2 tile:(0.0, 5.0) pip:0.0" -PublicObservationString() = "p0 last_action:p2 tile:(0.0, 5.0) pip:0.0" -PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [0.0, 5.0, 0.0, 2.0] -ObservationTensor(0).hand_sizes = [5.0, 5.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [0.0, 5.0, 0.0, 2.0] -ObservationTensor(1).hand_sizes = [5.0, 5.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [0.0, 5.0, 0.0, 2.0] -ObservationTensor(2).hand_sizes = [5.0, 6.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0] -ObservationTensor(3).last_action = [0.0, 5.0, 0.0, 2.0] -ObservationTensor(3).hand_sizes = [6.0, 5.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [232, 234, 237, 264, 289, 297] -StringLegalActions() = ["p3 tile:(0.0, 0.0) pip:0.0", "p3 tile:(0.0, 1.0) pip:0.0", "p3 tile:(0.0, 2.0) pip:0.0", "p3 tile:(1.0, 5.0) pip:5.0", "p3 tile:(3.0, 5.0) pip:5.0", "p3 tile:(4.0, 5.0) pip:5.0"] - -# Apply action "p3 tile:(0.0, 1.0) pip:0.0" -action: 234 - -# State 36 -# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 5.0)', '(5.0, 6.0)'] -# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 0 -InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0]" -InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)] last_action:p3 tile:(0.0, 1.0) pip:0.0" -ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p3 tile:(0.0, 1.0) pip:0.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p3 tile:(0.0, 1.0) pip:0.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p3 tile:(0.0, 1.0) pip:0.0" -PublicObservationString() = "p0 last_action:p3 tile:(0.0, 1.0) pip:0.0" -PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 5.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [0.0, 1.0, 0.0, 3.0] -ObservationTensor(0).hand_sizes = [5.0, 5.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [0.0, 1.0, 0.0, 3.0] -ObservationTensor(1).hand_sizes = [5.0, 5.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [0.0, 1.0, 0.0, 3.0] -ObservationTensor(2).hand_sizes = [5.0, 5.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(3).last_action = [0.0, 1.0, 0.0, 3.0] -ObservationTensor(3).hand_sizes = [5.0, 5.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [26, 71, 73] -StringLegalActions() = ["p0 tile:(1.0, 3.0) pip:1.0", "p0 tile:(5.0, 5.0) pip:5.0", "p0 tile:(5.0, 6.0) pip:5.0"] - -# Apply action "p0 tile:(5.0, 5.0) pip:5.0" -action: 71 - -# State 37 -# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 6.0)'] -# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 5.0)', '(2.0, 6.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(5.0, 5.0), (5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 2 -InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0]" -InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)] last_action:p0 tile:(5.0, 5.0) pip:5.0" -ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p0 tile:(5.0, 5.0) pip:5.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)] last_action:p0 tile:(5.0, 5.0) pip:5.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p0 tile:(5.0, 5.0) pip:5.0" -PublicObservationString() = "p0 last_action:p0 tile:(5.0, 5.0) pip:5.0" -PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 5.0), (2.0, 6.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [5.0, 5.0, 5.0, 0.0] -ObservationTensor(0).hand_sizes = [4.0, 5.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [5.0, 5.0, 5.0, 0.0] -ObservationTensor(1).hand_sizes = [5.0, 4.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 5.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [5.0, 5.0, 5.0, 0.0] -ObservationTensor(2).hand_sizes = [5.0, 5.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(3).last_action = [5.0, 5.0, 5.0, 0.0] -ObservationTensor(3).hand_sizes = [5.0, 5.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [177, 201] -StringLegalActions() = ["p2 tile:(1.0, 2.0) pip:1.0", "p2 tile:(2.0, 5.0) pip:5.0"] - -# Apply action "p2 tile:(2.0, 5.0) pip:5.0" -action: 201 - -# State 38 -# hand0:['(1.0, 3.0)', '(2.0, 3.0)', '(4.0, 4.0)', '(5.0, 6.0)'] -# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 6.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 2.0)', '(1.0, 5.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(2.0, 5.0), (5.0, 5.0), (5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 3 -InformationStateString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0]" -InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)] last_action:p2 tile:(2.0, 5.0) pip:5.0" -ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p2 tile:(2.0, 5.0) pip:5.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)] last_action:p2 tile:(2.0, 5.0) pip:5.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)] last_action:p2 tile:(2.0, 5.0) pip:5.0" -PublicObservationString() = "p0 last_action:p2 tile:(2.0, 5.0) pip:5.0" -PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (2.0, 3.0), (4.0, 4.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (1.0, 5.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [1.0, 3.0, 1.0, 2.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [2.0, 5.0, 5.0, 2.0] -ObservationTensor(0).hand_sizes = [4.0, 5.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [2.0, 5.0, 5.0, 2.0] -ObservationTensor(1).hand_sizes = [5.0, 4.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [2.0, 5.0, 5.0, 2.0] -ObservationTensor(2).hand_sizes = [4.0, 5.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(3).last_action = [2.0, 5.0, 5.0, 2.0] -ObservationTensor(3).hand_sizes = [5.0, 4.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [238, 263] -StringLegalActions() = ["p3 tile:(0.0, 2.0) pip:2.0", "p3 tile:(1.0, 5.0) pip:1.0"] - -# Apply action "p3 tile:(1.0, 5.0) pip:1.0" -action: 263 - -# State 39 -# Apply action "p0 tile:(2.0, 3.0) pip:2.0" -action: 40 - -# State 40 -# hand0:['(1.0, 3.0)', '(4.0, 4.0)', '(5.0, 6.0)'] -# hand1:['(2.0, 2.0)', '(2.0, 4.0)', '(3.0, 3.0)', '(3.0, 6.0)', '(4.0, 6.0)'] -# hand2:['(0.0, 4.0)', '(1.0, 2.0)', '(2.0, 6.0)', '(6.0, 6.0)'] -# hand3:['(0.0, 0.0)', '(0.0, 2.0)', '(3.0, 5.0)', '(4.0, 5.0)'] -# -# board: [(3.0, 2.0), (2.0, 5.0), (5.0, 5.0), (5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0), (1.0, 5.0)] -IsTerminal() = False -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201, 263, 40] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201, 263, 40" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = 1 -InformationStateString(0) = "p0 hand:[(1.0, 3.0), (4.0, 4.0), (5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0]" -InformationStateString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0]" -InformationStateString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0]" -InformationStateString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (3.0, 5.0), (4.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [1.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(1.0, 3.0), (4.0, 4.0), (5.0, 6.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" -ObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" -ObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" -ObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (3.0, 5.0), (4.0, 5.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" -PublicObservationString() = "p0 last_action:p0 tile:(2.0, 3.0) pip:2.0" -PrivateObservationString(0) = "p0 hand:[(1.0, 3.0), (4.0, 4.0), (5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(2.0, 2.0), (2.0, 4.0), (3.0, 3.0), (3.0, 6.0), (4.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(0.0, 4.0), (1.0, 2.0), (2.0, 6.0), (6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(0.0, 0.0), (0.0, 2.0), (3.0, 5.0), (4.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [1.0, 3.0, 1.0, 4.0, 4.0, 1.0, 5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [2.0, 3.0, 2.0, 0.0] -ObservationTensor(0).hand_sizes = [3.0, 5.0, 0.0, 0.0] -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 3.0, 3.0, 1.0, 3.0, 6.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [2.0, 3.0, 2.0, 0.0] -ObservationTensor(1).hand_sizes = [5.0, 3.0, 0.0, 0.0] -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [0.0, 4.0, 1.0, 1.0, 2.0, 1.0, 2.0, 6.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [2.0, 3.0, 2.0, 0.0] -ObservationTensor(2).hand_sizes = [4.0, 4.0, 0.0, 0.0] -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 3.0, 5.0, 1.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(3).last_action = [2.0, 3.0, 2.0, 0.0] -ObservationTensor(3).hand_sizes = [4.0, 4.0, 0.0, 0.0] -Rewards() = [0, 0, 0, 0] -Returns() = [0, 0, 0, 0] -LegalActions() = [129, 137] -StringLegalActions() = ["p1 tile:(3.0, 3.0) pip:3.0", "p1 tile:(3.0, 6.0) pip:3.0"] - -# Apply action "p1 tile:(3.0, 3.0) pip:3.0" -action: 129 - -# State 41 -# Apply action "p3 tile:(4.0, 5.0) pip:5.0" -action: 297 - -# State 42 -# Apply action "p0 tile:(4.0, 4.0) pip:4.0" -action: 63 - -# State 43 -# Apply action "p1 tile:(4.0, 6.0) pip:4.0" -action: 145 - -# State 44 -# Apply action "p2 tile:(2.0, 6.0) pip:6.0" -action: 204 - -# State 45 -# Apply action "p3 tile:(0.0, 2.0) pip:2.0" -action: 238 - -# State 46 -# Apply action "p0 tile:(1.0, 3.0) pip:3.0" -action: 27 - -# State 47 -# Apply action "p2 tile:(1.0, 2.0) pip:1.0" -action: 177 - -# State 48 -# Apply action "p3 tile:(0.0, 0.0) pip:0.0" -action: 232 - -# State 49 -# Apply action "p1 tile:(2.0, 2.0) pip:2.0" -action: 115 - -# State 50 -# Apply action "p2 tile:(0.0, 4.0) pip:0.0" -action: 166 - -# State 51 -# Apply action "p1 tile:(2.0, 4.0) pip:2.0" -action: 120 - -# State 52 -# hand0:['(5.0, 6.0)'] -# hand1:['(3.0, 6.0)'] -# hand2:['(6.0, 6.0)'] -# hand3:['(3.0, 5.0)'] -# -# board: [(4.0, 2.0), (2.0, 2.0), (2.0, 1.0), (1.0, 3.0), (3.0, 3.0), (3.0, 2.0), (2.0, 5.0), (5.0, 5.0), (5.0, 0.0), (0.0, 3.0), (3.0, 4.0), (4.0, 1.0), (1.0, 1.0), (1.0, 6.0), (6.0, 0.0), (0.0, 1.0), (1.0, 5.0), (5.0, 4.0), (4.0, 4.0), (4.0, 6.0), (6.0, 2.0), (2.0, 0.0), (0.0, 0.0), (0.0, 4.0)] -IsTerminal() = True -History() = [9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201, 263, 40, 129, 297, 63, 145, 204, 238, 27, 177, 232, 115, 166, 120] -HistoryString() = "9, 18, 5, 11, 14, 15, 19, 12, 26, 21, 27, 20, 7, 6, 4, 1, 25, 24, 8, 23, 3, 10, 17, 2, 22, 13, 16, 0, 20, 106, 209, 266, 10, 96, 169, 234, 71, 201, 263, 40, 129, 297, 63, 145, 204, 238, 27, 177, 232, 115, 166, 120" -IsChanceNode() = False -IsSimultaneousNode() = False -CurrentPlayer() = PlayerId.TERMINAL -InformationStateString(0) = "p0 hand:[(5.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0, p1 tile:(3.0, 3.0) pip:3.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(4.0, 4.0) pip:4.0, p1 tile:(4.0, 6.0) pip:4.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(0.0, 2.0) pip:2.0, p0 tile:(1.0, 3.0) pip:3.0, p2 tile:(1.0, 2.0) pip:1.0, p3 tile:(0.0, 0.0) pip:0.0, p1 tile:(2.0, 2.0) pip:2.0, p2 tile:(0.0, 4.0) pip:0.0, p1 tile:(2.0, 4.0) pip:2.0]" -InformationStateString(1) = "p1 hand:[(3.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0, p1 tile:(3.0, 3.0) pip:3.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(4.0, 4.0) pip:4.0, p1 tile:(4.0, 6.0) pip:4.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(0.0, 2.0) pip:2.0, p0 tile:(1.0, 3.0) pip:3.0, p2 tile:(1.0, 2.0) pip:1.0, p3 tile:(0.0, 0.0) pip:0.0, p1 tile:(2.0, 2.0) pip:2.0, p2 tile:(0.0, 4.0) pip:0.0, p1 tile:(2.0, 4.0) pip:2.0]" -InformationStateString(2) = "p2 hand:[(6.0, 6.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0, p1 tile:(3.0, 3.0) pip:3.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(4.0, 4.0) pip:4.0, p1 tile:(4.0, 6.0) pip:4.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(0.0, 2.0) pip:2.0, p0 tile:(1.0, 3.0) pip:3.0, p2 tile:(1.0, 2.0) pip:1.0, p3 tile:(0.0, 0.0) pip:0.0, p1 tile:(2.0, 2.0) pip:2.0, p2 tile:(0.0, 4.0) pip:0.0, p1 tile:(2.0, 4.0) pip:2.0]" -InformationStateString(3) = "p3 hand:[(3.0, 5.0)] history:[p0 tile:(1.0, 1.0) pip:None, p1 tile:(1.0, 4.0) pip:1.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(1.0, 6.0) pip:1.0, p0 tile:(0.0, 3.0) pip:3.0, p1 tile:(0.0, 6.0) pip:6.0, p2 tile:(0.0, 5.0) pip:0.0, p3 tile:(0.0, 1.0) pip:0.0, p0 tile:(5.0, 5.0) pip:5.0, p2 tile:(2.0, 5.0) pip:5.0, p3 tile:(1.0, 5.0) pip:1.0, p0 tile:(2.0, 3.0) pip:2.0, p1 tile:(3.0, 3.0) pip:3.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(4.0, 4.0) pip:4.0, p1 tile:(4.0, 6.0) pip:4.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(0.0, 2.0) pip:2.0, p0 tile:(1.0, 3.0) pip:3.0, p2 tile:(1.0, 2.0) pip:1.0, p3 tile:(0.0, 0.0) pip:0.0, p1 tile:(2.0, 2.0) pip:2.0, p2 tile:(0.0, 4.0) pip:0.0, p1 tile:(2.0, 4.0) pip:2.0]" -InformationStateTensor(0).player: ◉◯◯◯ -InformationStateTensor(0).hand = [5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(0).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 3.0, 3.0, 3.0, 1.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 4.0, 4.0, 4.0, 0.0, 1.0, 4.0, 6.0, 4.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 0.0, 2.0, 2.0, 3.0, 1.0, 1.0, 3.0, 3.0, 0.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, 3.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).player: ◯◉◯◯ -InformationStateTensor(1).hand = [3.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(1).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 3.0, 3.0, 3.0, 1.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 4.0, 4.0, 4.0, 0.0, 1.0, 4.0, 6.0, 4.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 0.0, 2.0, 2.0, 3.0, 1.0, 1.0, 3.0, 3.0, 0.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, 3.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).player: ◯◯◉◯ -InformationStateTensor(2).hand = [6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(2).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 3.0, 3.0, 3.0, 1.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 4.0, 4.0, 4.0, 0.0, 1.0, 4.0, 6.0, 4.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 0.0, 2.0, 2.0, 3.0, 1.0, 1.0, 3.0, 3.0, 0.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, 3.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).player: ◯◯◯◉ -InformationStateTensor(3).hand = [3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -InformationStateTensor(3).actions_history = [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 1.0, 6.0, 1.0, 3.0, 1.0, 0.0, 3.0, 3.0, 0.0, 1.0, 0.0, 6.0, 6.0, 1.0, 1.0, 0.0, 5.0, 0.0, 2.0, 1.0, 0.0, 1.0, 0.0, 3.0, 1.0, 5.0, 5.0, 5.0, 0.0, 1.0, 2.0, 5.0, 5.0, 2.0, 1.0, 1.0, 5.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 3.0, 3.0, 3.0, 1.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 4.0, 4.0, 4.0, 0.0, 1.0, 4.0, 6.0, 4.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 0.0, 2.0, 2.0, 3.0, 1.0, 1.0, 3.0, 3.0, 0.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, 3.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 2.0, 4.0, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationString(0) = "p0 hand:[(5.0, 6.0)] last_action:p1 tile:(2.0, 4.0) pip:2.0" -ObservationString(1) = "p1 hand:[(3.0, 6.0)] last_action:p1 tile:(2.0, 4.0) pip:2.0" -ObservationString(2) = "p2 hand:[(6.0, 6.0)] last_action:p1 tile:(2.0, 4.0) pip:2.0" -ObservationString(3) = "p3 hand:[(3.0, 5.0)] last_action:p1 tile:(2.0, 4.0) pip:2.0" -PublicObservationString() = "p0 last_action:p1 tile:(2.0, 4.0) pip:2.0" -PrivateObservationString(0) = "p0 hand:[(5.0, 6.0)]" -PrivateObservationString(1) = "p1 hand:[(3.0, 6.0)]" -PrivateObservationString(2) = "p2 hand:[(6.0, 6.0)]" -PrivateObservationString(3) = "p3 hand:[(3.0, 5.0)]" -ObservationTensor(0).player: ◉◯◯◯ -ObservationTensor(0).hand = [5.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(0).last_action = [2.0, 4.0, 2.0, 1.0] -ObservationTensor(0).hand_sizes: ◉◉◯◯ -ObservationTensor(1).player: ◯◉◯◯ -ObservationTensor(1).hand = [3.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(1).last_action = [2.0, 4.0, 2.0, 1.0] -ObservationTensor(1).hand_sizes: ◉◉◯◯ -ObservationTensor(2).player: ◯◯◉◯ -ObservationTensor(2).hand = [6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(2).last_action = [2.0, 4.0, 2.0, 1.0] -ObservationTensor(2).hand_sizes: ◉◉◯◯ -ObservationTensor(3).player: ◯◯◯◉ -ObservationTensor(3).hand = [3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] -ObservationTensor(3).last_action = [2.0, 4.0, 2.0, 1.0] -ObservationTensor(3).hand_sizes: ◉◉◯◯ -Rewards() = [-23, 23, -23, 23] -Returns() = [-23, 23, -23, 23] diff --git a/open_spiel/integration_tests/playthroughs/python_team_dominoes.txt b/open_spiel/integration_tests/playthroughs/python_team_dominoes.txt new file mode 100644 index 0000000000..dd8d62fecd --- /dev/null +++ b/open_spiel/integration_tests/playthroughs/python_team_dominoes.txt @@ -0,0 +1,1585 @@ +game: python_team_dominoes + +GameType.chance_mode = ChanceMode.EXPLICIT_STOCHASTIC +GameType.dynamics = Dynamics.SEQUENTIAL +GameType.information = Information.IMPERFECT_INFORMATION +GameType.long_name = "Python Team Dominoes (4 players)" +GameType.max_num_players = 4 +GameType.min_num_players = 4 +GameType.parameter_specification = [] +GameType.provides_information_state_string = True +GameType.provides_information_state_tensor = True +GameType.provides_observation_string = True +GameType.provides_observation_tensor = True +GameType.provides_factored_observation_string = True +GameType.reward_model = RewardModel.TERMINAL +GameType.short_name = "python_team_dominoes" +GameType.utility = Utility.ZERO_SUM + +NumDistinctActions() = 308 +PolicyTensorShape() = [308] +MaxChanceOutcomes() = 28 +GetParameters() = {} +NumPlayers() = 4 +MinUtility() = -100.0 +MaxUtility() = 100.0 +UtilitySum() = 0.0 +InformationStateTensorShape() = player: [4], hand: [7, 3], actions_history: [25, 5] +InformationStateTensorLayout() = TensorLayout.CHW +InformationStateTensorSize() = 150 +ObservationTensorShape() = player: [4], hand: [7, 3], last_action: [4], hand_sizes: [4] +ObservationTensorLayout() = TensorLayout.CHW +ObservationTensorSize() = 33 +MaxGameLength() = 28 +ToString() = "python_team_dominoes()" + +# State 0 +# hand0:[] +# hand1:[] +# hand2:[] +# hand3:[] +# +# board: [] +IsTerminal() = False +History() = [] +HistoryString() = "" +IsChanceNode() = True +IsSimultaneousNode() = False +CurrentPlayer() = PlayerId.CHANCE +InformationStateString(0) = "p0 hand:[] history:[]" +InformationStateString(1) = "p1 hand:[] history:[]" +InformationStateString(2) = "p2 hand:[] history:[]" +InformationStateString(3) = "p3 hand:[] history:[]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(0).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(1).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(2).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(3).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +ObservationString(0) = "p0 hand:[]" +ObservationString(1) = "p1 hand:[]" +ObservationString(2) = "p2 hand:[]" +ObservationString(3) = "p3 hand:[]" +PublicObservationString() = "p0" +PrivateObservationString(0) = "p0 hand:[]" +PrivateObservationString(1) = "p1 hand:[]" +PrivateObservationString(2) = "p2 hand:[]" +PrivateObservationString(3) = "p3 hand:[]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(0).last_action: ◯◯◯◯ +ObservationTensor(0).hand_sizes: ◯◯◯◯ +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(1).last_action: ◯◯◯◯ +ObservationTensor(1).hand_sizes: ◯◯◯◯ +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(2).last_action: ◯◯◯◯ +ObservationTensor(2).hand_sizes: ◯◯◯◯ +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(3).last_action: ◯◯◯◯ +ObservationTensor(3).hand_sizes: ◯◯◯◯ +ChanceOutcomes() = [(0,0.0357143), (1,0.0357143), (2,0.0357143), (3,0.0357143), (4,0.0357143), (5,0.0357143), (6,0.0357143), (7,0.0357143), (8,0.0357143), (9,0.0357143), (10,0.0357143), (11,0.0357143), (12,0.0357143), (13,0.0357143), (14,0.0357143), (15,0.0357143), (16,0.0357143), (17,0.0357143), (18,0.0357143), (19,0.0357143), (20,0.0357143), (21,0.0357143), (22,0.0357143), (23,0.0357143), (24,0.0357143), (25,0.0357143), (26,0.0357143), (27,0.0357143)] +LegalActions() = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] +StringLegalActions() = ["Deal (0.0, 0.0)", "Deal (0.0, 1.0)", "Deal (0.0, 2.0)", "Deal (0.0, 3.0)", "Deal (0.0, 4.0)", "Deal (0.0, 5.0)", "Deal (0.0, 6.0)", "Deal (1.0, 1.0)", "Deal (1.0, 2.0)", "Deal (1.0, 3.0)", "Deal (1.0, 4.0)", "Deal (1.0, 5.0)", "Deal (1.0, 6.0)", "Deal (2.0, 2.0)", "Deal (2.0, 3.0)", "Deal (2.0, 4.0)", "Deal (2.0, 5.0)", "Deal (2.0, 6.0)", "Deal (3.0, 3.0)", "Deal (3.0, 4.0)", "Deal (3.0, 5.0)", "Deal (3.0, 6.0)", "Deal (4.0, 4.0)", "Deal (4.0, 5.0)", "Deal (4.0, 6.0)", "Deal (5.0, 5.0)", "Deal (5.0, 6.0)", "Deal (6.0, 6.0)"] + +# Apply action "Deal (0.0, 2.0)" +action: 2 + +# State 1 +# hand0:['(0.0, 2.0)'] +# hand1:[] +# hand2:[] +# hand3:[] +# +# board: [] +IsTerminal() = False +History() = [2] +HistoryString() = "2" +IsChanceNode() = True +IsSimultaneousNode() = False +CurrentPlayer() = PlayerId.CHANCE +InformationStateString(0) = "p0 hand:[(0.0, 2.0)] history:[]" +InformationStateString(1) = "p1 hand:[] history:[]" +InformationStateString(2) = "p2 hand:[] history:[]" +InformationStateString(3) = "p3 hand:[] history:[]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(1).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(2).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(3).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +ObservationString(0) = "p0 hand:[(0.0, 2.0)]" +ObservationString(1) = "p1 hand:[]" +ObservationString(2) = "p2 hand:[]" +ObservationString(3) = "p3 hand:[]" +PublicObservationString() = "p0" +PrivateObservationString(0) = "p0 hand:[(0.0, 2.0)]" +PrivateObservationString(1) = "p1 hand:[]" +PrivateObservationString(2) = "p2 hand:[]" +PrivateObservationString(3) = "p3 hand:[]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action: ◯◯◯◯ +ObservationTensor(0).hand_sizes: ◉◯◯◯ +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(1).last_action: ◯◯◯◯ +ObservationTensor(1).hand_sizes: ◯◉◯◯ +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(2).last_action: ◯◯◯◯ +ObservationTensor(2).hand_sizes: ◯◯◯◯ +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(3).last_action: ◯◯◯◯ +ObservationTensor(3).hand_sizes: ◯◯◯◯ +ChanceOutcomes() = [(0,0.037037), (1,0.037037), (3,0.037037), (4,0.037037), (5,0.037037), (6,0.037037), (7,0.037037), (8,0.037037), (9,0.037037), (10,0.037037), (11,0.037037), (12,0.037037), (13,0.037037), (14,0.037037), (15,0.037037), (16,0.037037), (17,0.037037), (18,0.037037), (19,0.037037), (20,0.037037), (21,0.037037), (22,0.037037), (23,0.037037), (24,0.037037), (25,0.037037), (26,0.037037), (27,0.037037)] +LegalActions() = [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] +StringLegalActions() = ["Deal (0.0, 0.0)", "Deal (0.0, 1.0)", "Deal (0.0, 3.0)", "Deal (0.0, 4.0)", "Deal (0.0, 5.0)", "Deal (0.0, 6.0)", "Deal (1.0, 1.0)", "Deal (1.0, 2.0)", "Deal (1.0, 3.0)", "Deal (1.0, 4.0)", "Deal (1.0, 5.0)", "Deal (1.0, 6.0)", "Deal (2.0, 2.0)", "Deal (2.0, 3.0)", "Deal (2.0, 4.0)", "Deal (2.0, 5.0)", "Deal (2.0, 6.0)", "Deal (3.0, 3.0)", "Deal (3.0, 4.0)", "Deal (3.0, 5.0)", "Deal (3.0, 6.0)", "Deal (4.0, 4.0)", "Deal (4.0, 5.0)", "Deal (4.0, 6.0)", "Deal (5.0, 5.0)", "Deal (5.0, 6.0)", "Deal (6.0, 6.0)"] + +# Apply action "Deal (1.0, 6.0)" +action: 12 + +# State 2 +# Apply action "Deal (3.0, 4.0)" +action: 19 + +# State 3 +# Apply action "Deal (5.0, 6.0)" +action: 26 + +# State 4 +# Apply action "Deal (6.0, 6.0)" +action: 27 + +# State 5 +# Apply action "Deal (2.0, 4.0)" +action: 15 + +# State 6 +# Apply action "Deal (4.0, 6.0)" +action: 24 + +# State 7 +# Apply action "Deal (4.0, 5.0)" +action: 23 + +# State 8 +# Apply action "Deal (0.0, 5.0)" +action: 5 + +# State 9 +# Apply action "Deal (1.0, 1.0)" +action: 7 + +# State 10 +# Apply action "Deal (2.0, 6.0)" +action: 17 + +# State 11 +# Apply action "Deal (1.0, 5.0)" +action: 11 + +# State 12 +# Apply action "Deal (0.0, 0.0)" +action: 0 + +# State 13 +# Apply action "Deal (2.0, 2.0)" +action: 13 + +# State 14 +# Apply action "Deal (0.0, 3.0)" +action: 3 + +# State 15 +# Apply action "Deal (3.0, 3.0)" +action: 18 + +# State 16 +# Apply action "Deal (0.0, 1.0)" +action: 1 + +# State 17 +# Apply action "Deal (2.0, 5.0)" +action: 16 + +# State 18 +# Apply action "Deal (3.0, 6.0)" +action: 21 + +# State 19 +# Apply action "Deal (1.0, 3.0)" +action: 9 + +# State 20 +# Apply action "Deal (1.0, 4.0)" +action: 10 + +# State 21 +# Apply action "Deal (0.0, 6.0)" +action: 6 + +# State 22 +# Apply action "Deal (0.0, 4.0)" +action: 4 + +# State 23 +# Apply action "Deal (5.0, 5.0)" +action: 25 + +# State 24 +# Apply action "Deal (2.0, 3.0)" +action: 14 + +# State 25 +# Apply action "Deal (3.0, 5.0)" +action: 20 + +# State 26 +# Apply action "Deal (4.0, 4.0)" +action: 22 + +# State 27 +# Apply action "Deal (1.0, 2.0)" +action: 8 + +# State 28 +# hand0:['(0.0, 0.0)', '(0.0, 1.0)', '(0.0, 2.0)', '(0.0, 5.0)', '(1.0, 4.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(0.0, 6.0)', '(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(0.0, 3.0)', '(0.0, 4.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 2.0)', '(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# +# board: [] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 0 +InformationStateString(0) = "p0 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] history:[]" +InformationStateString(1) = "p1 hand:[(0.0, 6.0), (1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] history:[]" +InformationStateString(2) = "p2 hand:[(0.0, 3.0), (0.0, 4.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[]" +InformationStateString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)] history:[]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0] +InformationStateTensor(0).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0] +InformationStateTensor(1).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 3.0, 1.0, 0.0, 4.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0] +InformationStateTensor(2).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +InformationStateTensor(3).actions_history: ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +ObservationString(0) = "p0 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +ObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)]" +ObservationString(2) = "p2 hand:[(0.0, 3.0), (0.0, 4.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +ObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)]" +PublicObservationString() = "p0" +PrivateObservationString(0) = "p0 hand:[(0.0, 0.0), (0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 3.0), (0.0, 4.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0] +ObservationTensor(0).last_action: ◯◯◯◯ +ObservationTensor(0).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0] +ObservationTensor(1).last_action: ◯◯◯◯ +ObservationTensor(1).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 3.0, 1.0, 0.0, 4.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0] +ObservationTensor(2).last_action: ◯◯◯◯ +ObservationTensor(2).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +ObservationTensor(3).last_action: ◯◯◯◯ +ObservationTensor(3).hand_sizes = [7.0, 7.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [0, 2, 5, 14, 28, 39, 75] +StringLegalActions() = ["p0 tile:(0.0, 0.0) pip:None", "p0 tile:(0.0, 1.0) pip:None", "p0 tile:(0.0, 2.0) pip:None", "p0 tile:(0.0, 5.0) pip:None", "p0 tile:(1.0, 4.0) pip:None", "p0 tile:(2.0, 3.0) pip:None", "p0 tile:(6.0, 6.0) pip:None"] + +# Apply action "p0 tile:(0.0, 0.0) pip:None" +action: 0 + +# State 29 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(0.0, 5.0)', '(1.0, 4.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(0.0, 6.0)', '(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(0.0, 3.0)', '(0.0, 4.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 2.0)', '(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# +# board: [(0.0, 0.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 1 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None]" +InformationStateString(1) = "p1 hand:[(0.0, 6.0), (1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None]" +InformationStateString(2) = "p2 hand:[(0.0, 3.0), (0.0, 4.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None]" +InformationStateString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history: ◯◯◯◯◉ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0] +InformationStateTensor(1).actions_history: ◯◯◯◯◉ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 3.0, 1.0, 0.0, 4.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0] +InformationStateTensor(2).actions_history: ◯◯◯◯◉ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +InformationStateTensor(3).actions_history: ◯◯◯◯◉ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ + ◯◯◯◯◯ +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] last_action:p0 tile:(0.0, 0.0) pip:None" +ObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] last_action:p0 tile:(0.0, 0.0) pip:None" +ObservationString(2) = "p2 hand:[(0.0, 3.0), (0.0, 4.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p0 tile:(0.0, 0.0) pip:None" +ObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)] last_action:p0 tile:(0.0, 0.0) pip:None" +PublicObservationString() = "p0 last_action:p0 tile:(0.0, 0.0) pip:None" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(0.0, 6.0), (1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 3.0), (0.0, 4.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action: ◯◯◯◯ +ObservationTensor(0).hand_sizes = [6.0, 7.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [0.0, 6.0, 1.0, 1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0] +ObservationTensor(1).last_action: ◯◯◯◯ +ObservationTensor(1).hand_sizes = [7.0, 6.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 3.0, 1.0, 0.0, 4.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0] +ObservationTensor(2).last_action: ◯◯◯◯ +ObservationTensor(2).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +ObservationTensor(3).last_action: ◯◯◯◯ +ObservationTensor(3).hand_sizes = [7.0, 7.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [95] +StringLegalActions() = ["p1 tile:(0.0, 6.0) pip:0.0"] + +# Apply action "p1 tile:(0.0, 6.0) pip:0.0" +action: 95 + +# State 30 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(0.0, 5.0)', '(1.0, 4.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(0.0, 3.0)', '(0.0, 4.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 2.0)', '(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# +# board: [(6.0, 0.0), (0.0, 0.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 2 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0]" +InformationStateString(2) = "p2 hand:[(0.0, 3.0), (0.0, 4.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0]" +InformationStateString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 3.0, 1.0, 0.0, 4.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] last_action:p1 tile:(0.0, 6.0) pip:0.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] last_action:p1 tile:(0.0, 6.0) pip:0.0" +ObservationString(2) = "p2 hand:[(0.0, 3.0), (0.0, 4.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p1 tile:(0.0, 6.0) pip:0.0" +ObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)] last_action:p1 tile:(0.0, 6.0) pip:0.0" +PublicObservationString() = "p0 last_action:p1 tile:(0.0, 6.0) pip:0.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 3.0), (0.0, 4.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [0.0, 6.0, 0.0, 1.0] +ObservationTensor(0).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [0.0, 6.0, 0.0, 1.0] +ObservationTensor(1).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 3.0, 1.0, 0.0, 4.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0] +ObservationTensor(2).last_action = [0.0, 6.0, 0.0, 1.0] +ObservationTensor(2).hand_sizes = [7.0, 7.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +ObservationTensor(3).last_action = [0.0, 6.0, 0.0, 1.0] +ObservationTensor(3).hand_sizes = [7.0, 7.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [163, 166, 204, 215, 223] +StringLegalActions() = ["p2 tile:(0.0, 3.0) pip:0.0", "p2 tile:(0.0, 4.0) pip:0.0", "p2 tile:(2.0, 6.0) pip:6.0", "p2 tile:(3.0, 6.0) pip:6.0", "p2 tile:(4.0, 6.0) pip:6.0"] + +# Apply action "p2 tile:(0.0, 4.0) pip:0.0" +action: 166 + +# State 31 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(0.0, 5.0)', '(1.0, 4.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(0.0, 3.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 2.0)', '(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)', '(5.0, 6.0)'] +# +# board: [(6.0, 0.0), (0.0, 0.0), (0.0, 4.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 3 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0]" +InformationStateString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0]" +InformationStateString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 3.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] last_action:p2 tile:(0.0, 4.0) pip:0.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] last_action:p2 tile:(0.0, 4.0) pip:0.0" +ObservationString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p2 tile:(0.0, 4.0) pip:0.0" +ObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)] last_action:p2 tile:(0.0, 4.0) pip:0.0" +PublicObservationString() = "p0 last_action:p2 tile:(0.0, 4.0) pip:0.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0), (5.0, 6.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [0.0, 4.0, 0.0, 2.0] +ObservationTensor(0).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [0.0, 4.0, 0.0, 2.0] +ObservationTensor(1).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 3.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [0.0, 4.0, 0.0, 2.0] +ObservationTensor(2).hand_sizes = [6.0, 7.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 5.0, 6.0, 1.0] +ObservationTensor(3).last_action = [0.0, 4.0, 0.0, 2.0] +ObservationTensor(3).hand_sizes = [7.0, 6.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [296, 305] +StringLegalActions() = ["p3 tile:(4.0, 5.0) pip:4.0", "p3 tile:(5.0, 6.0) pip:6.0"] + +# Apply action "p3 tile:(5.0, 6.0) pip:6.0" +action: 305 + +# State 32 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(0.0, 5.0)', '(1.0, 4.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(0.0, 3.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 2.0)', '(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)'] +# +# board: [(5.0, 6.0), (6.0, 0.0), (0.0, 0.0), (0.0, 4.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 0 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0]" +InformationStateString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0]" +InformationStateString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 3.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] last_action:p3 tile:(5.0, 6.0) pip:6.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] last_action:p3 tile:(5.0, 6.0) pip:6.0" +ObservationString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p3 tile:(5.0, 6.0) pip:6.0" +ObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] last_action:p3 tile:(5.0, 6.0) pip:6.0" +PublicObservationString() = "p0 last_action:p3 tile:(5.0, 6.0) pip:6.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (0.0, 5.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 0.0, 5.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [5.0, 6.0, 6.0, 3.0] +ObservationTensor(0).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [5.0, 6.0, 6.0, 3.0] +ObservationTensor(1).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 3.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [5.0, 6.0, 6.0, 3.0] +ObservationTensor(2).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [5.0, 6.0, 6.0, 3.0] +ObservationTensor(3).hand_sizes = [6.0, 6.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [16, 30] +StringLegalActions() = ["p0 tile:(0.0, 5.0) pip:5.0", "p0 tile:(1.0, 4.0) pip:4.0"] + +# Apply action "p0 tile:(0.0, 5.0) pip:5.0" +action: 16 + +# State 33 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 4.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 4.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(0.0, 3.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 2.0)', '(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)'] +# +# board: [(0.0, 5.0), (5.0, 6.0), (6.0, 0.0), (0.0, 0.0), (0.0, 4.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 1 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0]" +InformationStateString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0]" +InformationStateString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 3.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] last_action:p0 tile:(0.0, 5.0) pip:5.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)] last_action:p0 tile:(0.0, 5.0) pip:5.0" +ObservationString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p0 tile:(0.0, 5.0) pip:5.0" +ObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] last_action:p0 tile:(0.0, 5.0) pip:5.0" +PublicObservationString() = "p0 last_action:p0 tile:(0.0, 5.0) pip:5.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 4.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [0.0, 5.0, 5.0, 0.0] +ObservationTensor(0).hand_sizes = [5.0, 6.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [0.0, 5.0, 5.0, 0.0] +ObservationTensor(1).hand_sizes = [6.0, 5.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 3.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [0.0, 5.0, 5.0, 0.0] +ObservationTensor(2).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [0.0, 5.0, 5.0, 0.0] +ObservationTensor(3).hand_sizes = [6.0, 6.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [121] +StringLegalActions() = ["p1 tile:(2.0, 4.0) pip:4.0"] + +# Apply action "p1 tile:(2.0, 4.0) pip:4.0" +action: 121 + +# State 34 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 4.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(0.0, 3.0)', '(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 2.0)', '(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)'] +# +# board: [(0.0, 5.0), (5.0, 6.0), (6.0, 0.0), (0.0, 0.0), (0.0, 4.0), (4.0, 2.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 2 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0]" +InformationStateString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0]" +InformationStateString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [0.0, 3.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] last_action:p1 tile:(2.0, 4.0) pip:4.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)] last_action:p1 tile:(2.0, 4.0) pip:4.0" +ObservationString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p1 tile:(2.0, 4.0) pip:4.0" +ObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] last_action:p1 tile:(2.0, 4.0) pip:4.0" +PublicObservationString() = "p0 last_action:p1 tile:(2.0, 4.0) pip:4.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(0.0, 3.0), (2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [2.0, 4.0, 4.0, 1.0] +ObservationTensor(0).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [2.0, 4.0, 4.0, 1.0] +ObservationTensor(1).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [0.0, 3.0, 1.0, 2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [2.0, 4.0, 4.0, 1.0] +ObservationTensor(2).hand_sizes = [6.0, 6.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [2.0, 4.0, 4.0, 1.0] +ObservationTensor(3).hand_sizes = [6.0, 6.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [163, 203] +StringLegalActions() = ["p2 tile:(0.0, 3.0) pip:0.0", "p2 tile:(2.0, 6.0) pip:2.0"] + +# Apply action "p2 tile:(0.0, 3.0) pip:0.0" +action: 163 + +# State 35 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 4.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 2.0)', '(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)'] +# +# board: [(3.0, 0.0), (0.0, 5.0), (5.0, 6.0), (6.0, 0.0), (0.0, 0.0), (0.0, 4.0), (4.0, 2.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 3 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0]" +InformationStateString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0]" +InformationStateString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] last_action:p2 tile:(0.0, 3.0) pip:0.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)] last_action:p2 tile:(0.0, 3.0) pip:0.0" +ObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p2 tile:(0.0, 3.0) pip:0.0" +ObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] last_action:p2 tile:(0.0, 3.0) pip:0.0" +PublicObservationString() = "p0 last_action:p2 tile:(0.0, 3.0) pip:0.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 2.0), (1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [0.0, 3.0, 0.0, 2.0] +ObservationTensor(0).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [0.0, 3.0, 0.0, 2.0] +ObservationTensor(1).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [0.0, 3.0, 0.0, 2.0] +ObservationTensor(2).hand_sizes = [5.0, 6.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [0.0, 3.0, 0.0, 2.0] +ObservationTensor(3).hand_sizes = [6.0, 5.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [255, 258, 283] +StringLegalActions() = ["p3 tile:(1.0, 2.0) pip:2.0", "p3 tile:(1.0, 3.0) pip:3.0", "p3 tile:(3.0, 3.0) pip:3.0"] + +# Apply action "p3 tile:(1.0, 2.0) pip:2.0" +action: 255 + +# State 36 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(1.0, 4.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)'] +# +# board: [(3.0, 0.0), (0.0, 5.0), (5.0, 6.0), (6.0, 0.0), (0.0, 0.0), (0.0, 4.0), (4.0, 2.0), (2.0, 1.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 0 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0]" +InformationStateString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0]" +InformationStateString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)] last_action:p3 tile:(1.0, 2.0) pip:2.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)] last_action:p3 tile:(1.0, 2.0) pip:2.0" +ObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p3 tile:(1.0, 2.0) pip:2.0" +ObservationString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] last_action:p3 tile:(1.0, 2.0) pip:2.0" +PublicObservationString() = "p0 last_action:p3 tile:(1.0, 2.0) pip:2.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (1.0, 4.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 1.0, 4.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [1.0, 2.0, 2.0, 3.0] +ObservationTensor(0).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [1.0, 2.0, 2.0, 3.0] +ObservationTensor(1).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [1.0, 2.0, 2.0, 3.0] +ObservationTensor(2).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [1.0, 2.0, 2.0, 3.0] +ObservationTensor(3).hand_sizes = [5.0, 5.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [4, 29, 41] +StringLegalActions() = ["p0 tile:(0.0, 1.0) pip:1.0", "p0 tile:(1.0, 4.0) pip:1.0", "p0 tile:(2.0, 3.0) pip:3.0"] + +# Apply action "p0 tile:(1.0, 4.0) pip:1.0" +action: 29 + +# State 37 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 5.0)', '(3.0, 5.0)'] +# hand2:['(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)'] +# +# board: [(3.0, 0.0), (0.0, 5.0), (5.0, 6.0), (6.0, 0.0), (0.0, 0.0), (0.0, 4.0), (4.0, 2.0), (2.0, 1.0), (1.0, 4.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255, 29] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255, 29" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 1 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0]" +InformationStateString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0]" +InformationStateString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (2.0, 3.0), (6.0, 6.0)] last_action:p0 tile:(1.0, 4.0) pip:1.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)] last_action:p0 tile:(1.0, 4.0) pip:1.0" +ObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p0 tile:(1.0, 4.0) pip:1.0" +ObservationString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] last_action:p0 tile:(1.0, 4.0) pip:1.0" +PublicObservationString() = "p0 last_action:p0 tile:(1.0, 4.0) pip:1.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0), (3.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [1.0, 4.0, 1.0, 0.0] +ObservationTensor(0).hand_sizes = [4.0, 5.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 3.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [1.0, 4.0, 1.0, 0.0] +ObservationTensor(1).hand_sizes = [5.0, 4.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [1.0, 4.0, 1.0, 0.0] +ObservationTensor(2).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [1.0, 4.0, 1.0, 0.0] +ObservationTensor(3).hand_sizes = [5.0, 5.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [134] +StringLegalActions() = ["p1 tile:(3.0, 5.0) pip:3.0"] + +# Apply action "p1 tile:(3.0, 5.0) pip:3.0" +action: 134 + +# State 38 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 5.0)'] +# hand2:['(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)', '(4.0, 6.0)'] +# hand3:['(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)'] +# +# board: [(5.0, 3.0), (3.0, 0.0), (0.0, 5.0), (5.0, 6.0), (6.0, 0.0), (0.0, 0.0), (0.0, 4.0), (4.0, 2.0), (2.0, 1.0), (1.0, 4.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255, 29, 134] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255, 29, 134" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 2 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0]" +InformationStateString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0]" +InformationStateString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (2.0, 3.0), (6.0, 6.0)] last_action:p1 tile:(3.0, 5.0) pip:3.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0)] last_action:p1 tile:(3.0, 5.0) pip:3.0" +ObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)] last_action:p1 tile:(3.0, 5.0) pip:3.0" +ObservationString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] last_action:p1 tile:(3.0, 5.0) pip:3.0" +PublicObservationString() = "p0 last_action:p1 tile:(3.0, 5.0) pip:3.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0), (4.0, 6.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [3.0, 5.0, 3.0, 1.0] +ObservationTensor(0).hand_sizes = [4.0, 4.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [3.0, 5.0, 3.0, 1.0] +ObservationTensor(1).hand_sizes = [4.0, 4.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 4.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [3.0, 5.0, 3.0, 1.0] +ObservationTensor(2).hand_sizes = [5.0, 5.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [3.0, 5.0, 3.0, 1.0] +ObservationTensor(3).hand_sizes = [5.0, 5.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [209, 217, 222] +StringLegalActions() = ["p2 tile:(3.0, 4.0) pip:4.0", "p2 tile:(4.0, 4.0) pip:4.0", "p2 tile:(4.0, 6.0) pip:4.0"] + +# Apply action "p2 tile:(4.0, 6.0) pip:4.0" +action: 222 + +# State 39 +# hand0:['(0.0, 1.0)', '(0.0, 2.0)', '(2.0, 3.0)', '(6.0, 6.0)'] +# hand1:['(1.0, 1.0)', '(1.0, 6.0)', '(2.0, 2.0)', '(2.0, 5.0)'] +# hand2:['(2.0, 6.0)', '(3.0, 4.0)', '(3.0, 6.0)', '(4.0, 4.0)'] +# hand3:['(1.0, 3.0)', '(1.0, 5.0)', '(3.0, 3.0)', '(4.0, 5.0)', '(5.0, 5.0)'] +# +# board: [(5.0, 3.0), (3.0, 0.0), (0.0, 5.0), (5.0, 6.0), (6.0, 0.0), (0.0, 0.0), (0.0, 4.0), (4.0, 2.0), (2.0, 1.0), (1.0, 4.0), (4.0, 6.0)] +IsTerminal() = False +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255, 29, 134, 222] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255, 29, 134, 222" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = 3 +InformationStateString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (2.0, 3.0), (6.0, 6.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0, p2 tile:(4.0, 6.0) pip:4.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0, p2 tile:(4.0, 6.0) pip:4.0]" +InformationStateString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0, p2 tile:(4.0, 6.0) pip:4.0]" +InformationStateString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0, p2 tile:(4.0, 6.0) pip:4.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 4.0, 6.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 4.0, 6.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 4.0, 6.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 4.0, 6.0, 4.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (2.0, 3.0), (6.0, 6.0)] last_action:p2 tile:(4.0, 6.0) pip:4.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0)] last_action:p2 tile:(4.0, 6.0) pip:4.0" +ObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0)] last_action:p2 tile:(4.0, 6.0) pip:4.0" +ObservationString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)] last_action:p2 tile:(4.0, 6.0) pip:4.0" +PublicObservationString() = "p0 last_action:p2 tile:(4.0, 6.0) pip:4.0" +PrivateObservationString(0) = "p0 hand:[(0.0, 1.0), (0.0, 2.0), (2.0, 3.0), (6.0, 6.0)]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (1.0, 6.0), (2.0, 2.0), (2.0, 5.0)]" +PrivateObservationString(2) = "p2 hand:[(2.0, 6.0), (3.0, 4.0), (3.0, 6.0), (4.0, 4.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 3.0), (1.0, 5.0), (3.0, 3.0), (4.0, 5.0), (5.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand = [0.0, 1.0, 1.0, 0.0, 2.0, 1.0, 2.0, 3.0, 1.0, 6.0, 6.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(0).last_action = [4.0, 6.0, 4.0, 2.0] +ObservationTensor(0).hand_sizes = [4.0, 4.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 1.0, 6.0, 1.0, 2.0, 2.0, 1.0, 2.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [4.0, 6.0, 4.0, 2.0] +ObservationTensor(1).hand_sizes = [4.0, 4.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [2.0, 6.0, 1.0, 3.0, 4.0, 1.0, 3.0, 6.0, 1.0, 4.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [4.0, 6.0, 4.0, 2.0] +ObservationTensor(2).hand_sizes = [4.0, 5.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 3.0, 1.0, 1.0, 5.0, 1.0, 3.0, 3.0, 1.0, 4.0, 5.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [4.0, 6.0, 4.0, 2.0] +ObservationTensor(3).hand_sizes = [5.0, 4.0, 0.0, 0.0] +Rewards() = [0, 0, 0, 0] +Returns() = [0, 0, 0, 0] +LegalActions() = [264, 297, 302] +StringLegalActions() = ["p3 tile:(1.0, 5.0) pip:5.0", "p3 tile:(4.0, 5.0) pip:5.0", "p3 tile:(5.0, 5.0) pip:5.0"] + +# Apply action "p3 tile:(4.0, 5.0) pip:5.0" +action: 297 + +# State 40 +# Apply action "p0 tile:(6.0, 6.0) pip:6.0" +action: 76 + +# State 41 +# Apply action "p1 tile:(1.0, 6.0) pip:6.0" +action: 113 + +# State 42 +# Apply action "p2 tile:(3.0, 4.0) pip:4.0" +action: 209 + +# State 43 +# Apply action "p3 tile:(3.0, 3.0) pip:3.0" +action: 283 + +# State 44 +# Apply action "p0 tile:(0.0, 1.0) pip:1.0" +action: 4 + +# State 45 +# Apply action "p2 tile:(3.0, 6.0) pip:3.0" +action: 214 + +# State 46 +# Apply action "p0 tile:(0.0, 2.0) pip:0.0" +action: 6 + +# State 47 +# Apply action "p1 tile:(2.0, 5.0) pip:2.0" +action: 123 + +# State 48 +# Apply action "p2 tile:(2.0, 6.0) pip:6.0" +action: 204 + +# State 49 +# Apply action "p3 tile:(1.0, 5.0) pip:5.0" +action: 264 + +# State 50 +# Apply action "p0 tile:(2.0, 3.0) pip:2.0" +action: 40 + +# State 51 +# hand0:[] +# hand1:['(1.0, 1.0)', '(2.0, 2.0)'] +# hand2:['(4.0, 4.0)'] +# hand3:['(1.0, 3.0)', '(5.0, 5.0)'] +# +# board: [(3.0, 2.0), (2.0, 6.0), (6.0, 3.0), (3.0, 3.0), (3.0, 4.0), (4.0, 5.0), (5.0, 3.0), (3.0, 0.0), (0.0, 5.0), (5.0, 6.0), (6.0, 0.0), (0.0, 0.0), (0.0, 4.0), (4.0, 2.0), (2.0, 1.0), (1.0, 4.0), (4.0, 6.0), (6.0, 6.0), (6.0, 1.0), (1.0, 0.0), (0.0, 2.0), (2.0, 5.0), (5.0, 1.0)] +IsTerminal() = True +History() = [2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255, 29, 134, 222, 297, 76, 113, 209, 283, 4, 214, 6, 123, 204, 264, 40] +HistoryString() = "2, 12, 19, 26, 27, 15, 24, 23, 5, 7, 17, 11, 0, 13, 3, 18, 1, 16, 21, 9, 10, 6, 4, 25, 14, 20, 22, 8, 0, 95, 166, 305, 16, 121, 163, 255, 29, 134, 222, 297, 76, 113, 209, 283, 4, 214, 6, 123, 204, 264, 40" +IsChanceNode() = False +IsSimultaneousNode() = False +CurrentPlayer() = PlayerId.TERMINAL +InformationStateString(0) = "p0 hand:[] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0, p2 tile:(4.0, 6.0) pip:4.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(6.0, 6.0) pip:6.0, p1 tile:(1.0, 6.0) pip:6.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(3.0, 3.0) pip:3.0, p0 tile:(0.0, 1.0) pip:1.0, p2 tile:(3.0, 6.0) pip:3.0, p0 tile:(0.0, 2.0) pip:0.0, p1 tile:(2.0, 5.0) pip:2.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(1.0, 5.0) pip:5.0, p0 tile:(2.0, 3.0) pip:2.0]" +InformationStateString(1) = "p1 hand:[(1.0, 1.0), (2.0, 2.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0, p2 tile:(4.0, 6.0) pip:4.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(6.0, 6.0) pip:6.0, p1 tile:(1.0, 6.0) pip:6.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(3.0, 3.0) pip:3.0, p0 tile:(0.0, 1.0) pip:1.0, p2 tile:(3.0, 6.0) pip:3.0, p0 tile:(0.0, 2.0) pip:0.0, p1 tile:(2.0, 5.0) pip:2.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(1.0, 5.0) pip:5.0, p0 tile:(2.0, 3.0) pip:2.0]" +InformationStateString(2) = "p2 hand:[(4.0, 4.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0, p2 tile:(4.0, 6.0) pip:4.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(6.0, 6.0) pip:6.0, p1 tile:(1.0, 6.0) pip:6.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(3.0, 3.0) pip:3.0, p0 tile:(0.0, 1.0) pip:1.0, p2 tile:(3.0, 6.0) pip:3.0, p0 tile:(0.0, 2.0) pip:0.0, p1 tile:(2.0, 5.0) pip:2.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(1.0, 5.0) pip:5.0, p0 tile:(2.0, 3.0) pip:2.0]" +InformationStateString(3) = "p3 hand:[(1.0, 3.0), (5.0, 5.0)] history:[p0 tile:(0.0, 0.0) pip:None, p1 tile:(0.0, 6.0) pip:0.0, p2 tile:(0.0, 4.0) pip:0.0, p3 tile:(5.0, 6.0) pip:6.0, p0 tile:(0.0, 5.0) pip:5.0, p1 tile:(2.0, 4.0) pip:4.0, p2 tile:(0.0, 3.0) pip:0.0, p3 tile:(1.0, 2.0) pip:2.0, p0 tile:(1.0, 4.0) pip:1.0, p1 tile:(3.0, 5.0) pip:3.0, p2 tile:(4.0, 6.0) pip:4.0, p3 tile:(4.0, 5.0) pip:5.0, p0 tile:(6.0, 6.0) pip:6.0, p1 tile:(1.0, 6.0) pip:6.0, p2 tile:(3.0, 4.0) pip:4.0, p3 tile:(3.0, 3.0) pip:3.0, p0 tile:(0.0, 1.0) pip:1.0, p2 tile:(3.0, 6.0) pip:3.0, p0 tile:(0.0, 2.0) pip:0.0, p1 tile:(2.0, 5.0) pip:2.0, p2 tile:(2.0, 6.0) pip:6.0, p3 tile:(1.0, 5.0) pip:5.0, p0 tile:(2.0, 3.0) pip:2.0]" +InformationStateTensor(0).player: ◉◯◯◯ +InformationStateTensor(0).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +InformationStateTensor(0).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 4.0, 6.0, 4.0, 2.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 6.0, 6.0, 6.0, 0.0, 1.0, 1.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 3.0, 3.0, 3.0, 3.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 3.0, 6.0, 3.0, 2.0, 1.0, 0.0, 2.0, 0.0, 0.0, 1.0, 2.0, 5.0, 2.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 1.0, 5.0, 5.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).player: ◯◉◯◯ +InformationStateTensor(1).hand = [1.0, 1.0, 1.0, 2.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(1).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 4.0, 6.0, 4.0, 2.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 6.0, 6.0, 6.0, 0.0, 1.0, 1.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 3.0, 3.0, 3.0, 3.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 3.0, 6.0, 3.0, 2.0, 1.0, 0.0, 2.0, 0.0, 0.0, 1.0, 2.0, 5.0, 2.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 1.0, 5.0, 5.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).player: ◯◯◉◯ +InformationStateTensor(2).hand = [4.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(2).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 4.0, 6.0, 4.0, 2.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 6.0, 6.0, 6.0, 0.0, 1.0, 1.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 3.0, 3.0, 3.0, 3.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 3.0, 6.0, 3.0, 2.0, 1.0, 0.0, 2.0, 0.0, 0.0, 1.0, 2.0, 5.0, 2.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 1.0, 5.0, 5.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).player: ◯◯◯◉ +InformationStateTensor(3).hand = [1.0, 3.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +InformationStateTensor(3).actions_history = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 6.0, 0.0, 1.0, 1.0, 0.0, 4.0, 0.0, 2.0, 1.0, 5.0, 6.0, 6.0, 3.0, 1.0, 0.0, 5.0, 5.0, 0.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 0.0, 3.0, 0.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 4.0, 1.0, 0.0, 1.0, 3.0, 5.0, 3.0, 1.0, 1.0, 4.0, 6.0, 4.0, 2.0, 1.0, 4.0, 5.0, 5.0, 3.0, 1.0, 6.0, 6.0, 6.0, 0.0, 1.0, 1.0, 6.0, 6.0, 1.0, 1.0, 3.0, 4.0, 4.0, 2.0, 1.0, 3.0, 3.0, 3.0, 3.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 3.0, 6.0, 3.0, 2.0, 1.0, 0.0, 2.0, 0.0, 0.0, 1.0, 2.0, 5.0, 2.0, 1.0, 1.0, 2.0, 6.0, 6.0, 2.0, 1.0, 1.0, 5.0, 5.0, 3.0, 1.0, 2.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationString(0) = "p0 hand:[] last_action:p0 tile:(2.0, 3.0) pip:2.0" +ObservationString(1) = "p1 hand:[(1.0, 1.0), (2.0, 2.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" +ObservationString(2) = "p2 hand:[(4.0, 4.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" +ObservationString(3) = "p3 hand:[(1.0, 3.0), (5.0, 5.0)] last_action:p0 tile:(2.0, 3.0) pip:2.0" +PublicObservationString() = "p0 last_action:p0 tile:(2.0, 3.0) pip:2.0" +PrivateObservationString(0) = "p0 hand:[]" +PrivateObservationString(1) = "p1 hand:[(1.0, 1.0), (2.0, 2.0)]" +PrivateObservationString(2) = "p2 hand:[(4.0, 4.0)]" +PrivateObservationString(3) = "p3 hand:[(1.0, 3.0), (5.0, 5.0)]" +ObservationTensor(0).player: ◉◯◯◯ +ObservationTensor(0).hand: ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ + ◯◯◯ +ObservationTensor(0).last_action = [2.0, 3.0, 2.0, 0.0] +ObservationTensor(0).hand_sizes = [0.0, 2.0, 0.0, 0.0] +ObservationTensor(1).player: ◯◉◯◯ +ObservationTensor(1).hand = [1.0, 1.0, 1.0, 2.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(1).last_action = [2.0, 3.0, 2.0, 0.0] +ObservationTensor(1).hand_sizes = [2.0, 0.0, 0.0, 0.0] +ObservationTensor(2).player: ◯◯◉◯ +ObservationTensor(2).hand = [4.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(2).last_action = [2.0, 3.0, 2.0, 0.0] +ObservationTensor(2).hand_sizes = [1.0, 2.0, 0.0, 0.0] +ObservationTensor(3).player: ◯◯◯◉ +ObservationTensor(3).hand = [1.0, 3.0, 1.0, 5.0, 5.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +ObservationTensor(3).last_action = [2.0, 3.0, 2.0, 0.0] +ObservationTensor(3).hand_sizes = [2.0, 1.0, 0.0, 0.0] +Rewards() = [20, -20, 20, -20] +Returns() = [20, -20, 20, -20] From 1cc8d0d7e1ea3048cba5799ccefbe12a01212817 Mon Sep 17 00:00:00 2001 From: Brunozml Date: Wed, 24 Apr 2024 14:38:11 +0200 Subject: [PATCH 6/6] corrected team dominoes tests --- docs/games.md | 22 +++++++++---------- open_spiel/python/CMakeLists.txt | 2 +- open_spiel/python/games/team_dominoes_test.py | 6 ++--- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/games.md b/docs/games.md index 03c4c9f86e..58a9789de6 100644 --- a/docs/games.md +++ b/docs/games.md @@ -495,17 +495,6 @@ * 2 players. * [Wikipedia](https://en.wikipedia.org/wiki/Kuhn_poker) -### Team Dominoes - -* Team version of dominoes. -* Consists of 28 tiles, featuring all combinations of spot counts (also called - pips or dots) between zero and six. -* Traditional game. -* Non-deterministic. -* Imperfect information. -* 4 players. -* [Wikipedia](https://en.wikipedia.org/wiki/Dominoes#Latin_American_Version) - ### Laser Tag * Agents see a local part of the grid, and attempt to tag each other with @@ -876,6 +865,17 @@ * [Wikipedia](https://en.wikipedia.org/wiki/Klondike_\(solitaire\)) and [Bjarnason et al. '07, Searching solitaire in real time](http://web.engr.oregonstate.edu/~afern/papers/solitaire.pdf) +### Team Dominoes + +* Team version of dominoes. +* Consists of 28 tiles, featuring all combinations of spot counts (also called + pips or dots) between zero and six. +* Traditional game. +* Non-deterministic. +* Imperfect information. +* 4 players. +* [Wikipedia](https://en.wikipedia.org/wiki/Dominoes#Latin_American_Version) + ### Tic-Tac-Toe * Players place tokens to try and form a pattern. diff --git a/open_spiel/python/CMakeLists.txt b/open_spiel/python/CMakeLists.txt index a0da0c3ffc..82fbc4ac8c 100644 --- a/open_spiel/python/CMakeLists.txt +++ b/open_spiel/python/CMakeLists.txt @@ -219,10 +219,10 @@ set(PYTHON_TESTS ${PYTHON_TESTS} games/chat_game_test.py games/chat_games/envs/base_envs/base_envs_test.py games/data_test.py - games/team_dominoes_test.py games/dynamic_routing_test.py games/dynamic_routing_utils_test.py games/liars_poker_test.py + games/team_dominoes_test.py games/tic_tac_toe_test.py mfg/algorithms/best_response_value_test.py mfg/algorithms/mirror_descent_test.py diff --git a/open_spiel/python/games/team_dominoes_test.py b/open_spiel/python/games/team_dominoes_test.py index f178d2041d..8a46ead099 100644 --- a/open_spiel/python/games/team_dominoes_test.py +++ b/open_spiel/python/games/team_dominoes_test.py @@ -25,12 +25,12 @@ class DominoesTest(absltest.TestCase): def test_game_from_cc(self): """Runs our standard game tests, checking API consistency.""" - game = pyspiel.load_game("python_dominoes") + game = pyspiel.load_game("python_team_dominoes") pyspiel.random_sim_test(game, num_sims=100, serialize=False, verbose=True) def test_single_deterministic_game_1(self): """Runs a single game where tiles and actions chose deterministically.""" - game = pyspiel.load_game("python_dominoes") + game = pyspiel.load_game("python_team_dominoes") state = game.new_initial_state() hand0 = [(1.0, 3.0), (0.0, 5.0), (1.0, 1.0), (2.0, 3.0), (4.0, 5.0), (3.0, 5.0), (0.0, 1.0)] hand1= [(2.0, 5.0), (3.0, 4.0), (2.0, 2.0), (0.0, 4.0), (3.0, 3.0), (2.0, 6.0), (1.0, 6.0)] @@ -78,7 +78,7 @@ def test_single_deterministic_game_1(self): def test_single_deterministic_game_2(self): """Runs a single game where tiles and actions chose deterministically.""" - game = pyspiel.load_game("python_dominoes") + game = pyspiel.load_game("python_team_dominoes") state = game.new_initial_state() hand0 = [(0.0, 6.0), (3.0, 6.0), (1.0, 3.0), (1.0, 4.0), (5.0, 5.0), (0.0, 0.0), (2.0, 6.0)] hand1= [(1.0, 5.0), (2.0, 2.0), (0.0, 2.0), (0.0, 3.0), (4.0, 5.0), (6.0, 6.0), (5.0, 6.0)]