from fastapi import APIRouter, HTTPException from pydantic import BaseModel from typing import List, Optional, Dict, Any from problems.knapsack.problem import KnapsackProblem router = APIRouter( prefix="/knapsack", tags=["knapsack"], responses={404: {"description": "Not found"}}, ) problem_solver = KnapsackProblem() class GenerateRequest(BaseModel): num_items: int = 10 max_weight: int = 50 max_value: int = 100 class SolveRequest(BaseModel): items: List[Dict[str, int]] capacity: int algorithms: List[str] = ["dp", "backtracking"] class BenchmarkRequest(BaseModel): sizes: List[int] = [10, 20, 30] algorithms: List[str] = ["dp", "backtracking"] @router.post("/generate") async def generate_case(req: GenerateRequest): return problem_solver.generate_case(num_items=req.num_items, max_weight=req.max_weight, max_value=req.max_value) @router.post("/solve") async def solve_case(req: SolveRequest): input_data = {"items": req.items, "capacity": req.capacity} results = [] for algo in req.algorithms: try: # Skip Backtracking for large inputs if len(req.items) > 22 and algo == "backtracking": results.append({ "algorithm": algo, "error": "Input too large for Backtracking (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(num_items=size) size_result = {"size": size, "algorithms": []} for algo in req.algorithms: try: if size > 22 and algo == "backtracking": 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