Rename multi-segment functions to two-concept names; polish docstrings
Naming pass: rename functions whose third+ segment is redundant or implementation-detail, sticking to the codebase's preferred ``noun_verb`` / ``verb_noun`` two-concept idiom. Renames are atomic across definitions, callers, and tests. is_penned_position → is_penned modulate_speed_near_sheep → modulate_speed mecanum_kinematics_step → mecanum_step policy_forward_mean → forward_mean Two-concept patterns like ``velocity_to_wheels`` / ``detections_from_scan`` / ``make_strombom_predictor`` are left alone — they're idiomatic converters / factories that read as a single concept, and the longer form aids grep-ability. Docstring polish: * ``herding/config.py`` header drops the "previously lived as a module-level literal" historical framing — we ship as a single thing, so the refactor anecdote no longer earns its keep. The usage examples now mention both ``HERDING_WEBOTS`` and ``HERDING_MEC_WEBOTS`` presets. 126 pytest cases still pass. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -8,7 +8,7 @@ from herding.control.active_scan import (
|
||||
EMPTY_DEBOUNCE_STEPS, INITIAL_SCAN_STEPS, ActiveScanTeacher,
|
||||
)
|
||||
from herding.control.modulation import (
|
||||
MIN_SPEED, SLOW_NEAR_SHEEP, modulate_speed_near_sheep,
|
||||
MIN_SPEED, SLOW_NEAR_SHEEP, modulate_speed,
|
||||
)
|
||||
from herding.control.sequential import compute_action as sequential_action
|
||||
from herding.control.strombom import (
|
||||
@@ -23,23 +23,23 @@ from herding.world.geometry import PEN_ENTRY
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def test_modulation_empty_input_passthrough():
|
||||
assert modulate_speed_near_sheep(1.0, 0.0, (0.0, 0.0), []) == (1.0, 0.0)
|
||||
assert modulate_speed_near_sheep(1.0, 0.0, (0.0, 0.0), {}) == (1.0, 0.0)
|
||||
assert modulate_speed(1.0, 0.0, (0.0, 0.0), []) == (1.0, 0.0)
|
||||
assert modulate_speed(1.0, 0.0, (0.0, 0.0), {}) == (1.0, 0.0)
|
||||
|
||||
|
||||
def test_modulation_far_sheep_passthrough():
|
||||
vx, vy = modulate_speed_near_sheep(1.0, 0.0, (0.0, 0.0), [(100.0, 0.0)])
|
||||
vx, vy = modulate_speed(1.0, 0.0, (0.0, 0.0), [(100.0, 0.0)])
|
||||
assert (vx, vy) == (1.0, 0.0)
|
||||
|
||||
|
||||
def test_modulation_close_sheep_min_speed():
|
||||
vx, vy = modulate_speed_near_sheep(1.0, 0.0, (0.0, 0.0), [(0.0, 0.0)])
|
||||
vx, vy = modulate_speed(1.0, 0.0, (0.0, 0.0), [(0.0, 0.0)])
|
||||
assert math.isclose(vx, MIN_SPEED)
|
||||
assert vy == 0.0
|
||||
|
||||
|
||||
def test_modulation_preserves_direction():
|
||||
vx, vy = modulate_speed_near_sheep(0.6, 0.8, (0.0, 0.0), [(1.0, 0.0)])
|
||||
vx, vy = modulate_speed(0.6, 0.8, (0.0, 0.0), [(1.0, 0.0)])
|
||||
ratio = math.hypot(vx, vy)
|
||||
# Direction preserved.
|
||||
assert math.isclose(vx / ratio, 0.6, abs_tol=1e-6)
|
||||
@@ -47,16 +47,16 @@ def test_modulation_preserves_direction():
|
||||
|
||||
|
||||
def test_modulation_linear_ramp_midpoint():
|
||||
vx, _ = modulate_speed_near_sheep(1.0, 0.0, (0.0, 0.0),
|
||||
vx, _ = modulate_speed(1.0, 0.0, (0.0, 0.0),
|
||||
[(SLOW_NEAR_SHEEP / 2, 0.0)])
|
||||
expected = MIN_SPEED + (1.0 - MIN_SPEED) * 0.5
|
||||
assert math.isclose(vx, expected, abs_tol=1e-6)
|
||||
|
||||
|
||||
def test_modulation_accepts_dict_input():
|
||||
vx_list, _ = modulate_speed_near_sheep(1.0, 0.0, (0.0, 0.0),
|
||||
vx_list, _ = modulate_speed(1.0, 0.0, (0.0, 0.0),
|
||||
[(1.0, 0.0)])
|
||||
vx_dict, _ = modulate_speed_near_sheep(1.0, 0.0, (0.0, 0.0),
|
||||
vx_dict, _ = modulate_speed(1.0, 0.0, (0.0, 0.0),
|
||||
{"t0": (1.0, 0.0)})
|
||||
assert math.isclose(vx_list, vx_dict)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user