Changeset 16233 for branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers
- Timestamp:
- 10/17/18 17:51:26 (6 years ago)
- Location:
- branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers
- Files:
-
- 7 added
- 9 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/Base/ISolver.cs
r16232 r16233 1 using HeuristicLab.Core; 1 using System.Threading; 2 using HeuristicLab.Core; 2 3 3 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms { 4 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base { 5 4 6 public interface ISolver : IParameterizedNamedItem { 7 LinearProgrammingType LinearProgrammingType { get; set; } 5 8 OptimizationProblemType OptimizationProblemType { get; } 6 string LibraryName { get; set; } 7 LinearProgrammingType LinearProgrammingType { get; set; } 9 bool SupportsPause { get; } 10 bool SupportsStop { get; } 11 12 void Interrupt(); 13 14 void Reset(); 15 16 void Solve(LinearProgrammingAlgorithm algorithm); 17 18 void Solve(LinearProgrammingAlgorithm algorithm, CancellationToken cancellationToken); 8 19 } 9 20 } -
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/Base/Solver.cs
r16232 r16233 1 using HeuristicLab.Common; 1 using System; 2 using System.Threading; 3 using HeuristicLab.Common; 2 4 using HeuristicLab.Core; 3 5 using HeuristicLab.Data; … … 5 7 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 6 8 7 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {9 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base { 8 10 9 public class Solver : ParameterizedNamedItem, ISolver { 11 [StorableClass] 12 public class Solver : ParameterizedNamedItem, ISolver, IDisposable { 10 13 11 14 [Storable] 12 protected I FixedValueParameter<StringValue> libraryNameParam;15 protected IValueParameter<EnumValue<LinearProgrammingType>> programmingTypeParam; 13 16 14 15 [Storable] 16 protected IFixedValueParameter<EnumValue<LinearProgrammingType>> programmingTypeParam; 17 protected LinearSolver solver; 17 18 18 19 public Solver() { 19 // Parameters.Add(useMixedIntegerProgrammingParam = new FixedValueParameter<BoolValue>(nameof(UseMixedIntegerProgramming), (BoolValue)new BoolValue(false).AsReadOnly())); 20 Parameters.Add(programmingTypeParam = new FixedValueParameter<EnumValue<LinearProgrammingType>>(nameof(LinearProgrammingType), new EnumValue<LinearProgrammingType>())); 20 Parameters.Add(programmingTypeParam = 21 new ValueParameter<EnumValue<LinearProgrammingType>>(nameof(LinearProgrammingType), 22 new EnumValue<LinearProgrammingType>())); 21 23 } 22 24 23 25 [StorableConstructor] 24 26 protected Solver(bool deserializing) 25 : base(deserializing) { } 27 : base(deserializing) { 28 } 26 29 27 30 protected Solver(Solver original, Cloner cloner) 28 31 : base(original, cloner) { 29 libraryNameParam = cloner.Clone(original.libraryNameParam);30 32 programmingTypeParam = cloner.Clone(original.programmingTypeParam); 31 33 } 32 33 public string LibraryName {34 get => libraryNameParam?.Value.Value;35 set => libraryNameParam.Value.Value = value;36 }37 38 public virtual OptimizationProblemType OptimizationProblemType { get; }39 34 40 35 public LinearProgrammingType LinearProgrammingType { … … 43 38 } 44 39 40 public virtual OptimizationProblemType OptimizationProblemType { get; } 41 public virtual bool SupportsPause => false; 42 public virtual bool SupportsStop => false; 43 45 44 public override IDeepCloneable Clone(Cloner cloner) => new Solver(this, cloner); 45 46 public void Dispose() => solver?.Dispose(); 47 48 public void Interrupt() => solver.Stop(); 49 50 public virtual void Reset() { 51 solver = null; 52 } 53 54 public virtual void Solve(LinearProgrammingAlgorithm algorithm, CancellationToken cancellationToken) => 55 Solve(algorithm, CancellationToken.None); 56 57 public virtual void Solve(LinearProgrammingAlgorithm algorithm) => 58 Solve(algorithm, algorithm.TimeLimit, false); 59 60 public virtual void Solve(LinearProgrammingAlgorithm algorithm, TimeSpan timeLimit, bool incrementality) { 61 var libraryName = string.Empty; 62 if (this is ExternalSolver externalSolver) 63 libraryName = externalSolver.LibraryName; 64 65 if (solver == null) { 66 solver = LinearSolver.CreateSolver(OptimizationProblemType, Name, 67 libraryName, s => algorithm.Problem.ProblemDefinition.BuildModel(s)); 68 } 69 70 solver.TimeLimit = timeLimit; 71 solver.RelativeGapTolerance = algorithm.RelativeGapTolerance; 72 solver.PrimalTolerance = algorithm.PrimalTolerance; 73 solver.DualTolerance = algorithm.DualTolerance; 74 solver.Presolve = algorithm.Presolve; 75 solver.Scaling = algorithm.Scaling; 76 solver.LpAlgorithm = algorithm.LpAlgorithm; 77 solver.Incrementality = incrementality; 78 79 solver.Solve(); 80 81 algorithm.Problem.ProblemDefinition.Analyze(solver.Solver, algorithm.Results); 82 algorithm.Results.AddOrUpdateResult("Result Status", new EnumValue<ResultStatus>(solver.ResultStatus)); 83 algorithm.Results.AddOrUpdateResult("Best Objective Value", 84 new DoubleValue(solver.ObjectiveValue ?? double.NaN)); 85 algorithm.Results.AddOrUpdateResult("Best Objective Bound", 86 new DoubleValue(solver.ObjectiveBound ?? double.NaN)); 87 algorithm.Results.AddOrUpdateResult("Absolute Gap", new DoubleValue(solver.AbsoluteGap ?? double.NaN)); 88 algorithm.Results.AddOrUpdateResult("Relative Gap", new DoubleValue(solver.RelativeGap ?? double.NaN)); 89 algorithm.Results.AddOrUpdateResult("Number of Constraints", new IntValue(solver.NumberOfConstraints)); 90 algorithm.Results.AddOrUpdateResult("Number of Variables", new IntValue(solver.NumberOfVariables)); 91 algorithm.Results.AddOrUpdateResult("Number of Nodes", new DoubleValue(solver.NumberOfNodes)); 92 algorithm.Results.AddOrUpdateResult("Iterations", new DoubleValue(solver.Iterations)); 93 algorithm.Results.AddOrUpdateResult("Solver Version", new StringValue(solver.SolverVersion)); 94 algorithm.Results.AddOrUpdateResult("Wall Time", new TimeSpanValue(solver.WallTime ?? TimeSpan.Zero)); 95 } 46 96 } 47 97 } -
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/BopSolver.cs
r16232 r16233 1 1 using HeuristicLab.Core; 2 using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base; 2 3 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 3 4 4 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms { 5 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers { 6 5 7 [Item("BOP", "BOP (https://developers.google.com/optimization/reference/bop/bop_solver/) can be used out of the box.")] 6 8 [StorableClass] 7 public class BopSolver : Solver {9 public class BopSolver : IncrementalSolver { 8 10 9 11 public BopSolver() { … … 12 14 13 15 public override OptimizationProblemType OptimizationProblemType => OptimizationProblemType.BOP_INTEGER_PROGRAMMING; 16 public override bool SupportsPause => true; 17 public override bool SupportsStop => true; 14 18 } 15 19 } -
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/CoinOrSolver.cs
r16232 r16233 1 1 using HeuristicLab.Core; 2 using HeuristicLab.Data; 3 using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base; 2 4 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 3 5 4 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms { 6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers { 7 5 8 [Item("Clp/Cbc", "Clp (https://projects.coin-or.org/Clp) and Cbc (https://projects.coin-or.org/Cbc) can be used out of the box.")] 6 9 [StorableClass] 7 public class CoinOrSolver : Solver { 10 public class CoinOrSolver : IncrementalSolver { 11 12 public CoinOrSolver() { 13 programmingTypeParam.Value.ValueChanged += (sender, args) => { 14 if (((EnumValue<LinearProgrammingType>)sender).Value == LinearProgrammingType.LinearProgramming) { 15 incrementalityParam.Value = new BoolValue(true); 16 incrementalityParam.Value.ValueChanged += (s, a) => { 17 if (((BoolValue)s).Value) { 18 qualityUpdateIntervalParam.Value = new TimeSpanValue(qualityUpdateIntervalParam.Value.Value); 19 } else { 20 qualityUpdateIntervalParam.Value = (TimeSpanValue)qualityUpdateIntervalParam.Value.AsReadOnly(); 21 } 22 }; 23 } else { 24 incrementalityParam.Value = (BoolValue)new BoolValue().AsReadOnly(); 25 } 26 }; 27 } 8 28 9 29 public override OptimizationProblemType OptimizationProblemType => -
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/CplexSolver.cs
r16232 r16233 1 1 using HeuristicLab.Core; 2 2 using HeuristicLab.Data; 3 using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base; 3 4 using HeuristicLab.Parameters; 4 5 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 5 6 6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {7 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers { 7 8 8 9 [Item("CPLEX", "CPLEX (https://www.ibm.com/analytics/cplex-optimizer) must be installed and licenced.")] 9 10 [StorableClass] 10 public class CplexSolver : Solver {11 public class CplexSolver : ExternalIncrementalSolver { 11 12 12 13 public CplexSolver() { 13 Parameters.Add(libraryNameParam = new FixedValueParameter<StringValue>(nameof(LibraryName), new StringValue("cplex1280.dll"))); 14 Parameters.Add(libraryNameParam = new FixedValueParameter<FileValue>(nameof(LibraryName), 15 new FileValue { FileDialogFilter = FileDialogFilter, Value = "cplex1280.dll" })); 14 16 } 15 17 -
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/GlopSolver.cs
r16232 r16233 1 1 using HeuristicLab.Core; 2 2 using HeuristicLab.Data; 3 using HeuristicLab. Parameters;3 using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base; 4 4 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 5 5 6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms { 6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers { 7 7 8 [Item("Glop", "Glop (https://developers.google.com/optimization/lp/glop) can be used out of the box.")] 8 9 [StorableClass] 9 public class GlopSolver : Solver {10 public class GlopSolver : IncrementalSolver { 10 11 11 12 public GlopSolver() { 12 Parameters.Remove(programmingTypeParam); 13 Parameters.Add(programmingTypeParam = new FixedValueParameter<EnumValue<LinearProgrammingType>>(nameof(LinearProgrammingType), 14 (EnumValue<LinearProgrammingType>)new EnumValue<LinearProgrammingType>().AsReadOnly())); 13 programmingTypeParam.Value = (EnumValue<LinearProgrammingType>)programmingTypeParam.Value.AsReadOnly(); 15 14 } 16 15 17 16 public override OptimizationProblemType OptimizationProblemType => OptimizationProblemType.GLOP_LINEAR_PROGRAMMING; 17 public override bool SupportsPause => true; 18 public override bool SupportsStop => true; 18 19 } 19 20 } -
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/GlpkSolver.cs
r16232 r16233 1 1 using HeuristicLab.Core; 2 2 using HeuristicLab.Data; 3 using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base; 3 4 using HeuristicLab.Parameters; 4 5 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 5 6 6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms { 7 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers { 8 7 9 [Item("GLPK", "GLPK (https://www.gnu.org/software/glpk/) can be used out of the box.")] 8 10 [StorableClass] 9 public class GlpkSolver : Solver {11 public class GlpkSolver : ExternalIncrementalSolver { 10 12 11 13 public GlpkSolver() { 12 Parameters.Add(libraryNameParam = new FixedValueParameter<StringValue>(nameof(LibraryName), new StringValue("glpk_4_65.dll"))); 14 Parameters.Add(libraryNameParam = new FixedValueParameter<FileValue>(nameof(LibraryName), 15 new FileValue { FileDialogFilter = FileDialogFilter, Value = "glpk465.dll" })); 16 17 programmingTypeParam.Value.ValueChanged += (sender, args) => { 18 if (((EnumValue<LinearProgrammingType>)sender).Value == LinearProgrammingType.LinearProgramming) { 19 incrementalityParam.Value = new BoolValue(true); 20 incrementalityParam.Value.ValueChanged += (s, a) => { 21 if (((BoolValue)s).Value) { 22 qualityUpdateIntervalParam.Value = new TimeSpanValue(qualityUpdateIntervalParam.Value.Value); 23 } else { 24 qualityUpdateIntervalParam.Value = (TimeSpanValue)qualityUpdateIntervalParam.Value.AsReadOnly(); 25 } 26 }; 27 } else { 28 incrementalityParam.Value = (BoolValue)new BoolValue().AsReadOnly(); 29 } 30 }; 13 31 } 14 32 -
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/GurobiSolver.cs
r16232 r16233 1 using HeuristicLab.Core; 1 using HeuristicLab.Common; 2 using HeuristicLab.Core; 2 3 using HeuristicLab.Data; 4 using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base; 3 5 using HeuristicLab.Parameters; 4 6 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 5 7 6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms { 8 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers { 9 7 10 [Item("Gurobi", "Gurobi (http://www.gurobi.com/) must be installed and licenced.")] 8 11 [StorableClass] 9 public class GurobiSolver : Solver {12 public class GurobiSolver : ExternalIncrementalSolver { 10 13 11 14 public GurobiSolver() { 12 Parameters.Add(libraryNameParam = new FixedValueParameter<StringValue>(nameof(LibraryName), new StringValue("gurobi80.dll"))); 15 Parameters.Add(libraryNameParam = new FixedValueParameter<FileValue>(nameof(LibraryName), 16 new FileValue { FileDialogFilter = FileDialogFilter, Value = "gurobi80.dll" })); 17 } 18 19 protected GurobiSolver(GurobiSolver original, Cloner cloner) 20 : base(original, cloner) { 21 programmingTypeParam = cloner.Clone(original.programmingTypeParam); 13 22 } 14 23 … … 17 26 ? OptimizationProblemType.GUROBI_LINEAR_PROGRAMMING 18 27 : OptimizationProblemType.GUROBI_MIXED_INTEGER_PROGRAMMING; 28 29 public override bool SupportsPause => true; 30 public override bool SupportsStop => true; 19 31 } 20 32 } -
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/ScipSolver.cs
r16232 r16233 1 1 using HeuristicLab.Core; 2 2 using HeuristicLab.Data; 3 using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base; 3 4 using HeuristicLab.Parameters; 4 5 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 5 6 6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms { 7 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers { 8 7 9 [Item("SCIP", "SCIP (http://scip.zib.de/) must be installed and licenced.")] 8 10 [StorableClass] 9 public class ScipSolver : Solver {11 public class ScipSolver : ExternalSolver { 10 12 11 13 public ScipSolver() { 12 Parameters.Add(libraryNameParam = new FixedValueParameter<StringValue>(nameof(LibraryName), new StringValue("scip.dll"))); 13 Parameters.Remove(programmingTypeParam); 14 Parameters.Add(programmingTypeParam = new FixedValueParameter<EnumValue<LinearProgrammingType>>(nameof(LinearProgrammingType), 15 (EnumValue<LinearProgrammingType>)new EnumValue<LinearProgrammingType>(LinearProgrammingType.MixedIntegerProgramming).AsReadOnly())); 14 Parameters.Add(libraryNameParam = new FixedValueParameter<FileValue>(nameof(LibraryName), 15 new FileValue { FileDialogFilter = FileDialogFilter, Value = "scip.dll" })); 16 programmingTypeParam.Value = 17 (EnumValue<LinearProgrammingType>)new EnumValue<LinearProgrammingType>(LinearProgrammingType 18 .MixedIntegerProgramming).AsReadOnly(); 16 19 } 17 20 18 21 public override OptimizationProblemType OptimizationProblemType => 19 22 OptimizationProblemType.SCIP_MIXED_INTEGER_PROGRAMMING; 23 24 public override bool SupportsPause => true; 25 public override bool SupportsStop => true; 20 26 } 21 27 }
Note: See TracChangeset
for help on using the changeset viewer.