Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Mahjong] 副露の実装 #921

Merged
merged 13 commits into from
Jun 23, 2023
Merged

[Mahjong] 副露の実装 #921

merged 13 commits into from
Jun 23, 2023

Conversation

OkanoShinri
Copy link
Collaborator

No description provided.

@OkanoShinri
Copy link
Collaborator Author

OkanoShinri commented Jun 2, 2023

同時に生じる場合、ポンorカン→チーの順で処理(2人以上が同時にポンすることはありえない、チーは下家しか不可)

@OkanoShinri
Copy link
Collaborator Author

OkanoShinri commented Jun 7, 2023

そもそも

playerが順に回らない、をどう扱うか。先代はstepの引数にplayerを入れていたが、current_playerに組み込めないか?

ex. pon

  • player0 discard = state(current_player=2)

    1. player2 judge(pon) = state(current_player=2)
      -> player2 discard = state(current_player=3)

    2. player2 judge(not pon) = state(current_player=1)
      -> player1 discard = state(current_player=2)

@OkanoShinri
Copy link
Collaborator Author

OkanoShinri commented Jun 22, 2023

make_jaxprの行数比較

full_mahjongが@jitをすべて外してjax.make_jaxpr(State._step)してもエラーが出る
解決がめんどそうなので、@jit付をさらにmake_jaxprしているため参考程度に

import jax
from pgx._mahjong._action import Action
from pgx.experimental.mahjong.full_mahjong import State

key = jax.random.PRNGKey(0)
state = State.init(key)
exp = jax.make_jaxpr(State._step)(state, 0, Action.TSUMOGIRI)
n_line = len(str(exp).split("\n"))
print("old", n_line)


from pgx._mahjong._mahjong2 import Mahjong

env = Mahjong()

key = jax.random.PRNGKey(0)
state = env.init(key=key)
exp = jax.make_jaxpr(env.step)(state, Action.TSUMOGIRI)
n_line = len(str(exp).split("\n"))
print("new", n_line)
old 55745
new 7596

@OkanoShinri
Copy link
Collaborator Author

OkanoShinri commented Jun 22, 2023

残り

  • riichi
  • 終了判定
    • tsumo
    • ron
    • ryukyoku
  • pon/kan を無視した後のchi判定
  • observe

くらい?

@OkanoShinri
Copy link
Collaborator Author

current_playerを定める方をmahjong2としています

@OkanoShinri
Copy link
Collaborator Author

OkanoShinri commented Jun 22, 2023

@sotetsuk
Stateはこれで可視化へ進むつもりです

@dataclass
class State(v1.State):
current_player: jnp.ndarray = jnp.int8(0) # actionを行うplayer
observation: jnp.ndarray = jnp.int8(0)
rewards: jnp.ndarray = jnp.float32([0.0, 0.0, 0.0, 0.0])
terminated: jnp.ndarray = FALSE
truncated: jnp.ndarray = FALSE
legal_action_mask: jnp.ndarray = jnp.zeros(NUM_ACTION, dtype=jnp.bool_)
_rng_key: jax.random.KeyArray = jax.random.PRNGKey(0)
_step_count: jnp.ndarray = jnp.int32(0)
# --- Mahjong specific ---
deck: jnp.ndarray = jnp.zeros(136, dtype=jnp.int8)
# 次に引く牌のindex
next_deck_ix: jnp.ndarray = jnp.int8(135)
# 各プレイヤーの手牌. 長さ34で、数字は持っている牌の数
hand: jnp.ndarray = jnp.zeros((4, 34), dtype=jnp.int8)
# ドラ
doras: jnp.ndarray = jnp.zeros(4, dtype=jnp.int8)
# カンの回数=追加ドラ枚数
num_kan: jnp.ndarray = jnp.int8(0)
# 直前に捨てられてron,pon,chiの対象になっている牌. 存在しなければ-1
target: jnp.ndarray = jnp.int8(-1)
# 手牌が3n+2枚のplayerが直前に引いた牌. 存在しなければ-1
last_draw: jnp.ndarray = jnp.int8(0)
# 最後のプレイヤー. ron,pon,chiの対象
last_player: jnp.ndarray = jnp.int8(0)
# 最後のアクション. ponの次のchi判定などで使用
last_action: jnp.ndarray = jnp.int8(-1)
# state.current_player がリーチ宣言してから, その直後の打牌が通るまでTrue
riichi_declared: jnp.ndarray = FALSE
# 各playerのリーチが成立しているかどうか
riichi: jnp.ndarray = jnp.zeros(4, dtype=jnp.bool_)
# 各playerの副露回数
n_meld: jnp.ndarray = jnp.zeros(4, dtype=jnp.int8)
# melds[i][j]: player i のj回目の副露(j=1,2,3,4). 存在しなければ0
melds: jnp.ndarray = jnp.zeros((4, 4), dtype=jnp.int32)
is_menzen: jnp.ndarray = jnp.zeros(4, dtype=jnp.bool_)
# pon[i][j]: player i がjをポンを所有している場合, src << 2 | index. or 0
pon: jnp.ndarray = jnp.zeros((4, 34), dtype=jnp.int32)

@OkanoShinri
Copy link
Collaborator Author

このPRはマージ可能です

@sotetsuk
Copy link
Owner

@OkanoShinri マージしちゃってください!

@OkanoShinri OkanoShinri merged commit 667fe39 into main Jun 23, 2023
4 checks passed
@OkanoShinri OkanoShinri deleted the okano/feat/mahjong-meld branch June 23, 2023 11:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants