From 0d1440d18f9183834db955c310e1a88c9950d358 Mon Sep 17 00:00:00 2001 From: bRNS98 <82089915+bRNS98@users.noreply.github.com> Date: Fri, 11 Oct 2024 22:54:52 +0200 Subject: [PATCH] Destroyed optimizeMIP.ts (markdown) --- optimizeMIP.ts.md | 169 ---------------------------------------------- 1 file changed, 169 deletions(-) delete mode 100644 optimizeMIP.ts.md diff --git a/optimizeMIP.ts.md b/optimizeMIP.ts.md deleted file mode 100644 index 31244d6..0000000 --- a/optimizeMIP.ts.md +++ /dev/null @@ -1,169 +0,0 @@ -# Documentation for `optimizeMIP.ts` - -This document provides detailed documentation for the `optimizeMIP.ts` file. This TypeScript file is designed to handle HTTP POST requests to optimize Mixed Integer Programming (MIP) problems using the GLPK (GNU Linear Programming Kit) solver in a Next.js API route. - ---- - -## Index - -1. [Overview](#overview) -2. [Imports](#imports) -3. [Interfaces](#interfaces) -4. [Handler Function](#handler-function) -5. [Error Handling](#error-handling) -6. [Response](#response) - ---- - -## Overview - -The **optimizeMIP.ts** file defines an API endpoint that processes POST requests for solving MIP problems. It uses the `glpk.js` library to perform the optimization based on the provided objective function, constraints, and optionally, bounds. ---- - -## Imports - -```typescript -import { NextApiRequest, NextApiResponse } from 'next'; -import GLPK from 'glpk.js'; -``` - -- **`NextApiRequest`** and **`NextApiResponse`** are imported from Next.js to handle API requests and responses. -- **`GLPK`** is imported from `glpk.js` to perform the optimization computations. - ---- - -## Interfaces - -The file defines several interfaces to structure the input data: - -```typescript -interface Variable { - name: string; - coef: number; -} - -interface Constraint { - name: string; - vars: Variable[]; - bnds: { - lb: number; - ub: number; - }; -} - -interface Objective { - direction: 'max' | 'min'; - vars: Variable[]; -} - -interface RequestBody { - objective: Objective; - constraints: Constraint[]; - bounds?: any; -} -``` - -- **`Variable`**: Represents a variable with a name and coefficient. -- **`Constraint`**: Represents a constraint with a name, variables, and bounds (lower and upper). -- **`Objective`**: Defines the objective function with a direction (`max` or `min`) and a list of variables. -- **`RequestBody`**: The expected structure of the request body. - ---- - -## Handler Function - -The main function that handles the API request: - -```typescript -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'POST') { - const { objective, constraints, bounds }: RequestBody = req.body; - - if (!objective || !constraints) { - return res.status(400).json({ message: 'Invalid input data. Ensure that "objective" and "constraints" are provided correctly.' }); - } - - try { - const glpk = await GLPK(); - const options = { - msglev: glpk.GLP_MSG_ALL, - presol: true, - }; - - const problem = { - name: 'MIP', - objective: { - direction: objective.direction === 'max' ? glpk.GLP_MAX : glpk.GLP_MIN, - name: 'obj', - vars: objective.vars.map((v: Variable) => ({ name: v.name, coef: v.coef })) - }, - subjectTo: constraints.map((c: Constraint) => ({ - name: c.name, - vars: c.vars.map((v: Variable) => ({ name: v.name, coef: v.coef })), - bnds: { type: glpk.GLP_UP, lb: c.bnds.lb, ub: c.bnds.ub } - })), - binaries: objective.vars.map((v: Variable) => v.name), - generals: objective.vars.map((v: Variable) => v.name) - }; - - const result = glpk.solve(problem, options); - res.status(200).json({ result }); - - } catch (error: unknown) { - if (error instanceof Error) { - console.error('Error processing optimization:', error); - res.status(500).json({ message: 'Error processing optimization', error: error.message }); - } else { - console.error('Unknown error:', error); - res.status(500).json({ message: 'Error processing optimization', error: 'Unknown error' }); - } - } - } else { - res.status(405).json({ message: 'Only POST method is allowed' }); - } -} -``` - -### Functionality - -- **Request Method Check**: Ensures that only POST requests are processed. -- **Input Validation**: Checks if the `objective` and `constraints` are provided. -- **GLPK Setup and Problem Definition**: - - Initializes the GLPK solver. - - Sets solver options. - - Constructs the problem definition with the objective function, constraints, and variable bounds. -- **Solver Execution**: Solves the problem using GLPK and sends the result back to the client. - ---- - -## ⚠️ Error Handling - -The function includes robust error handling: - -- **Input Validation Error**: Returns a 400 status with a message if input data is invalid. -- **Execution Error**: Catches any errors during the optimization process and logs them. Returns a 500 status with an error message. - -```typescript -if (error instanceof Error) { - console.error('Error processing optimization:', error); - res.status(500).json({ message: 'Error processing optimization', error: error.message }); -} else { - console.error('Unknown error:', error); - res.status(500).json({ message: 'Error processing optimization', error: 'Unknown error' }); -} -``` - ---- - -## 📬 Response - -On successful optimization, the function returns: - -- **Status 200**: Success -- **Body**: JSON object containing the optimization result. - -```typescript -res.status(200).json({ result }); -``` - ----