Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/17/18 17:51:26 (6 years ago)
Author:
ddorfmei
Message:

#2931:

  • added all available parameters OR-Tools's linear_solver to LinearProgrammingAlgorithm
    • added necessary parameter enums
  • moved solving logic to Solver
    • created IncrementalSolver, ExternalSolver, ExternalIncrementalSolver
    • added logic for solvers that can be stopped and resumed
  • added SupportsStop property to BasicAlgorithm
  • added quality per time chart for incremental solvers
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;
     1using System.Threading;
     2using HeuristicLab.Core;
    23
    3 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
     4namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base {
     5
    46  public interface ISolver : IParameterizedNamedItem {
     7    LinearProgrammingType LinearProgrammingType { get; set; }
    58    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);
    819  }
    920}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/Base/Solver.cs

    r16232 r16233  
    1 using HeuristicLab.Common;
     1using System;
     2using System.Threading;
     3using HeuristicLab.Common;
    24using HeuristicLab.Core;
    35using HeuristicLab.Data;
     
    57using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    68
    7 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
     9namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base {
    810
    9   public class Solver : ParameterizedNamedItem, ISolver {
     11  [StorableClass]
     12  public class Solver : ParameterizedNamedItem, ISolver, IDisposable {
    1013
    1114    [Storable]
    12     protected IFixedValueParameter<StringValue> libraryNameParam;
     15    protected IValueParameter<EnumValue<LinearProgrammingType>> programmingTypeParam;
    1316
    14 
    15     [Storable]
    16     protected IFixedValueParameter<EnumValue<LinearProgrammingType>> programmingTypeParam;
     17    protected LinearSolver solver;
    1718
    1819    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>()));
    2123    }
    2224
    2325    [StorableConstructor]
    2426    protected Solver(bool deserializing)
    25       : base(deserializing) { }
     27      : base(deserializing) {
     28    }
    2629
    2730    protected Solver(Solver original, Cloner cloner)
    2831      : base(original, cloner) {
    29       libraryNameParam = cloner.Clone(original.libraryNameParam);
    3032      programmingTypeParam = cloner.Clone(original.programmingTypeParam);
    3133    }
    32 
    33     public string LibraryName {
    34       get => libraryNameParam?.Value.Value;
    35       set => libraryNameParam.Value.Value = value;
    36     }
    37 
    38     public virtual OptimizationProblemType OptimizationProblemType { get; }
    3934
    4035    public LinearProgrammingType LinearProgrammingType {
     
    4338    }
    4439
     40    public virtual OptimizationProblemType OptimizationProblemType { get; }
     41    public virtual bool SupportsPause => false;
     42    public virtual bool SupportsStop => false;
     43
    4544    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    }
    4696  }
    4797}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/BopSolver.cs

    r16232 r16233  
    11using HeuristicLab.Core;
     2using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base;
    23using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    34
    4 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
     5namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers {
     6
    57  [Item("BOP", "BOP (https://developers.google.com/optimization/reference/bop/bop_solver/) can be used out of the box.")]
    68  [StorableClass]
    7   public class BopSolver : Solver {
     9  public class BopSolver : IncrementalSolver {
    810
    911    public BopSolver() {
     
    1214
    1315    public override OptimizationProblemType OptimizationProblemType => OptimizationProblemType.BOP_INTEGER_PROGRAMMING;
     16    public override bool SupportsPause => true;
     17    public override bool SupportsStop => true;
    1418  }
    1519}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/CoinOrSolver.cs

    r16232 r16233  
    11using HeuristicLab.Core;
     2using HeuristicLab.Data;
     3using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base;
    24using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    35
    4 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
     6namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers {
     7
    58  [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.")]
    69  [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    }
    828
    929    public override OptimizationProblemType OptimizationProblemType =>
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/CplexSolver.cs

    r16232 r16233  
    11using HeuristicLab.Core;
    22using HeuristicLab.Data;
     3using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base;
    34using HeuristicLab.Parameters;
    45using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    56
    6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
     7namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers {
    78
    89  [Item("CPLEX", "CPLEX (https://www.ibm.com/analytics/cplex-optimizer) must be installed and licenced.")]
    910  [StorableClass]
    10   public class CplexSolver : Solver {
     11  public class CplexSolver : ExternalIncrementalSolver {
    1112
    1213    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" }));
    1416    }
    1517
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/GlopSolver.cs

    r16232 r16233  
    11using HeuristicLab.Core;
    22using HeuristicLab.Data;
    3 using HeuristicLab.Parameters;
     3using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base;
    44using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    55
    6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
     6namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers {
     7
    78  [Item("Glop", "Glop (https://developers.google.com/optimization/lp/glop) can be used out of the box.")]
    89  [StorableClass]
    9   public class GlopSolver : Solver {
     10  public class GlopSolver : IncrementalSolver {
    1011
    1112    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();
    1514    }
    1615
    1716    public override OptimizationProblemType OptimizationProblemType => OptimizationProblemType.GLOP_LINEAR_PROGRAMMING;
     17    public override bool SupportsPause => true;
     18    public override bool SupportsStop => true;
    1819  }
    1920}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/GlpkSolver.cs

    r16232 r16233  
    11using HeuristicLab.Core;
    22using HeuristicLab.Data;
     3using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base;
    34using HeuristicLab.Parameters;
    45using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    56
    6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
     7namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers {
     8
    79  [Item("GLPK", "GLPK (https://www.gnu.org/software/glpk/) can be used out of the box.")]
    810  [StorableClass]
    9   public class GlpkSolver : Solver {
     11  public class GlpkSolver : ExternalIncrementalSolver {
    1012
    1113    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      };
    1331    }
    1432
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/GurobiSolver.cs

    r16232 r16233  
    1 using HeuristicLab.Core;
     1using HeuristicLab.Common;
     2using HeuristicLab.Core;
    23using HeuristicLab.Data;
     4using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base;
    35using HeuristicLab.Parameters;
    46using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    57
    6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
     8namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers {
     9
    710  [Item("Gurobi", "Gurobi (http://www.gurobi.com/) must be installed and licenced.")]
    811  [StorableClass]
    9   public class GurobiSolver : Solver {
     12  public class GurobiSolver : ExternalIncrementalSolver {
    1013
    1114    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);
    1322    }
    1423
     
    1726        ? OptimizationProblemType.GUROBI_LINEAR_PROGRAMMING
    1827        : OptimizationProblemType.GUROBI_MIXED_INTEGER_PROGRAMMING;
     28
     29    public override bool SupportsPause => true;
     30    public override bool SupportsStop => true;
    1931  }
    2032}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/ScipSolver.cs

    r16232 r16233  
    11using HeuristicLab.Core;
    22using HeuristicLab.Data;
     3using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base;
    34using HeuristicLab.Parameters;
    45using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    56
    6 namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
     7namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers {
     8
    79  [Item("SCIP", "SCIP (http://scip.zib.de/) must be installed and licenced.")]
    810  [StorableClass]
    9   public class ScipSolver : Solver {
     11  public class ScipSolver : ExternalSolver {
    1012
    1113    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();
    1619    }
    1720
    1821    public override OptimizationProblemType OptimizationProblemType =>
    1922      OptimizationProblemType.SCIP_MIXED_INTEGER_PROGRAMMING;
     23
     24    public override bool SupportsPause => true;
     25    public override bool SupportsStop => true;
    2026  }
    2127}
Note: See TracChangeset for help on using the changeset viewer.