from models import NeuralTunerAction from server.neural_tuner_env_environment import NeuralTunerEnvironment def _first_layer_id(obs_text: str) -> str: for line in obs_text.splitlines(): if "HIDDEN" in line and line.strip(): return line.split()[0] raise AssertionError("No layer row found in reset observation.") def test_benchmark_budget_is_enforced(): env = NeuralTunerEnvironment() env.reset(model_id="resnet50", difficulty="easy", seed=42) for _ in range(env.MAX_BENCHMARKS): result = env.step(NeuralTunerAction(action_type="benchmark")) assert result.success is True assert result.done is False exhausted = env.step(NeuralTunerAction(action_type="benchmark")) assert exhausted.success is False assert exhausted.error == "benchmark_limit_reached" def test_invalid_layer_returns_error(): env = NeuralTunerEnvironment() env.reset(model_id="inception_v3", difficulty="easy", seed=42) result = env.step(NeuralTunerAction(action_type="quantize_layer", layer_id="not_a_layer", dtype="INT8")) assert result.success is False assert result.error == "layer_not_found" def test_submit_ends_episode_and_next_step_is_rejected(): env = NeuralTunerEnvironment() env.reset(model_id="mobilenet_v3", difficulty="easy", seed=42) submitted = env.step(NeuralTunerAction(action_type="submit")) assert submitted.done is True assert submitted.success is True after = env.step(NeuralTunerAction(action_type="benchmark")) assert after.success is False assert after.error == "episode_complete" assert after.done is True def test_quantize_then_revert_changes_state_safely(): env = NeuralTunerEnvironment() reset_obs = env.reset(model_id="resnet50", difficulty="easy", seed=123) layer_id = _first_layer_id(reset_obs.output) quantized = env.step(NeuralTunerAction(action_type="quantize_layer", layer_id=layer_id, dtype="INT8")) assert quantized.success is True reverted = env.step(NeuralTunerAction(action_type="revert_layer", layer_id=layer_id)) assert reverted.success is True assert "FP32" in reverted.output