25-cxsj-final/backend/routers/interval_scheduling_router.py

76 lines
2.5 KiB
Python

from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import List, Optional, Dict, Any, Tuple
from problems.interval_scheduling.problem import IntervalSchedulingProblem
router = APIRouter(
prefix="/interval_scheduling",
tags=["interval_scheduling"],
responses={404: {"description": "Not found"}},
)
problem_solver = IntervalSchedulingProblem()
class GenerateRequest(BaseModel):
size: int = 10
min_time: int = 0
max_time: int = 100
class SolveRequest(BaseModel):
intervals: List[Tuple[int, int]]
algorithms: List[str] = ["greedy", "brute_force"]
class BenchmarkRequest(BaseModel):
sizes: List[int] = [5, 10, 15, 20]
algorithms: List[str] = ["greedy", "brute_force"]
@router.post("/generate")
async def generate_case(req: GenerateRequest):
return problem_solver.generate_case(size=req.size, min_time=req.min_time, max_time=req.max_time)
@router.post("/solve")
async def solve_case(req: SolveRequest):
input_data = {"intervals": req.intervals}
results = []
for algo in req.algorithms:
try:
# Skip Brute Force for large inputs to avoid timeout
if len(req.intervals) > 22 and algo == "brute_force":
results.append({
"algorithm": algo,
"error": "Input too large for Brute Force (limit 22)",
"skipped": True
})
continue
res = problem_solver.solve(input_data, algo)
results.append(res)
except ValueError as e:
results.append({"algorithm": algo, "error": str(e)})
return results
@router.post("/benchmark")
async def benchmark(req: BenchmarkRequest):
benchmark_results = []
for size in req.sizes:
input_data = problem_solver.generate_case(size=size)
size_result = {"size": size, "algorithms": []}
for algo in req.algorithms:
try:
if size > 22 and algo == "brute_force":
size_result["algorithms"].append({
"algorithm": algo,
"time_seconds": None,
"skipped": True
})
continue
res = problem_solver.solve(input_data, algo)
size_result["algorithms"].append(res)
except Exception as e:
size_result["algorithms"].append({"algorithm": algo, "error": str(e)})
benchmark_results.append(size_result)
return benchmark_results