public LinearProgamSolution Solve(LinearProgram linearProgram) { //check if needs initialization bool needsInit = linearProgram.Coefficients.Any(c => c[0] < 0); if (needsInit) { //solve dual var dual = _mapPrimalToDual.Map(linearProgram); var dualSol = SolveSingle(dual); //todo: check if feasbile if (dualSol.SolutionType != LinearProgramSolutionType.Solved) { return(new LinearProgamSolution(0, 0, LinearProgramSolutionType.Infeasible)); } //map back to primal var primal = _mapDualToPrimal.Map(dual); //restore objective _restoreObjective.Restore(primal, dual.OriginalObjectiveCoefficients, dual.OriginalNonBasicIndices); //solve var primalSol = SolveSingle(primal); return(primalSol); } else { return(SolveSingle(linearProgram)); } }
public void ShouldMap_Vl01() { var primal = _reader.Read(DictionaryFiles + "vl1.dict"); var dual = _mapPrimalToDual.Map(primal); //verify m,n dual.M.ShouldEqual(primal.N); dual.N.ShouldEqual(primal.M); //verify indices dual.BasicIndices.Length.ShouldEqual(primal.NonBasicIndices.Length); dual.BasicIndices[1].ShouldEqual(1); dual.BasicIndices[2].ShouldEqual(2); dual.NonBasicIndices.Length.ShouldEqual(primal.BasicIndices.Length); dual.NonBasicIndices[1].ShouldEqual(3); dual.NonBasicIndices[2].ShouldEqual(4); dual.NonBasicIndices[3].ShouldEqual(5); dual.NonBasicIndices[4].ShouldEqual(6); VerifyDual(primal, dual); }