mjx-project / mjx

Mjx: A framework for Mahjong AI research
https://colab.research.google.com/drive/1m1wOT_K2YFtuV6IO7VgWk4ilVhTKqRFU?usp=sharing
MIT License
170 stars 19 forks source link

tile1をDISCARDするactionをto_jsonすると、keyがwhoだけのjsonになる #1142

Closed sacckey closed 2 years ago

sacckey commented 2 years ago

環境 OS: Ubuntu 22.04.1 LTS, Python: 3.10.6 Google Colab上のデモでも再現しました。

テスト用アクションクラス

...
import json
class TestAgent(Agent):
    def __init__(self) -> None:
        super().__init__()

    def act(self, observation: Observation) -> Action:
        for legal_action in observation.legal_actions():
            legal_action_keys = list(json.loads(legal_action.to_json()).keys())
            if len(legal_action_keys) == 1 and legal_action_keys[0] == 'who':
                print(str(legal_action.type()) + ': ' + legal_action.to_json())
                print('tile: ' + str(legal_action.tile().num()))

        return random.choice(observation.legal_actions())

実行結果

TestAgent().act(obs)
# =>
# ActionType.DISCARD: {"who":1}
# tile: 1
sotetsuk commented 2 years ago

ありがとうございます!

これはprotobufがデフォルトの値が入らないのでこうなってますね。 Id0の牌(一萬)を捨てる行動は現象はこう表現される仕様になってます。

Jsonはシリアライズとデシリアライズ(及び中身の確認)だけに使って、 データアクセスはprotobufオブジェクトか他のPythonメソッドを使う想定です。 まだドキュメントとか書いてなくて申し訳ないです💦

sotetsuk commented 2 years ago

numメソッドが返してるのは一萬の1ですね。 idはゼロの牌のはずです。

sacckey commented 2 years ago

numメソッドが返してるのは一萬の1ですね。 idはゼロの牌のはずです。

すみません。確かにtile.id()が0の牌でした🙇‍♂️

これはprotobufがデフォルトの値が入らないのでこうなってますね。 Id0の牌(一萬)を捨てる行動は現象はこう表現される仕様になってます。

なるほど、ありがとうございます! これは牌譜の中にもtile0やwho0のJsonは入らない想定でしょうか? 元々はenv.state().to_json()で牌譜を出力したときに、whoやtileが無いJsonがあるのが気になった感じでした。

もし、そもそも牌譜を出力する方法が間違っていれば、教えていただきたいです🙏

sotetsuk commented 2 years ago

いや、牌譜はstateをto_jsonしてもらってシリアライズする想定で合ってます。 中身の確認はstateクラスから画像で可視化してもらうのがいいかなと思います。

sotetsuk commented 2 years ago

Issue自体はクローズします