import type Model from "../model"; import type { Constraint, Variable } from "../expressions"; import type { BranchCut, OptionalObjective, TableauSolution, VariableValue } from "./types"; import type { BranchAndCutService } from "./branch-and-cut"; export default class Tableau { model: Model | null; matrix: Float64Array; width: number; height: number; costRowIndex: number; rhsColumn: number; variablesPerIndex: Array; unrestrictedVars: Record; feasible: boolean; evaluation: number; simplexIters: number; varIndexByRow: number[]; varIndexByCol: number[]; rowByVarIndex: number[]; colByVarIndex: number[]; precision: number; optionalObjectives: OptionalObjective[]; objectivesByPriority: Record; optionalObjectivePerPriority: Record; savedState: Tableau | null; availableIndexes: number[]; lastElementIndex: number; variables: Variable[]; nVars: number; bounded: boolean; unboundedVarIndex: number | null; branchAndCutIterations: number; bestPossibleEval: number; __isIntegral?: boolean; pricingBatchStart: number; pricingBatchSize: number; readonly branchAndCutService: BranchAndCutService; constructor(precision?: number, branchAndCutService?: BranchAndCutService); simplex(): this; phase1(): number; phase2(): number; /** * Dual simplex for warm-starting after adding bound constraints. * Use when solution is dual feasible but may be primal infeasible. * @returns Number of iterations, or -1 if dual infeasible */ dualSimplex(): number; pivot(pivotRowIndex: number, pivotColumnIndex: number): void; checkForCycles(varIndexes: Array<[number, number]>): number[]; countIntegerValues(): number; isIntegral(): boolean; computeFractionalVolume(ignoreIntegerValues?: boolean): number; addCutConstraints(branchingCuts: BranchCut[]): void; applyMIRCuts(): void; addLowerBoundMIRCut(rowIndex: number): boolean; addUpperBoundMIRCut(rowIndex: number): boolean; getMostFractionalVar(): VariableValue; getFractionalVarWithLowestCost(): VariableValue; putInBase(varIndex: number): number; takeOutOfBase(varIndex: number): number; updateVariableValues(): void; updateRightHandSide(constraint: Constraint, difference: number): void; updateConstraintCoefficient(constraint: Constraint, variable: Variable, difference: number): void; updateCost(variable: Variable, difference: number): void; addConstraint(constraint: Constraint): void; removeConstraint(constraint: Constraint): void; addVariable(variable: Variable): void; removeVariable(variable: Variable): void; copy(): Tableau; save(): void; restore(): void; log(message: unknown): this; applyCuts(branchingCuts: BranchCut[]): void; branchAndCut(): void; solve(): TableauSolution; getSolution(): TableauSolution; setOptionalObjective(priority: number, column: number, cost: number): void; initialize(width: number, height: number, variables: Variable[], unrestrictedVars: Record): void; _resetMatrix(): void; setModel(model: Model): this; getNewElementIndex(): number; density(): number; setEvaluation(): void; }