{"version":3,"file":"index.cjs","sources":["../src/tableau/solution.ts","../src/tableau/min-heap.ts","../src/tableau/branch-and-cut.ts","../src/tableau/simplex.ts","../src/expressions.ts","../src/tableau/cutting-strategies.ts","../src/tableau/dynamic-modification.ts","../src/tableau/backup.ts","../src/tableau/mip-utils.ts","../src/tableau/log.ts","../src/tableau/tableau.ts","../src/tableau/presolve.ts","../src/model.ts","../src/validation.ts","../src/external/lpsolve/reformat.js","../src/external/lpsolve/main.js","../src/external/main.ts","../src/polyopt.ts","../src/tableau/enhanced-branch-and-cut.ts","../src/tableau/incremental-branch-and-cut.ts","../src/main.ts","../src/solver.ts"],"sourcesContent":["/**\n * @file src/tableau/solution.ts\n * @description Solution classes for LP and MIP results\n *\n * Provides solution containers for optimization results:\n * - Solution: Base class for continuous LP problems\n * - MilpSolution: Extended class for mixed-integer problems\n *\n * Solutions include feasibility status, objective value, and variable values.\n */\nimport type Tableau from \"./tableau\";\nimport type { TableauSolutionSet } from \"./types\";\n\n/**\n * Represents a solution to a linear programming problem.\n */\nexport class Solution {\n    feasible: boolean;\n    evaluation: number;\n    bounded: boolean;\n    _tableau: Tableau;\n    solutionSet: TableauSolutionSet;\n\n    constructor(tableau: Tableau, evaluation: number, feasible: boolean, bounded: boolean) {\n        this.feasible = feasible;\n        this.evaluation = evaluation;\n        this.bounded = bounded;\n        this._tableau = tableau;\n        this.solutionSet = {};\n    }\n\n    /**\n     * Generate the solution set mapping variable IDs to their values.\n     */\n    generateSolutionSet(): TableauSolutionSet {\n        const solutionSet: TableauSolutionSet = {};\n\n        const tableau = this._tableau;\n        const varIndexByRow = tableau.varIndexByRow;\n        const variablesPerIndex = tableau.variablesPerIndex;\n        const matrix = tableau.matrix;\n        const width = tableau.width;\n        const rhsColumn = tableau.rhsColumn;\n        const lastRow = tableau.height - 1;\n        const roundingCoeff = Math.round(1 / tableau.precision);\n\n        for (let r = 1; r <= lastRow; r += 1) {\n            const varIndex = varIndexByRow[r];\n            const variable = variablesPerIndex[varIndex];\n            if (variable === undefined || variable.isSlack === true) {\n                continue;\n            }\n\n            const varValue = matrix[r * width + rhsColumn];\n            solutionSet[variable.id] =\n                Math.round((Number.EPSILON + varValue) * roundingCoeff) / roundingCoeff;\n        }\n\n        return solutionSet;\n    }\n}\n\n/**\n * Represents a solution to a mixed-integer programming problem.\n * Extends Solution with branch-and-cut iteration tracking.\n */\nexport class MilpSolution extends Solution {\n    iter: number;\n\n    constructor(\n        tableau: Tableau,\n        evaluation: number,\n        feasible: boolean,\n        bounded: boolean,\n        branchAndCutIterations: number\n    ) {\n        super(tableau, evaluation, feasible, bounded);\n        this.iter = branchAndCutIterations;\n    }\n}\n","/**\n * @file src/tableau/min-heap.ts\n * @description Priority queue for branch-and-bound node selection\n *\n * Implements a binary min-heap optimized for extracting the most\n * promising branch (lowest relaxed objective). Uses a flat array\n * for cache efficiency and LIFO tie-breaking.\n *\n * This replaces sorting the branch list on every iteration,\n * reducing complexity from O(n log n) to O(log n) per operation.\n */\nimport type { Branch } from \"./types\";\n\ninterface HeapEntry {\n    branch: Branch;\n    seq: number;\n}\nexport class BranchMinHeap {\n    private heap: HeapEntry[];\n    private size: number;\n    private seqCounter: number;\n    // Object pool to reduce GC pressure\n    private pool: HeapEntry[];\n    private poolSize: number;\n\n    constructor(initialCapacity = 64) {\n        this.heap = new Array(initialCapacity);\n        this.size = 0;\n        this.seqCounter = 0;\n        this.pool = new Array(64);\n        this.poolSize = 0;\n    }\n\n    private allocEntry(branch: Branch, seq: number): HeapEntry {\n        if (this.poolSize > 0) {\n            const entry = this.pool[--this.poolSize];\n            entry.branch = branch;\n            entry.seq = seq;\n            return entry;\n        }\n        return { branch, seq };\n    }\n\n    private freeEntry(entry: HeapEntry): void {\n        if (this.poolSize < 256) {\n            this.pool[this.poolSize++] = entry;\n        }\n    }\n\n    get length(): number {\n        return this.size;\n    }\n\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    clear(): void {\n        this.size = 0;\n        this.seqCounter = 0;\n    }\n\n    // Compare: returns true if a should be before b (a has higher priority)\n    private isBefore(a: HeapEntry, b: HeapEntry): boolean {\n        if (a.branch.relaxedEvaluation !== b.branch.relaxedEvaluation) {\n            return a.branch.relaxedEvaluation < b.branch.relaxedEvaluation;\n        }\n        // LIFO tie-breaking: higher seq (more recent) comes first\n        return a.seq > b.seq;\n    }\n\n    push(branch: Branch): void {\n        const heap = this.heap;\n        let idx = this.size;\n        this.size++;\n\n        // Grow if needed\n        if (idx >= heap.length) {\n            heap.length = heap.length * 2;\n        }\n\n        const entry = this.allocEntry(branch, this.seqCounter++);\n\n        // Bubble up\n        while (idx > 0) {\n            const parentIdx = (idx - 1) >> 1;\n            const parent = heap[parentIdx];\n            if (!this.isBefore(entry, parent)) {\n                break;\n            }\n            heap[idx] = parent;\n            idx = parentIdx;\n        }\n        heap[idx] = entry;\n    }\n\n    pop(): Branch | undefined {\n        if (this.size === 0) {\n            return undefined;\n        }\n\n        const heap = this.heap;\n        const poppedEntry = heap[0];\n        const result = poppedEntry.branch;\n        this.size--;\n\n        // Return entry to pool\n        this.freeEntry(poppedEntry);\n\n        if (this.size === 0) {\n            return result;\n        }\n\n        // Move last element to root and bubble down\n        const last = heap[this.size];\n        let idx = 0;\n        const halfSize = this.size >> 1;\n\n        while (idx < halfSize) {\n            let childIdx = (idx << 1) + 1;\n            let child = heap[childIdx];\n            const rightIdx = childIdx + 1;\n\n            if (rightIdx < this.size && this.isBefore(heap[rightIdx], child)) {\n                childIdx = rightIdx;\n                child = heap[rightIdx];\n            }\n\n            if (!this.isBefore(child, last)) {\n                break;\n            }\n\n            heap[idx] = child;\n            idx = childIdx;\n        }\n\n        heap[idx] = last;\n        return result;\n    }\n\n    peek(): Branch | undefined {\n        return this.size > 0 ? this.heap[0].branch : undefined;\n    }\n}\n","/**\n * @file src/tableau/branch-and-cut.ts\n * @description Branch-and-cut algorithm for mixed-integer programming\n *\n * Implements the branch-and-bound algorithm with cutting planes to find\n * integer-optimal solutions. Uses a priority queue (min-heap) to explore\n * promising branches first based on relaxed objective values.\n *\n * Key features:\n * - Branching on fractional integer variables\n * - Gomory cuts to tighten LP relaxation\n * - Best-first node selection\n * - Early termination via tolerance\n */\nimport type Tableau from \"./tableau\";\nimport type { Branch, BranchCut } from \"./types\";\nimport { BranchMinHeap } from \"./min-heap\";\n\nexport interface BranchAndCutService {\n    applyCuts(tableau: Tableau, branchingCuts: BranchCut[]): void;\n    branchAndCut(tableau: Tableau): void;\n}\n\nfunction createCut(type: BranchCut[\"type\"], varIndex: number, value: number): BranchCut {\n    return { type, varIndex, value };\n}\n\nfunction createBranch(relaxedEvaluation: number, cuts: BranchCut[]): Branch {\n    return { relaxedEvaluation, cuts };\n}\n\nexport function createBranchAndCutService(): BranchAndCutService {\n    const applyCuts = (tableau: Tableau, branchingCuts: BranchCut[]): void => {\n        tableau.restore();\n\n        tableau.addCutConstraints(branchingCuts);\n        tableau.simplex();\n        if (tableau.model?.useMIRCuts) {\n            // Optimization: reuse previous \"after\" as next \"before\" to avoid redundant computation\n            let fractionalVolume = tableau.computeFractionalVolume(true);\n            while (fractionalVolume > 0) {\n                tableau.applyMIRCuts();\n                tableau.simplex();\n                const fractionalVolumeAfter = tableau.computeFractionalVolume(true);\n                if (fractionalVolumeAfter >= 0.9 * fractionalVolume) {\n                    break;\n                }\n                fractionalVolume = fractionalVolumeAfter;\n            }\n        }\n    };\n\n    const branchAndCut = (tableau: Tableau): void => {\n        const branches = new BranchMinHeap();\n        let iterations = 0;\n        const tolerance = tableau.model?.tolerance ?? 0;\n        let toleranceFlag = true;\n        let terminalTime = 1e99;\n\n        if (tableau.model?.timeout) {\n            terminalTime = Date.now() + tableau.model.timeout;\n        }\n\n        let bestEvaluation = Infinity;\n        let bestBranch: Branch | null = null;\n        const bestOptionalObjectivesEvaluations: number[] = [];\n        // Cache optionalObjectives reference to avoid repeated property lookups in hot loop\n        const optionalObjectives = tableau.optionalObjectives;\n        const nOptionalObjectives = optionalObjectives.length;\n        for (let oInit = 0; oInit < nOptionalObjectives; oInit += 1) {\n            bestOptionalObjectivesEvaluations.push(Infinity);\n        }\n\n        const branch = createBranch(-Infinity, []);\n        let acceptableThreshold: number;\n\n        branches.push(branch);\n        while (!branches.isEmpty() && toleranceFlag === true && Date.now() < terminalTime) {\n            if (tableau.model?.isMinimization) {\n                acceptableThreshold = tableau.bestPossibleEval * (1 + tolerance);\n            } else {\n                acceptableThreshold = tableau.bestPossibleEval * (1 - tolerance);\n            }\n\n            if (tolerance > 0) {\n                if (bestEvaluation < acceptableThreshold) {\n                    toleranceFlag = false;\n                }\n            }\n\n            const activeBranch = branches.pop()!;\n            if (activeBranch.relaxedEvaluation >= bestEvaluation) {\n                continue;\n            }\n\n            const cuts = activeBranch.cuts;\n            applyCuts(tableau, cuts);\n\n            iterations++;\n            if (tableau.feasible === false) {\n                continue;\n            }\n\n            const evaluation = tableau.evaluation;\n            if (evaluation > bestEvaluation) {\n                continue;\n            }\n\n            if (evaluation === bestEvaluation) {\n                let isCurrentEvaluationWorse = true;\n                for (let o = 0; o < nOptionalObjectives; o += 1) {\n                    const currentCost = optionalObjectives[o].reducedCosts[0];\n                    const bestCost = bestOptionalObjectivesEvaluations[o];\n                    if (currentCost > bestCost) {\n                        break;\n                    } else if (currentCost < bestCost) {\n                        isCurrentEvaluationWorse = false;\n                        break;\n                    }\n                }\n\n                if (isCurrentEvaluationWorse) {\n                    continue;\n                }\n            }\n\n            if (tableau.isIntegral() === true) {\n                tableau.__isIntegral = true;\n\n                if (iterations === 1) {\n                    tableau.branchAndCutIterations = iterations;\n                    return;\n                }\n                bestBranch = activeBranch;\n                bestEvaluation = evaluation;\n                for (let oCopy = 0; oCopy < nOptionalObjectives; oCopy += 1) {\n                    bestOptionalObjectivesEvaluations[oCopy] =\n                        optionalObjectives[oCopy].reducedCosts[0];\n                }\n\n                if (tableau.model?.keep_solutions) {\n                    const nowSolution = tableau.model.tableau.getSolution();\n                    const store = nowSolution.generateSolutionSet();\n                    store.result = nowSolution.evaluation;\n\n                    if (!tableau.model.solutions) {\n                        tableau.model.solutions = [];\n                    }\n\n                    tableau.model.solutions.push(store);\n                }\n            } else {\n                if (iterations === 1) {\n                    tableau.save();\n                }\n\n                const variable = tableau.getMostFractionalVar();\n\n                const varIndex = variable.index as number;\n                const varValue = variable.value as number;\n\n                const cutsHigh: BranchCut[] = [];\n                const cutsLow: BranchCut[] = [];\n\n                const nCuts = cuts.length;\n                for (let c = 0; c < nCuts; c += 1) {\n                    const cut = cuts[c];\n                    if (cut.varIndex === varIndex) {\n                        if (cut.type === \"min\") {\n                            cutsLow.push(cut);\n                        } else {\n                            cutsHigh.push(cut);\n                        }\n                    } else {\n                        cutsHigh.push(cut);\n                        cutsLow.push(cut);\n                    }\n                }\n\n                const cutHigh = createCut(\"min\", varIndex, Math.ceil(varValue));\n                cutsHigh.push(cutHigh);\n\n                const cutLow = createCut(\"max\", varIndex, Math.floor(varValue));\n                cutsLow.push(cutLow);\n\n                branches.push(createBranch(evaluation, cutsHigh));\n                branches.push(createBranch(evaluation, cutsLow));\n            }\n        }\n\n        if (bestBranch !== null) {\n            applyCuts(tableau, bestBranch.cuts);\n        }\n        tableau.branchAndCutIterations = iterations;\n    };\n\n    return { applyCuts, branchAndCut };\n}\n","/**\n * @file src/tableau/simplex.ts\n * @description Simplex algorithm implementation\n *\n * Implements the two-phase simplex method for solving linear programs:\n * - Phase 1: Find an initial basic feasible solution (or prove infeasibility)\n * - Phase 2: Optimize the objective function (or prove unboundedness)\n *\n * Functions are designed to be bound to a Tableau instance via `this`.\n * Uses partial pricing for large problems to improve performance.\n */\nimport type Tableau from \"./tableau\";\n\n/**\n * Optimized cycle detector using hash-based O(1) lookup.\n * The original checkForCycles was O(n²) - comparing every pair against all others.\n * This version uses a Map to track where each (leaving,entering) pair occurred,\n * making duplicate detection O(1) average case.\n */\nclass CycleDetector {\n    private pairs: Array<[number, number]> = [];\n    private positions: Map<string, number[]> = new Map();\n\n    add(leaving: number, entering: number): number[] {\n        const key = `${leaving}_${entering}`;\n        const pos = this.pairs.length;\n        this.pairs.push([leaving, entering]);\n\n        const prevPositions = this.positions.get(key);\n        if (prevPositions === undefined) {\n            this.positions.set(key, [pos]);\n            return [];\n        }\n\n        // Check if any previous occurrence starts a repeating cycle\n        for (const startPos of prevPositions) {\n            const cycleLength = pos - startPos;\n            // Need at least cycleLength more elements to verify\n            if (cycleLength > this.pairs.length - pos) {\n                continue;\n            }\n\n            let cycleFound = true;\n            for (\n                let i = 1;\n                i < cycleLength && startPos + cycleLength + i < this.pairs.length;\n                i++\n            ) {\n                const p1 = this.pairs[startPos + i];\n                const p2 = this.pairs[startPos + cycleLength + i];\n                if (p1[0] !== p2[0] || p1[1] !== p2[1]) {\n                    cycleFound = false;\n                    break;\n                }\n            }\n\n            if (cycleFound) {\n                return [startPos, cycleLength];\n            }\n        }\n\n        prevPositions.push(pos);\n        return [];\n    }\n}\n\nexport function simplex(this: Tableau): Tableau {\n    this.bounded = true;\n    this.phase1();\n\n    if (this.feasible === true) {\n        this.phase2();\n    }\n\n    return this;\n}\n\n/**\n * Dual simplex algorithm for warm-starting after adding constraints.\n *\n * Use when: The current solution is dual feasible (reduced costs valid) but\n * may be primal infeasible (some RHS values negative). This is common after\n * adding bound constraints in branch-and-cut.\n *\n * Algorithm:\n * 1. Find a basic variable with negative value (leaving variable)\n * 2. Find entering variable using dual ratio test\n * 3. Pivot to restore primal feasibility\n * 4. Repeat until all basic variables are non-negative\n *\n * @returns Number of iterations, or -1 if dual infeasible\n */\nexport function dualSimplex(this: Tableau): number {\n    const matrix = this.matrix;\n    const width = this.width;\n    const rhsColumn = this.rhsColumn;\n    const lastColumn = width - 1;\n    const lastRow = this.height - 1;\n    const precision = this.precision;\n    const negPrecision = -precision;\n\n    let iterations = 0;\n    const maxIterations = 10000; // Safety limit\n\n    while (iterations < maxIterations) {\n        // Step 1: Find leaving variable (row with most negative RHS)\n        let leavingRow = 0;\n        let minRHS = negPrecision;\n\n        for (let r = 1; r <= lastRow; r++) {\n            const rhsValue = matrix[r * width + rhsColumn];\n            if (rhsValue < minRHS) {\n                minRHS = rhsValue;\n                leavingRow = r;\n            }\n        }\n\n        // If no negative RHS, we're primal feasible - done!\n        if (leavingRow === 0) {\n            this.feasible = true;\n            this.setEvaluation();\n            return iterations;\n        }\n\n        // Step 2: Find entering variable using dual ratio test\n        // For each non-basic variable j with a_ij < 0 (negative coefficient in leaving row),\n        // compute ratio = reduced_cost[j] / |a_ij|\n        // Choose the one with minimum ratio (to maintain dual feasibility)\n        let enteringColumn = 0;\n        let minRatio = Infinity;\n        const leavingRowOffset = leavingRow * width;\n\n        for (let c = 1; c <= lastColumn; c++) {\n            const coefficient = matrix[leavingRowOffset + c];\n\n            // Only consider columns with negative coefficient in leaving row\n            if (coefficient < negPrecision) {\n                // Reduced cost is in row 0 (cost row)\n                const reducedCost = matrix[c];\n\n                // For minimization, reduced costs should be >= 0 for optimality\n                // Ratio test: reducedCost / |coefficient|\n                if (reducedCost >= negPrecision) {\n                    const ratio = reducedCost / -coefficient;\n                    if (ratio < minRatio) {\n                        minRatio = ratio;\n                        enteringColumn = c;\n                    }\n                }\n            }\n        }\n\n        // If no entering column found, the problem is dual infeasible (primal unbounded)\n        if (enteringColumn === 0) {\n            this.feasible = false;\n            return -1;\n        }\n\n        // Step 3: Pivot\n        this.pivot(leavingRow, enteringColumn);\n        iterations++;\n    }\n\n    // Hit iteration limit - something went wrong\n    this.feasible = false;\n    return iterations;\n}\n\nexport function phase1(this: Tableau): number {\n    const debugCheckForCycles = this.model.checkForCycles;\n    const cycleDetector = debugCheckForCycles ? new CycleDetector() : null;\n\n    const matrix = this.matrix;\n    const width = this.width;\n    const rhsColumn = this.rhsColumn;\n    const lastColumn = this.width - 1;\n    const lastRow = this.height - 1;\n    const precision = this.precision;\n    const negPrecision = -precision;\n\n    // Cache arrays for faster access in hot loops\n    const unrestrictedVars = this.unrestrictedVars;\n    const varIndexByRow = this.varIndexByRow;\n    const varIndexByCol = this.varIndexByCol;\n\n    // Anti-cycling: on degenerate problems, the max-quotient pivot rule\n    // can oscillate, corrupting the matrix. We detect stalling early\n    // (after SAVE_THRESHOLD iterations without RHS improvement) and save\n    // the matrix state. If still stuck after maxQuotientLimit iterations,\n    // we restore the clean matrix and switch to Bland's rule. The lazy\n    // save avoids the copy cost on the vast majority of phase1 calls\n    // that converge quickly.\n    const SAVE_THRESHOLD = 10;\n    const maxQuotientLimit = Math.max(lastRow, lastColumn);\n\n    let iterations = 0;\n    let useBland = false;\n    let initialRHS = -Infinity;\n\n    let savedMatrix: Float64Array | null = null;\n    let savedVarIndexByRow: number[] | null = null;\n    let savedVarIndexByCol: number[] | null = null;\n    let savedRowByVarIndex: number[] | null = null;\n    let savedColByVarIndex: number[] | null = null;\n\n    while (true) {\n        // Find leaving row (most negative RHS among restricted basic vars).\n        // Unrestricted variables can validly have negative values, so rows\n        // where the basic variable is unrestricted are not infeasible.\n        let leavingRowIndex = 0;\n        let rhsValue = negPrecision;\n        for (let r = 1; r <= lastRow; r++) {\n            if (unrestrictedVars[varIndexByRow[r]] === true) continue;\n            const value = matrix[r * width + rhsColumn];\n            if (value < rhsValue) {\n                rhsValue = value;\n                leavingRowIndex = r;\n            }\n        }\n\n        if (leavingRowIndex === 0) {\n            this.feasible = true;\n            return iterations;\n        }\n\n        // Detect non-convergence and apply anti-cycling.\n        if (!useBland && iterations > 0 && rhsValue <= initialRHS) {\n            if (iterations >= SAVE_THRESHOLD && savedMatrix === null) {\n                // Stalling detected: save matrix for potential rollback\n                savedMatrix = matrix.slice();\n                savedVarIndexByRow = varIndexByRow.slice();\n                savedVarIndexByCol = varIndexByCol.slice();\n                savedRowByVarIndex = this.rowByVarIndex.slice();\n                savedColByVarIndex = this.colByVarIndex.slice();\n            }\n            if (iterations >= maxQuotientLimit) {\n                // Still stuck after generous budget: restore and switch\n                useBland = true;\n                if (savedMatrix) {\n                    matrix.set(savedMatrix);\n                    for (let i = 0; i < savedVarIndexByRow!.length; i++) {\n                        varIndexByRow[i] = savedVarIndexByRow![i];\n                    }\n                    for (let i = 0; i < savedVarIndexByCol!.length; i++) {\n                        varIndexByCol[i] = savedVarIndexByCol![i];\n                    }\n                    for (let i = 0; i < savedRowByVarIndex!.length; i++) {\n                        this.rowByVarIndex[i] = savedRowByVarIndex![i];\n                    }\n                    for (let i = 0; i < savedColByVarIndex!.length; i++) {\n                        this.colByVarIndex[i] = savedColByVarIndex![i];\n                    }\n                    iterations = 0;\n                    continue;\n                }\n            }\n        }\n        if (iterations === 0) {\n            initialRHS = rhsValue;\n        }\n\n        // Find entering column.\n        // Prefer columns with negative coefficient in leaving row (these directly\n        // fix the infeasibility by making RHS positive after pivot).\n        // Only fall back to unrestricted variables with positive coefficient when\n        // no negative coefficient column exists - this \"swaps\" the infeasibility\n        // to an unrestricted variable (which is allowed to be negative).\n        let enteringColumn = 0;\n        const leavingRowOffset = leavingRowIndex * width;\n\n        if (useBland) {\n            // Bland's rule: pick the first eligible column (smallest index).\n            // First pass: negative coefficients only (directly fix infeasibility)\n            for (let c = 1; c <= lastColumn; c++) {\n                const coefficient = matrix[leavingRowOffset + c];\n                if (coefficient < negPrecision) {\n                    enteringColumn = c;\n                    break;\n                }\n            }\n            // Fallback: unrestricted with non-zero coefficient (swap infeasibility)\n            if (enteringColumn === 0) {\n                for (let c = 1; c <= lastColumn; c++) {\n                    const coefficient = matrix[leavingRowOffset + c];\n                    if (\n                        unrestrictedVars[varIndexByCol[c]] === true &&\n                        (coefficient < negPrecision || coefficient > precision)\n                    ) {\n                        enteringColumn = c;\n                        break;\n                    }\n                }\n            }\n        } else {\n            // Max-quotient rule: faster in practice but can oscillate on\n            // degenerate problems.\n            // First pass: negative coefficients only\n            let maxQuotient = -Infinity;\n            for (let c = 1; c <= lastColumn; c++) {\n                const coefficient = matrix[leavingRowOffset + c];\n                if (coefficient < negPrecision) {\n                    const quotient = -matrix[c] / coefficient;\n                    if (maxQuotient < quotient) {\n                        maxQuotient = quotient;\n                        enteringColumn = c;\n                    }\n                }\n            }\n            // Fallback: unrestricted with non-zero coefficient\n            if (enteringColumn === 0) {\n                for (let c = 1; c <= lastColumn; c++) {\n                    const coefficient = matrix[leavingRowOffset + c];\n                    if (\n                        unrestrictedVars[varIndexByCol[c]] === true &&\n                        (coefficient < negPrecision || coefficient > precision)\n                    ) {\n                        enteringColumn = c;\n                        break;\n                    }\n                }\n            }\n        }\n\n        if (enteringColumn === 0) {\n            this.feasible = false;\n            return iterations;\n        }\n\n        if (cycleDetector) {\n            const cycleData = cycleDetector.add(\n                varIndexByRow[leavingRowIndex],\n                varIndexByCol[enteringColumn]\n            );\n            if (cycleData.length > 0) {\n                this.model.messages.push(\"Cycle in phase 1\");\n                this.model.messages.push(\"Start :\" + cycleData[0]);\n                this.model.messages.push(\"Length :\" + cycleData[1]);\n\n                this.feasible = false;\n                return iterations;\n            }\n        }\n\n        this.pivot(leavingRowIndex, enteringColumn);\n        iterations += 1;\n    }\n}\n\nexport function phase2(this: Tableau): number {\n    const debugCheckForCycles = this.model.checkForCycles;\n    const cycleDetector = debugCheckForCycles ? new CycleDetector() : null;\n\n    const matrix = this.matrix;\n    const width = this.width;\n    const rhsColumn = this.rhsColumn;\n    const lastColumn = this.width - 1;\n    const lastRow = this.height - 1;\n\n    const precision = this.precision;\n    const negPrecision = -precision;\n    const nOptionalObjectives = this.optionalObjectives.length;\n    let optionalCostsColumns: number[] | null = null;\n\n    // Cache arrays for faster access in hot loops\n    const unrestrictedVars = this.unrestrictedVars;\n    const varIndexByCol = this.varIndexByCol;\n    const varIndexByRow = this.varIndexByRow;\n\n    // Note: costRowIndex is always 0, so we access matrix[c] directly\n\n    let iterations = 0;\n    let reducedCost: number;\n    let unrestricted: boolean;\n\n    // Anti-cycling for phase 2: if the objective stalls (no meaningful\n    // improvement over several hundred iterations), the simplex is\n    // cycling through degenerate vertices. Switch to Bland's rule which\n    // guarantees termination in exact arithmetic. In floating-point,\n    // even Bland's can cycle indefinitely, so we also impose a limit:\n    // if Bland's runs for lastRow iterations without improving the\n    // objective, we accept the current solution as optimal.\n    const PHASE2_WINDOW = 100;\n    const PHASE2_STALE_LIMIT = 5; // consecutive stale windows before switching\n    let useBland = false;\n    let windowStartObj = matrix[rhsColumn];\n    let staleWindows = 0;\n    let blandStartIter = 0;\n    let blandStartObj = 0;\n\n    // Partial pricing setup\n    // Batch size: use configured value or auto-compute (sqrt of columns, min 50, max 500)\n    const nColumns = lastColumn;\n    const batchSize =\n        this.pricingBatchSize > 0\n            ? this.pricingBatchSize\n            : Math.min(500, Math.max(50, Math.floor(Math.sqrt(nColumns))));\n\n    // For small problems, just scan everything (no benefit from partial pricing)\n    const usePartialPricing = nColumns > batchSize * 2;\n\n    while (true) {\n        if (nOptionalObjectives > 0) {\n            optionalCostsColumns = [];\n        }\n\n        // Detect degenerate cycling: check every WINDOW iterations\n        // whether the objective has made meaningful progress.\n        if (!useBland && iterations > 0 && iterations % PHASE2_WINDOW === 0) {\n            const currentObj = matrix[rhsColumn];\n            const delta = Math.abs(currentObj - windowStartObj);\n            const scale = Math.max(1, Math.abs(windowStartObj));\n            if (delta / scale < 1e-10) {\n                staleWindows++;\n                if (staleWindows >= PHASE2_STALE_LIMIT) {\n                    useBland = true;\n                    blandStartIter = iterations;\n                    blandStartObj = currentObj;\n                }\n            } else {\n                staleWindows = 0;\n            }\n            windowStartObj = currentObj;\n        }\n\n        // Bland's termination: in floating-point arithmetic, Bland's rule\n        // can cycle through degenerate bases indefinitely. If it hasn't\n        // improved the objective after lastRow pivots, accept the current\n        // solution (reduced costs are within floating-point noise of zero).\n        if (useBland && iterations - blandStartIter > lastRow) {\n            const currentObj = matrix[rhsColumn];\n            const delta = Math.abs(currentObj - blandStartObj);\n            const scale = Math.max(1, Math.abs(blandStartObj));\n            if (delta / scale < 1e-10) {\n                this.setEvaluation();\n                this.simplexIters += 1;\n                return iterations;\n            }\n            // Objective did improve; reset the counter\n            blandStartIter = iterations;\n            blandStartObj = currentObj;\n        }\n\n        let enteringColumn = 0;\n        let enteringValue = precision;\n        let isReducedCostNegative = false;\n\n        if (useBland) {\n            // Bland's rule: pick first eligible column (smallest index)\n            for (let c = 1; c <= lastColumn; c++) {\n                reducedCost = matrix[c];\n                unrestricted = unrestrictedVars[varIndexByCol[c]] === true;\n\n                if (unrestricted && reducedCost < 0) {\n                    enteringColumn = c;\n                    enteringValue = -reducedCost;\n                    isReducedCostNegative = true;\n                    break;\n                }\n\n                if (reducedCost > precision) {\n                    enteringColumn = c;\n                    enteringValue = reducedCost;\n                    isReducedCostNegative = false;\n                    break;\n                }\n            }\n        } else if (usePartialPricing) {\n            // Partial pricing: scan columns in batches\n            const startBatch = this.pricingBatchStart;\n            let batchesScanned = 0;\n            const totalBatches = Math.ceil(nColumns / batchSize);\n\n            // Scan batches until we find an improving column or exhaust all batches\n            while (enteringColumn === 0 && batchesScanned < totalBatches) {\n                const batchStart = this.pricingBatchStart;\n                const batchEnd = Math.min(batchStart + batchSize - 1, lastColumn);\n\n                for (let c = batchStart; c <= batchEnd; c++) {\n                    reducedCost = matrix[c]; // costRowOffset is 0\n                    unrestricted = unrestrictedVars[varIndexByCol[c]] === true;\n\n                    if (\n                        nOptionalObjectives > 0 &&\n                        negPrecision < reducedCost &&\n                        reducedCost < precision\n                    ) {\n                        optionalCostsColumns?.push(c);\n                        continue;\n                    }\n\n                    if (unrestricted && reducedCost < 0) {\n                        if (-reducedCost > enteringValue) {\n                            enteringValue = -reducedCost;\n                            enteringColumn = c;\n                            isReducedCostNegative = true;\n                        }\n                        continue;\n                    }\n\n                    if (reducedCost > enteringValue) {\n                        enteringValue = reducedCost;\n                        enteringColumn = c;\n                        isReducedCostNegative = false;\n                    }\n                }\n\n                // Move to next batch (wrap around)\n                this.pricingBatchStart = batchEnd >= lastColumn ? 1 : batchEnd + 1;\n                batchesScanned++;\n            }\n\n            // Reset batch start if we found an improving column\n            if (enteringColumn !== 0) {\n                this.pricingBatchStart = startBatch;\n            }\n        } else {\n            // Full pricing for small problems\n            for (let c = 1; c <= lastColumn; c++) {\n                reducedCost = matrix[c]; // costRowOffset is 0\n                unrestricted = unrestrictedVars[varIndexByCol[c]] === true;\n\n                if (\n                    nOptionalObjectives > 0 &&\n                    negPrecision < reducedCost &&\n                    reducedCost < precision\n                ) {\n                    optionalCostsColumns?.push(c);\n                    continue;\n                }\n\n                if (unrestricted && reducedCost < 0) {\n                    if (-reducedCost > enteringValue) {\n                        enteringValue = -reducedCost;\n                        enteringColumn = c;\n                        isReducedCostNegative = true;\n                    }\n                    continue;\n                }\n\n                if (reducedCost > enteringValue) {\n                    enteringValue = reducedCost;\n                    enteringColumn = c;\n                    isReducedCostNegative = false;\n                }\n            }\n        }\n\n        if (nOptionalObjectives > 0) {\n            let o = 0;\n            while (\n                enteringColumn === 0 &&\n                optionalCostsColumns &&\n                optionalCostsColumns.length > 0 &&\n                o < nOptionalObjectives\n            ) {\n                const optionalCostsColumns2: number[] = [];\n                const reducedCosts = this.optionalObjectives[o].reducedCosts;\n\n                enteringValue = precision;\n\n                for (let i = 0; i < optionalCostsColumns.length; i++) {\n                    const c = optionalCostsColumns[i];\n\n                    reducedCost = reducedCosts[c];\n                    unrestricted = unrestrictedVars[varIndexByCol[c]] === true;\n\n                    if (negPrecision < reducedCost && reducedCost < precision) {\n                        optionalCostsColumns2.push(c);\n                        continue;\n                    }\n\n                    if (unrestricted && reducedCost < 0) {\n                        if (-reducedCost > enteringValue) {\n                            enteringValue = -reducedCost;\n                            enteringColumn = c;\n                            isReducedCostNegative = true;\n                        }\n                        continue;\n                    }\n\n                    if (reducedCost > enteringValue) {\n                        enteringValue = reducedCost;\n                        enteringColumn = c;\n                        isReducedCostNegative = false;\n                    }\n                }\n                optionalCostsColumns = optionalCostsColumns2;\n                o += 1;\n            }\n        }\n\n        if (enteringColumn === 0) {\n            this.setEvaluation();\n            this.simplexIters += 1;\n            return iterations;\n        }\n\n        let leavingRow = 0;\n        let minQuotient = Infinity;\n\n        for (let r = 1; r <= lastRow; r++) {\n            const rowOffset = r * width;\n            const rhsValue = matrix[rowOffset + rhsColumn];\n            const colValue = matrix[rowOffset + enteringColumn];\n\n            if (negPrecision < colValue && colValue < precision) {\n                continue;\n            }\n\n            if (colValue > 0 && precision > rhsValue && rhsValue > negPrecision) {\n                minQuotient = 0;\n                leavingRow = r;\n                break;\n            }\n\n            const quotient = isReducedCostNegative ? -rhsValue / colValue : rhsValue / colValue;\n            if (quotient > precision && minQuotient > quotient) {\n                minQuotient = quotient;\n                leavingRow = r;\n            }\n        }\n\n        if (minQuotient === Infinity) {\n            this.evaluation = -Infinity;\n            this.bounded = false;\n            this.unboundedVarIndex = varIndexByCol[enteringColumn];\n            return iterations;\n        }\n\n        if (cycleDetector) {\n            const cycleData = cycleDetector.add(\n                varIndexByRow[leavingRow],\n                varIndexByCol[enteringColumn]\n            );\n            if (cycleData.length > 0) {\n                this.model.messages.push(\"Cycle in phase 2\");\n                this.model.messages.push(\"Start :\" + cycleData[0]);\n                this.model.messages.push(\"Length :\" + cycleData[1]);\n\n                this.feasible = false;\n                return iterations;\n            }\n        }\n\n        this.pivot(leavingRow, enteringColumn);\n        iterations += 1;\n    }\n}\n\n// Pre-allocated typed arrays for pivot optimization (better cache performance)\nlet nonZeroColumns = new Int32Array(1024);\nlet pivotRowCache = new Float64Array(1024);\n\nexport function pivot(this: Tableau, pivotRowIndex: number, pivotColumnIndex: number): void {\n    const matrix = this.matrix;\n    const width = this.width;\n\n    // Ensure work arrays are large enough\n    if (width > nonZeroColumns.length) {\n        nonZeroColumns = new Int32Array(width * 2);\n        pivotRowCache = new Float64Array(width * 2);\n    }\n\n    const pivotRowOffset = pivotRowIndex * width;\n    const quotient = matrix[pivotRowOffset + pivotColumnIndex];\n    const invQuotient = 1 / quotient;\n\n    const height = this.height;\n\n    const leavingBasicIndex = this.varIndexByRow[pivotRowIndex];\n    const enteringBasicIndex = this.varIndexByCol[pivotColumnIndex];\n\n    this.varIndexByRow[pivotRowIndex] = enteringBasicIndex;\n    this.varIndexByCol[pivotColumnIndex] = leavingBasicIndex;\n\n    this.rowByVarIndex[enteringBasicIndex] = pivotRowIndex;\n    this.rowByVarIndex[leavingBasicIndex] = -1;\n\n    this.colByVarIndex[enteringBasicIndex] = -1;\n    this.colByVarIndex[leavingBasicIndex] = pivotColumnIndex;\n\n    // Normalize pivot row, track non-zero columns, and cache values for locality\n    let nNonZeroColumns = 0;\n    for (let c = 0; c < width; c++) {\n        const idx = pivotRowOffset + c;\n        const val = matrix[idx];\n        if (!(val >= -1e-16 && val <= 1e-16)) {\n            const normalized = val / quotient;\n            matrix[idx] = normalized;\n            nonZeroColumns[nNonZeroColumns] = c;\n            pivotRowCache[nNonZeroColumns] = normalized;\n            nNonZeroColumns++;\n        } else {\n            matrix[idx] = 0;\n        }\n    }\n    matrix[pivotRowOffset + pivotColumnIndex] = invQuotient;\n\n    // Update all other rows using cached pivot row values\n    for (let r = 0; r < height; r++) {\n        if (r !== pivotRowIndex) {\n            const rowOffset = r * width;\n            const pivotColVal = matrix[rowOffset + pivotColumnIndex];\n            if (!(pivotColVal >= -1e-16 && pivotColVal <= 1e-16)) {\n                const coefficient = pivotColVal;\n\n                if (!(coefficient >= -1e-16 && coefficient <= 1e-16)) {\n                    // Use cached pivot row values for better cache locality\n                    for (let i = 0; i < nNonZeroColumns; i++) {\n                        const c = nonZeroColumns[i];\n                        const v0 = pivotRowCache[i];\n                        // Inner zero check is critical for numerical stability\n                        if (!(v0 >= -1e-16 && v0 <= 1e-16)) {\n                            matrix[rowOffset + c] -= coefficient * v0;\n                        } else if (v0 !== 0) {\n                            // Clean up near-zero values in pivot row\n                            matrix[pivotRowOffset + c] = 0;\n                        }\n                    }\n\n                    matrix[rowOffset + pivotColumnIndex] = -coefficient / quotient;\n                } else if (coefficient !== 0) {\n                    matrix[rowOffset + pivotColumnIndex] = 0;\n                }\n            }\n        }\n    }\n\n    // Update optional objectives using cached pivot row values\n    const optionalObjectives = this.optionalObjectives;\n    const nOptionalObjectives = optionalObjectives.length;\n    if (nOptionalObjectives > 0) {\n        for (let o = 0; o < nOptionalObjectives; o++) {\n            const reducedCosts = optionalObjectives[o].reducedCosts;\n            const coefficient = reducedCosts[pivotColumnIndex];\n            if (coefficient !== 0) {\n                for (let i = 0; i < nNonZeroColumns; i++) {\n                    const c = nonZeroColumns[i];\n                    reducedCosts[c] -= coefficient * pivotRowCache[i];\n                }\n                reducedCosts[pivotColumnIndex] = -coefficient * invQuotient;\n            }\n        }\n    }\n}\n\nexport function checkForCycles(this: Tableau, varIndexes: Array<[number, number]>): number[] {\n    for (let e1 = 0; e1 < varIndexes.length - 1; e1++) {\n        for (let e2 = e1 + 1; e2 < varIndexes.length; e2++) {\n            const elt1 = varIndexes[e1];\n            const elt2 = varIndexes[e2];\n            if (elt1[0] === elt2[0] && elt1[1] === elt2[1]) {\n                if (e2 - e1 > varIndexes.length - e2) {\n                    break;\n                }\n                let cycleFound = true;\n                for (let i = 1; i < e2 - e1; i++) {\n                    const tmp1 = varIndexes[e1 + i];\n                    const tmp2 = varIndexes[e2 + i];\n                    if (tmp1[0] !== tmp2[0] || tmp1[1] !== tmp2[1]) {\n                        cycleFound = false;\n                        break;\n                    }\n                }\n                if (cycleFound) {\n                    return [e1, e2 - e1];\n                }\n            }\n        }\n    }\n    return [];\n}\n","/**\n * @file src/expressions.ts\n * @description Core expression classes for building optimization models\n *\n * Defines the building blocks for programmatic model construction:\n * - Variable: Decision variable with cost and bounds\n * - IntegerVariable: Variable restricted to integer values\n * - SlackVariable: Internal variable for constraint conversion\n * - Term: Variable-coefficient pair in a constraint\n * - Constraint: Linear inequality (<=, >=) with terms\n * - Equality: Equality constraint (=) represented as two inequalities\n *\n * These classes support the fluent API: model.smallerThan(10).addTerm(2, x)\n */\nimport type Model from \"./model\";\n\nexport type Priority = number | \"required\" | \"strong\" | \"medium\" | \"weak\";\n\nexport class Variable {\n    id: string;\n    cost: number;\n    index: number;\n    value: number;\n    priority: number;\n    isInteger?: true;\n    isSlack?: true;\n\n    constructor(id: string, cost: number, index: number, priority: number) {\n        this.id = id;\n        this.cost = cost;\n        this.index = index;\n        this.value = 0;\n        this.priority = priority;\n    }\n}\n\nexport class IntegerVariable extends Variable {\n    isInteger: true = true;\n\n    constructor(id: string, cost: number, index: number, priority: number) {\n        super(id, cost, index, priority);\n    }\n}\n\nexport class SlackVariable extends Variable {\n    isSlack: true = true;\n\n    constructor(id: string, index: number) {\n        super(id, 0, index, 0);\n    }\n}\n\nexport class Term {\n    variable: Variable;\n    coefficient: number;\n\n    constructor(variable: Variable, coefficient: number) {\n        this.variable = variable;\n        this.coefficient = coefficient;\n    }\n}\n\ntype RelaxationModel = Model & {\n    addVariable(\n        cost: number,\n        id: string,\n        isInteger?: boolean,\n        isUnrestricted?: boolean,\n        priority?: number\n    ): Variable;\n};\n\nexport function createRelaxationVariable(\n    model: RelaxationModel,\n    weight?: number,\n    priority?: Priority\n): Variable | null {\n    if (priority === 0 || priority === \"required\") {\n        return null;\n    }\n\n    const normalizedWeight = weight === undefined ? 1 : weight;\n    const normalizedPriority = priority === undefined ? 1 : priority;\n\n    const actualWeight = model.isMinimization === false ? -normalizedWeight : normalizedWeight;\n\n    return model.addVariable(\n        actualWeight,\n        \"r\" + model.relaxationIndex++,\n        false,\n        false,\n        normalizedPriority as number\n    );\n}\n\nexport class Constraint {\n    slack: SlackVariable;\n    index: number;\n    model: RelaxationModel;\n    rhs: number;\n    isUpperBound: boolean;\n    terms: Term[];\n    termsByVarIndex: Record<number, Term>;\n    relaxation: Variable | null;\n\n    constructor(rhs: number, isUpperBound: boolean, index: number, model: RelaxationModel) {\n        this.slack = new SlackVariable(\"s\" + index, index);\n        this.index = index;\n        this.model = model;\n        this.rhs = rhs;\n        this.isUpperBound = isUpperBound;\n\n        this.terms = [];\n        this.termsByVarIndex = {};\n\n        this.relaxation = null;\n    }\n\n    addTerm(coefficient: number, variable: Variable): this {\n        const varIndex = variable.index;\n        const term = this.termsByVarIndex[varIndex];\n        if (term === undefined) {\n            // No term for given variable\n            const newTerm = new Term(variable, coefficient);\n            this.termsByVarIndex[varIndex] = newTerm;\n            this.terms.push(newTerm);\n            const signedCoefficient = this.isUpperBound === true ? -coefficient : coefficient;\n            this.model.updateConstraintCoefficient(this, variable, signedCoefficient);\n        } else {\n            // Term for given variable already exists\n            // updating its coefficient\n            const newCoefficient = term.coefficient + coefficient;\n            this.setVariableCoefficient(newCoefficient, variable);\n        }\n\n        return this;\n    }\n\n    // TODO: Implement term removal if required by consumers.\n    removeTerm(_term: Term): this {\n        return this;\n    }\n\n    setRightHandSide(newRhs: number): this {\n        if (newRhs !== this.rhs) {\n            let difference = newRhs - this.rhs;\n            if (this.isUpperBound === true) {\n                difference = -difference;\n            }\n\n            this.rhs = newRhs;\n            this.model.updateRightHandSide(this, difference);\n        }\n\n        return this;\n    }\n\n    setVariableCoefficient(newCoefficient: number, variable: Variable): this | void {\n        const varIndex = variable.index;\n        if (varIndex === -1) {\n            // eslint-disable-next-line no-console\n            console.warn(\n                \"[Constraint.setVariableCoefficient] Trying to change coefficient of inexistant variable.\"\n            );\n            return;\n        }\n\n        const term = this.termsByVarIndex[varIndex];\n        if (term === undefined) {\n            // No term for given variable\n            this.addTerm(newCoefficient, variable);\n        } else if (newCoefficient !== term.coefficient) {\n            // Term for given variable already exists\n            // updating its coefficient if changed\n            let difference = newCoefficient - term.coefficient;\n            if (this.isUpperBound === true) {\n                difference = -difference;\n            }\n\n            term.coefficient = newCoefficient;\n            this.model.updateConstraintCoefficient(this, variable, difference);\n        }\n\n        return this;\n    }\n\n    relax(weight?: number, priority?: Priority): void {\n        this.relaxation = createRelaxationVariable(this.model, weight, priority);\n        this._relax(this.relaxation);\n    }\n\n    _relax(relaxationVariable: Variable | null): void {\n        if (relaxationVariable === null) {\n            // Relaxation variable not created, priority was probably \"required\"\n            return;\n        }\n\n        if (this.isUpperBound) {\n            this.setVariableCoefficient(-1, relaxationVariable);\n        } else {\n            this.setVariableCoefficient(1, relaxationVariable);\n        }\n    }\n}\n\nexport class Equality {\n    upperBound: Constraint;\n    lowerBound: Constraint;\n    model: RelaxationModel;\n    rhs: number;\n    relaxation: Variable | null;\n    isEquality: true = true;\n\n    constructor(constraintUpper: Constraint, constraintLower: Constraint) {\n        this.upperBound = constraintUpper;\n        this.lowerBound = constraintLower;\n        this.model = constraintUpper.model;\n        this.rhs = constraintUpper.rhs;\n        this.relaxation = null;\n    }\n\n    addTerm(coefficient: number, variable: Variable): this {\n        this.upperBound.addTerm(coefficient, variable);\n        this.lowerBound.addTerm(coefficient, variable);\n        return this;\n    }\n\n    // TODO: Implement term removal if required by consumers.\n    removeTerm(_term: Term): this {\n        this.upperBound.removeTerm(_term);\n        this.lowerBound.removeTerm(_term);\n        return this;\n    }\n\n    setRightHandSide(rhs: number): void {\n        this.upperBound.setRightHandSide(rhs);\n        this.lowerBound.setRightHandSide(rhs);\n        this.rhs = rhs;\n    }\n\n    relax(weight?: number, priority?: Priority): void {\n        this.relaxation = createRelaxationVariable(this.model, weight, priority);\n        this.upperBound.relaxation = this.relaxation;\n        this.upperBound._relax(this.relaxation);\n        this.lowerBound.relaxation = this.relaxation;\n        this.lowerBound._relax(this.relaxation);\n    }\n}\n\nexport class Numeral {\n    value: number;\n\n    constructor(value: number) {\n        this.value = value;\n    }\n}\n","/**\n * @file src/tableau/cutting-strategies.ts\n * @description Cutting plane strategies for MIP solving\n *\n * Implements various cutting plane methods to tighten LP relaxations:\n * - Gomory mixed-integer cuts from the simplex tableau\n * - Bound cuts for variable branching\n *\n * These cuts are dynamically added to the tableau during branch-and-cut\n * to eliminate fractional solutions without cutting off integer solutions.\n */\nimport type Tableau from \"./tableau\";\nimport { SlackVariable } from \"../expressions\";\nimport type { BranchCut } from \"./types\";\n\nexport function addCutConstraints(this: Tableau, cutConstraints: BranchCut[]): void {\n    const nCutConstraints = cutConstraints.length;\n    const height = this.height;\n    const heightWithCuts = height + nCutConstraints;\n    const width = this.width;\n    const lastColumn = width - 1;\n\n    // Grow the matrix to accommodate new rows (with over-allocation to reduce reallocation frequency)\n    const oldMatrix = this.matrix;\n    const newSize = heightWithCuts * width;\n    if (oldMatrix.length < newSize) {\n        // Over-allocate by 50% to reduce future reallocations\n        const allocSize = Math.ceil(newSize * 1.5);\n        const newMatrix = new Float64Array(allocSize);\n        newMatrix.set(oldMatrix);\n        this.matrix = newMatrix;\n    }\n    const matrix = this.matrix;\n\n    this.height = heightWithCuts;\n    this.nVars = this.width + this.height - 2;\n\n    // Cache array references for faster access in loop\n    const rhsColumn = this.rhsColumn;\n    const rowByVarIndex = this.rowByVarIndex;\n    const colByVarIndex = this.colByVarIndex;\n    const varIndexByRow = this.varIndexByRow;\n    const variablesPerIndex = this.variablesPerIndex;\n\n    for (let h = 0; h < nCutConstraints; h += 1) {\n        const cut = cutConstraints[h];\n        const cutRow = height + h;\n        const cutRowOffset = cutRow * width;\n        const sign = cut.type === \"min\" ? -1 : 1;\n\n        const varIndex = cut.varIndex;\n        let varRowIndex = rowByVarIndex[varIndex];\n\n        if (varRowIndex === -1) {\n            matrix[cutRowOffset + rhsColumn] = sign * cut.value;\n\n            for (let c = 1; c <= lastColumn; c += 1) {\n                matrix[cutRowOffset + c] = 0;\n            }\n\n            matrix[cutRowOffset + colByVarIndex[varIndex]] = sign;\n        } else {\n            const varRowOffset = varRowIndex * width;\n            const varValue = matrix[varRowOffset + rhsColumn];\n\n            matrix[cutRowOffset + rhsColumn] = sign * (cut.value - varValue);\n\n            for (let c = 1; c <= lastColumn; c += 1) {\n                matrix[cutRowOffset + c] = -sign * matrix[varRowOffset + c];\n            }\n        }\n\n        varRowIndex = this.getNewElementIndex();\n        varIndexByRow[cutRow] = varRowIndex;\n        rowByVarIndex[varRowIndex] = cutRow;\n        colByVarIndex[varRowIndex] = -1;\n        variablesPerIndex[varRowIndex] = new SlackVariable(\"s\" + varRowIndex, varRowIndex);\n\n        this.nVars += 1;\n    }\n}\n\nexport function addLowerBoundMIRCut(this: Tableau, rowIndex: number): boolean {\n    if (rowIndex === this.costRowIndex) {\n        return false;\n    }\n\n    const width = this.width;\n    const matrix = this.matrix;\n    const cutRowOffset = rowIndex * width;\n    const integerVar = this.variablesPerIndex[this.varIndexByRow[rowIndex]];\n    if (integerVar === undefined || !integerVar.isInteger) {\n        return false;\n    }\n\n    const rhsValue = matrix[cutRowOffset + this.rhsColumn];\n    const fractionalPart = rhsValue - Math.floor(rhsValue);\n    if (fractionalPart < this.precision || fractionalPart > 1 - this.precision) {\n        return false;\n    }\n\n    const height = this.height;\n    const newRowOffset = height * width;\n\n    // Grow matrix to add new row (with over-allocation to reduce reallocation frequency)\n    const newSize = (height + 1) * width;\n    if (matrix.length < newSize) {\n        // Over-allocate by 50% to reduce future reallocations\n        const allocSize = Math.ceil(newSize * 1.5);\n        const newMatrix = new Float64Array(allocSize);\n        newMatrix.set(matrix);\n        this.matrix = newMatrix;\n    }\n    const mat = this.matrix;\n\n    this.height += 1;\n    this.nVars += 1;\n\n    const slackVarIndex = this.getNewElementIndex();\n    this.varIndexByRow[height] = slackVarIndex;\n    this.rowByVarIndex[slackVarIndex] = height;\n    this.colByVarIndex[slackVarIndex] = -1;\n    this.variablesPerIndex[slackVarIndex] = new SlackVariable(\"s\" + slackVarIndex, slackVarIndex);\n\n    const rhsColumn = this.rhsColumn;\n    mat[newRowOffset + rhsColumn] = Math.floor(rhsValue);\n\n    // Cache array references for faster access in hot loop\n    const variablesPerIndex = this.variablesPerIndex;\n    const varIndexByCol = this.varIndexByCol;\n    const varIndexByColLen = varIndexByCol.length;\n    const oneMinusFrac = 1 - fractionalPart;\n\n    for (let colIndex = 1; colIndex < varIndexByColLen; colIndex += 1) {\n        const variable = variablesPerIndex[varIndexByCol[colIndex]];\n        const coefficient = mat[cutRowOffset + colIndex];\n        if (variable !== undefined && variable.isInteger) {\n            const floorCoeff = Math.floor(coefficient);\n            const termCoeff =\n                floorCoeff + Math.max(0, coefficient - floorCoeff - fractionalPart) / oneMinusFrac;\n            mat[newRowOffset + colIndex] = termCoeff;\n        } else {\n            mat[newRowOffset + colIndex] = Math.min(0, coefficient / oneMinusFrac);\n        }\n    }\n\n    for (let c = 0; c < width; c += 1) {\n        mat[newRowOffset + c] -= mat[cutRowOffset + c];\n    }\n\n    return true;\n}\n\nexport function addUpperBoundMIRCut(this: Tableau, rowIndex: number): boolean {\n    if (rowIndex === this.costRowIndex) {\n        return false;\n    }\n\n    const width = this.width;\n    const matrix = this.matrix;\n    const cutRowOffset = rowIndex * width;\n    const integerVar = this.variablesPerIndex[this.varIndexByRow[rowIndex]];\n    if (integerVar === undefined || !integerVar.isInteger) {\n        return false;\n    }\n\n    const rhsValue = matrix[cutRowOffset + this.rhsColumn];\n    const fractionalPart = rhsValue - Math.floor(rhsValue);\n    if (fractionalPart < this.precision || fractionalPart > 1 - this.precision) {\n        return false;\n    }\n\n    const height = this.height;\n    const newRowOffset = height * width;\n\n    // Grow matrix to add new row (with over-allocation to reduce reallocation frequency)\n    const newSize = (height + 1) * width;\n    if (matrix.length < newSize) {\n        // Over-allocate by 50% to reduce future reallocations\n        const allocSize = Math.ceil(newSize * 1.5);\n        const newMatrix = new Float64Array(allocSize);\n        newMatrix.set(matrix);\n        this.matrix = newMatrix;\n    }\n    const mat = this.matrix;\n\n    this.height += 1;\n    this.nVars += 1;\n\n    const slackVarIndex = this.getNewElementIndex();\n    this.varIndexByRow[height] = slackVarIndex;\n    this.rowByVarIndex[slackVarIndex] = height;\n    this.colByVarIndex[slackVarIndex] = -1;\n    this.variablesPerIndex[slackVarIndex] = new SlackVariable(\"s\" + slackVarIndex, slackVarIndex);\n\n    const rhsColumn = this.rhsColumn;\n    mat[newRowOffset + rhsColumn] = -fractionalPart;\n\n    // Cache array references for faster access in hot loop\n    const variablesPerIndex = this.variablesPerIndex;\n    const varIndexByCol = this.varIndexByCol;\n    const varIndexByColLen = varIndexByCol.length;\n    const oneMinusFrac = 1 - fractionalPart;\n\n    for (let colIndex = 1; colIndex < varIndexByColLen; colIndex += 1) {\n        const variable = variablesPerIndex[varIndexByCol[colIndex]];\n        const coefficient = mat[cutRowOffset + colIndex];\n        const termCoeff = coefficient - Math.floor(coefficient);\n        if (variable !== undefined && variable.isInteger) {\n            mat[newRowOffset + colIndex] =\n                termCoeff <= fractionalPart\n                    ? -termCoeff\n                    : (-(1 - termCoeff) * fractionalPart) / termCoeff;\n        } else {\n            mat[newRowOffset + colIndex] =\n                coefficient >= 0 ? -coefficient : (coefficient * fractionalPart) / oneMinusFrac;\n        }\n    }\n\n    return true;\n}\n\nexport function applyMIRCuts(this: Tableau): void {\n    // Apply MIR (Mixed Integer Rounding) cuts to all rows with fractional integer variables\n    // This tightens the LP relaxation and can help prune the branch-and-bound tree\n    const height = this.height;\n    let cutsAdded = 0;\n    const maxCuts = 10; // Limit cuts per iteration to avoid excessive growth\n\n    for (let r = 1; r < height && cutsAdded < maxCuts; r++) {\n        // Try lower bound MIR cut first (typically more effective)\n        if (this.addLowerBoundMIRCut(r)) {\n            cutsAdded++;\n        }\n    }\n}\n","/**\n * @file src/tableau/dynamic-modification.ts\n * @description Runtime tableau modification operations\n *\n * Supports modifying the LP after initial solve:\n * - Add/remove constraints\n * - Add/remove variables\n * - Update constraint coefficients and RHS values\n * - Update objective function costs\n *\n * Functions are designed to be bound to a Tableau instance via `this`.\n */\nimport type Tableau from \"./tableau\";\nimport type { Constraint, Variable } from \"../expressions\";\n\nexport function putInBase(this: Tableau, varIndex: number): number {\n    const width = this.width;\n    let r = this.rowByVarIndex[varIndex];\n    if (r === -1) {\n        const c = this.colByVarIndex[varIndex];\n\n        for (let r1 = 1; r1 < this.height; r1 += 1) {\n            const coefficient = this.matrix[r1 * width + c];\n            if (coefficient < -this.precision || this.precision < coefficient) {\n                r = r1;\n                break;\n            }\n        }\n\n        this.pivot(r, c);\n    }\n\n    return r;\n}\n\nexport function takeOutOfBase(this: Tableau, varIndex: number): number {\n    const width = this.width;\n    let c = this.colByVarIndex[varIndex];\n    if (c === -1) {\n        const r = this.rowByVarIndex[varIndex];\n        const pivotRowOffset = r * width;\n\n        for (let c1 = 1; c1 < this.height; c1 += 1) {\n            const coefficient = this.matrix[pivotRowOffset + c1];\n            if (coefficient < -this.precision || this.precision < coefficient) {\n                c = c1;\n                break;\n            }\n        }\n\n        this.pivot(r, c);\n    }\n\n    return c;\n}\n\nexport function updateVariableValues(this: Tableau): void {\n    const width = this.width;\n    const matrix = this.matrix;\n    const rhsColumn = this.rhsColumn;\n    const nVars = this.variables.length;\n    const roundingCoeff = Math.round(1 / this.precision);\n    for (let v = 0; v < nVars; v += 1) {\n        const variable = this.variables[v];\n        const varIndex = variable.index;\n\n        const r = this.rowByVarIndex[varIndex];\n        if (r === -1) {\n            variable.value = 0;\n        } else {\n            const varValue = matrix[r * width + rhsColumn];\n            variable.value =\n                Math.round((varValue + Number.EPSILON) * roundingCoeff) / roundingCoeff;\n        }\n    }\n}\n\nexport function updateRightHandSide(\n    this: Tableau,\n    constraint: Constraint,\n    difference: number\n): void {\n    const width = this.width;\n    const matrix = this.matrix;\n    const rhsColumn = this.rhsColumn;\n    const lastRow = this.height - 1;\n    const constraintRow = this.rowByVarIndex[constraint.index];\n    if (constraintRow === -1) {\n        const slackColumn = this.colByVarIndex[constraint.index];\n\n        for (let r = 0; r <= lastRow; r += 1) {\n            const rowOffset = r * width;\n            matrix[rowOffset + rhsColumn] -= difference * matrix[rowOffset + slackColumn];\n        }\n\n        const nOptionalObjectives = this.optionalObjectives.length;\n        if (nOptionalObjectives > 0) {\n            for (let o = 0; o < nOptionalObjectives; o += 1) {\n                const reducedCosts = this.optionalObjectives[o].reducedCosts;\n                reducedCosts[rhsColumn] -= difference * reducedCosts[slackColumn];\n            }\n        }\n    } else {\n        matrix[constraintRow * width + rhsColumn] -= difference;\n    }\n}\n\nexport function updateConstraintCoefficient(\n    this: Tableau,\n    constraint: Constraint,\n    variable: Variable,\n    difference: number\n): void {\n    if (constraint.index === variable.index) {\n        throw new Error(\n            \"[Tableau.updateConstraintCoefficient] constraint index should not be equal to variable index !\"\n        );\n    }\n\n    const width = this.width;\n    const matrix = this.matrix;\n    const r = this.putInBase(constraint.index);\n    const rowOffset = r * width;\n\n    const colVar = this.colByVarIndex[variable.index];\n    if (colVar === -1) {\n        const rowVar = this.rowByVarIndex[variable.index];\n        const rowVarOffset = rowVar * width;\n        for (let c = 0; c < width; c += 1) {\n            matrix[rowOffset + c] += difference * matrix[rowVarOffset + c];\n        }\n    } else {\n        matrix[rowOffset + colVar] -= difference;\n    }\n}\n\nexport function updateCost(this: Tableau, variable: Variable, difference: number): void {\n    const width = this.width;\n    const matrix = this.matrix;\n    const varIndex = variable.index;\n    const lastColumn = width - 1;\n    const varColumn = this.colByVarIndex[varIndex];\n    if (varColumn === -1) {\n        const variableRowOffset = this.rowByVarIndex[varIndex] * width;\n\n        if (variable.priority === 0) {\n            // Cost row is row 0\n            for (let c = 0; c <= lastColumn; c += 1) {\n                matrix[c] += difference * matrix[variableRowOffset + c];\n            }\n        } else {\n            const reducedCosts = this.objectivesByPriority[variable.priority].reducedCosts;\n            for (let c = 0; c <= lastColumn; c += 1) {\n                reducedCosts[c] += difference * matrix[variableRowOffset + c];\n            }\n        }\n    } else {\n        matrix[varColumn] -= difference; // row 0, col varColumn\n    }\n}\n\nexport function addConstraint(this: Tableau, constraint: Constraint): void {\n    const sign = constraint.isUpperBound ? 1 : -1;\n    const lastRow = this.height;\n    const width = this.width;\n    const lastColumn = width - 1;\n\n    // Check if we need to grow the matrix capacity (using exponential growth)\n    const newRowCount = lastRow + 1;\n    const requiredSize = newRowCount * width;\n    if (this.matrix.length < requiredSize) {\n        // Use exponential growth strategy (1.5x) with minimum increment\n        const currentCapacity = this.matrix.length;\n        const minGrowth = Math.max(width * 16, Math.floor(currentCapacity * 0.5));\n        const newCapacity = currentCapacity + minGrowth;\n\n        const oldMatrix = this.matrix;\n        const newMatrix = new Float64Array(newCapacity);\n        newMatrix.set(oldMatrix);\n        this.matrix = newMatrix;\n    }\n\n    const matrix = this.matrix;\n    const constraintRowOffset = lastRow * width;\n\n    // Zero out the new row\n    for (let c = 0; c <= lastColumn; c += 1) {\n        matrix[constraintRowOffset + c] = 0;\n    }\n\n    matrix[constraintRowOffset + this.rhsColumn] = sign * constraint.rhs;\n\n    const terms = constraint.terms;\n    const nTerms = terms.length;\n    for (let t = 0; t < nTerms; t += 1) {\n        const term = terms[t];\n        const coefficient = term.coefficient;\n        const varIndex = term.variable.index;\n\n        const varRowIndex = this.rowByVarIndex[varIndex];\n        if (varRowIndex === -1) {\n            matrix[constraintRowOffset + this.colByVarIndex[varIndex]] += sign * coefficient;\n        } else {\n            const varRowOffset = varRowIndex * width;\n            for (let c = 0; c <= lastColumn; c += 1) {\n                matrix[constraintRowOffset + c] -= sign * coefficient * matrix[varRowOffset + c];\n            }\n        }\n    }\n\n    const slackIndex = constraint.index;\n    this.varIndexByRow[lastRow] = slackIndex;\n    this.rowByVarIndex[slackIndex] = lastRow;\n    this.colByVarIndex[slackIndex] = -1;\n\n    this.height += 1;\n}\n\nexport function removeConstraint(this: Tableau, constraint: Constraint): void {\n    const slackIndex = constraint.index;\n    const lastRow = this.height - 1;\n    const width = this.width;\n    const matrix = this.matrix;\n\n    const r = this.putInBase(slackIndex);\n\n    // Swap row r with lastRow\n    const rowOffset = r * width;\n    const lastRowOffset = lastRow * width;\n    for (let c = 0; c < width; c++) {\n        const tmp = matrix[lastRowOffset + c];\n        matrix[lastRowOffset + c] = matrix[rowOffset + c];\n        matrix[rowOffset + c] = tmp;\n    }\n\n    this.varIndexByRow[r] = this.varIndexByRow[lastRow];\n    this.varIndexByRow[lastRow] = -1;\n    this.rowByVarIndex[slackIndex] = -1;\n\n    this.availableIndexes[this.availableIndexes.length] = slackIndex;\n\n    constraint.slack.index = -1;\n\n    this.height -= 1;\n}\n\nexport function addVariable(this: Tableau, variable: Variable): void {\n    const _lastRow = this.height - 1;\n    const oldWidth = this.width;\n    const newWidth = oldWidth + 1;\n    const height = this.height;\n    const cost = this.model.isMinimization === true ? -variable.cost : variable.cost;\n    const priority = variable.priority;\n\n    // Need to expand the matrix to add a new column\n    // This requires reallocating and copying with new layout\n    // Note: Column capacity optimization would require changing all matrix access\n    // to use capacity as stride, which is too invasive. Keep simple reallocation.\n    const oldMatrix = this.matrix;\n    const newMatrix = new Float64Array(height * newWidth);\n\n    // Copy old data with new width\n    for (let r = 0; r < height; r++) {\n        const oldOffset = r * oldWidth;\n        const newOffset = r * newWidth;\n        for (let c = 0; c < oldWidth; c++) {\n            newMatrix[newOffset + c] = oldMatrix[oldOffset + c];\n        }\n        // New column is 0 by default\n    }\n\n    this.matrix = newMatrix;\n    this.width = newWidth;\n\n    const lastColumn = newWidth - 1;\n\n    const nOptionalObjectives = this.optionalObjectives.length;\n    if (nOptionalObjectives > 0) {\n        for (let o = 0; o < nOptionalObjectives; o += 1) {\n            this.optionalObjectives[o].reducedCosts[lastColumn] = 0;\n        }\n    }\n\n    if (priority === 0) {\n        newMatrix[lastColumn] = cost; // row 0, col lastColumn\n    } else {\n        this.setOptionalObjective(priority, lastColumn, cost);\n        newMatrix[lastColumn] = 0;\n    }\n\n    this.colByVarIndex[variable.index] = lastColumn;\n    this.varIndexByCol[lastColumn] = variable.index;\n}\n\nexport function removeVariable(this: Tableau, variable: Variable): void {\n    const varIndex = variable.index;\n    const width = this.width;\n    const matrix = this.matrix;\n    const lastColumn = width - 1;\n\n    const c = this.takeOutOfBase(varIndex);\n\n    const lastRow = this.height - 1;\n    for (let r = 0; r <= lastRow; r += 1) {\n        const rowOffset = r * width;\n        matrix[rowOffset + c] = matrix[rowOffset + lastColumn];\n    }\n\n    this.varIndexByCol[c] = this.varIndexByCol[lastColumn];\n    this.rowByVarIndex[varIndex] = -1;\n    this.colByVarIndex[varIndex] = -1;\n\n    this.availableIndexes[this.availableIndexes.length] = varIndex;\n\n    this.width -= 1;\n}\n","/**\n * @file src/tableau/backup.ts\n * @description Tableau state backup and restoration\n *\n * Provides functions to snapshot and restore tableau state during\n * branch-and-bound exploration. Essential for backtracking when\n * a branch is pruned or found infeasible.\n *\n * Functions are designed to be bound to a Tableau instance via `this`.\n */\nimport type Tableau from \"./tableau\";\n\nexport function copy(this: Tableau): Tableau {\n    const copy = new (this.constructor as typeof Tableau)(this.precision, this.branchAndCutService);\n\n    copy.width = this.width;\n    copy.height = this.height;\n\n    copy.nVars = this.nVars;\n    copy.model = this.model;\n\n    copy.variables = this.variables;\n    copy.variablesPerIndex = this.variablesPerIndex;\n    copy.unrestrictedVars = this.unrestrictedVars;\n    copy.lastElementIndex = this.lastElementIndex;\n\n    copy.varIndexByRow = this.varIndexByRow.slice();\n    copy.varIndexByCol = this.varIndexByCol.slice();\n\n    copy.rowByVarIndex = this.rowByVarIndex.slice();\n    copy.colByVarIndex = this.colByVarIndex.slice();\n\n    copy.availableIndexes = this.availableIndexes.slice();\n\n    const optionalObjectivesCopy = [];\n    for (let o = 0; o < this.optionalObjectives.length; o++) {\n        optionalObjectivesCopy[o] = this.optionalObjectives[o].copy();\n    }\n    copy.optionalObjectives = optionalObjectivesCopy;\n    copy.objectivesByPriority = { ...this.objectivesByPriority };\n    copy.optionalObjectivePerPriority = { ...this.optionalObjectivePerPriority };\n\n    // Fast Float64Array copy using constructor\n    copy.matrix = new Float64Array(this.matrix);\n\n    return copy;\n}\n\nexport function save(this: Tableau): void {\n    this.savedState = this.copy();\n}\n\nexport function restore(this: Tableau): void {\n    if (this.savedState === null) {\n        return;\n    }\n\n    const save = this.savedState;\n    this.nVars = save.nVars;\n    this.model = save.model;\n\n    this.variables = save.variables;\n    this.variablesPerIndex = save.variablesPerIndex;\n    this.unrestrictedVars = save.unrestrictedVars;\n    this.lastElementIndex = save.lastElementIndex;\n\n    this.width = save.width;\n    this.height = save.height;\n\n    // Fast Float64Array restore using set()\n    this.matrix.set(save.matrix);\n\n    const savedBasicIndexes = save.varIndexByRow;\n    const height = this.height;\n    for (let c = 0; c < height; c += 1) {\n        this.varIndexByRow[c] = savedBasicIndexes[c];\n    }\n    this.varIndexByRow.length = height;\n\n    const savedNonBasicIndexes = save.varIndexByCol;\n    const width = this.width;\n    for (let r = 0; r < width; r += 1) {\n        this.varIndexByCol[r] = savedNonBasicIndexes[r];\n    }\n    this.varIndexByCol.length = width;\n\n    const savedRows = save.rowByVarIndex;\n    const savedCols = save.colByVarIndex;\n    for (let v = 0; v < this.nVars; v += 1) {\n        this.rowByVarIndex[v] = savedRows[v];\n        this.colByVarIndex[v] = savedCols[v];\n    }\n\n    if (save.optionalObjectives.length > 0 && this.optionalObjectives.length > 0) {\n        this.optionalObjectives = [];\n        this.optionalObjectivePerPriority = {};\n        for (let o = 0; o < save.optionalObjectives.length; o++) {\n            const optionalObjectiveCopy = save.optionalObjectives[o].copy();\n            this.optionalObjectives[o] = optionalObjectiveCopy;\n            this.optionalObjectivePerPriority[optionalObjectiveCopy.priority] =\n                optionalObjectiveCopy;\n            this.objectivesByPriority[optionalObjectiveCopy.priority] = optionalObjectiveCopy;\n        }\n    }\n}\n","/**\n * @file src/tableau/mip-utils.ts\n * @description Mixed-integer programming utility functions\n *\n * Provides helper functions for MIP solving:\n * - Checking integrality of current solution\n * - Variable selection for branching (most fractional, etc.)\n * - Fractional volume computation\n *\n * Functions are designed to be bound to a Tableau instance via `this`.\n */\nimport type Tableau from \"./tableau\";\nimport type { VariableValue } from \"./types\";\n\n// ========== Integer Property Functions ==========\n\n/**\n * Count how many integer variables currently have integral values.\n */\nexport function countIntegerValues(this: Tableau): number {\n    let count = 0;\n    const width = this.width;\n    const matrix = this.matrix;\n    const rhsColumn = this.rhsColumn;\n\n    for (let r = 1; r < this.height; r += 1) {\n        const variable = this.variablesPerIndex[this.varIndexByRow[r]];\n        if (variable !== undefined && variable.isInteger) {\n            const value = matrix[r * width + rhsColumn];\n            const decimalPart = value - Math.floor(value);\n            if (decimalPart < this.precision && -decimalPart < this.precision) {\n                count += 1;\n            }\n        }\n    }\n    return count;\n}\n\n/**\n * Check if all integer variables have integral values.\n * Returns true if the current solution is integral.\n */\nexport function isIntegral(this: Tableau): boolean {\n    const width = this.width;\n    const matrix = this.matrix;\n    const rhsColumn = this.rhsColumn;\n    const integerVariables = this.model!.integerVariables;\n    const nIntegerVars = integerVariables.length;\n    // Cache array reference for faster access in hot loop\n    const rowByVarIndex = this.rowByVarIndex;\n    const precision = this.precision;\n\n    for (let v = 0; v < nIntegerVars; v++) {\n        const varIndex = integerVariables[v].index;\n        const row = rowByVarIndex[varIndex];\n        if (row !== -1) {\n            const value = matrix[row * width + rhsColumn];\n            if (Math.abs(value - Math.round(value)) > precision) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\n\n/**\n * Compute a measure of how fractional the current solution is.\n * Used for evaluating the quality of cutting planes.\n */\nexport function computeFractionalVolume(this: Tableau, ignoreIntegerValues?: boolean): number {\n    let volume = -1;\n    const width = this.width;\n    const matrix = this.matrix;\n    const rhsColumn = this.rhsColumn;\n    const height = this.height;\n    // Cache array references for faster access in hot loop\n    const variablesPerIndex = this.variablesPerIndex;\n    const varIndexByRow = this.varIndexByRow;\n    const precision = this.precision;\n\n    for (let r = 1; r < height; r += 1) {\n        const variable = variablesPerIndex[varIndexByRow[r]];\n        if (variable !== undefined && variable.isInteger) {\n            const value = matrix[r * width + rhsColumn];\n            const distance = Math.abs(value);\n            if (Math.min(distance - Math.floor(distance), Math.floor(distance + 1)) < precision) {\n                if (ignoreIntegerValues !== true) {\n                    return 0;\n                }\n            } else if (volume === -1) {\n                volume = distance;\n            } else {\n                volume *= distance;\n            }\n        }\n    }\n    return volume === -1 ? 0 : volume;\n}\n\n// ========== Branching Variable Selection ==========\n\n/**\n * Select the integer variable with the most fractional value.\n * Standard branching strategy - picks the variable closest to 0.5 fractionality.\n */\nexport function getMostFractionalVar(this: Tableau): VariableValue {\n    let biggestFraction = 0;\n    let selectedVarIndex: number | null = null;\n    let selectedVarValue = 0;\n\n    const width = this.width;\n    const matrix = this.matrix;\n    const rhsColumn = this.rhsColumn;\n    const integerVars = this.model!.integerVariables;\n    const nIntegerVars = integerVars.length;\n    // Cache array reference for faster access in hot loop\n    const rowByVarIndex = this.rowByVarIndex;\n\n    for (let v = 0; v < nIntegerVars; v += 1) {\n        const varIndex = integerVars[v].index;\n        const row = rowByVarIndex[varIndex];\n        if (row !== -1) {\n            const varValue = matrix[row * width + rhsColumn];\n            const fraction = Math.abs(varValue - Math.round(varValue));\n            if (fraction > biggestFraction) {\n                biggestFraction = fraction;\n                selectedVarIndex = varIndex;\n                selectedVarValue = varValue;\n            }\n        }\n    }\n\n    return { index: selectedVarIndex, value: selectedVarValue };\n}\n\n/**\n * Select the fractional integer variable with the lowest cost coefficient.\n * Alternative branching strategy that considers objective function impact.\n */\nexport function getFractionalVarWithLowestCost(this: Tableau): VariableValue {\n    let highestCost = Infinity;\n    let selectedVarIndex: number | null = null;\n    let selectedVarValue: number | null = null;\n\n    const width = this.width;\n    const matrix = this.matrix;\n    const rhsColumn = this.rhsColumn;\n    const integerVars = this.model!.integerVariables;\n    const nIntegerVars = integerVars.length;\n\n    for (let v = 0; v < nIntegerVars; v += 1) {\n        const variable = integerVars[v];\n        const varIndex = variable.index;\n        const varRow = this.rowByVarIndex[varIndex];\n        if (varRow !== -1) {\n            const varValue = matrix[varRow * width + rhsColumn];\n            if (\n                Math.abs(varValue - Math.round(varValue)) > this.precision &&\n                variable.cost < highestCost\n            ) {\n                highestCost = variable.cost;\n                selectedVarIndex = varIndex;\n                selectedVarValue = varValue;\n            }\n        }\n    }\n\n    return { index: selectedVarIndex, value: selectedVarValue };\n}\n","/**\n * @file src/tableau/log.ts\n * @description Debug logging for tableau state\n *\n * Provides console output of the current tableau state including:\n * - Matrix dimensions\n * - Basic and non-basic variable indices\n * - Formatted matrix contents\n *\n * Primarily used during development and debugging.\n */\nimport type Tableau from \"./tableau\";\n\nconst DEBUG_ENABLED = false;\n\nexport function log(this: Tableau, message: unknown, force?: boolean): Tableau {\n    if (!DEBUG_ENABLED && !force) {\n        return this;\n    }\n\n    // eslint-disable-next-line no-console\n    console.log(\"****\", message, \"****\");\n    // eslint-disable-next-line no-console\n    console.log(\"Nb Variables\", this.width - 1);\n    // eslint-disable-next-line no-console\n    console.log(\"Nb Constraints\", this.height - 1);\n    // console.log(\"Variable Ids\", this.variablesPerIndex);\n    // eslint-disable-next-line no-console\n    console.log(\"Basic Indexes\", this.varIndexByRow);\n    // eslint-disable-next-line no-console\n    console.log(\"Non Basic Indexes\", this.varIndexByCol);\n    // eslint-disable-next-line no-console\n    console.log(\"Rows\", this.rowByVarIndex);\n    // eslint-disable-next-line no-console\n    console.log(\"Cols\", this.colByVarIndex);\n\n    const digitPrecision = 5;\n    const matrix = this.matrix;\n    const width = this.width;\n\n    let varNameRowString = \"\";\n    const spacePerColumn: string[] = [\" \"];\n    let j: number;\n    let c: number;\n    let varIndex: number;\n    let varName: string;\n    let varNameLength: number;\n    let valueSpace: string;\n    let nameSpace: string;\n\n    for (c = 1; c < this.width; c += 1) {\n        varIndex = this.varIndexByCol[c];\n        const variable = this.variablesPerIndex[varIndex];\n        if (variable === undefined) {\n            varName = \"c\" + varIndex;\n        } else {\n            varName = variable.id;\n        }\n\n        varNameLength = varName.length;\n        valueSpace = \" \";\n        nameSpace = \"\\t\";\n\n        if (varNameLength > 5) {\n            valueSpace += \" \";\n        } else {\n            nameSpace += \"\\t\";\n        }\n\n        spacePerColumn[c] = valueSpace;\n\n        varNameRowString += nameSpace + varName;\n    }\n    // eslint-disable-next-line no-console\n    console.log(varNameRowString);\n\n    let signSpace: string;\n\n    const costRowOffset = this.costRowIndex * width;\n    let firstRowString = \"\\t\";\n\n    for (j = 1; j < this.width; j += 1) {\n        signSpace = \"\\t\";\n        firstRowString += signSpace;\n        firstRowString += spacePerColumn[j];\n        firstRowString += matrix[costRowOffset + j].toFixed(digitPrecision);\n    }\n    signSpace = \"\\t\";\n    firstRowString += signSpace + spacePerColumn[0] + matrix[costRowOffset].toFixed(digitPrecision);\n    // eslint-disable-next-line no-console\n    console.log(firstRowString + \"\\tZ\");\n\n    for (let r = 1; r < this.height; r += 1) {\n        const rowOffset = r * width;\n        let rowString = \"\\t\";\n\n        for (c = 1; c < this.width; c += 1) {\n            signSpace = \"\\t\";\n            rowString +=\n                signSpace + spacePerColumn[c] + matrix[rowOffset + c].toFixed(digitPrecision);\n        }\n        signSpace = \"\\t\";\n        rowString += signSpace + spacePerColumn[0] + matrix[rowOffset].toFixed(digitPrecision);\n\n        varIndex = this.varIndexByRow[r];\n        const variable = this.variablesPerIndex[varIndex];\n        if (variable === undefined) {\n            varName = \"c\" + varIndex;\n        } else {\n            varName = variable.id;\n        }\n        // eslint-disable-next-line no-console\n        console.log(rowString + \"\\t\" + varName);\n    }\n    // eslint-disable-next-line no-console\n    console.log(\"\");\n\n    const nOptionalObjectives = this.optionalObjectives.length;\n    if (nOptionalObjectives > 0) {\n        // eslint-disable-next-line no-console\n        console.log(\"    Optional objectives:\");\n        for (let o = 0; o < nOptionalObjectives; o += 1) {\n            const reducedCosts = this.optionalObjectives[o].reducedCosts;\n            let reducedCostsString = \"\";\n            for (j = 1; j < this.width; j += 1) {\n                signSpace = reducedCosts[j] < 0 ? \"\" : \" \";\n                reducedCostsString += signSpace;\n                reducedCostsString += spacePerColumn[j];\n                reducedCostsString += reducedCosts[j].toFixed(digitPrecision);\n            }\n            signSpace = reducedCosts[0] < 0 ? \"\" : \" \";\n            reducedCostsString +=\n                signSpace + spacePerColumn[0] + reducedCosts[0].toFixed(digitPrecision);\n            // eslint-disable-next-line no-console\n            console.log(reducedCostsString + \" z\" + o);\n        }\n    }\n    // eslint-disable-next-line no-console\n    console.log(\"Feasible?\", this.feasible);\n    // eslint-disable-next-line no-console\n    console.log(\"evaluation\", this.evaluation);\n\n    return this;\n}\n","/**\n * @file src/tableau/tableau.ts\n * @description Core Tableau class for the simplex algorithm\n *\n * The Tableau represents the LP problem in matrix form and provides:\n * - Matrix storage using Float64Array for numerical precision\n * - Variable and constraint index management\n * - Simplex operations (via bound function imports)\n * - Branch-and-cut integration for MIP solving\n * - Save/restore for backtracking during B&B\n */\nimport { Solution, MilpSolution } from \"./solution\";\nimport type Model from \"../model\";\nimport type { Constraint, Variable } from \"../expressions\";\nimport type { BranchCut, OptionalObjective, TableauSolution, VariableValue } from \"./types\";\nimport type { BranchAndCutService } from \"./branch-and-cut\";\nimport { createBranchAndCutService } from \"./branch-and-cut\";\n\n// Import implementations\nimport * as simplexOps from \"./simplex\";\nimport * as cuttingOps from \"./cutting-strategies\";\nimport * as dynamicOps from \"./dynamic-modification\";\nimport * as backupOps from \"./backup\";\nimport * as mipOps from \"./mip-utils\";\nimport { log as logImpl } from \"./log\";\n\nfunction createOptionalObjective(\n    priority: number,\n    nColumns: number,\n    reducedCosts?: number[]\n): OptionalObjective {\n    return {\n        priority,\n        reducedCosts: reducedCosts ? reducedCosts.slice() : new Array<number>(nColumns).fill(0),\n        copy(): OptionalObjective {\n            return createOptionalObjective(\n                this.priority,\n                this.reducedCosts.length,\n                this.reducedCosts\n            );\n        },\n    };\n}\n\nexport default class Tableau {\n    model: Model | null = null;\n\n    matrix: Float64Array = new Float64Array(0);\n    width = 0;\n    height = 0;\n\n    costRowIndex = 0;\n    rhsColumn = 0;\n\n    variablesPerIndex: Array<Variable | undefined> = [];\n    unrestrictedVars: Record<number, boolean> = {};\n\n    feasible = true;\n    evaluation = 0;\n    simplexIters = 0;\n\n    varIndexByRow: number[] = [];\n    varIndexByCol: number[] = [];\n\n    rowByVarIndex: number[] = [];\n    colByVarIndex: number[] = [];\n\n    precision: number;\n\n    optionalObjectives: OptionalObjective[] = [];\n    objectivesByPriority: Record<number, OptionalObjective> = {};\n    optionalObjectivePerPriority: Record<number, OptionalObjective> = {};\n\n    savedState: Tableau | null = null;\n\n    availableIndexes: number[] = [];\n    lastElementIndex = 0;\n\n    variables: Variable[] = [];\n    nVars = 0;\n\n    bounded = true;\n    unboundedVarIndex: number | null = null;\n\n    branchAndCutIterations = 0;\n    bestPossibleEval = 0;\n    __isIntegral?: boolean;\n\n    // Partial pricing state for phase2 optimization\n    pricingBatchStart = 1;\n    pricingBatchSize = 0; // 0 means auto-compute based on problem size\n\n    readonly branchAndCutService: BranchAndCutService;\n\n    constructor(precision = 1e-8, branchAndCutService?: BranchAndCutService) {\n        this.precision = precision;\n        this.branchAndCutService = branchAndCutService ?? createBranchAndCutService();\n    }\n\n    // ========== Core Simplex Operations ==========\n\n    simplex(): this {\n        simplexOps.simplex.call(this);\n        return this;\n    }\n\n    phase1(): number {\n        return simplexOps.phase1.call(this);\n    }\n\n    phase2(): number {\n        return simplexOps.phase2.call(this);\n    }\n\n    /**\n     * Dual simplex for warm-starting after adding bound constraints.\n     * Use when solution is dual feasible but may be primal infeasible.\n     * @returns Number of iterations, or -1 if dual infeasible\n     */\n    dualSimplex(): number {\n        return simplexOps.dualSimplex.call(this);\n    }\n\n    pivot(pivotRowIndex: number, pivotColumnIndex: number): void {\n        simplexOps.pivot.call(this, pivotRowIndex, pivotColumnIndex);\n    }\n\n    checkForCycles(varIndexes: Array<[number, number]>): number[] {\n        return simplexOps.checkForCycles.call(this, varIndexes);\n    }\n\n    // ========== Integer/MIP Properties ==========\n\n    countIntegerValues(): number {\n        return mipOps.countIntegerValues.call(this);\n    }\n\n    isIntegral(): boolean {\n        return mipOps.isIntegral.call(this);\n    }\n\n    computeFractionalVolume(ignoreIntegerValues?: boolean): number {\n        return mipOps.computeFractionalVolume.call(this, ignoreIntegerValues);\n    }\n\n    // ========== Cutting Strategies ==========\n\n    addCutConstraints(branchingCuts: BranchCut[]): void {\n        cuttingOps.addCutConstraints.call(this, branchingCuts);\n    }\n\n    applyMIRCuts(): void {\n        cuttingOps.applyMIRCuts.call(this);\n    }\n\n    addLowerBoundMIRCut(rowIndex: number): boolean {\n        return cuttingOps.addLowerBoundMIRCut.call(this, rowIndex);\n    }\n\n    addUpperBoundMIRCut(rowIndex: number): boolean {\n        return cuttingOps.addUpperBoundMIRCut.call(this, rowIndex);\n    }\n\n    // ========== Branching Strategies ==========\n\n    getMostFractionalVar(): VariableValue {\n        return mipOps.getMostFractionalVar.call(this);\n    }\n\n    getFractionalVarWithLowestCost(): VariableValue {\n        return mipOps.getFractionalVarWithLowestCost.call(this);\n    }\n\n    // ========== Dynamic Modification ==========\n\n    putInBase(varIndex: number): number {\n        return dynamicOps.putInBase.call(this, varIndex);\n    }\n\n    takeOutOfBase(varIndex: number): number {\n        return dynamicOps.takeOutOfBase.call(this, varIndex);\n    }\n\n    updateVariableValues(): void {\n        dynamicOps.updateVariableValues.call(this);\n    }\n\n    updateRightHandSide(constraint: Constraint, difference: number): void {\n        dynamicOps.updateRightHandSide.call(this, constraint, difference);\n    }\n\n    updateConstraintCoefficient(\n        constraint: Constraint,\n        variable: Variable,\n        difference: number\n    ): void {\n        dynamicOps.updateConstraintCoefficient.call(this, constraint, variable, difference);\n    }\n\n    updateCost(variable: Variable, difference: number): void {\n        dynamicOps.updateCost.call(this, variable, difference);\n    }\n\n    addConstraint(constraint: Constraint): void {\n        dynamicOps.addConstraint.call(this, constraint);\n    }\n\n    removeConstraint(constraint: Constraint): void {\n        dynamicOps.removeConstraint.call(this, constraint);\n    }\n\n    addVariable(variable: Variable): void {\n        dynamicOps.addVariable.call(this, variable);\n    }\n\n    removeVariable(variable: Variable): void {\n        dynamicOps.removeVariable.call(this, variable);\n    }\n\n    // ========== Backup/Restore ==========\n\n    copy(): Tableau {\n        return backupOps.copy.call(this);\n    }\n\n    save(): void {\n        backupOps.save.call(this);\n    }\n\n    restore(): void {\n        backupOps.restore.call(this);\n    }\n\n    // ========== Debug ==========\n\n    log(message: unknown): this {\n        logImpl.call(this, message);\n        return this;\n    }\n\n    // ========== Branch and Cut ==========\n\n    applyCuts(branchingCuts: BranchCut[]): void {\n        this.branchAndCutService.applyCuts(this, branchingCuts);\n    }\n\n    branchAndCut(): void {\n        this.branchAndCutService.branchAndCut(this);\n    }\n\n    // ========== Solution ==========\n\n    solve(): TableauSolution {\n        if ((this.model?.getNumberOfIntegerVariables() ?? 0) > 0) {\n            this.branchAndCut();\n        } else {\n            this.simplex();\n        }\n        this.updateVariableValues();\n        return this.getSolution();\n    }\n\n    getSolution(): TableauSolution {\n        const evaluation = this.model?.isMinimization === true ? this.evaluation : -this.evaluation;\n\n        if ((this.model?.getNumberOfIntegerVariables() ?? 0) > 0) {\n            return new MilpSolution(\n                this,\n                evaluation,\n                this.feasible,\n                this.bounded,\n                this.branchAndCutIterations\n            );\n        } else {\n            return new Solution(this, evaluation, this.feasible, this.bounded);\n        }\n    }\n\n    // ========== Initialization ==========\n\n    setOptionalObjective(priority: number, column: number, cost: number): void {\n        let objectiveForPriority = this.objectivesByPriority[priority];\n        if (objectiveForPriority === undefined) {\n            const nColumns = Math.max(this.width, column + 1);\n            objectiveForPriority = createOptionalObjective(priority, nColumns);\n            this.objectivesByPriority[priority] = objectiveForPriority;\n            this.optionalObjectivePerPriority[priority] = objectiveForPriority;\n            this.optionalObjectives.push(objectiveForPriority);\n            this.optionalObjectives.sort((a, b) => a.priority - b.priority);\n        }\n\n        objectiveForPriority.reducedCosts[column] = cost;\n    }\n\n    initialize(\n        width: number,\n        height: number,\n        variables: Variable[],\n        unrestrictedVars: Record<number, boolean>\n    ): void {\n        this.variables = variables;\n        this.unrestrictedVars = unrestrictedVars;\n\n        this.width = width;\n        this.height = height;\n\n        this.matrix = new Float64Array(width * height);\n\n        this.varIndexByRow = new Array<number>(this.height);\n        this.varIndexByCol = new Array<number>(this.width);\n\n        this.varIndexByRow[0] = -1;\n        this.varIndexByCol[0] = -1;\n\n        this.nVars = width + height - 2;\n        this.rowByVarIndex = new Array<number>(this.nVars);\n        this.colByVarIndex = new Array<number>(this.nVars);\n\n        this.lastElementIndex = this.nVars;\n    }\n\n    _resetMatrix(): void {\n        if (this.model === null) {\n            throw new Error(\"[Tableau._resetMatrix] Model not set\");\n        }\n\n        const matrix = this.matrix;\n        const width = this.width;\n        const variables = this.model.variables;\n        const constraints = this.model.constraints;\n\n        const nVars = variables.length;\n        const nConstraints = constraints.length;\n\n        const coeff = this.model.isMinimization === true ? -1 : 1;\n\n        for (let v = 0; v < nVars; v += 1) {\n            const variable = variables[v];\n            const priority = variable.priority;\n            const cost = coeff * variable.cost;\n            if (priority === 0) {\n                matrix[v + 1] = cost;\n            } else {\n                this.setOptionalObjective(priority, v + 1, cost);\n            }\n\n            const varIndex = variables[v].index;\n            this.rowByVarIndex[varIndex] = -1;\n            this.colByVarIndex[varIndex] = v + 1;\n            this.varIndexByCol[v + 1] = varIndex;\n        }\n\n        let rowIndex = 1;\n        for (let c = 0; c < nConstraints; c += 1) {\n            const constraint = constraints[c];\n\n            const constraintIndex = constraint.index;\n            this.rowByVarIndex[constraintIndex] = rowIndex;\n            this.colByVarIndex[constraintIndex] = -1;\n            this.varIndexByRow[rowIndex] = constraintIndex;\n\n            const terms = constraint.terms;\n            const nTerms = terms.length;\n            const rowOffset = rowIndex * width;\n            rowIndex++;\n\n            if (constraint.isUpperBound) {\n                for (let t = 0; t < nTerms; t += 1) {\n                    const term = terms[t];\n                    const column = this.colByVarIndex[term.variable.index];\n                    matrix[rowOffset + column] = term.coefficient;\n                }\n                matrix[rowOffset] = constraint.rhs;\n            } else {\n                for (let t = 0; t < nTerms; t += 1) {\n                    const term = terms[t];\n                    const column = this.colByVarIndex[term.variable.index];\n                    matrix[rowOffset + column] = -term.coefficient;\n                }\n                matrix[rowOffset] = -constraint.rhs;\n            }\n        }\n    }\n\n    setModel(model: Model): this {\n        this.model = model;\n\n        const width = model.nVariables + 1;\n        const height = model.nConstraints + 1;\n\n        this.initialize(width, height, model.variables, model.unrestrictedVariables);\n        this._resetMatrix();\n        return this;\n    }\n\n    getNewElementIndex(): number {\n        if (this.availableIndexes.length > 0) {\n            return this.availableIndexes.pop() as number;\n        }\n\n        const index = this.lastElementIndex;\n        this.lastElementIndex += 1;\n        return index;\n    }\n\n    density(): number {\n        let density = 0;\n\n        const matrix = this.matrix;\n        const width = this.width;\n        for (let r = 0; r < this.height; r++) {\n            const rowOffset = r * width;\n            for (let c = 0; c < width; c++) {\n                if (matrix[rowOffset + c] !== 0) {\n                    density += 1;\n                }\n            }\n        }\n\n        return density / (this.height * this.width);\n    }\n\n    setEvaluation(): void {\n        const roundingCoeff = Math.round(1 / this.precision);\n        const evaluation = this.matrix[this.costRowIndex * this.width + this.rhsColumn];\n        const roundedEvaluation =\n            Math.round((Number.EPSILON + evaluation) * roundingCoeff) / roundingCoeff;\n\n        this.evaluation = roundedEvaluation;\n        if (this.simplexIters === 0) {\n            this.bestPossibleEval = roundedEvaluation;\n        }\n    }\n}\n","/**\n * @file src/tableau/presolve.ts\n * @description Problem preprocessing for LP/MIP\n *\n * Applies reductions before solving to simplify the problem:\n * - Fix variables with equal bounds\n * - Detect singleton rows (single-variable constraints)\n * - Tighten variable bounds from constraint coefficients\n * - Remove redundant constraints\n *\n * Based on techniques from COIN-OR CBC, CPLEX, and Gurobi.\n */\nimport type Model from \"../model\";\nimport type { Variable, Constraint } from \"../expressions\";\n\nexport interface PresolveResult {\n    fixedVariables: Map<Variable, number>;\n    removedConstraints: Set<Constraint>;\n    tightenedBounds: Map<Variable, { lower?: number; upper?: number }>;\n    isInfeasible: boolean;\n    stats: {\n        variablesFixed: number;\n        constraintsRemoved: number;\n        boundsTightened: number;\n    };\n}\n\n/**\n * Probing: Temporarily fix binary variables and propagate to find implications.\n * If fixing x=0 causes infeasibility, then x must be 1 (and vice versa).\n * If both x=0 and x=1 imply y has same bound, that bound is valid.\n */\nfunction _probe(model: Model, result: PresolveResult, maxProbes: number = 100): boolean {\n    let changed = false;\n    let probeCount = 0;\n\n    // Only probe binary/integer variables\n    for (const variable of model.integerVariables) {\n        if (result.fixedVariables.has(variable)) continue;\n        if (probeCount >= maxProbes) break;\n        probeCount++;\n\n        // Get current bounds\n        const bounds = result.tightenedBounds.get(variable) ?? {};\n        const lower = bounds.lower ?? 0;\n        const upper = bounds.upper ?? 1;\n\n        // Skip if already fixed or not binary-like\n        if (upper - lower < 0.5) continue;\n        if (lower < -0.5 || upper > 1.5) continue; // Not binary\n\n        // Try fixing to 0\n        const impliedAt0 = propagateFixing(model, result, variable, 0);\n        // Try fixing to 1\n        const impliedAt1 = propagateFixing(model, result, variable, 1);\n\n        if (impliedAt0.infeasible && impliedAt1.infeasible) {\n            // Problem is infeasible\n            result.isInfeasible = true;\n            return false;\n        }\n\n        if (impliedAt0.infeasible) {\n            // x must be 1\n            result.fixedVariables.set(variable, 1);\n            result.stats.variablesFixed++;\n            changed = true;\n            continue;\n        }\n\n        if (impliedAt1.infeasible) {\n            // x must be 0\n            result.fixedVariables.set(variable, 0);\n            result.stats.variablesFixed++;\n            changed = true;\n            continue;\n        }\n\n        // Check for common implications\n        for (const [v, val0] of impliedAt0.fixed) {\n            const val1 = impliedAt1.fixed.get(v);\n            if (val1 !== undefined && Math.abs(val0 - val1) < 1e-6) {\n                // Both branches fix v to same value\n                if (!result.fixedVariables.has(v)) {\n                    result.fixedVariables.set(v, val0);\n                    result.stats.variablesFixed++;\n                    changed = true;\n                }\n            }\n        }\n    }\n\n    return changed;\n}\n\n/**\n * Propagate implications of fixing a variable to a value.\n * Returns implied fixings and whether it causes infeasibility.\n */\nfunction propagateFixing(\n    model: Model,\n    result: PresolveResult,\n    fixedVar: Variable,\n    fixedValue: number\n): { fixed: Map<Variable, number>; infeasible: boolean } {\n    const implied: Map<Variable, number> = new Map();\n    implied.set(fixedVar, fixedValue);\n\n    // Simple propagation through constraints\n    for (const constraint of model.constraints) {\n        if (result.removedConstraints.has(constraint)) continue;\n\n        // Calculate contribution of fixed variables\n        let fixedSum = 0;\n        const unfixedTerms: Array<{ variable: Variable; coefficient: number }> = [];\n\n        for (const term of constraint.terms) {\n            const fixed = result.fixedVariables.get(term.variable) ?? implied.get(term.variable);\n            if (fixed !== undefined) {\n                fixedSum += term.coefficient * fixed;\n            } else {\n                unfixedTerms.push({ variable: term.variable, coefficient: term.coefficient });\n            }\n        }\n\n        // If all variables fixed, check feasibility\n        if (unfixedTerms.length === 0) {\n            if (constraint.isUpperBound) {\n                if (fixedSum > constraint.rhs + 1e-6) {\n                    return { fixed: implied, infeasible: true };\n                }\n            } else {\n                if (fixedSum < constraint.rhs - 1e-6) {\n                    return { fixed: implied, infeasible: true };\n                }\n            }\n        }\n\n        // If one variable left, may be able to fix it\n        if (unfixedTerms.length === 1) {\n            const term = unfixedTerms[0];\n            const remaining = constraint.rhs - fixedSum;\n            const bound = remaining / term.coefficient;\n\n            // For binary variables, check if bound forces a value\n            if (term.variable.isInteger) {\n                const varBounds = result.tightenedBounds.get(term.variable) ?? {};\n                const varLower = varBounds.lower ?? 0;\n                const varUpper = varBounds.upper ?? 1;\n\n                if (constraint.isUpperBound && term.coefficient > 0) {\n                    // x <= bound\n                    if (bound < varLower - 1e-6) {\n                        return { fixed: implied, infeasible: true };\n                    }\n                    if (bound < 0.5 && varLower >= -0.5 && varUpper <= 1.5) {\n                        implied.set(term.variable, 0);\n                    }\n                } else if (!constraint.isUpperBound && term.coefficient > 0) {\n                    // x >= bound\n                    if (bound > varUpper + 1e-6) {\n                        return { fixed: implied, infeasible: true };\n                    }\n                    if (bound > 0.5 && varLower >= -0.5 && varUpper <= 1.5) {\n                        implied.set(term.variable, 1);\n                    }\n                }\n            }\n        }\n    }\n\n    return { fixed: implied, infeasible: false };\n}\n\n/**\n * Coefficient tightening for knapsack-like constraints.\n * If a coefficient is larger than the remaining capacity, reduce it.\n */\nfunction tightenCoefficients(model: Model, result: PresolveResult): boolean {\n    let changed = false;\n\n    for (const constraint of model.constraints) {\n        if (result.removedConstraints.has(constraint)) continue;\n        if (!constraint.isUpperBound) continue; // Only for <= constraints\n\n        // Calculate min activity (all variables at their lower bounds)\n        let minActivity = 0;\n        for (const term of constraint.terms) {\n            if (result.fixedVariables.has(term.variable)) {\n                minActivity += term.coefficient * result.fixedVariables.get(term.variable)!;\n            } else {\n                const bounds = result.tightenedBounds.get(term.variable) ?? {};\n                const lower = bounds.lower ?? 0;\n                if (term.coefficient > 0) {\n                    minActivity += term.coefficient * lower;\n                } else {\n                    const upper = bounds.upper ?? Infinity;\n                    minActivity += term.coefficient * upper;\n                }\n            }\n        }\n\n        // For each variable, check if coefficient can be tightened\n        const slack = constraint.rhs - minActivity;\n        if (slack < 0) continue; // Constraint may be infeasible\n\n        for (const term of constraint.terms) {\n            if (result.fixedVariables.has(term.variable)) continue;\n            if (!term.variable.isInteger) continue;\n            if (term.coefficient <= 0) continue;\n\n            const bounds = result.tightenedBounds.get(term.variable) ?? {};\n            const lower = bounds.lower ?? 0;\n            const upper = bounds.upper ?? 1;\n\n            // For binary variables: if coeff > slack, can reduce to slack\n            if (lower >= -0.5 && upper <= 1.5) {\n                const effectiveCoeff = term.coefficient * (upper - lower);\n                if (effectiveCoeff > slack + 1e-6) {\n                    // Could tighten coefficient - but we don't modify the model\n                    // Instead, derive an upper bound on the variable\n                    const impliedUpper = lower + slack / term.coefficient;\n                    if (impliedUpper < upper - 1e-6) {\n                        const current = result.tightenedBounds.get(term.variable) ?? {};\n                        if (!current.upper || impliedUpper < current.upper) {\n                            result.tightenedBounds.set(term.variable, {\n                                ...current,\n                                upper: impliedUpper,\n                            });\n                            result.stats.boundsTightened++;\n                            changed = true;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    return changed;\n}\n\n/**\n * Detect redundant constraints using activity bounds.\n * If max activity <= RHS for <= constraint, it's redundant.\n */\nfunction removeRedundantConstraints(model: Model, result: PresolveResult): boolean {\n    let changed = false;\n\n    for (const constraint of model.constraints) {\n        if (result.removedConstraints.has(constraint)) continue;\n\n        // Calculate activity bounds\n        let minActivity = 0;\n        let maxActivity = 0;\n\n        for (const term of constraint.terms) {\n            const fixed = result.fixedVariables.get(term.variable);\n            if (fixed !== undefined) {\n                minActivity += term.coefficient * fixed;\n                maxActivity += term.coefficient * fixed;\n                continue;\n            }\n\n            const bounds = result.tightenedBounds.get(term.variable) ?? {};\n            const lower = bounds.lower ?? 0;\n            const upper = bounds.upper ?? Infinity;\n\n            if (term.coefficient > 0) {\n                minActivity += term.coefficient * lower;\n                maxActivity += term.coefficient * (upper === Infinity ? 1e10 : upper);\n            } else {\n                minActivity += term.coefficient * (upper === Infinity ? 1e10 : upper);\n                maxActivity += term.coefficient * lower;\n            }\n        }\n\n        // Check redundancy\n        if (constraint.isUpperBound) {\n            // <= constraint is redundant if max activity <= RHS\n            if (maxActivity <= constraint.rhs + 1e-6) {\n                result.removedConstraints.add(constraint);\n                result.stats.constraintsRemoved++;\n                changed = true;\n            }\n            // Infeasible if min activity > RHS\n            if (minActivity > constraint.rhs + 1e-6) {\n                result.isInfeasible = true;\n                return false;\n            }\n        } else {\n            // >= constraint is redundant if min activity >= RHS\n            if (minActivity >= constraint.rhs - 1e-6) {\n                result.removedConstraints.add(constraint);\n                result.stats.constraintsRemoved++;\n                changed = true;\n            }\n            // Infeasible if max activity < RHS\n            if (maxActivity < constraint.rhs - 1e-6) {\n                result.isInfeasible = true;\n                return false;\n            }\n        }\n    }\n\n    return changed;\n}\n\n/**\n * Presolve reductions for Mixed Integer Programs.\n * Based on techniques from COIN-OR CBC, CPLEX, and Gurobi.\n *\n * Key techniques:\n * 1. Fixed variable removal\n * 2. Singleton row detection\n * 3. Bound tightening\n * 4. Redundant constraint removal\n * 5. Probing (for binary variables)\n * 6. Coefficient tightening\n */\nexport function presolve(model: Model): PresolveResult {\n    const result: PresolveResult = {\n        fixedVariables: new Map(),\n        removedConstraints: new Set(),\n        tightenedBounds: new Map(),\n        isInfeasible: false,\n        stats: {\n            variablesFixed: 0,\n            constraintsRemoved: 0,\n            boundsTightened: 0,\n        },\n    };\n\n    // Multiple passes for propagation\n    let changed = true;\n    let passes = 0;\n    const maxPasses = 5;\n\n    while (changed && passes < maxPasses) {\n        changed = false;\n        passes++;\n\n        // Pass 1: Singleton rows - constraints with single variable\n        for (const constraint of model.constraints) {\n            if (result.removedConstraints.has(constraint)) continue;\n\n            const activeTerms = constraint.terms.filter(\n                (t) => !result.fixedVariables.has(t.variable)\n            );\n\n            if (activeTerms.length === 0) {\n                // All variables fixed - check feasibility\n                let lhs = 0;\n                for (const term of constraint.terms) {\n                    const fixedVal = result.fixedVariables.get(term.variable);\n                    if (fixedVal !== undefined) {\n                        lhs += term.coefficient * fixedVal;\n                    }\n                }\n\n                const satisfied = constraint.isUpperBound\n                    ? lhs <= constraint.rhs + 1e-6\n                    : lhs >= constraint.rhs - 1e-6;\n\n                if (!satisfied) {\n                    result.isInfeasible = true;\n                    return result;\n                }\n\n                result.removedConstraints.add(constraint);\n                result.stats.constraintsRemoved++;\n                changed = true;\n            } else if (activeTerms.length === 1) {\n                // Singleton row - can fix or tighten bounds\n                const term = activeTerms[0];\n                const variable = term.variable;\n                const coeff = term.coefficient;\n\n                // Calculate RHS adjustment for fixed variables\n                let rhsAdj = constraint.rhs;\n                for (const t of constraint.terms) {\n                    if (t.variable !== variable) {\n                        const fixedVal = result.fixedVariables.get(t.variable);\n                        if (fixedVal !== undefined) {\n                            rhsAdj -= t.coefficient * fixedVal;\n                        }\n                    }\n                }\n\n                const bound = rhsAdj / coeff;\n\n                if (constraint.isUpperBound) {\n                    // x <= bound (if coeff > 0) or x >= bound (if coeff < 0)\n                    if (coeff > 0) {\n                        // Upper bound\n                        const current = result.tightenedBounds.get(variable);\n                        if (!current?.upper || bound < current.upper) {\n                            result.tightenedBounds.set(variable, {\n                                ...current,\n                                upper: bound,\n                            });\n                            result.stats.boundsTightened++;\n                            changed = true;\n                        }\n                    } else {\n                        // Lower bound (coefficient is negative)\n                        const current = result.tightenedBounds.get(variable);\n                        if (!current?.lower || bound > current.lower) {\n                            result.tightenedBounds.set(variable, {\n                                ...current,\n                                lower: bound,\n                            });\n                            result.stats.boundsTightened++;\n                            changed = true;\n                        }\n                    }\n                }\n\n                result.removedConstraints.add(constraint);\n                result.stats.constraintsRemoved++;\n            }\n        }\n\n        // Pass 2: Check for fixed variables from bounds\n        for (const [variable, bounds] of result.tightenedBounds) {\n            if (result.fixedVariables.has(variable)) continue;\n\n            if (bounds.lower !== undefined && bounds.upper !== undefined) {\n                if (bounds.lower > bounds.upper + 1e-6) {\n                    result.isInfeasible = true;\n                    return result;\n                }\n\n                if (Math.abs(bounds.lower - bounds.upper) < 1e-6) {\n                    // Variable is fixed\n                    let fixedValue = bounds.lower;\n\n                    // If integer, round to nearest integer\n                    if (variable.isInteger) {\n                        fixedValue = Math.round(fixedValue);\n                    }\n\n                    result.fixedVariables.set(variable, fixedValue);\n                    result.stats.variablesFixed++;\n                    changed = true;\n                }\n            }\n\n            // Binary variables with lower bound >= 0.5 are fixed to 1\n            if (variable.isInteger && bounds.lower !== undefined && bounds.lower >= 0.5) {\n                const upperBound = bounds.upper ?? Infinity;\n                if (upperBound <= 1.5) {\n                    result.fixedVariables.set(variable, 1);\n                    result.stats.variablesFixed++;\n                    changed = true;\n                }\n            }\n\n            // Binary variables with upper bound <= 0.5 are fixed to 0\n            if (variable.isInteger && bounds.upper !== undefined && bounds.upper <= 0.5) {\n                const lowerBound = bounds.lower ?? 0;\n                if (lowerBound >= -0.5) {\n                    result.fixedVariables.set(variable, 0);\n                    result.stats.variablesFixed++;\n                    changed = true;\n                }\n            }\n        }\n\n        // Pass 3: Remove redundant constraints using activity bounds\n        if (removeRedundantConstraints(model, result)) {\n            changed = true;\n        }\n        if (result.isInfeasible) return result;\n\n        // Pass 4: Coefficient tightening for knapsack-like constraints\n        if (tightenCoefficients(model, result)) {\n            changed = true;\n        }\n\n        // Pass 5: Probing for binary variables (disabled - needs more work on equality constraints)\n        // TODO: Fix probing to handle equality constraints correctly\n        // if (passes <= 2 && model.integerVariables.length > 0) {\n        //     const probeLimit = Math.min(50, model.integerVariables.length);\n        //     if (probe(model, result, probeLimit)) {\n        //         changed = true;\n        //     }\n        //     if (result.isInfeasible) return result;\n        // }\n    }\n\n    return result;\n}\n","/**\n * @file src/model.ts\n * @description Model class for LP/MIP problem representation\n *\n * Provides the programmatic API for building optimization problems:\n * - Add variables with costs and integer constraints\n * - Define constraints (<=, >=, =) with coefficients\n * - Load problems from JSON model definitions\n * - Dynamic model modification after initialization\n *\n * The Model converts high-level problem definitions into the internal\n * Tableau representation used by the simplex algorithm.\n */\nimport Tableau from \"./tableau/tableau\";\nimport { Constraint, Equality, IntegerVariable, Variable } from \"./expressions\";\nimport type { Priority } from \"./expressions\";\nimport type { BranchAndCutService } from \"./tableau/branch-and-cut\";\nimport type { ConstraintBound, Model as JsonModel } from \"./types/solver\";\nimport type { TableauSolution, TableauSolutionSet } from \"./tableau\";\nimport { presolve, type PresolveResult } from \"./tableau/presolve\";\n\ntype ConstraintDefinition = ConstraintBound | (ConstraintBound & { equal?: number });\n\nclass Model {\n    tableau: Tableau;\n    name?: string;\n    variables: Variable[];\n    integerVariables: IntegerVariable[];\n    unrestrictedVariables: Record<number, boolean>;\n    constraints: Constraint[];\n    nConstraints: number;\n    nVariables: number;\n    isMinimization: boolean;\n    tableauInitialized: boolean;\n    relaxationIndex: number;\n    useMIRCuts: boolean;\n    checkForCycles: boolean;\n    messages: unknown[];\n    tolerance?: number;\n    timeout?: number;\n    keep_solutions?: boolean;\n    solutions?: TableauSolutionSet[];\n    availableIndexes: number[];\n    lastElementIndex: number;\n    usePresolve: boolean;\n    presolveResult: PresolveResult | null;\n\n    constructor(precision?: number, name?: string, branchAndCutService?: BranchAndCutService) {\n        this.tableau = new Tableau(precision, branchAndCutService);\n\n        this.name = name;\n\n        this.variables = [];\n\n        this.integerVariables = [];\n\n        this.unrestrictedVariables = {};\n\n        this.constraints = [];\n\n        this.nConstraints = 0;\n\n        this.nVariables = 0;\n\n        this.isMinimization = true;\n\n        this.tableauInitialized = false;\n\n        this.relaxationIndex = 1;\n\n        this.useMIRCuts = false;\n\n        this.checkForCycles = true;\n\n        // Collect diagnostic messages for debugging without console output\n        this.messages = [];\n\n        this.availableIndexes = [];\n        this.lastElementIndex = 0;\n        this.usePresolve = true;\n        this.presolveResult = null;\n    }\n\n    minimize(): this {\n        this.isMinimization = true;\n        return this;\n    }\n\n    maximize(): this {\n        this.isMinimization = false;\n        return this;\n    }\n\n    _getNewElementIndex(): number {\n        if (this.availableIndexes.length > 0) {\n            return this.availableIndexes.pop() as number;\n        }\n\n        const index = this.lastElementIndex;\n        this.lastElementIndex += 1;\n        return index;\n    }\n\n    _addConstraint(constraint: Constraint): void {\n        const slackVariable = constraint.slack;\n        this.tableau.variablesPerIndex[slackVariable.index] = slackVariable;\n        this.constraints.push(constraint);\n        this.nConstraints += 1;\n        if (this.tableauInitialized === true) {\n            this.tableau.addConstraint(constraint);\n        }\n    }\n\n    smallerThan(rhs: number): Constraint {\n        const constraint = new Constraint(rhs, true, this.tableau.getNewElementIndex(), this);\n        this._addConstraint(constraint);\n        return constraint;\n    }\n\n    greaterThan(rhs: number): Constraint {\n        const constraint = new Constraint(rhs, false, this.tableau.getNewElementIndex(), this);\n        this._addConstraint(constraint);\n        return constraint;\n    }\n\n    equal(rhs: number): Equality {\n        const constraintUpper = new Constraint(rhs, true, this.tableau.getNewElementIndex(), this);\n        this._addConstraint(constraintUpper);\n\n        const constraintLower = new Constraint(rhs, false, this.tableau.getNewElementIndex(), this);\n        this._addConstraint(constraintLower);\n\n        return new Equality(constraintUpper, constraintLower);\n    }\n\n    addVariable(\n        cost?: number | null,\n        id?: string | null,\n        isInteger?: boolean,\n        isUnrestricted?: boolean,\n        priority?: Priority | null\n    ): Variable {\n        if (typeof priority === \"string\") {\n            switch (priority) {\n                case \"required\":\n                    priority = 0;\n                    break;\n                case \"strong\":\n                    priority = 1;\n                    break;\n                case \"medium\":\n                    priority = 2;\n                    break;\n                case \"weak\":\n                    priority = 3;\n                    break;\n                default:\n                    priority = 0;\n                    break;\n            }\n        }\n\n        const varIndex = this.tableau.getNewElementIndex();\n        const identifier = id ?? \"v\" + varIndex;\n        const normalizedCost = cost ?? 0;\n        const normalizedPriority = priority ?? 0;\n\n        let variable: Variable;\n        if (isInteger) {\n            const integerVariable = new IntegerVariable(\n                identifier,\n                normalizedCost,\n                varIndex,\n                normalizedPriority\n            );\n            this.integerVariables.push(integerVariable);\n            variable = integerVariable;\n        } else {\n            variable = new Variable(identifier, normalizedCost, varIndex, normalizedPriority);\n        }\n\n        this.variables.push(variable);\n        this.tableau.variablesPerIndex[varIndex] = variable;\n\n        if (isUnrestricted) {\n            this.unrestrictedVariables[varIndex] = true;\n        }\n\n        this.nVariables += 1;\n\n        if (this.tableauInitialized === true) {\n            this.tableau.addVariable(variable);\n        }\n\n        return variable;\n    }\n\n    _removeConstraint(constraint: Constraint): void {\n        const idx = this.constraints.indexOf(constraint);\n        if (idx === -1) {\n            // eslint-disable-next-line no-console\n            console.warn(\"[Model.removeConstraint] Constraint not present in model\");\n            return;\n        }\n\n        this.constraints.splice(idx, 1);\n        this.nConstraints -= 1;\n\n        if (this.tableauInitialized === true) {\n            this.tableau.removeConstraint(constraint);\n        }\n\n        if (constraint.relaxation) {\n            this.removeVariable(constraint.relaxation);\n        }\n    }\n\n    //-------------------------------------------------------------------\n    // For dynamic model modification\n    //-------------------------------------------------------------------\n    removeConstraint(constraint: Constraint | Equality): this {\n        if ((constraint as Equality).isEquality) {\n            const equalityConstraint = constraint as Equality;\n            this._removeConstraint(equalityConstraint.upperBound);\n            this._removeConstraint(equalityConstraint.lowerBound);\n        } else {\n            this._removeConstraint(constraint as Constraint);\n        }\n\n        return this;\n    }\n\n    removeVariable(variable: Variable): this | void {\n        const idx = this.variables.indexOf(variable);\n        if (idx === -1) {\n            // eslint-disable-next-line no-console\n            console.warn(\"[Model.removeVariable] Variable not present in model\");\n            return;\n        }\n        this.variables.splice(idx, 1);\n\n        if (this.tableauInitialized === true) {\n            this.tableau.removeVariable(variable);\n        }\n\n        return this;\n    }\n\n    updateRightHandSide(constraint: Constraint, difference: number): this {\n        if (this.tableauInitialized === true) {\n            this.tableau.updateRightHandSide(constraint, difference);\n        }\n        return this;\n    }\n\n    updateConstraintCoefficient(\n        constraint: Constraint,\n        variable: Variable,\n        difference: number\n    ): this {\n        if (this.tableauInitialized === true) {\n            this.tableau.updateConstraintCoefficient(constraint, variable, difference);\n        }\n        return this;\n    }\n\n    setCost(cost: number, variable: Variable): this {\n        let difference = cost - variable.cost;\n        if (this.isMinimization === false) {\n            difference = -difference;\n        }\n\n        variable.cost = cost;\n        this.tableau.updateCost(variable, difference);\n        return this;\n    }\n\n    //-------------------------------------------------------------------\n    //-------------------------------------------------------------------\n    loadJson(jsonModel: JsonModel): this {\n        this.isMinimization = jsonModel.opType !== \"max\";\n\n        const variables = jsonModel.variables;\n        const constraints = jsonModel.constraints as Record<string, ConstraintDefinition | string>;\n\n        const constraintsMin: Record<string, Constraint> = {};\n        const constraintsMax: Record<string, Constraint> = {};\n\n        // Instantiating constraints\n        const constraintIds = Object.keys(constraints);\n        const nConstraintIds = constraintIds.length;\n\n        for (let c = 0; c < nConstraintIds; c += 1) {\n            const constraintId = constraintIds[c];\n            const constraint = constraints[constraintId] as ConstraintDefinition;\n            const equal = (constraint as ConstraintBound).equal;\n\n            const weight = (constraint as ConstraintBound).weight;\n            const priority = (constraint as ConstraintBound).priority as Priority | undefined;\n            const relaxed = weight !== undefined || priority !== undefined;\n\n            let lowerBound: Constraint | undefined;\n            let upperBound: Constraint | undefined;\n            if (equal === undefined) {\n                const min = (constraint as ConstraintBound).min;\n                if (min !== undefined) {\n                    lowerBound = this.greaterThan(min);\n                    constraintsMin[constraintId] = lowerBound;\n                    if (relaxed) {\n                        lowerBound.relax(weight, priority);\n                    }\n                }\n\n                const max = (constraint as ConstraintBound).max;\n                if (max !== undefined) {\n                    upperBound = this.smallerThan(max);\n                    constraintsMax[constraintId] = upperBound;\n                    if (relaxed) {\n                        upperBound.relax(weight, priority);\n                    }\n                }\n            } else {\n                lowerBound = this.greaterThan(equal);\n                constraintsMin[constraintId] = lowerBound;\n\n                upperBound = this.smallerThan(equal);\n                constraintsMax[constraintId] = upperBound;\n\n                const equality = new Equality(lowerBound, upperBound);\n                if (relaxed) {\n                    equality.relax(weight, priority);\n                }\n            }\n        }\n\n        const variableIds = Object.keys(variables);\n        const nVariables = variableIds.length;\n\n        // Parse solver options\n        this.tolerance = jsonModel.tolerance || 0;\n\n        if (jsonModel.timeout) {\n            this.timeout = jsonModel.timeout;\n        }\n\n        // Options object takes precedence over top-level properties\n        if (jsonModel.options) {\n            if (jsonModel.options.timeout) {\n                this.timeout = jsonModel.options.timeout;\n            }\n\n            if (this.tolerance === 0) {\n                this.tolerance = jsonModel.options.tolerance || 0;\n            }\n\n            if (jsonModel.options.useMIRCuts) {\n                this.useMIRCuts = jsonModel.options.useMIRCuts;\n            }\n\n            // Cycle detection defaults to true\n            if (typeof jsonModel.options.exitOnCycles === \"undefined\") {\n                this.checkForCycles = true;\n            } else {\n                this.checkForCycles = jsonModel.options.exitOnCycles;\n            }\n\n            if (jsonModel.options.keep_solutions) {\n                this.keep_solutions = jsonModel.options.keep_solutions;\n            } else {\n                this.keep_solutions = false;\n            }\n\n            if (jsonModel.options.presolve !== undefined) {\n                this.usePresolve = jsonModel.options.presolve;\n            }\n        }\n\n        const integerVarIds = jsonModel.ints || {};\n        const binaryVarIds = jsonModel.binaries || {};\n        const unrestrictedVarIds = jsonModel.unrestricted || {};\n\n        // Instantiating variables and constraint terms\n        const objectiveName = jsonModel.optimize as string;\n\n        // Check if objectiveName exists as a coefficient key in any variable.\n        // If not, and it matches a variable name, the user wants to optimize\n        // that variable directly (implicit cost of 1).\n        const objectiveIsAttribute = variableIds.some(\n            (id) => objectiveName in (variables[id] as Record<string, number>)\n        );\n        const objectiveIsVariable = !objectiveIsAttribute && variableIds.includes(objectiveName);\n\n        for (let v = 0; v < nVariables; v += 1) {\n            // Creation of the variables\n            const variableId = variableIds[v];\n            const variableConstraints = variables[variableId] as Record<string, number>;\n            const cost = objectiveIsVariable\n                ? variableId === objectiveName\n                    ? 1\n                    : 0\n                : variableConstraints[objectiveName] || 0;\n            const isBinary = !!binaryVarIds[variableId];\n            const isInteger = !!integerVarIds[variableId] || isBinary;\n            const isUnrestricted = !!unrestrictedVarIds[variableId];\n            const variable = this.addVariable(cost, variableId, isInteger, isUnrestricted);\n\n            if (isBinary) {\n                // Creating an upperbound constraint for this variable\n                this.smallerThan(1).addTerm(1, variable);\n            }\n\n            const constraintNames = Object.keys(variableConstraints);\n            for (let c = 0; c < constraintNames.length; c += 1) {\n                const constraintName = constraintNames[c];\n                if (constraintName === objectiveName) {\n                    continue;\n                }\n\n                const coefficient = variableConstraints[constraintName];\n\n                const constraintMin = constraintsMin[constraintName];\n                if (constraintMin !== undefined) {\n                    constraintMin.addTerm(coefficient, variable);\n                }\n\n                const constraintMax = constraintsMax[constraintName];\n                if (constraintMax !== undefined) {\n                    constraintMax.addTerm(coefficient, variable);\n                }\n            }\n        }\n\n        return this;\n    }\n\n    //-------------------------------------------------------------------\n    //-------------------------------------------------------------------\n    getNumberOfIntegerVariables(): number {\n        return this.integerVariables.length;\n    }\n\n    solve(): TableauSolution {\n        // Apply presolve to reduce problem size\n        if (this.usePresolve && this.presolveResult === null) {\n            this.presolveResult = presolve(this);\n\n            if (this.presolveResult.isInfeasible) {\n                // Problem is infeasible - return early\n                this.tableau.feasible = false;\n                return this.tableau.getSolution();\n            }\n\n            // Apply fixed variables to constraints\n            this.applyPresolveReductions(this.presolveResult);\n        }\n\n        // Setting tableau if not done\n        if (this.tableauInitialized === false) {\n            this.tableau.setModel(this);\n            this.tableauInitialized = true;\n        }\n\n        return this.tableau.solve();\n    }\n\n    /**\n     * Apply presolve reductions to the model.\n     * Sets fixed variable values and removes redundant constraints.\n     */\n    private applyPresolveReductions(result: PresolveResult): void {\n        // Set fixed variable values\n        for (const [variable, value] of result.fixedVariables) {\n            variable.value = value;\n            // Zero out the cost since variable is fixed\n            variable.cost = 0;\n        }\n\n        // Note: We don't actually remove constraints/variables from the model\n        // as that would require complex bookkeeping. Instead, the presolve\n        // information is used to detect early infeasibility and fix variable values.\n        // A more aggressive presolve would rebuild the model without fixed variables.\n    }\n\n    isFeasible(): boolean {\n        return this.tableau.feasible;\n    }\n\n    save(): void {\n        this.tableau.save();\n    }\n\n    restore(): void {\n        this.tableau.restore();\n    }\n\n    activateMIRCuts(useMIRCuts: boolean): void {\n        this.useMIRCuts = useMIRCuts;\n    }\n\n    debug(debugCheckForCycles: boolean): void {\n        this.checkForCycles = debugCheckForCycles;\n    }\n\n    log(message: unknown): Tableau {\n        return this.tableau.log(message);\n    }\n}\n\nexport default Model;\n","/**\n * @file src/validation.ts\n * @description Model validation and cleanup utilities\n *\n * Provides pre-solve validation functions that ensure models are properly\n * formatted before solving. All exported functions accept a model and return\n * a valid model (or throw an error if validation fails).\n */\n/* eslint-disable no-console */\nimport type { Model as ModelDefinition } from \"./types/solver\";\n\n/**\n * Common typos and their corrections for model properties.\n */\nconst PROPERTY_TYPOS: Record<string, string> = {\n    optype: \"opType\",\n    OpType: \"opType\",\n    op_type: \"opType\",\n    type: \"opType\",\n    optimise: \"optimize\",\n    Optimize: \"optimize\",\n    objective: \"optimize\",\n    constraint: \"constraints\",\n    Constraints: \"constraints\",\n    variable: \"variables\",\n    Variables: \"variables\",\n    vars: \"variables\",\n    int: \"ints\",\n    integers: \"ints\",\n    Ints: \"ints\",\n    binary: \"binaries\",\n    Binaries: \"binaries\",\n};\n\n/**\n * Common typos for constraint properties.\n */\nconst CONSTRAINT_TYPOS: Record<string, string> = {\n    minimum: \"min\",\n    maximum: \"max\",\n    Min: \"min\",\n    Max: \"max\",\n    eq: \"equal\",\n    equals: \"equal\",\n    Equal: \"equal\",\n};\n\n/**\n * Checks for common typos in model properties and logs warnings.\n *\n * This helps users identify issues like using 'optype' instead of 'opType'\n * which would cause the solver to silently use default behavior.\n */\nexport function WarnOnTypos(model: ModelDefinition): ModelDefinition {\n    const modelKeys = Object.keys(model) as Array<keyof typeof model>;\n\n    // Check top-level property typos\n    for (const key of modelKeys) {\n        const correction = PROPERTY_TYPOS[key as string];\n        if (correction) {\n            console.warn(\n                `[jsLPSolver] Warning: Model has '${key}' but expected '${correction}'. ` +\n                    `This may cause unexpected behavior.`\n            );\n        }\n    }\n\n    // Check for missing required properties\n    if (!model.optimize && !modelKeys.some((k) => PROPERTY_TYPOS[k as string] === \"optimize\")) {\n        console.warn(\n            `[jsLPSolver] Warning: Model is missing 'optimize' property. ` +\n                `The solver needs to know which attribute to optimize.`\n        );\n    }\n\n    if (!model.opType && !modelKeys.some((k) => PROPERTY_TYPOS[k as string] === \"opType\")) {\n        console.warn(\n            `[jsLPSolver] Warning: Model is missing 'opType' property. ` +\n                `Defaulting to 'max'. Use 'opType: \"max\"' or 'opType: \"min\"' to be explicit.`\n        );\n    }\n\n    // Check constraint property typos\n    if (model.constraints) {\n        for (const [constraintName, constraint] of Object.entries(model.constraints)) {\n            if (typeof constraint === \"object\" && constraint !== null) {\n                for (const prop of Object.keys(constraint)) {\n                    const correction = CONSTRAINT_TYPOS[prop];\n                    if (correction) {\n                        console.warn(\n                            `[jsLPSolver] Warning: Constraint '${constraintName}' has '${prop}' ` +\n                                `but expected '${correction}'.`\n                        );\n                    }\n                }\n            }\n        }\n    }\n\n    return model;\n}\n\n/**\n * Renames objective attributes that conflict with constraint names.\n *\n * If the optimize attribute is also used as a constraint name, this function\n * creates a new random attribute name to avoid the collision.\n */\nexport function CleanObjectiveAttributes(model: ModelDefinition): ModelDefinition {\n    let fakeAttr: string | number | undefined;\n    let x: string;\n    let z: string;\n\n    if (typeof model.optimize === \"string\") {\n        if (model.constraints[model.optimize]) {\n            // Conflict: objective name matches a constraint name\n            fakeAttr = Math.random();\n\n            for (x in model.variables) {\n                if (model.variables[x][model.optimize]) {\n                    model.variables[x][fakeAttr] = model.variables[x][model.optimize];\n                }\n            }\n\n            model.constraints[fakeAttr] = model.constraints[model.optimize];\n            delete model.constraints[model.optimize];\n            return model;\n        }\n        return model;\n    } else {\n        // Multi-objective case\n        for (z in model.optimize) {\n            if (model.constraints[z]) {\n                if (model.constraints[z] === \"equal\") {\n                    // Can't optimize an equality-constrained attribute\n                    delete model.optimize[z];\n                } else {\n                    fakeAttr = Math.random();\n\n                    for (x in model.variables) {\n                        if (model.variables[x][z]) {\n                            model.variables[x][fakeAttr] = model.variables[x][z];\n                        }\n                    }\n\n                    model.constraints[fakeAttr] = model.constraints[z];\n                    delete model.constraints[z];\n                }\n            }\n        }\n        return model;\n    }\n}\n","/**\n * @file src/external/lpsolve/reformat.js\n * @description LP format conversion utilities\n *\n * Converts between jsLPSolver's JSON model format and the standard\n * LP file format used by lp_solve and other solvers:\n * - to_JSON: Parse LP text format into JSON model\n * - to_lpsolve: Convert JSON model to LP text format\n *\n * Supports objectives, constraints, integer/binary variables.\n */\n\n/*global describe*/\n/*global require*/\n/*global module*/\n/*global it*/\n/*global console*/\n/*global process*/\n/*jshint -W083 */\nfunction to_JSON(input) {\n    var rxo = {\n            /* jshint ignore:start */\n            is_blank: /^\\W{0,}$/,\n            is_objective: /(max|min)(imize){0,}\\:/i,\n            is_int: /^(?!\\/\\*)\\W{0,}int/i,\n            is_bin: /^(?!\\/\\*)\\W{0,}bin/i,\n            is_constraint: /(\\>|\\<){0,}\\=/i,\n            is_unrestricted: /^\\S{0,}unrestricted/i,\n            parse_lhs: /(\\-|\\+){0,1}\\s{0,1}\\d{0,}\\.{0,}\\d{0,}\\s{0,}[A-Za-z]\\S{0,}/gi,\n            parse_rhs: /(\\-|\\+){0,1}\\d{1,}\\.{0,}\\d{0,}\\W{0,}\\;{0,1}$/i,\n            parse_dir: /(\\>|\\<){0,}\\=/gi,\n            parse_int: /[^\\s|^\\,]+/gi,\n            parse_bin: /[^\\s|^\\,]+/gi,\n            get_num: /(\\-|\\+){0,1}(\\W|^)\\d+\\.{0,1}\\d{0,}/g,\n            get_word: /[A-Za-z].*/,\n            /* jshint ignore:end */\n        },\n        model = {\n            opType: \"\",\n            optimize: \"_obj\",\n            constraints: {},\n            variables: {},\n        },\n        constraints = {\n            \">=\": \"min\",\n            \"<=\": \"max\",\n            \"=\": \"equal\",\n        },\n        tmp = \"\",\n        tst = 0,\n        ary = null,\n        hldr = \"\",\n        hldr2 = \"\",\n        constraint = \"\",\n        rhs = 0;\n\n    // Handle input if its coming\n    // to us as a hard string\n    // instead of as an array of\n    // strings\n    if (typeof input === \"string\") {\n        input = input.split(\"\\n\");\n    }\n\n    // Start iterating over the rows\n    // to see what all we have\n    for (var i = 0; i < input.length; i++) {\n        constraint = \"__\" + i;\n\n        // Get the string we're working with\n        tmp = input[i];\n\n        // Set the test = 0\n        tst = 0;\n\n        // Reset the array\n        ary = null;\n\n        // Test to see if we're the objective\n        if (rxo.is_objective.test(tmp)) {\n            // Set up in model the opType\n            model.opType = tmp.match(/(max|min)/gi)[0];\n\n            // Pull apart lhs\n            ary = tmp\n                .match(rxo.parse_lhs)\n                .map(function (d) {\n                    return d.replace(/\\s+/, \"\");\n                })\n                .slice(1);\n\n            // *** STEP 1 *** ///\n            // Get the variables out\n            ary.forEach(function (d) {\n                // Get the number if its there\n                hldr = d.match(rxo.get_num);\n\n                // If it isn't a number, it might\n                // be a standalone variable\n                if (hldr === null) {\n                    if (d.substr(0, 1) === \"-\") {\n                        hldr = -1;\n                    } else {\n                        hldr = 1;\n                    }\n                } else {\n                    hldr = hldr[0];\n                }\n\n                hldr = parseFloat(hldr);\n\n                // Get the variable type\n                hldr2 = d.match(rxo.get_word)[0].replace(/\\;$/, \"\");\n\n                // Make sure the variable is in the model\n                model.variables[hldr2] = model.variables[hldr2] || {};\n                model.variables[hldr2]._obj = hldr;\n            });\n            ////////////////////////////////////\n        } else if (rxo.is_int.test(tmp)) {\n            // Get the array of ints\n            ary = tmp.match(rxo.parse_int).slice(1);\n\n            // Since we have an int, our model should too\n            model.ints = model.ints || {};\n\n            ary.forEach(function (d) {\n                d = d.replace(\";\", \"\");\n                model.ints[d] = 1;\n            });\n            ////////////////////////////////////\n        } else if (rxo.is_bin.test(tmp)) {\n            // Get the array of bins\n            ary = tmp.match(rxo.parse_bin).slice(1);\n\n            // Since we have an binary, our model should too\n            model.binaries = model.binaries || {};\n\n            ary.forEach(function (d) {\n                d = d.replace(\";\", \"\");\n                model.binaries[d] = 1;\n            });\n            ////////////////////////////////////\n        } else if (rxo.is_constraint.test(tmp)) {\n            var separatorIndex = tmp.indexOf(\":\");\n            var constraintExpression = separatorIndex === -1 ? tmp : tmp.slice(separatorIndex + 1);\n\n            // Pull apart lhs\n            ary = constraintExpression.match(rxo.parse_lhs).map(function (d) {\n                return d.replace(/\\s+/, \"\");\n            });\n\n            // *** STEP 1 *** ///\n            // Get the variables out\n            ary.forEach(function (d) {\n                // Get the number if its there\n                hldr = d.match(rxo.get_num);\n\n                if (hldr === null) {\n                    if (d.substr(0, 1) === \"-\") {\n                        hldr = -1;\n                    } else {\n                        hldr = 1;\n                    }\n                } else {\n                    hldr = hldr[0];\n                }\n\n                hldr = parseFloat(hldr);\n\n                // Get the variable name\n                hldr2 = d.match(rxo.get_word)[0];\n\n                // Make sure the variable is in the model\n                model.variables[hldr2] = model.variables[hldr2] || {};\n                model.variables[hldr2][constraint] = hldr;\n            });\n\n            // *** STEP 2 *** ///\n            // Get the RHS out\n            rhs = parseFloat(tmp.match(rxo.parse_rhs)[0]);\n\n            // *** STEP 3 *** ///\n            // Get the Constrainer out\n            tmp = constraints[tmp.match(rxo.parse_dir)[0]];\n            model.constraints[constraint] = model.constraints[constraint] || {};\n            model.constraints[constraint][tmp] = rhs;\n            ////////////////////////////////////\n        } else if (rxo.is_unrestricted.test(tmp)) {\n            // Get the array of unrestricted\n            ary = tmp.match(rxo.parse_int).slice(1);\n\n            // Since we have an int, our model should too\n            model.unrestricted = model.unrestricted || {};\n\n            ary.forEach(function (d) {\n                d = d.replace(\";\", \"\");\n                model.unrestricted[d] = 1;\n            });\n        }\n    }\n    return model;\n}\n\n/*************************************************************\n * Method: from_JSON\n * Scope: Public:\n * Agruments: model: The model we want solver to operate on\n * Purpose: Convert a friendly JSON model into a model for a\n *          real solving library...in this case\n *          lp_solver\n **************************************************************/\nfunction from_JSON(model) {\n    // Make sure we at least have a model\n    if (!model) {\n        throw new Error(\"Solver requires a model to operate on\");\n    }\n\n    var output = \"\",\n        ary = [],\n        norm = 1,\n        lookup = {\n            max: \"<=\",\n            min: \">=\",\n            equal: \"=\",\n        },\n        rxClean = new RegExp(\"[^A-Za-z0-9_\\[\\{\\}\\/\\.\\&\\#\\$\\%\\~\\'\\@\\^]\", \"gi\");\n\n    // Build the objective statement\n\n    if (model.opType) {\n        output += model.opType + \":\";\n\n        // Iterate over the variables\n        for (var x in model.variables) {\n            // Give each variable a self of 1 unless\n            // it exists already\n            model.variables[x][x] = model.variables[x][x] ? model.variables[x][x] : 1;\n\n            // Does our objective exist here?\n            if (model.variables[x][model.optimize]) {\n                output += \" \" + model.variables[x][model.optimize] + \" \" + x.replace(rxClean, \"_\");\n            }\n        }\n    } else {\n        output += \"max:\";\n    }\n\n    // Add some closure to our line thing\n    output += \";\\n\\n\";\n\n    // And now... to iterate over the constraints\n    for (var xx in model.constraints) {\n        for (var y in model.constraints[xx]) {\n            if (typeof lookup[y] !== \"undefined\") {\n                for (var z in model.variables) {\n                    // Does our Constraint exist here?\n                    if (typeof model.variables[z][xx] !== \"undefined\") {\n                        output += \" \" + model.variables[z][xx] + \" \" + z.replace(rxClean, \"_\");\n                    }\n                }\n                // Add the constraint type and value...\n\n                output += \" \" + lookup[y] + \" \" + model.constraints[xx][y];\n                output += \";\\n\";\n            }\n        }\n    }\n\n    // Are there any ints?\n    if (model.ints) {\n        output += \"\\n\\n\";\n        for (var xxx in model.ints) {\n            output += \"int \" + xxx.replace(rxClean, \"_\") + \";\\n\";\n        }\n    }\n\n    // Are there any unrestricted?\n    if (model.unrestricted) {\n        output += \"\\n\\n\";\n        for (var xxxx in model.unrestricted) {\n            output += \"unrestricted \" + xxxx.replace(rxClean, \"_\") + \";\\n\";\n        }\n    }\n\n    // And kick the string back\n    return output;\n}\n\nmodule.exports = function (model) {\n    // If the user is giving us an array\n    // or a string, convert it to a JSON Model\n    // otherwise, spit it out as a string\n    if (model.length) {\n        return to_JSON(model);\n    } else {\n        return from_JSON(model);\n    }\n};\n","/**\n * @file src/external/lpsolve/main.js\n * @description lp_solve CLI integration\n *\n * Wraps the lp_solve command-line solver for use from JavaScript:\n * - Converts JSON model to lp_solve's LP format\n * - Spawns lp_solve process with user-specified options\n * - Parses output back to JSON result format\n *\n * Requires lp_solve binary to be installed and path provided in model.external.binPath.\n * @see http://lpsolve.sourceforge.net/5.5/lp_solve.htm\n */\n\n/*global describe*/\n/*global require*/\n/*global it*/\n/*global console*/\n/*global process*/\n/*global exports*/\n/*global Promise*/\n\nexports.reformat = require(\"./reformat.js\");\n\nfunction clean_data(data) {\n    //\n    // Clean Up\n    // And Reformatting...\n    //\n    data = data.replace(\"\\\\r\\\\n\", \"\\r\\n\");\n\n    data = data.split(\"\\r\\n\");\n    data = data\n        .filter(function (x) {\n            var rx;\n\n            //\n            // Test 1\n            rx = new RegExp(\" 0$\", \"gi\");\n            if (rx.test(x) === true) {\n                return false;\n            }\n\n            //\n            // Test 2\n            rx = new RegExp(\"\\\\d$\", \"gi\");\n            if (rx.test(x) === false) {\n                return false;\n            }\n\n            return true;\n        })\n        .map(function (x) {\n            return x.split(/\\:{0,1} +(?=\\d)/);\n        })\n        .reduce(function (o, k, i) {\n            o[k[0]] = k[1];\n            return o;\n        }, {});\n\n    return data;\n}\n\nexports.solve = function (model) {\n    //\n    return new Promise(function (res, rej) {\n        //\n        // Exit if we're in the browser...\n        //\n        if (typeof window !== \"undefined\") {\n            rej(\"Function Not Available in Browser\");\n        }\n        //\n        // Convert JSON model to lp_solve format\n        //\n        var data = require(\"./reformat.js\")(model);\n\n        if (!model.external) {\n            rej(\n                \"Data for this function must be contained in the 'external' attribute. Not seeing anything there.\"\n            );\n        }\n\n        //\n        // In the args, they *SHALL* have provided an executable\n        // path to the solver they're piping the data into\n        //\n        if (!model.external.binPath) {\n            rej(\"No Executable | Binary path provided in arguments as 'binPath'\");\n        }\n\n        //\n        // They also need to provide an arg_array\n        //\n        if (!model.external.args) {\n            rej(\"No arguments array for cli | bash provided on 'args' attribute\");\n        }\n\n        //\n        // They also need a tempName so we know where to store\n        // the temp file we're creating...\n        //\n        if (!model.external.tempName) {\n            rej(\n                \"No 'tempName' given. This is necessary to produce a staging file for the solver to operate on\"\n            );\n        }\n\n        //\n        // To my knowledge, in Windows, you cannot directly pipe text into\n        // an exe...\n        //\n        // Thus, our process looks like this...\n        //\n        // 1.) Convert a model to something an external solver can use\n        // 2.) Save the results from step 1 as a temp-text file\n        // 3.) Pump the results into an exe | whatever-linux-uses\n        // 4.)\n        //\n        //\n\n        var fs = require(\"fs\");\n\n        fs.writeFile(model.external.tempName, data, function (fe, fd) {\n            if (fe) {\n                rej(fe);\n            } else {\n                //\n                // So it looks like we wrote to a file and closed it.\n                // Neat.\n                //\n                // Now we need to execute our CLI...\n                var exec = require(\"child_process\").execFile;\n\n                //\n                // Put the temp file name in the args array...\n                //\n                model.external.args.push(model.external.tempName);\n\n                exec(model.external.binPath, model.external.args, function (e, data) {\n                    if (e) {\n                        if (e.code === 1) {\n                            res(clean_data(data));\n                        } else {\n                            var codes = {\n                                \"-2\": \"Out of Memory\",\n                                1: \"SUBOPTIMAL\",\n                                2: \"INFEASIBLE\",\n                                3: \"UNBOUNDED\",\n                                4: \"DEGENERATE\",\n                                5: \"NUMFAILURE\",\n                                6: \"USER-ABORT\",\n                                7: \"TIMEOUT\",\n                                9: \"PRESOLVED\",\n                                25: \"ACCURACY ERROR\",\n                                255: \"FILE-ERROR\",\n                            };\n\n                            var ret_obj = {\n                                code: e.code,\n                                meaning: codes[e.code],\n                                data: data,\n                            };\n\n                            rej(ret_obj);\n                        }\n                    } else {\n                        // And finally...return it.\n                        res(clean_data(data));\n                    }\n                });\n            }\n        });\n    });\n};\n\n/*\nmodel.external = {\n    \"binPath\": \"C:/lpsolve/lp_solve.exe\",\n    \"tempName\": \"C:/temp/out.txt\",\n    \"args\": [\n        \"-S2\"\n    ]\n    \n}\n\n*/\n","/**\n * @file src/external/main.ts\n * @description External solver integration hub\n *\n * Provides a unified interface for delegating to external solvers\n * (e.g., lp_solve). External solvers run as separate processes and\n * may offer better performance or features for specific problem types.\n *\n * Note: External solvers require Node.js and are not available in browsers.\n */\nimport lpsolve from \"./lpsolve/main\";\nimport type { Model as ModelDefinition } from \"../types/solver\";\n\nexport interface ExternalSolverModule {\n    reformat?: (model: ModelDefinition) => unknown;\n    solve: (model: ModelDefinition) => Promise<unknown>;\n}\n\nexport type ExternalSolvers = Record<string, ExternalSolverModule>;\n\nconst lpsolveSolver: ExternalSolverModule = lpsolve;\n\nconst External: ExternalSolvers = {\n    lpsolve: lpsolveSolver,\n};\n\nexport default External;\n","/**\n * @file src/polyopt.ts\n * @description Multi-objective optimization via compromise programming\n *\n * Solves problems with multiple objective functions by:\n * 1. Optimizing each objective independently to find Pareto vertices\n * 2. Computing the midpoint of the feasible region across all objectives\n * 3. Solving for a compromise solution at that midpoint\n *\n * Returns the midpoint solution along with all Pareto vertices and\n * the min/max ranges for each objective.\n */\nimport type { Model as ModelDefinition, ObjectiveDirection, SolveResult } from \"./types/solver\";\ninterface SolverLike {\n    Solve(model: ModelDefinition, precision?: number, full?: boolean, validate?: boolean): unknown;\n}\n\n// Multi-objective solutions are still shaped like regular solve results but may\n// include additional numeric attributes for the auxiliary objectives.\ntype PolyoptSolution = SolveResult & Record<string, number>;\n\ntype ObjectiveMap = Record<string, ObjectiveDirection>;\n\ntype Vertex = Record<string, number>;\n\ninterface PolyoptResult {\n    midpoint: PolyoptSolution;\n    vertices: Vertex[];\n    ranges: Record<string, { min: number; max: number }>;\n}\n\n/**\n * Create a structured, JSON-friendly clone of the incoming model so we can\n * mutate it freely during the multi-objective solve without affecting callers.\n */\nfunction cloneModel(model: ModelDefinition): ModelDefinition {\n    return JSON.parse(JSON.stringify(model));\n}\n\nfunction asPolyoptSolution(value: unknown): PolyoptSolution {\n    if (value && typeof value === \"object\") {\n        return value as PolyoptSolution;\n    }\n\n    throw new Error(\"Polyopt requires the solver to return an object result.\");\n}\n\n/**\n * Populate the solution object with synthetic values for any objective\n * attribute that is not a standalone variable by aggregating contributions\n * from the model's variables.\n */\nfunction backfillObjectiveAttributes(\n    solution: PolyoptSolution,\n    workingModel: ModelDefinition,\n    objectiveKeys: string[]\n): void {\n    for (const attribute of objectiveKeys) {\n        // Skip attributes that already exist as explicit variables.\n        if (workingModel.variables[attribute]) {\n            continue;\n        }\n\n        if (typeof solution[attribute] !== \"number\") {\n            solution[attribute] = 0;\n        }\n\n        for (const [variableName, coefficients] of Object.entries(workingModel.variables)) {\n            const variableContribution = coefficients[attribute];\n            const solvedValue = solution[variableName];\n\n            if (typeof variableContribution === \"number\" && typeof solvedValue === \"number\") {\n                solution[attribute] += solvedValue * variableContribution;\n            }\n        }\n    }\n}\n\n/**\n * Build a string key for a solution vector so we can detect identical vertices\n * (within a small rounding tolerance) and avoid double-counting them when\n * computing the midpoint.\n */\nfunction buildVectorKey(solution: PolyoptSolution, objectiveKeys: string[]): string {\n    const suffix = objectiveKeys\n        .map((key) => {\n            const value = solution[key];\n            // Round to three decimals so tiny floating point differences do not\n            // create distinct vector identifiers.\n            return typeof value === \"number\" ? Math.round(value * 1000) / 1000 : 0;\n        })\n        .join(\"-\");\n\n    return `base-${suffix}`;\n}\n\n/**\n * Ensure each vertex object contains all attribute keys and capture the min/max\n * range for each objective across the Pareto set.\n */\nfunction computeRanges(vertices: Vertex[]): Record<string, { min: number; max: number }> {\n    const ranges: Record<string, { min: number; max: number }> = {};\n\n    // First pass: establish keys and initial ranges from observed values.\n    for (const vertex of vertices) {\n        for (const [key, value] of Object.entries(vertex)) {\n            if (typeof value !== \"number\") {\n                continue;\n            }\n\n            const current = ranges[key] ?? {\n                min: Number.POSITIVE_INFINITY,\n                max: Number.NEGATIVE_INFINITY,\n            };\n            ranges[key] = {\n                min: Math.min(current.min, value),\n                max: Math.max(current.max, value),\n            };\n        }\n    }\n\n    // Second pass: fill missing attributes with zero so all vertices are aligned\n    // and ranges account for implicit zeros.\n    for (const vertex of vertices) {\n        for (const key of Object.keys(ranges)) {\n            if (typeof vertex[key] !== \"number\") {\n                vertex[key] = 0;\n            }\n\n            ranges[key].min = Math.min(ranges[key].min, vertex[key]);\n            ranges[key].max = Math.max(ranges[key].max, vertex[key]);\n        }\n    }\n\n    // Normalize any untouched ranges to zero so callers never see infinities.\n    for (const [key, range] of Object.entries(ranges)) {\n        if (!Number.isFinite(range.min)) {\n            ranges[key] = { min: 0, max: 0 };\n        }\n    }\n\n    return ranges;\n}\n\n/**\n * Solve a model with multiple objective functions by optimizing each objective\n * independently, collecting the resulting Pareto vertices, and solving a\n * derived model that targets the midpoint across all objectives.\n */\nexport default function Polyopt(solver: SolverLike, model: ModelDefinition): PolyoptResult {\n    const workingModel = cloneModel(model);\n    const objectives = workingModel.optimize as ObjectiveMap;\n    const objectiveKeys = Object.keys(objectives);\n\n    if (objectiveKeys.length === 0) {\n        throw new Error(\"Multi-objective solve requires at least one objective definition.\");\n    }\n\n    // We'll replace optimize/opType repeatedly, so start with a clean slate.\n    const workingRecord = workingModel as unknown as Record<string, unknown>;\n    delete workingRecord.optimize;\n    delete workingRecord.opType;\n\n    const aggregatedTargets: Record<string, number> = {};\n    const uniqueVectors = new Set<string>();\n    const paretoVertices: Vertex[] = [];\n\n    for (const key of objectiveKeys) {\n        aggregatedTargets[key] = 0;\n    }\n\n    for (const objectiveName of objectiveKeys) {\n        // Configure the working model to focus solely on the current objective.\n        workingModel.optimize = objectiveName;\n        workingModel.opType = objectives[objectiveName];\n\n        const solution = asPolyoptSolution(solver.Solve(workingModel, undefined, undefined, true));\n\n        // Ensure attributes that are not explicit variables still get values we can compare.\n        backfillObjectiveAttributes(solution, workingModel, objectiveKeys);\n\n        const vectorKey = buildVectorKey(solution, objectiveKeys);\n        if (uniqueVectors.has(vectorKey)) {\n            continue;\n        }\n\n        uniqueVectors.add(vectorKey);\n\n        for (const key of objectiveKeys) {\n            const value = solution[key];\n            if (typeof value === \"number\") {\n                aggregatedTargets[key] += value;\n            }\n        }\n\n        // Strip metadata so each Pareto vertex only contains value-bearing fields.\n        const {\n            feasible: _feasible,\n            result: _result,\n            bounded: _bounded,\n            ...paretoPayload\n        } = solution;\n        paretoVertices.push(paretoPayload);\n    }\n\n    // Derive equality constraints that represent the averaged objective values.\n    for (const key of objectiveKeys) {\n        workingModel.constraints[key] = { equal: aggregatedTargets[key] / uniqueVectors.size };\n    }\n\n    // Add a synthetic objective so the solver has something concrete to maximize.\n    const syntheticObjective = `cheater-${Math.random()}`;\n    workingModel.optimize = syntheticObjective;\n    workingModel.opType = \"max\";\n\n    for (const variable of Object.values(workingModel.variables)) {\n        variable[syntheticObjective] = 1;\n    }\n\n    const ranges = computeRanges(paretoVertices);\n    const midpoint = asPolyoptSolution(solver.Solve(workingModel, undefined, undefined, true));\n\n    return {\n        midpoint,\n        vertices: paretoVertices,\n        ranges,\n    };\n}\n","/**\n * @file src/tableau/enhanced-branch-and-cut.ts\n * @description Advanced branch-and-cut with configurable strategies\n *\n * Extends the basic branch-and-cut with:\n * - Node selection: best-first, depth-first, or hybrid\n * - Variable selection: most-fractional, pseudocost, or strong branching\n * - Diving heuristic for faster feasible solution discovery\n *\n * These advanced strategies can significantly improve performance on\n * large MIP instances compared to the basic implementation.\n */\nimport type Tableau from \"./tableau\";\nimport type { Branch, BranchCut } from \"./types\";\nimport { BranchMinHeap } from \"./min-heap\";\n\nexport interface EnhancedBranchAndCutService {\n    applyCuts(tableau: Tableau, branchingCuts: BranchCut[]): void;\n    branchAndCut(tableau: Tableau): void;\n}\n\nexport interface BranchAndCutOptions {\n    // Node selection: 'best-first' | 'depth-first' | 'hybrid'\n    nodeSelection?: \"best-first\" | \"depth-first\" | \"hybrid\";\n    // Branching: 'most-fractional' | 'pseudocost' | 'strong'\n    branching?: \"most-fractional\" | \"pseudocost\" | \"strong\";\n    // Enable diving heuristic to find feasible solutions faster\n    useDiving?: boolean;\n    // Maximum strong branching candidates\n    strongBranchingCandidates?: number;\n}\n\ninterface PseudoCostData {\n    upSum: number;\n    upCount: number;\n    downSum: number;\n    downCount: number;\n}\n\nfunction createCut(type: BranchCut[\"type\"], varIndex: number, value: number): BranchCut {\n    return { type, varIndex, value };\n}\n\nfunction createBranch(\n    relaxedEvaluation: number,\n    cuts: BranchCut[],\n    depth: number,\n    branchVarIndex?: number,\n    branchDirection?: \"up\" | \"down\",\n    branchFractionality?: number,\n    parentEvaluation?: number\n): Branch & { depth: number } {\n    return {\n        relaxedEvaluation,\n        cuts,\n        depth,\n        branchVarIndex,\n        branchDirection,\n        branchFractionality,\n        parentEvaluation,\n    };\n}\n\n/**\n * Enhanced branch-and-cut with:\n * - Pseudocost branching\n * - Hybrid node selection (depth-first early, best-first later)\n * - Diving heuristic for quick feasible solutions\n */\nexport function createEnhancedBranchAndCutService(\n    options: BranchAndCutOptions = {}\n): EnhancedBranchAndCutService {\n    const {\n        nodeSelection = \"hybrid\",\n        branching = \"pseudocost\",\n        useDiving: _useDiving = true, // Reserved for future diving heuristic\n        strongBranchingCandidates = 5,\n    } = options;\n\n    // Pseudocost data per variable index\n    const pseudoCosts = new Map<number, PseudoCostData>();\n\n    const getPseudoCost = (varIndex: number): PseudoCostData => {\n        let data = pseudoCosts.get(varIndex);\n        if (!data) {\n            data = { upSum: 0, upCount: 0, downSum: 0, downCount: 0 };\n            pseudoCosts.set(varIndex, data);\n        }\n        return data;\n    };\n\n    const updatePseudoCost = (\n        varIndex: number,\n        direction: \"up\" | \"down\",\n        improvement: number,\n        fraction: number\n    ): void => {\n        const data = getPseudoCost(varIndex);\n        const normalizedImprovement = improvement / (direction === \"up\" ? 1 - fraction : fraction);\n\n        if (direction === \"up\") {\n            data.upSum += normalizedImprovement;\n            data.upCount++;\n        } else {\n            data.downSum += normalizedImprovement;\n            data.downCount++;\n        }\n    };\n\n    const getScore = (varIndex: number, fraction: number): number => {\n        const data = getPseudoCost(varIndex);\n\n        // Use geometric mean of up and down pseudocosts\n        const upPseudo = data.upCount > 0 ? data.upSum / data.upCount : 1;\n        const downPseudo = data.downCount > 0 ? data.downSum / data.downCount : 1;\n\n        const upEstimate = upPseudo * (1 - fraction);\n        const downEstimate = downPseudo * fraction;\n\n        // Product score (like SCIP's default)\n        return Math.max(upEstimate, 1e-6) * Math.max(downEstimate, 1e-6);\n    };\n\n    const selectBranchingVariable = (\n        tableau: Tableau,\n        _currentEval: number\n    ): { index: number; value: number } | null => {\n        const width = tableau.width;\n        const matrix = tableau.matrix;\n        const rhsColumn = tableau.rhsColumn;\n        const integerVars = tableau.model!.integerVariables;\n        const precision = tableau.precision;\n\n        let candidates: Array<{ index: number; value: number; fraction: number }> = [];\n\n        // Collect fractional variables\n        for (const variable of integerVars) {\n            const varIndex = variable.index;\n            const row = tableau.rowByVarIndex[varIndex];\n            if (row !== -1) {\n                const value = matrix[row * width + rhsColumn];\n                const fraction = Math.abs(value - Math.round(value));\n                if (fraction > precision) {\n                    candidates.push({ index: varIndex, value, fraction });\n                }\n            }\n        }\n\n        if (candidates.length === 0) return null;\n\n        if (branching === \"most-fractional\") {\n            // Original strategy - pick most fractional\n            candidates.sort((a, b) => b.fraction - a.fraction);\n            return { index: candidates[0].index, value: candidates[0].value };\n        }\n\n        if (branching === \"pseudocost\") {\n            // Score by pseudocosts\n            let bestScore = -Infinity;\n            let bestCandidate = candidates[0];\n\n            for (const candidate of candidates) {\n                const score = getScore(candidate.index, candidate.fraction);\n                if (score > bestScore) {\n                    bestScore = score;\n                    bestCandidate = candidate;\n                }\n            }\n\n            return { index: bestCandidate.index, value: bestCandidate.value };\n        }\n\n        if (branching === \"strong\") {\n            // Strong branching on top candidates\n            // Sort by most fractional first\n            candidates.sort((a, b) => b.fraction - a.fraction);\n            candidates = candidates.slice(0, strongBranchingCandidates);\n\n            let bestScore = -Infinity;\n            let bestCandidate = candidates[0];\n\n            // For strong branching, we'd solve LP relaxations\n            // Here we use a simplified version with pseudocost estimation\n            for (const candidate of candidates) {\n                const data = getPseudoCost(candidate.index);\n\n                // If we have enough pseudocost data, use it\n                if (data.upCount >= 2 && data.downCount >= 2) {\n                    const score = getScore(candidate.index, candidate.fraction);\n                    if (score > bestScore) {\n                        bestScore = score;\n                        bestCandidate = candidate;\n                    }\n                } else {\n                    // Fall back to most fractional\n                    const score = candidate.fraction * (1 - candidate.fraction);\n                    if (score > bestScore) {\n                        bestScore = score;\n                        bestCandidate = candidate;\n                    }\n                }\n            }\n\n            return { index: bestCandidate.index, value: bestCandidate.value };\n        }\n\n        return { index: candidates[0].index, value: candidates[0].value };\n    };\n\n    const applyCuts = (tableau: Tableau, branchingCuts: BranchCut[]): void => {\n        tableau.restore();\n        tableau.addCutConstraints(branchingCuts);\n        tableau.simplex();\n\n        if (tableau.model?.useMIRCuts && tableau.feasible) {\n            let fractionalVolumeImproved = true;\n            let mirIterations = 0;\n            const maxMIRIterations = 3;\n\n            while (fractionalVolumeImproved && mirIterations < maxMIRIterations) {\n                const fractionalVolumeBefore = tableau.computeFractionalVolume(true);\n                tableau.applyMIRCuts();\n                tableau.simplex();\n\n                const fractionalVolumeAfter = tableau.computeFractionalVolume(true);\n                mirIterations++;\n\n                if (fractionalVolumeAfter >= 0.9 * fractionalVolumeBefore) {\n                    fractionalVolumeImproved = false;\n                }\n            }\n        }\n    };\n\n    const branchAndCut = (tableau: Tableau): void => {\n        const branches = new BranchMinHeap();\n        const depthFirstStack: Array<Branch & { depth: number }> = [];\n\n        let iterations = 0;\n        const tolerance = tableau.model?.tolerance ?? 0;\n        let toleranceFlag = true;\n        let terminalTime = 1e99;\n\n        if (tableau.model?.timeout) {\n            terminalTime = Date.now() + tableau.model.timeout;\n        }\n\n        let bestEvaluation = Infinity;\n        let bestBranch: Branch | null = null;\n        const bestOptionalObjectivesEvaluations: number[] = [];\n        for (let oInit = 0; oInit < tableau.optionalObjectives.length; oInit += 1) {\n            bestOptionalObjectivesEvaluations.push(Infinity);\n        }\n\n        // Configuration for hybrid node selection\n        const switchTobestFirstAfterSolutions = 1;\n        let solutionsFound = 0;\n        let useDepthFirst = nodeSelection === \"depth-first\" || nodeSelection === \"hybrid\";\n\n        const branch = createBranch(-Infinity, [], 0);\n        let acceptableThreshold: number;\n\n        if (useDepthFirst) {\n            depthFirstStack.push(branch);\n        } else {\n            branches.push(branch);\n        }\n\n        while (\n            (useDepthFirst ? depthFirstStack.length > 0 : !branches.isEmpty()) &&\n            toleranceFlag === true &&\n            Date.now() < terminalTime\n        ) {\n            if (tableau.model?.isMinimization) {\n                acceptableThreshold = tableau.bestPossibleEval * (1 + tolerance);\n            } else {\n                acceptableThreshold = tableau.bestPossibleEval * (1 - tolerance);\n            }\n\n            if (tolerance > 0 && bestEvaluation < acceptableThreshold) {\n                toleranceFlag = false;\n            }\n\n            // Select next node based on strategy\n            let activeBranch: Branch & { depth: number };\n            if (useDepthFirst && depthFirstStack.length > 0) {\n                activeBranch = depthFirstStack.pop()!;\n            } else if (!branches.isEmpty()) {\n                activeBranch = branches.pop() as Branch & { depth: number };\n            } else {\n                break;\n            }\n\n            if (activeBranch.relaxedEvaluation >= bestEvaluation) {\n                continue;\n            }\n\n            const cuts = activeBranch.cuts;\n            const _parentEval = tableau.evaluation;\n\n            applyCuts(tableau, cuts);\n            iterations++;\n\n            if (!tableau.feasible) {\n                continue;\n            }\n\n            const evaluation = tableau.evaluation;\n            if (evaluation > bestEvaluation) {\n                continue;\n            }\n\n            // Update pseudocosts based on observed improvement\n            if (\n                activeBranch.branchVarIndex !== undefined &&\n                activeBranch.branchDirection !== undefined &&\n                activeBranch.branchFractionality !== undefined &&\n                activeBranch.parentEvaluation !== undefined\n            ) {\n                const improvement = Math.abs(evaluation - activeBranch.parentEvaluation);\n                updatePseudoCost(\n                    activeBranch.branchVarIndex,\n                    activeBranch.branchDirection,\n                    improvement,\n                    activeBranch.branchFractionality\n                );\n            }\n\n            if (evaluation === bestEvaluation) {\n                let isCurrentEvaluationWorse = true;\n                for (let o = 0; o < tableau.optionalObjectives.length; o++) {\n                    if (\n                        tableau.optionalObjectives[o].reducedCosts[0] >\n                        bestOptionalObjectivesEvaluations[o]\n                    ) {\n                        break;\n                    } else if (\n                        tableau.optionalObjectives[o].reducedCosts[0] <\n                        bestOptionalObjectivesEvaluations[o]\n                    ) {\n                        isCurrentEvaluationWorse = false;\n                        break;\n                    }\n                }\n\n                if (isCurrentEvaluationWorse) {\n                    continue;\n                }\n            }\n\n            if (tableau.isIntegral()) {\n                tableau.__isIntegral = true;\n                solutionsFound++;\n\n                if (iterations === 1) {\n                    tableau.branchAndCutIterations = iterations;\n                    return;\n                }\n\n                bestBranch = activeBranch;\n                bestEvaluation = evaluation;\n\n                for (let oCopy = 0; oCopy < tableau.optionalObjectives.length; oCopy++) {\n                    bestOptionalObjectivesEvaluations[oCopy] =\n                        tableau.optionalObjectives[oCopy].reducedCosts[0];\n                }\n\n                if (tableau.model?.keep_solutions) {\n                    const nowSolution = tableau.model.tableau.getSolution();\n                    const store = nowSolution.generateSolutionSet();\n                    store.result = nowSolution.evaluation;\n\n                    if (!tableau.model.solutions) {\n                        tableau.model.solutions = [];\n                    }\n                    tableau.model.solutions.push(store);\n                }\n\n                // Switch to best-first after finding solutions\n                if (\n                    nodeSelection === \"hybrid\" &&\n                    solutionsFound >= switchTobestFirstAfterSolutions\n                ) {\n                    useDepthFirst = false;\n                    // Move remaining depth-first nodes to priority queue\n                    while (depthFirstStack.length > 0) {\n                        branches.push(depthFirstStack.pop()!);\n                    }\n                }\n            } else {\n                if (iterations === 1) {\n                    tableau.save();\n                }\n\n                // Use enhanced branching variable selection\n                const variable = selectBranchingVariable(tableau, evaluation);\n                if (!variable) continue;\n\n                const varIndex = variable.index;\n                const varValue = variable.value;\n\n                const cutsHigh: BranchCut[] = [];\n                const cutsLow: BranchCut[] = [];\n\n                const nCuts = cuts.length;\n                for (let c = 0; c < nCuts; c++) {\n                    const cut = cuts[c];\n                    if (cut.varIndex === varIndex) {\n                        if (cut.type === \"min\") {\n                            cutsLow.push(cut);\n                        } else {\n                            cutsHigh.push(cut);\n                        }\n                    } else {\n                        cutsHigh.push(cut);\n                        cutsLow.push(cut);\n                    }\n                }\n\n                const ceilVal = Math.ceil(varValue);\n                const floorVal = Math.floor(varValue);\n                const fracUp = ceilVal - varValue; // Distance to ceil\n                const fracDown = varValue - floorVal; // Distance to floor\n\n                const cutHigh = createCut(\"min\", varIndex, ceilVal);\n                cutsHigh.push(cutHigh);\n\n                const cutLow = createCut(\"max\", varIndex, floorVal);\n                cutsLow.push(cutLow);\n\n                const newDepth = activeBranch.depth + 1;\n\n                if (useDepthFirst) {\n                    // Push in reverse order so 'up' branch is explored first\n                    // (often better for minimization with binary vars)\n                    depthFirstStack.push(\n                        createBranch(\n                            evaluation,\n                            cutsLow,\n                            newDepth,\n                            varIndex,\n                            \"down\",\n                            fracDown,\n                            evaluation\n                        )\n                    );\n                    depthFirstStack.push(\n                        createBranch(\n                            evaluation,\n                            cutsHigh,\n                            newDepth,\n                            varIndex,\n                            \"up\",\n                            fracUp,\n                            evaluation\n                        )\n                    );\n                } else {\n                    branches.push(\n                        createBranch(\n                            evaluation,\n                            cutsHigh,\n                            newDepth,\n                            varIndex,\n                            \"up\",\n                            fracUp,\n                            evaluation\n                        )\n                    );\n                    branches.push(\n                        createBranch(\n                            evaluation,\n                            cutsLow,\n                            newDepth,\n                            varIndex,\n                            \"down\",\n                            fracDown,\n                            evaluation\n                        )\n                    );\n                }\n            }\n        }\n\n        if (bestBranch !== null) {\n            applyCuts(tableau, bestBranch.cuts);\n        }\n        tableau.branchAndCutIterations = iterations;\n    };\n\n    return { applyCuts, branchAndCut };\n}\n","/**\n * @file src/tableau/incremental-branch-and-cut.ts\n * @description Optimized branch-and-cut with incremental state management\n *\n * Key optimization: Instead of always restoring to root and reapplying all cuts,\n * this implementation uses checkpoints to restore to parent state and apply\n * only the new cut. For depth-first traversal, this reduces cut applications\n * from O(depth) to O(1) per node.\n *\n * Memory trade-off: Stores one checkpoint per active path in the B&B tree.\n * For depth D, this is O(D) checkpoints vs O(1) for the basic implementation.\n */\nimport type Tableau from \"./tableau\";\nimport type { Branch, BranchCut } from \"./types\";\nimport { BranchMinHeap } from \"./min-heap\";\n\nexport interface IncrementalBranchAndCutService {\n    applyCuts(tableau: Tableau, branchingCuts: BranchCut[]): void;\n    branchAndCut(tableau: Tableau): void;\n}\n\nexport interface IncrementalBranchAndCutOptions {\n    nodeSelection?: \"best-first\" | \"depth-first\" | \"hybrid\";\n    branching?: \"most-fractional\" | \"pseudocost\" | \"strong\";\n    maxCheckpoints?: number; // Limit memory usage\n}\n\n/**\n * Lightweight checkpoint storing only what's needed for restoration\n */\ninterface StateCheckpoint {\n    matrix: Float64Array;\n    width: number;\n    height: number;\n    nVars: number;\n    varIndexByRow: number[];\n    varIndexByCol: number[];\n    rowByVarIndex: number[];\n    colByVarIndex: number[];\n    availableIndexes: number[];\n    lastElementIndex: number;\n    evaluation: number;\n    feasible: boolean;\n}\n\n/**\n * Extended branch with parent reference for incremental restoration\n */\ninterface IncrementalBranch extends Branch {\n    depth: number;\n    parentCheckpoint?: StateCheckpoint;\n    newCut?: BranchCut; // The single cut added from parent\n}\n\nfunction createCheckpoint(tableau: Tableau): StateCheckpoint {\n    return {\n        matrix: new Float64Array(tableau.matrix),\n        width: tableau.width,\n        height: tableau.height,\n        nVars: tableau.nVars,\n        varIndexByRow: tableau.varIndexByRow.slice(),\n        varIndexByCol: tableau.varIndexByCol.slice(),\n        rowByVarIndex: tableau.rowByVarIndex.slice(),\n        colByVarIndex: tableau.colByVarIndex.slice(),\n        availableIndexes: tableau.availableIndexes.slice(),\n        lastElementIndex: tableau.lastElementIndex,\n        evaluation: tableau.evaluation,\n        feasible: tableau.feasible,\n    };\n}\n\nfunction restoreCheckpoint(tableau: Tableau, checkpoint: StateCheckpoint): void {\n    // Only copy if sizes match, otherwise need full restore\n    if (tableau.matrix.length >= checkpoint.matrix.length) {\n        tableau.matrix.set(checkpoint.matrix);\n    } else {\n        tableau.matrix = new Float64Array(checkpoint.matrix);\n    }\n\n    tableau.width = checkpoint.width;\n    tableau.height = checkpoint.height;\n    tableau.nVars = checkpoint.nVars;\n\n    // Restore arrays\n    const height = checkpoint.height;\n    for (let i = 0; i < height; i++) {\n        tableau.varIndexByRow[i] = checkpoint.varIndexByRow[i];\n    }\n    tableau.varIndexByRow.length = height;\n\n    const width = checkpoint.width;\n    for (let i = 0; i < width; i++) {\n        tableau.varIndexByCol[i] = checkpoint.varIndexByCol[i];\n    }\n    tableau.varIndexByCol.length = width;\n\n    const nVars = checkpoint.nVars;\n    for (let i = 0; i < nVars; i++) {\n        tableau.rowByVarIndex[i] = checkpoint.rowByVarIndex[i];\n        tableau.colByVarIndex[i] = checkpoint.colByVarIndex[i];\n    }\n\n    tableau.availableIndexes = checkpoint.availableIndexes.slice();\n    tableau.lastElementIndex = checkpoint.lastElementIndex;\n    tableau.evaluation = checkpoint.evaluation;\n    tableau.feasible = checkpoint.feasible;\n}\n\nfunction createCut(type: BranchCut[\"type\"], varIndex: number, value: number): BranchCut {\n    return { type, varIndex, value };\n}\n\nfunction createBranch(\n    relaxedEvaluation: number,\n    cuts: BranchCut[],\n    depth: number,\n    parentCheckpoint?: StateCheckpoint,\n    newCut?: BranchCut\n): IncrementalBranch {\n    return { relaxedEvaluation, cuts, depth, parentCheckpoint, newCut };\n}\n\ninterface PseudoCostData {\n    upSum: number;\n    upCount: number;\n    downSum: number;\n    downCount: number;\n}\n\nexport function createIncrementalBranchAndCutService(\n    options: IncrementalBranchAndCutOptions = {}\n): IncrementalBranchAndCutService {\n    const {\n        nodeSelection = \"hybrid\",\n        branching = \"pseudocost\",\n        maxCheckpoints = 50, // Limit checkpoints to avoid memory overhead\n    } = options;\n\n    const pseudoCosts = new Map<number, PseudoCostData>();\n\n    const getPseudoCost = (varIndex: number): PseudoCostData => {\n        let data = pseudoCosts.get(varIndex);\n        if (!data) {\n            data = { upSum: 0, upCount: 0, downSum: 0, downCount: 0 };\n            pseudoCosts.set(varIndex, data);\n        }\n        return data;\n    };\n\n    const updatePseudoCost = (\n        varIndex: number,\n        direction: \"up\" | \"down\",\n        improvement: number,\n        fraction: number\n    ): void => {\n        const data = getPseudoCost(varIndex);\n        const normalizedImprovement = improvement / (direction === \"up\" ? 1 - fraction : fraction);\n\n        if (direction === \"up\") {\n            data.upSum += normalizedImprovement;\n            data.upCount++;\n        } else {\n            data.downSum += normalizedImprovement;\n            data.downCount++;\n        }\n    };\n\n    const getScore = (varIndex: number, fraction: number): number => {\n        const data = getPseudoCost(varIndex);\n        const upPseudo = data.upCount > 0 ? data.upSum / data.upCount : 1;\n        const downPseudo = data.downCount > 0 ? data.downSum / data.downCount : 1;\n        const upEstimate = upPseudo * (1 - fraction);\n        const downEstimate = downPseudo * fraction;\n        return Math.max(upEstimate, 1e-6) * Math.max(downEstimate, 1e-6);\n    };\n\n    const selectBranchingVariable = (\n        tableau: Tableau\n    ): { index: number; value: number; fraction: number } | null => {\n        const width = tableau.width;\n        const matrix = tableau.matrix;\n        const rhsColumn = tableau.rhsColumn;\n        const integerVars = tableau.model!.integerVariables;\n        const precision = tableau.precision;\n\n        const candidates: Array<{ index: number; value: number; fraction: number }> = [];\n\n        for (const variable of integerVars) {\n            const varIndex = variable.index;\n            const row = tableau.rowByVarIndex[varIndex];\n            if (row !== -1) {\n                const value = matrix[row * width + rhsColumn];\n                const fraction = Math.abs(value - Math.round(value));\n                if (fraction > precision) {\n                    candidates.push({ index: varIndex, value, fraction });\n                }\n            }\n        }\n\n        if (candidates.length === 0) return null;\n\n        if (branching === \"most-fractional\") {\n            candidates.sort((a, b) => b.fraction - a.fraction);\n            return candidates[0];\n        }\n\n        // Pseudocost branching\n        let bestScore = -Infinity;\n        let bestCandidate = candidates[0];\n\n        for (const candidate of candidates) {\n            const score = getScore(candidate.index, candidate.fraction);\n            if (score > bestScore) {\n                bestScore = score;\n                bestCandidate = candidate;\n            }\n        }\n\n        return bestCandidate;\n    };\n\n    // Standard applyCuts - restores to root and applies all cuts\n    const applyCuts = (tableau: Tableau, branchingCuts: BranchCut[]): void => {\n        tableau.restore();\n        tableau.addCutConstraints(branchingCuts);\n        tableau.simplex();\n\n        if (tableau.model?.useMIRCuts && tableau.feasible) {\n            let fractionalVolumeImproved = true;\n            let mirIterations = 0;\n            const maxMIRIterations = 3;\n\n            while (fractionalVolumeImproved && mirIterations < maxMIRIterations) {\n                const fractionalVolumeBefore = tableau.computeFractionalVolume(true);\n                tableau.applyMIRCuts();\n                tableau.simplex();\n                const fractionalVolumeAfter = tableau.computeFractionalVolume(true);\n                mirIterations++;\n\n                if (fractionalVolumeAfter >= 0.9 * fractionalVolumeBefore) {\n                    fractionalVolumeImproved = false;\n                }\n            }\n        }\n    };\n\n    // Incremental applyCuts - uses parent checkpoint if available\n    const applyIncrementalCuts = (tableau: Tableau, branch: IncrementalBranch): void => {\n        if (branch.parentCheckpoint && branch.newCut) {\n            // Fast path: restore parent and apply only new cut\n            restoreCheckpoint(tableau, branch.parentCheckpoint);\n            tableau.addCutConstraints([branch.newCut]);\n            tableau.simplex();\n        } else {\n            // Fallback: full restore from root\n            tableau.restore();\n            tableau.addCutConstraints(branch.cuts);\n            tableau.simplex();\n        }\n\n        if (tableau.model?.useMIRCuts && tableau.feasible) {\n            let fractionalVolumeImproved = true;\n            let mirIterations = 0;\n            const maxMIRIterations = 3;\n\n            while (fractionalVolumeImproved && mirIterations < maxMIRIterations) {\n                const fractionalVolumeBefore = tableau.computeFractionalVolume(true);\n                tableau.applyMIRCuts();\n                tableau.simplex();\n                const fractionalVolumeAfter = tableau.computeFractionalVolume(true);\n                mirIterations++;\n\n                if (fractionalVolumeAfter >= 0.9 * fractionalVolumeBefore) {\n                    fractionalVolumeImproved = false;\n                }\n            }\n        }\n    };\n\n    const branchAndCut = (tableau: Tableau): void => {\n        const branches = new BranchMinHeap();\n        const depthFirstStack: IncrementalBranch[] = [];\n\n        let iterations = 0;\n        let checkpointCount = 0;\n        const tolerance = tableau.model?.tolerance ?? 0;\n        let toleranceFlag = true;\n        let terminalTime = 1e99;\n\n        if (tableau.model?.timeout) {\n            terminalTime = Date.now() + tableau.model.timeout;\n        }\n\n        let bestEvaluation = Infinity;\n        let bestBranch: IncrementalBranch | null = null;\n        const bestOptionalObjectivesEvaluations: number[] = [];\n        for (let oInit = 0; oInit < tableau.optionalObjectives.length; oInit++) {\n            bestOptionalObjectivesEvaluations.push(Infinity);\n        }\n\n        const switchToBestFirstAfterSolutions = 1;\n        let solutionsFound = 0;\n        let useDepthFirst = nodeSelection === \"depth-first\" || nodeSelection === \"hybrid\";\n\n        const rootBranch = createBranch(-Infinity, [], 0);\n\n        if (useDepthFirst) {\n            depthFirstStack.push(rootBranch);\n        } else {\n            branches.push(rootBranch);\n        }\n\n        while (\n            (useDepthFirst ? depthFirstStack.length > 0 : !branches.isEmpty()) &&\n            toleranceFlag === true &&\n            Date.now() < terminalTime\n        ) {\n            let acceptableThreshold: number;\n            if (tableau.model?.isMinimization) {\n                acceptableThreshold = tableau.bestPossibleEval * (1 + tolerance);\n            } else {\n                acceptableThreshold = tableau.bestPossibleEval * (1 - tolerance);\n            }\n\n            if (tolerance > 0 && bestEvaluation < acceptableThreshold) {\n                toleranceFlag = false;\n            }\n\n            let activeBranch: IncrementalBranch;\n            if (useDepthFirst && depthFirstStack.length > 0) {\n                activeBranch = depthFirstStack.pop()!;\n            } else if (!branches.isEmpty()) {\n                activeBranch = branches.pop() as IncrementalBranch;\n            } else {\n                break;\n            }\n\n            if (activeBranch.relaxedEvaluation >= bestEvaluation) {\n                continue;\n            }\n\n            const parentEval = tableau.evaluation;\n\n            // Use incremental restoration if available\n            applyIncrementalCuts(tableau, activeBranch);\n            iterations++;\n\n            if (!tableau.feasible) {\n                continue;\n            }\n\n            const evaluation = tableau.evaluation;\n            if (evaluation > bestEvaluation) {\n                continue;\n            }\n\n            // Update pseudocosts\n            if (activeBranch.newCut && parentEval !== 0) {\n                const improvement = Math.abs(evaluation - parentEval);\n                const fraction = 0.5;\n                updatePseudoCost(\n                    activeBranch.newCut.varIndex,\n                    activeBranch.newCut.type === \"min\" ? \"up\" : \"down\",\n                    improvement,\n                    fraction\n                );\n            }\n\n            if (evaluation === bestEvaluation) {\n                let isCurrentEvaluationWorse = true;\n                for (let o = 0; o < tableau.optionalObjectives.length; o++) {\n                    if (\n                        tableau.optionalObjectives[o].reducedCosts[0] >\n                        bestOptionalObjectivesEvaluations[o]\n                    ) {\n                        break;\n                    } else if (\n                        tableau.optionalObjectives[o].reducedCosts[0] <\n                        bestOptionalObjectivesEvaluations[o]\n                    ) {\n                        isCurrentEvaluationWorse = false;\n                        break;\n                    }\n                }\n\n                if (isCurrentEvaluationWorse) {\n                    continue;\n                }\n            }\n\n            if (tableau.isIntegral()) {\n                tableau.__isIntegral = true;\n                solutionsFound++;\n\n                if (iterations === 1) {\n                    tableau.branchAndCutIterations = iterations;\n                    return;\n                }\n\n                bestBranch = activeBranch;\n                bestEvaluation = evaluation;\n\n                for (let oCopy = 0; oCopy < tableau.optionalObjectives.length; oCopy++) {\n                    bestOptionalObjectivesEvaluations[oCopy] =\n                        tableau.optionalObjectives[oCopy].reducedCosts[0];\n                }\n\n                if (tableau.model?.keep_solutions) {\n                    const nowSolution = tableau.model.tableau.getSolution();\n                    const store = nowSolution.generateSolutionSet();\n                    store.result = nowSolution.evaluation;\n\n                    if (!tableau.model.solutions) {\n                        tableau.model.solutions = [];\n                    }\n                    tableau.model.solutions.push(store);\n                }\n\n                // Switch to best-first after finding solutions\n                if (\n                    nodeSelection === \"hybrid\" &&\n                    solutionsFound >= switchToBestFirstAfterSolutions\n                ) {\n                    useDepthFirst = false;\n                    while (depthFirstStack.length > 0) {\n                        branches.push(depthFirstStack.pop()!);\n                    }\n                }\n            } else {\n                if (iterations === 1) {\n                    tableau.save();\n                }\n\n                const variable = selectBranchingVariable(tableau);\n                if (!variable) continue;\n\n                const varIndex = variable.index;\n                const varValue = variable.value;\n\n                // Create checkpoint for children (only if under limit)\n                let checkpoint: StateCheckpoint | undefined;\n                if (useDepthFirst && checkpointCount < maxCheckpoints) {\n                    checkpoint = createCheckpoint(tableau);\n                    checkpointCount++;\n                }\n\n                const cutsHigh: BranchCut[] = [];\n                const cutsLow: BranchCut[] = [];\n\n                const nCuts = activeBranch.cuts.length;\n                for (let c = 0; c < nCuts; c++) {\n                    const cut = activeBranch.cuts[c];\n                    if (cut.varIndex === varIndex) {\n                        if (cut.type === \"min\") {\n                            cutsLow.push(cut);\n                        } else {\n                            cutsHigh.push(cut);\n                        }\n                    } else {\n                        cutsHigh.push(cut);\n                        cutsLow.push(cut);\n                    }\n                }\n\n                const min = Math.ceil(varValue);\n                const max = Math.floor(varValue);\n\n                const cutHigh = createCut(\"min\", varIndex, min);\n                cutsHigh.push(cutHigh);\n\n                const cutLow = createCut(\"max\", varIndex, max);\n                cutsLow.push(cutLow);\n\n                const newDepth = activeBranch.depth + 1;\n\n                if (useDepthFirst) {\n                    // Push with parent checkpoint for incremental restoration\n                    depthFirstStack.push(\n                        createBranch(evaluation, cutsLow, newDepth, checkpoint, cutLow)\n                    );\n                    depthFirstStack.push(\n                        createBranch(evaluation, cutsHigh, newDepth, checkpoint, cutHigh)\n                    );\n                } else {\n                    // Best-first doesn't use checkpoints (would need too much memory)\n                    branches.push(createBranch(evaluation, cutsHigh, newDepth));\n                    branches.push(createBranch(evaluation, cutsLow, newDepth));\n                }\n            }\n        }\n\n        if (bestBranch !== null) {\n            applyCuts(tableau, bestBranch.cuts);\n        }\n        tableau.branchAndCutIterations = iterations;\n    };\n\n    return { applyCuts, branchAndCut };\n}\n","/**\n * @file src/main.ts\n * @description Core Solver class implementation\n *\n * Orchestrates the complete solving pipeline:\n * - Model parsing and validation\n * - Simplex algorithm for linear programming\n * - Branch-and-cut for mixed-integer programming\n * - Multi-objective optimization via Polyopt\n * - External solver delegation (e.g., lp_solve)\n */\nimport Tableau from \"./tableau\";\nimport Model from \"./model\";\nimport * as expressions from \"./expressions\";\nimport * as validation from \"./validation\";\nimport External from \"./external/main\";\nimport Polyopt from \"./polyopt\";\nimport ReformatLP from \"./external/lpsolve/reformat\";\nimport { createBranchAndCutService } from \"./tableau/branch-and-cut\";\nimport { createEnhancedBranchAndCutService } from \"./tableau/enhanced-branch-and-cut\";\nimport { createIncrementalBranchAndCutService } from \"./tableau/incremental-branch-and-cut\";\nimport type { Model as ModelDefinition, SolveResult } from \"./types/solver\";\n\n// Global environment declarations for UMD compatibility\ndeclare const define: ((deps: unknown[], factory: () => Solver) => void) | undefined;\ndeclare const window: { solver?: Solver } | undefined;\ndeclare const self: { solver?: Solver } | undefined;\n\ntype ValidationFn = (model: ModelDefinition) => ModelDefinition;\n\n/**\n * Main solver class providing the public API for solving optimization problems.\n */\nclass Solver {\n    // Expose constructors for programmatic model building\n    Model = Model;\n    Tableau = Tableau;\n    Constraint = expressions.Constraint;\n    Variable = expressions.Variable;\n    Numeral = expressions.Numeral;\n    Term = expressions.Term;\n\n    // External solver integrations\n    External = External;\n    ReformatLP = ReformatLP;\n\n    // Branch-and-cut service (default implementation)\n    branchAndCutService = createBranchAndCutService();\n    branchAndCut = (tableau: Tableau): void => this.branchAndCutService.branchAndCut(tableau);\n\n    // Reference to the last solved model (useful for debugging)\n    lastSolvedModel: Model | null = null;\n\n    /**\n     * Select the appropriate branch-and-cut service based on model options.\n     *\n     * Enhanced strategies can be enabled via model.options:\n     * - nodeSelection: 'best-first' | 'depth-first' | 'hybrid'\n     * - branching: 'most-fractional' | 'pseudocost' | 'strong'\n     * - useIncremental: true to use incremental state management (experimental)\n     */\n    private selectBranchAndCutService(model: ModelDefinition) {\n        const options = model.options;\n        const useEnhanced = options?.nodeSelection || options?.branching;\n        const useIncremental = options?.useIncremental === true; // Must explicitly enable\n\n        if (useIncremental) {\n            return createIncrementalBranchAndCutService({\n                nodeSelection: options?.nodeSelection ?? \"hybrid\",\n                branching: options?.branching ?? \"pseudocost\",\n            });\n        }\n\n        if (useEnhanced) {\n            return createEnhancedBranchAndCutService({\n                nodeSelection: options?.nodeSelection ?? \"hybrid\",\n                branching: options?.branching ?? \"pseudocost\",\n                useDiving: true,\n            });\n        }\n\n        return createBranchAndCutService();\n    }\n\n    /**\n     * Solve a linear or mixed-integer programming problem.\n     *\n     * @param model - Problem definition (JSON format or Model instance)\n     * @param precision - Tolerance for integer constraints (default: 1e-9)\n     * @param full - If true, return full Solution object; otherwise return simplified result\n     * @param validate - If true, run model through validation functions\n     * @returns Solution object or simplified result with variable values\n     */\n    Solve<_TVariable extends string = string>(\n        model: ModelDefinition | Model,\n        precision?: number,\n        full?: boolean,\n        validate?: boolean\n    ): SolveResult | unknown {\n        // Run validation if requested\n        if (validate) {\n            for (const test in validation) {\n                const validator = (validation as Record<string, ValidationFn>)[test];\n                if (typeof validator === \"function\") {\n                    model = validator(model as ModelDefinition);\n                }\n            }\n        }\n\n        if (!model) {\n            throw new Error(\"Solver requires a model to operate on\");\n        }\n\n        // Handle multi-objective optimization\n        if (typeof (model as ModelDefinition).optimize === \"object\") {\n            if (Object.keys((model as ModelDefinition).optimize).length > 1) {\n                return Polyopt(this, model as ModelDefinition);\n            }\n        }\n\n        // Handle external solver delegation\n        if ((model as ModelDefinition).external) {\n            return this.solveWithExternalSolver(model as ModelDefinition);\n        }\n\n        // Solve with internal solver\n        let modelInstance: Model;\n        if (!(model instanceof Model)) {\n            const branchAndCutService = this.selectBranchAndCutService(model as ModelDefinition);\n            modelInstance = new Model(precision, undefined, branchAndCutService).loadJson(\n                model as ModelDefinition\n            );\n        } else {\n            modelInstance = model;\n        }\n\n        const solution = modelInstance.solve();\n        this.lastSolvedModel = modelInstance;\n        solution.solutionSet = solution.generateSolutionSet();\n\n        // Return full solution or simplified result\n        if (full) {\n            return solution;\n        }\n\n        return this.buildSimplifiedResult(solution);\n    }\n\n    /**\n     * Delegate solving to an external solver (e.g., lp_solve).\n     */\n    private solveWithExternalSolver(model: ModelDefinition): unknown {\n        const solvers = Object.keys(External);\n        const solverList = JSON.stringify(solvers);\n\n        if (!model.external?.solver) {\n            throw new Error(\n                `Model has 'external' object without solver attribute. Available: ${solverList}`\n            );\n        }\n\n        const requestedSolver = model.external.solver;\n        if (!External[requestedSolver]) {\n            throw new Error(`Solver '${requestedSolver}' not supported. Available: ${solverList}`);\n        }\n\n        return External[requestedSolver].solve(model);\n    }\n\n    /**\n     * Build a simplified result object from a full solution.\n     */\n    private buildSimplifiedResult(solution: ReturnType<Model[\"solve\"]>): SolveResult {\n        const result: SolveResult = {\n            feasible: solution.feasible,\n            result: solution.evaluation,\n            bounded: solution.bounded,\n        };\n\n        if (solution._tableau.__isIntegral) {\n            result.isIntegral = true;\n        }\n\n        // Add non-zero variable values\n        for (const varId of Object.keys(solution.solutionSet)) {\n            const value = solution.solutionSet[varId];\n            if (value !== 0) {\n                result[varId] = value;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Solve a multi-objective optimization problem.\n     *\n     * Returns a compromise solution using the mid-point formula between\n     * individually optimized objectives.\n     *\n     * @example\n     * const model = {\n     *     optimize: { profit: \"max\", risk: \"min\" },\n     *     constraints: { budget: { max: 1000 } },\n     *     variables: { ... }\n     * };\n     * const result = solver.MultiObjective(model);\n     */\n    MultiObjective(model: ModelDefinition): unknown {\n        return Polyopt(this, model);\n    }\n}\n\n// Create singleton instance\nconst solver = new Solver();\n\n// UMD module exports for various environments\nif (typeof define === \"function\") {\n    // AMD (RequireJS)\n    define([], () => solver);\n} else if (typeof window === \"object\") {\n    // Browser global\n    window.solver = solver;\n} else if (typeof self === \"object\") {\n    // Web Worker\n    self.solver = solver;\n}\n\nexport default solver;\n","/**\n * @file src/solver.ts\n * @description Main entry point for jsLPSolver library\n *\n * Re-exports the solver instance and all public types. This is the primary\n * import target for library consumers.\n *\n * @example\n * import solver from \"javascript-lp-solver\";\n * const result = solver.Solve(model);\n */\nimport solver from \"./main\";\n\nexport default solver;\n\n// Re-export all public types\nexport type {\n    Constraint,\n    ConstraintBound,\n    ConstraintRelation,\n    ExternalSolvers,\n    ExternalSolverModule,\n    Model,\n    ModelDefinition,\n    Numeral,\n    ObjectiveDirection,\n    Solution,\n    SolveOptions,\n    SolveResult,\n    SolverAPI,\n    Term,\n    Variable,\n    VariableCoefficients,\n} from \"./types/solver\";\n"],"names":["createCut","createBranch","simplexOps.simplex","simplexOps.phase1","simplexOps.phase2","simplexOps.dualSimplex","simplexOps.pivot","simplexOps.checkForCycles","mipOps.countIntegerValues","mipOps.isIntegral","mipOps.computeFractionalVolume","cuttingOps.addCutConstraints","cuttingOps.applyMIRCuts","cuttingOps.addLowerBoundMIRCut","cuttingOps.addUpperBoundMIRCut","mipOps.getMostFractionalVar","mipOps.getFractionalVarWithLowestCost","dynamicOps.putInBase","dynamicOps.takeOutOfBase","dynamicOps.updateVariableValues","dynamicOps.updateRightHandSide","dynamicOps.updateConstraintCoefficient","dynamicOps.updateCost","dynamicOps.addConstraint","dynamicOps.removeConstraint","dynamicOps.addVariable","dynamicOps.removeVariable","backupOps.copy","backupOps.save","backupOps.restore","logImpl","require$$0","lpsolve","expressions.Constraint","expressions.Variable","expressions.Numeral","expressions.Term"],"mappings":"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"}