REMB / algorithms /backend /api /schemas /request_schemas.py
Cuong2004's picture
Beauti mode
3bd69a8
"""Request schemas for the API."""
from typing import List, Dict, Any, Optional
from pydantic import BaseModel, Field
class AlgorithmConfig(BaseModel):
"""Configuration parameters for the land redistribution algorithm."""
# Stage 1: Grid optimization parameters
spacing_min: float = Field(default=20.0, ge=10.0, le=200.0, description="Minimum grid spacing in meters")
spacing_max: float = Field(default=30.0, ge=10.0, le=200.0, description="Maximum grid spacing in meters")
angle_min: float = Field(default=0.0, ge=0.0, le=90.0, description="Minimum grid angle in degrees")
angle_max: float = Field(default=90.0, ge=0.0, le=90.0, description="Maximum grid angle in degrees")
# Stage 2: Subdivision parameters (Industrial lots)
min_lot_width: float = Field(default=20.0, ge=10.0, le=100.0, description="Minimum lot width in meters")
max_lot_width: float = Field(default=80.0, ge=40.0, le=200.0, description="Maximum lot width in meters")
target_lot_width: float = Field(default=40.0, ge=20.0, le=100.0, description="Target lot width in meters")
# Infrastructure parameters
road_width: float = Field(default=6.0, ge=3.0, le=30.0, description="Road width in meters")
block_depth: float = Field(default=50.0, ge=30.0, le=200.0, description="Block depth in meters")
# Optimization parameters
population_size: int = Field(default=50, ge=20, le=200, description="NSGA-II population size")
generations: int = Field(default=100, ge=50, le=500, description="Number of generations")
ortools_time_limit: float = Field(default=5.0, ge=0.1, le=60.0, description="OR-Tools solver time limit per block (seconds)")
class LandPlot(BaseModel):
"""A land plot represented as a GeoJSON polygon."""
type: str = Field(default="Polygon", description="Geometry type")
coordinates: List[List[List[float]]] = Field(..., description="Polygon coordinates [[x, y], ...]")
properties: Optional[Dict[str, Any]] = Field(default={}, description="Additional properties")
class OptimizationRequest(BaseModel):
"""Request model for running the optimization algorithm."""
config: AlgorithmConfig = Field(..., description="Algorithm configuration")
land_plots: List[LandPlot] = Field(..., description="Initial land plots to subdivide")