sliding-cubes-api / validator.py
quynhanh2610's picture
Update validator.py
1b95eb6 verified
Raw
History Blame Contribute Delete
4.52 kB
from utils import to_tuple_set, is_connected
def validate_input(dimension, blocks, max_steps):
"""
Validate request input before running the compaction algorithm.
"""
if dimension not in [2, 3]:
return {
"success": False,
"message": "Dimension must be 2 or 3.",
"dimension": dimension,
"algorithm": "greedy_potential",
"initial": None,
"steps": [],
"final": None,
"total_steps": 0,
"status": "invalid_input",
"error_code": "INVALID_DIMENSION"
}
if not blocks:
return {
"success": False,
"message": "Blocks cannot be empty.",
"dimension": dimension,
"algorithm": "greedy_potential",
"initial": None,
"steps": [],
"final": None,
"total_steps": 0,
"status": "invalid_input",
"error_code": "EMPTY_CONFIGURATION"
}
if not isinstance(max_steps, int) or max_steps <= 0:
return {
"success": False,
"message": "max_steps must be a positive integer.",
"dimension": dimension,
"algorithm": "greedy_potential",
"initial": None,
"steps": [],
"final": None,
"total_steps": 0,
"status": "invalid_input",
"error_code": "INVALID_MAX_STEPS"
}
for block in blocks:
if not isinstance(block, list):
return {
"success": False,
"message": "Each block must be a list of coordinates.",
"dimension": dimension,
"algorithm": "greedy_potential",
"initial": None,
"steps": [],
"final": None,
"total_steps": 0,
"status": "invalid_input",
"error_code": "INVALID_BLOCK_FORMAT"
}
if len(block) != dimension:
return {
"success": False,
"message": f"Each block must have exactly {dimension} coordinates.",
"dimension": dimension,
"algorithm": "greedy_potential",
"initial": None,
"steps": [],
"final": None,
"total_steps": 0,
"status": "invalid_input",
"error_code": "INVALID_BLOCK_DIMENSION"
}
for value in block:
if not isinstance(value, int):
return {
"success": False,
"message": "All coordinates must be integers.",
"dimension": dimension,
"algorithm": "greedy_potential",
"initial": None,
"steps": [],
"final": None,
"total_steps": 0,
"status": "invalid_input",
"error_code": "INVALID_COORDINATE_TYPE"
}
if value < 0:
return {
"success": False,
"message": "Negative coordinates are not supported.",
"dimension": dimension,
"algorithm": "greedy_potential",
"initial": None,
"steps": [],
"final": None,
"total_steps": 0,
"status": "invalid_input",
"error_code": "NEGATIVE_COORDINATES"
}
blocks_set = to_tuple_set(blocks)
if len(blocks_set) != len(blocks):
return {
"success": False,
"message": "Duplicate block coordinates found.",
"dimension": dimension,
"algorithm": "greedy_potential",
"initial": None,
"steps": [],
"final": None,
"total_steps": 0,
"status": "invalid_input",
"error_code": "DUPLICATE_BLOCKS"
}
if not is_connected(blocks_set, dimension):
return {
"success": False,
"message": "Initial configuration is not connected.",
"dimension": dimension,
"algorithm": "greedy_potential",
"initial": None,
"steps": [],
"final": None,
"total_steps": 0,
"status": "invalid_input",
"error_code": "NOT_CONNECTED"
}
return None