""" test_docker.py -- Test the Hypothesis Lab environment using the OpenEnv client. Run with: python test_docker.py Requires: the Docker container running on localhost:8000 """ import asyncio from client import HypothesisLabEnv async def main(): async with HypothesisLabEnv(base_url="http://localhost:8000") as env: # 1. Reset result = await env.reset(noise_level="low", domain="system_alpha", seed=42) obs = result.observation print("=== Episode Started ===") print(f"Message: {obs.system_message[:80]}...") print(f"Variables: {obs.available_variables}") print(f"Budget: {obs.budget_remaining}") print() v = obs.available_variables cause, effect = v[0], v[1] # 2. Intervention -- set one variable, observe the other result = await env.run_intervention(cause, 5.0, effect) obs = result.observation print(f"[Intervention] Set {cause}=5.0 -> {effect}={obs.result_value:.4f}") print(f" Info gain: {obs.info_gain_reward} Budget left: {obs.budget_remaining}") print() # 3. Try the reverse direction to check causality result = await env.run_intervention(effect, 5.0, cause) obs = result.observation print(f"[Reverse] Set {effect}=5.0 -> {cause}={obs.result_value:.4f}") print(f" Info gain: {obs.info_gain_reward} Budget left: {obs.budget_remaining}") print() # 4. Correlation sweep -- see the shape of the relationship result = await env.run_correlation(cause, [0.5, 20.0, 8], effect) obs = result.observation print(f"[Correlation] Swept {cause} from 0.5 to 20.0:") for x, y in obs.result_value: print(f" {cause}={x:.1f} -> {effect}={y:.4f}") print(f" Info gain: {obs.info_gain_reward} Budget left: {obs.budget_remaining}") print() # 5. Counterfactual -- what if cause changes by +3? result = await env.run_counterfactual(cause, 3.0, effect) obs = result.observation cf = obs.result_value print(f"[Counterfactual] If {cause} changes by +3.0:") print(f" Baseline: {cause}={cf['baseline_x']:.2f} -> {effect}={cf['baseline_y_noisy']:.4f}") print(f" After: {cause}={cf['counterfactual_x']:.2f} -> {effect}={cf['counterfactual_y_noisy']:.4f}") print(f" Direction: {cf['direction']}") print(f" Info gain: {obs.info_gain_reward} Budget left: {obs.budget_remaining}") print() # 6. Passive observation -- observe a variable without touching anything result = await env.run_passive(effect) obs = result.observation print(f"[Passive] {effect} at rest = {obs.result_value:.4f}") print(f" Info gain: {obs.info_gain_reward} Budget left: {obs.budget_remaining}") print() # 7. Submit hypothesis result = await env.submit_hypothesis( hypothesis_text=f"{effect} decays exponentially as {cause} increases.", hypothesis_equations=[f"{effect} = 1.1 * exp(-0.16 * {cause})"], confidence=0.65, ) obs = result.observation print("=== Episode Finished ===") print(f"Accuracy: {obs.accuracy_score}") print(f"Precision: {obs.precision_bonus}") print(f"Calibration: {obs.calibration_score}") print(f"Efficiency: {obs.efficiency_bonus}") print(f"Contradiction: {obs.contradiction_penalty}") print(f"TOTAL REWARD: {obs.total_episode_reward}") print() print(f"Ground truth:\n{obs.ground_truth_revealed}") asyncio.run(main())