File size: 1,484 Bytes
5e0b58b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Deterministic environment used for the first Alpha.7 loop proof."""

from __future__ import annotations

from dataclasses import dataclass

from .environment import EnvironmentAdapter
from .models import ActionCommand, EnvironmentKind, EnvironmentObservation


@dataclass(slots=True)
class DeterministicTargetEnvironment(EnvironmentAdapter):
    """One-dimensional target task with deterministic seeded reset."""

    target: int = 3
    position: int = 0
    tick: int = 0

    @property
    def environment_id(self) -> str:
        return "deterministic-target-v1"

    @property
    def kind(self) -> EnvironmentKind:
        return EnvironmentKind.SIMULATED

    def reset(self, seed: int | None = None) -> EnvironmentObservation:
        self.position = 0 if seed is None else seed % 2
        self.tick = 0
        return self._observation(0.0)

    def step(self, action: ActionCommand) -> EnvironmentObservation:
        self.tick += 1
        if action.action == "right":
            self.position += 1
        elif action.action == "left":
            self.position -= 1
        reward = 1.0 if self.position == self.target else 0.0
        return self._observation(reward)

    def _observation(self, reward: float) -> EnvironmentObservation:
        return EnvironmentObservation(
            tick=self.tick,
            state={"position": self.position, "target": self.target},
            reward=reward,
            terminated=self.position == self.target,
        )