File size: 3,663 Bytes
aab0192
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
"""
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())