OperantKit の手動セッションドライバ。experiment-core.Session を
コールバック型 API で包み、emit された全イベントを下流の
experiment_core.EventSink に転送する。
session-runner は任意の入力源(GUI / テスト / シミュレータ /
ハードウェアループ)と experiment_core.Session の間に立つ
ドライバレイヤ。ハードウェア・wire format・DSL を知らない。
| 責務 | パッケージ |
|---|---|
| セッションライフサイクル(イベント) | experiment-core |
| 手動駆動(本パッケージ) | session-runner |
| HAL Protocol + ハードウェア駆動 | experiment-io |
| OKL v1 永続化 | session-recorder |
| DSL パース | contingency-dsl-py |
| エンドツーエンド CLI glue | operant-cli |
mise exec -- python -m venv .venv
mise exec -- .venv/bin/python -m pip install -e ../experiment-core
mise exec -- .venv/bin/python -m pip install -e ../../core/contingency-py
mise exec -- .venv/bin/python -m pip install -e ../../core/contingency-dsl-py
mise exec -- .venv/bin/python -m pip install -e '.[dev]'from contingency import ScheduleBuilder
from experiment_core import InMemorySink, ReinforcementCountExit
from session_runner import SessionConfig, SessionRunner
sink = InMemorySink()
runner = SessionRunner(
SessionConfig(
name="demo",
schedule=ScheduleBuilder.fr(3),
exit_condition=ReinforcementCountExit(count=5),
),
sink=sink,
)
runner.start(start_time=0.0)
runner.handle_response(timestamp=1.0)
runner.handle_response(timestamp=2.0)
runner.handle_response(timestamp=3.0)
assert runner.is_reinforcing
runner.end_reinforcement(timestamp=3.1)tee() で複数 sink にイベントをファンアウトできる:
from session_recorder import OklSink
from session_runner import tee
okl_sink = OklSink("session.txt")
okl_sink.write_header(session_name="demo", clock_type="ManualClock", session_start=0.0)
runner = SessionRunner(
SessionConfig(name="demo", schedule=...),
sink=tee(InMemorySink(), okl_sink),
)SessionRunner 自体はハードウェアをポーリングしない。
handle_response_on / handle_tick / end_reinforcement を公開し、
任意のループから駆動できる構造にしている。HAL 駆動ループは
experiment-io.drive を参照。
SessionConfig(name, schedule, exit_condition?, metadata?)— セッション identity。SessionRunner(config, sink?, clock?)— ドライバ。start(start_time?)handle_response(timestamp)— 単一コンポーネントhandle_response_on(operandum, timestamp)— 並立handle_tick(timestamp)— 時間ベース / 時間制限end_reinforcement(timestamp)is_finished,is_reinforcing,total_responses,component_responses,session_metadata
tee(*sinks) -> EventSink— 複数 sink を結合。
.venv/bin/pytest
.venv/bin/pytest --cov=src --cov-report=term-missing
.venv/bin/ruff check src tests
.venv/bin/black --check src tests- Ferster, C. B., & Skinner, B. F. (1957). Schedules of reinforcement. Appleton-Century-Crofts.