63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
"""
|
|
Parse raw parameter value strings into typed Python lists.
|
|
|
|
Supported formats:
|
|
INT range: "10-30, 5" -> [10, 15, 20, 25, 30]
|
|
INT list: "10, 20, 30" -> [10, 20, 30]
|
|
FLOAT range: "0.5-1.5, 0.25" -> [0.5, 0.75, 1.0, 1.25, 1.5]
|
|
FLOAT list: "0.5, 1.0, 1.5" -> [0.5, 1.0, 1.5]
|
|
STRING: "cat\ndog\nbird" -> ["cat", "dog", "bird"]
|
|
COMBO: "euler, dpm_2, ddim" -> ["euler", "dpm_2", "ddim"]
|
|
SEED: "random:5" -> [5 random ints], or "42, 123, 999"
|
|
"""
|
|
|
|
import random
|
|
import re
|
|
from decimal import Decimal, ROUND_HALF_UP
|
|
|
|
|
|
def parse(raw_string: str, param_type: str) -> list:
|
|
"""Main entry point. Dispatches to type-specific parsers."""
|
|
raise NotImplementedError("Parameter parsing not yet implemented")
|
|
|
|
|
|
def parse_int(raw: str) -> list[int]:
|
|
"""
|
|
Parse INT values.
|
|
Supports range syntax: "start-end, step" (e.g., "10-30, 5")
|
|
Supports comma-separated list: "10, 20, 30"
|
|
"""
|
|
raw = raw.strip()
|
|
|
|
# Check for range syntax: "start-end, step" or "start-end"
|
|
range_match = re.match(
|
|
r"^(-?\d+)\s*-\s*(-?\d+)(?:\s*,\s*(\d+))?$", raw
|
|
)
|
|
if range_match:
|
|
start = int(range_match.group(1))
|
|
end = int(range_match.group(2))
|
|
step = int(range_match.group(3)) if range_match.group(3) else 1
|
|
|
|
if step <= 0:
|
|
raise ValueError(f"Step must be positive, got {step}")
|
|
|
|
if start <= end:
|
|
return list(range(start, end + 1, step))
|
|
else:
|
|
return list(range(start, end - 1, -step))
|
|
|
|
# Otherwise treat as comma-separated list
|
|
values = []
|
|
for part in raw.split(","):
|
|
part = part.strip()
|
|
if part:
|
|
try:
|
|
values.append(int(part))
|
|
except ValueError:
|
|
raise ValueError(
|
|
f"Cannot parse '{part}' as integer. "
|
|
f"Use comma-separated values (10, 20, 30) "
|
|
f"or range syntax (10-30, 5)"
|
|
)
|
|
return values
|