アプリケーションとラウンド

アプリケーション

oTreeアプリケーションはPythonおよびHTMLコードを含むフォルダとして構成されます。一つのプロジェクト内で複数のアプリケーションを含むことができます。セッションは基本的に、次々に実行される一連のアプリケーションを表します。

アプリケーションの組合わせ

セッション構成 app_sequence を設定することで、アプリケーションを組み合わせることができます。

アプリケーション間のデータ受け渡し

Participant fieldssession fields を参照してください。

ラウンド

C.NUM_ROUNDS に値を設定することで、実行するラウンド数を設定できます。例えば、 app_sequence['app1', 'app2'] として設定されており、 app1NUM_ROUNDS = 3 に、app2NUM_ROUNDS = 1 に設定されている場合は、合わせて4つのセッションが実行されます。

ラウンド数

player.round_number で現在のラウンド数を参照できます。(この要素はsubsession、group、playerオブジェクトが保持しています。)ラウンド数は1から数えられます。

ラウンドとアプリケーション間のデータの受け渡し

それぞれのラウンドは個別の GroupPlayer オブジェクトを保持します。例えば、ラウンド1で player.my_field = True に設定した場合、ラウンド2で player.my_field の値を参照しようとしても None が返ってきます。これはラウンドによって個別に Player オブジェクトが作成されるためです。

過去のラウンドやアプリケーションからのデータにアクセスするために、以下のいずれかの方法でアクセスすることができます。

in_rounds、 in_previous_rounds、 in_round など

Player、Group、subsessionオブジェクトは次のメソッドを持ちます。

  • in_previous_rounds()
  • in_all_rounds()
  • in_rounds()
  • in_round()

例えば、もし10ラウンドのゲームの最後に、 player.in_previous_rounds() を呼び出すと、過去の9ラウンド分の同じ参加者のPlayerオブジェクトのデータが返されます。

player.in_all_rounds() はほとんど同じですが、現在のラウンドも含めて10このオブジェクトを返します。

player.in_rounds(m, n) はラウンド m からラウンド n までの同じ参加者のPlayerのリストを返します。

player.in_round(m) はラウンド m のPlayerデータを返します。例えば、前のラウンドの参加者の利得が知りたい場合は、次のようにします。

prev_player = player.in_round(player.round_number - 1)
print(prev_player.payoff)

これらの関数はsubsessionでも同じように機能します。(例: subsession.in_all_rounds()

これらはGroupに対しても同じように機能しますが、ラウンド間でグループがシャッフルされる場合は、使用しても正しい結果を得ることはできません。

Participant fields

前のアプリケーションの参加者のデータにアクセスしたいのなら、participantオブジェクトにアクセスしたいデータをあらかじめ保存しておく必要があります。このオブジェクトはアプリケーション間で保存されます。( Participant )( in_all_rounds() は、同じアプリケーションの前のラウンドのデータにアクセスする必要があるときのみ有効です。)

実験の参加者に定義したいフィールドの名前のリストである、 PARTICIPANT_FIELDS を定義し、設定してください。

すると、コード上でこれらのフィールドに任意のタイプのデータの取得や設定ができます。

participant.mylist = [1, 2, 3]

内部的には、すべての参加者のデータは participant.vars という辞書型リストに保存されています。また、 participant.xyzparticipant.vars['xyz'] と同等です。

session fields

セッション中のすべての参加者で共通のグローバル変数を利用するために、 SESSION_FIELDS を追加してください。それは、 PARTICIPANT_FIELDS と同じように働きます。内部的には、全ての session fields は session.vars に保存されます。

ラウンド数を可変にする

もし、ラウンドを可変にしたいなら、ライブページ の利用を検討してください。

代わりに、 NUM_ROUNDS を高い値に設定してから、プログラム内である条件で {{ next_button }} を非表示にして、先のラウンドへ進めなくするか、 app_after_this_page を使う方法もあります。ただし、ラウンド数が増えると(例えば、100以上)、パフォーマンスに問題が生じる可能性があります。注意して、テストしてください。