from fastapi import APIRouter, HTTPException from pydantic import BaseModel from typing import List, Optional, Dict, Any from problems.max_subarray.problem import MaxSubarrayProblem router = APIRouter( prefix="/max_subarray", tags=["max_subarray"], responses={404: {"description": "Not found"}}, ) problem_solver = MaxSubarrayProblem() class GenerateRequest(BaseModel): size: int = 100 min_val: int = -100 max_val: int = 100 class SolveRequest(BaseModel): array: List[int] algorithms: List[str] = ["kadane", "divide_conquer", "brute_force"] class BenchmarkRequest(BaseModel): sizes: List[int] = [10, 50, 100, 500, 1000] algorithms: List[str] = ["kadane", "divide_conquer", "brute_force"] @router.post("/generate") async def generate_case(req: GenerateRequest): return problem_solver.generate_case(size=req.size, min_val=req.min_val, max_val=req.max_val) @router.post("/solve") async def solve_case(req: SolveRequest): input_data = {"array": req.array} results = [] for algo in req.algorithms: try: 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: # Generate a random case for this size # To reduce noise, we might want to run multiple times and average, # but for now single run per size is fine for demonstration input_data = problem_solver.generate_case(size=size) size_result = {"size": size, "algorithms": []} for algo in req.algorithms: try: # Skip O(N^2) for very large inputs to avoid timeout if size > 5000 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