Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/12/18 14:23:45 (5 years ago)
Author:
ddorfmei
Message:

#2931:

  • upgraded Google OR-Tools to version 6.10
  • added TextValue and TextValueView to be able to display and edit a multiline string
  • added parameter to set solver specific parameters for supported solvers
  • added support for the Protocol Buffers representation of models (import/export)
  • added import of MPS models
  • added pause/stop functionality to CplexSolver and GlpkSolver
  • refactored wrapper (LinearSolver and related enums)
  • added new algorithm category Exact for LinearProgrammingAlgorithm
Location:
branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming
Files:
3 added
16 edited
5 moved

Legend:

Unmodified
Added
Removed
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/LinearProgrammingAlgorithm.cs

    r16288 r16373  
    3535namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
    3636
    37   [Item("Linear/Mixed Integer Programming (LP/MIP)", "")]
    38   [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms)]
     37  [Item("Linear/Mixed Integer Programming (LP/MIP)", "Linear/mixed integer programming implemented in several solvers. " +
     38    "See also https://dev.heuristiclab.com/trac.fcgi/wiki/Documentation/Howto/LinearMixedIntegerProgramming")] // TODO: update link
     39  [Creatable(CreatableAttribute.Categories.ExactAlgorithms)]
    3940  [StorableClass]
    4041  public class LinearProgrammingAlgorithm : BasicAlgorithm {
     
    5354
    5455    [Storable]
    55     private readonly IFixedValueParameter<DoubleValue> relativeGapToleranceParam;
     56    private readonly IFixedValueParameter<PercentValue> relativeGapToleranceParam;
    5657
    5758    [Storable]
     
    6566
    6667    public IConstrainedValueParameter<ISolver> SolverParameter {
    67       get { return solverParam; }
    68       set { solverParam = value; }
     68      get => solverParam;
     69      set => solverParam = value;
    6970    }
    7071
     
    7273      Parameters.Add(solverParam =
    7374        new ConstrainedValueParameter<ISolver>(nameof(Solver), "The solver used to solve the model."));
    74       Parameters.Add(relativeGapToleranceParam = new FixedValueParameter<DoubleValue>(nameof(RelativeGapTolerance),
    75         "Limit for relative MIP gap.", new DoubleValue(MPSolverParameters.kDefaultRelativeMipGap)));
     75
     76      ISolver defaultSolver;
     77      solverParam.ValidValues.Add(new BopSolver());
     78      solverParam.ValidValues.Add(defaultSolver = new CoinOrSolver());
     79      solverParam.ValidValues.Add(new CplexSolver());
     80      solverParam.ValidValues.Add(new GlopSolver());
     81      solverParam.ValidValues.Add(new GlpkSolver());
     82      solverParam.ValidValues.Add(new GurobiSolver());
     83      solverParam.ValidValues.Add(new ScipSolver());
     84      solverParam.Value = defaultSolver;
     85
     86      Parameters.Add(relativeGapToleranceParam = new FixedValueParameter<PercentValue>(nameof(RelativeGapTolerance),
     87        "Limit for relative MIP gap.", new PercentValue(MPSolverParameters.kDefaultRelativeMipGap)));
    7688      Parameters.Add(timeLimitParam = new FixedValueParameter<TimeSpanValue>(nameof(TimeLimit),
    7789        "Limit for runtime. Set to zero for unlimited runtime.", new TimeSpanValue()));
     
    92104
    93105      Problem = new LinearProgrammingProblem();
    94 
    95       solverParam.ValidValues.Add(new CoinOrSolver());
    96       solverParam.ValidValues.Add(new CplexSolver());
    97       solverParam.ValidValues.Add(new GlpkSolver());
    98       solverParam.ValidValues.Add(new GurobiSolver());
    99       solverParam.ValidValues.Add(new ScipSolver());
    100       solverParam.ValidValues.Add(new BopSolver());
    101       solverParam.ValidValues.Add(new GlopSolver());
    102106    }
    103107
     
    176180    public override void Pause() {
    177181      base.Pause();
    178       Solver.Interrupt();
     182      Solver.InterruptSolve();
    179183    }
    180184
     
    190194    public override void Stop() {
    191195      base.Stop();
    192       Solver.Interrupt();
    193     }
    194 
    195     protected override void Initialize(CancellationToken cancellationToken) {
    196       base.Initialize(cancellationToken);
     196      Solver.InterruptSolve();
    197197    }
    198198
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/ProblemType.cs

    r16372 r16373  
    2222namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms {
    2323
    24   public enum LinearProgrammingType {
     24  public enum ProblemType {
    2525    LinearProgramming,
    2626    MixedIntegerProgramming
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/Base/IIncrementalSolver.cs

    r16288 r16373  
    2525
    2626  public interface IIncrementalSolver : ISolver {
    27     bool Incrementality { get; set; }
    2827    TimeSpan QualityUpdateInterval { get; set; }
     28    bool SupportsQualityUpdate { get; }
    2929  }
    3030}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/Base/ISolver.cs

    r16288 r16373  
    2626
    2727  public interface ISolver : IParameterizedNamedItem {
    28     LinearProgrammingType LinearProgrammingType { get; set; }
     28    ProblemType ProblemType { get; set; }
    2929    bool SupportsPause { get; }
    3030    bool SupportsStop { get; }
    3131
    32     void Interrupt();
     32    bool InterruptSolve();
    3333
    3434    void Reset();
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/Base/IncrementalSolver.cs

    r16288 r16373  
    2323using System.Linq;
    2424using System.Threading;
    25 using Google.OrTools.LinearSolver;
    2625using HeuristicLab.Analysis;
    2726using HeuristicLab.Common;
     
    3534  [StorableClass]
    3635  public class IncrementalSolver : Solver, IIncrementalSolver {
    37 
    38     [Storable]
    39     protected readonly IValueParameter<BoolValue> incrementalityParam;
    4036
    4137    [Storable]
     
    5551
    5652    public IncrementalSolver() {
    57       Parameters.Add(incrementalityParam = new ValueParameter<BoolValue>(nameof(Incrementality),
    58         "Advanced usage: incrementality from one solve to the next.",
    59         new BoolValue(MPSolverParameters.kDefaultIncrementality == MPSolverParameters.INCREMENTALITY_ON)));
    6053      Parameters.Add(qualityUpdateIntervalParam =
    6154        new ValueParameter<TimeSpanValue>(nameof(QualityUpdateInterval),
    62           "Time interval before solver is paused, resuls are retrieved and solver is resumed.",
    63           new TimeSpanValue(new TimeSpan(0, 0, 10))));
    64 
    65       incrementalityParam.Value.ValueChanged += (sender, args) => {
    66         if (((BoolValue)sender).Value) {
    67           qualityUpdateIntervalParam.Value = new TimeSpanValue(qualityUpdateIntervalParam.Value.Value);
     55          "Time interval before solver is paused, results are retrieved and solver is resumed. " +
     56          "Set to zero for no intermediate results and faster solving.", new TimeSpanValue(new TimeSpan(0, 0, 10))));
     57      problemTypeParam.Value.ValueChanged += (sender, args) => {
     58        if (SupportsQualityUpdate) {
     59          if (!Parameters.Contains(qualityUpdateIntervalParam)) {
     60            Parameters.Add(qualityUpdateIntervalParam);
     61          }
    6862        } else {
    69           qualityUpdateIntervalParam.Value = (TimeSpanValue)qualityUpdateIntervalParam.Value.AsReadOnly();
     63          Parameters.Remove(qualityUpdateIntervalParam);
    7064        }
    7165      };
     
    7468    protected IncrementalSolver(IncrementalSolver original, Cloner cloner)
    7569        : base(original, cloner) {
    76       programmingTypeParam = cloner.Clone(original.programmingTypeParam);
     70      problemTypeParam = cloner.Clone(original.problemTypeParam);
    7771      qualityUpdateIntervalParam = cloner.Clone(original.qualityUpdateIntervalParam);
    78       incrementalityParam = cloner.Clone(original.incrementalityParam);
    7972      if (original.qualityPerClock != null)
    8073        qualityPerClock = cloner.Clone(original.qualityPerClock);
    8174    }
    8275
    83     public bool Incrementality {
    84       get => incrementalityParam.Value.Value;
    85       set => incrementalityParam.Value.Value = value;
    86     }
     76    public virtual bool SupportsQualityUpdate => true;
    8777
    8878    public TimeSpan QualityUpdateInterval {
     
    9181    }
    9282
     83    protected virtual TimeSpan TimeLimit => QualityUpdateInterval;
     84
    9385    public override void Solve(LinearProgrammingAlgorithm algorithm, CancellationToken cancellationToken) {
    94       if (!Incrementality) {
     86      if (!SupportsQualityUpdate || QualityUpdateInterval == TimeSpan.Zero) {
    9587        base.Solve(algorithm, cancellationToken);
    9688        return;
     
    10193
    10294      if (!unlimitedRuntime) {
    103         var wallTime = ((TimeSpanValue)algorithm.Results.SingleOrDefault(r => r.Name == "Wall Time")?.Value)?.Value;
    104         if (wallTime.HasValue) {
    105           timeLimit -= wallTime.Value;
    106         }
     95        timeLimit -= algorithm.ExecutionTime;
    10796      }
    10897
    10998      var iterations = (long)timeLimit.TotalMilliseconds / (long)QualityUpdateInterval.TotalMilliseconds;
    11099      var remaining = timeLimit - TimeSpan.FromMilliseconds(iterations * QualityUpdateInterval.TotalMilliseconds);
    111       var validResultStatuses = new[] { ResultStatus.NOT_SOLVED, ResultStatus.FEASIBLE };
     100      var validResultStatuses = new[] { ResultStatus.NotSolved, ResultStatus.Feasible };
    112101
    113102      while (unlimitedRuntime || iterations > 0) {
    114         base.Solve(algorithm, QualityUpdateInterval, true);
     103        if (cancellationToken.IsCancellationRequested)
     104          return;
     105
     106        base.Solve(algorithm, TimeLimit);
    115107        UpdateQuality(algorithm);
    116108
    117         var resultStatus = ((EnumValue<ResultStatus>)algorithm.Results["Result Status"].Value).Value;
    118         if (!validResultStatuses.Contains(resultStatus) || cancellationToken.IsCancellationRequested)
     109        var resultStatus = ((EnumValue<ResultStatus>)algorithm.Results[nameof(solver.ResultStatus)].Value).Value;
     110        if (!validResultStatuses.Contains(resultStatus))
    119111          return;
    120112
     
    124116
    125117      if (remaining > TimeSpan.Zero) {
    126         base.Solve(algorithm, remaining, true);
     118        base.Solve(algorithm, remaining);
    127119        UpdateQuality(algorithm);
    128120      }
     
    132124      if (!algorithm.Results.Exists(r => r.Name == "QualityPerClock")) {
    133125        qualityPerClock = new IndexedDataTable<double>("Quality per Clock");
    134         qpcRow = new IndexedDataRow<double>("First-hit Graph Objective");
    135         bpcRow = new IndexedDataRow<double>("First-hit Graph Bound");
     126        qpcRow = new IndexedDataRow<double>("Objective Value");
     127        bpcRow = new IndexedDataRow<double>("Bound");
    136128        algorithm.Results.AddOrUpdateResult("QualityPerClock", qualityPerClock);
    137129      }
    138130
    139       var resultStatus = ((EnumValue<ResultStatus>)algorithm.Results["Result Status"].Value).Value;
     131      var resultStatus = ((EnumValue<ResultStatus>)algorithm.Results[nameof(solver.ResultStatus)].Value).Value;
    140132
    141       if (new[] { ResultStatus.ABNORMAL, ResultStatus.NOT_SOLVED, ResultStatus.UNBOUNDED }.Contains(resultStatus))
     133      if (new[] { ResultStatus.Abnormal, ResultStatus.NotSolved, ResultStatus.Unbounded }.Contains(resultStatus))
    142134        return;
    143135
    144       var objective = ((DoubleValue)algorithm.Results["Best Objective Value"].Value).Value;
    145       var bound = ((DoubleValue)algorithm.Results["Best Objective Bound"].Value).Value;
     136      var objective = ((DoubleValue)algorithm.Results[$"Best{nameof(solver.ObjectiveValue)}"].Value).Value;
     137      var bound = solver.IsMip ? ((DoubleValue)algorithm.Results[$"Best{nameof(solver.ObjectiveBound)}"].Value).Value : double.NaN;
    146138      var time = algorithm.ExecutionTime.TotalSeconds;
    147139
     
    151143          qpcRow.Values.Add(Tuple.Create(time, objective));
    152144          qualityPerClock.Rows.Add(qpcRow);
    153           algorithm.Results.AddOrUpdateResult("Best Solution Found At", new TimeSpanValue(TimeSpan.FromSeconds(time)));
     145          algorithm.Results.AddOrUpdateResult($"Best{nameof(solver.ObjectiveValue)}FoundAt", new TimeSpanValue(TimeSpan.FromSeconds(time)));
    154146        }
    155147      } else {
     
    158150        if (!objective.IsAlmost(previousBest)) {
    159151          qpcRow.Values.Add(Tuple.Create(time, objective));
    160           algorithm.Results.AddOrUpdateResult("Best Solution Found At", new TimeSpanValue(TimeSpan.FromSeconds(time)));
     152          algorithm.Results.AddOrUpdateResult($"Best{nameof(solver.ObjectiveValue)}FoundAt", new TimeSpanValue(TimeSpan.FromSeconds(time)));
    161153        }
    162154      }
     155
     156      if (!solver.IsMip)
     157        return;
    163158
    164159      if (!bpcRow.Values.Any()) {
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/Base/Solver.cs

    r16288 r16373  
    3434
    3535    [Storable]
    36     protected IValueParameter<EnumValue<LinearProgrammingType>> programmingTypeParam;
     36    protected IValueParameter<EnumValue<ProblemType>> problemTypeParam;
    3737
    3838    protected LinearSolver solver;
    3939
     40    [Storable]
     41    protected IFixedValueParameter<TextValue> solverSpecificParametersParam;
     42
    4043    public Solver() {
    41       Parameters.Add(programmingTypeParam =
    42         new ValueParameter<EnumValue<LinearProgrammingType>>(nameof(LinearProgrammingType),
    43           new EnumValue<LinearProgrammingType>()));
     44      Parameters.Add(problemTypeParam =
     45        new ValueParameter<EnumValue<ProblemType>>(nameof(ProblemType), new EnumValue<ProblemType>()));
     46      Parameters.Add(solverSpecificParametersParam =
     47        new FixedValueParameter<TextValue>(nameof(SolverSpecificParameters), new TextValue()));
    4448    }
    4549
     
    5155    protected Solver(Solver original, Cloner cloner)
    5256      : base(original, cloner) {
    53       programmingTypeParam = cloner.Clone(original.programmingTypeParam);
     57      problemTypeParam = cloner.Clone(original.problemTypeParam);
     58      solverSpecificParametersParam = cloner.Clone(original.solverSpecificParametersParam);
    5459    }
    5560
    56     public LinearProgrammingType LinearProgrammingType {
    57       get => programmingTypeParam.Value.Value;
    58       set => programmingTypeParam.Value.Value = value;
     61    public ProblemType ProblemType {
     62      get => problemTypeParam.Value.Value;
     63      set => problemTypeParam.Value.Value = value;
    5964    }
    6065
     66    public TextValue SolverSpecificParameters => solverSpecificParametersParam.Value;
     67
     68    public virtual bool SupportsPause => true;
     69    public virtual bool SupportsStop => true;
    6170    protected virtual OptimizationProblemType OptimizationProblemType { get; }
    62     public virtual bool SupportsPause => false;
    63     public virtual bool SupportsStop => false;
    6471
    6572    public override IDeepCloneable Clone(Cloner cloner) => new Solver(this, cloner);
     
    6774    public void Dispose() => solver?.Dispose();
    6875
    69     public void Interrupt() => solver.Stop();
     76    public bool InterruptSolve() => solver?.InterruptSolve() ?? false;
    7077
    7178    public virtual void Reset() {
     
    7885
    7986    public virtual void Solve(LinearProgrammingAlgorithm algorithm) =>
    80       Solve(algorithm, algorithm.TimeLimit, false);
     87      Solve(algorithm, algorithm.TimeLimit);
    8188
    82     public virtual void Solve(LinearProgrammingAlgorithm algorithm, TimeSpan timeLimit, bool incrementality) {
     89    public virtual void Solve(LinearProgrammingAlgorithm algorithm, TimeSpan timeLimit) {
    8390      string libraryName = null;
    8491      if (this is IExternalSolver externalSolver)
     
    8693
    8794      if (solver == null) {
    88         solver = LinearSolver.CreateSolver(OptimizationProblemType, Name,
    89           libraryName, s => algorithm.Problem.ProblemDefinition.BuildModel(s));
     95        solver = new LinearSolver(OptimizationProblemType, s => algorithm.Problem.ProblemDefinition.BuildModel(s), Name,
     96          libraryName);
    9097      }
    9198
     
    97104      solver.Scaling = algorithm.Scaling;
    98105      solver.LpAlgorithm = algorithm.LpAlgorithm;
    99       solver.Incrementality = incrementality;
     106      solver.Incrementality = true;
     107
     108      if (!solver.SetSolverSpecificParameters(SolverSpecificParameters.Value))
     109        throw new ArgumentException("Solver specific parameters could not be set.");
    100110
    101111      solver.Solve();
    102112
    103113      algorithm.Problem.ProblemDefinition.Analyze(solver.Solver, algorithm.Results);
    104       algorithm.Results.AddOrUpdateResult("Result Status", new EnumValue<ResultStatus>(solver.ResultStatus));
    105       algorithm.Results.AddOrUpdateResult("Best Objective Value",
     114      algorithm.Results.AddOrUpdateResult(nameof(solver.ResultStatus),
     115        new EnumValue<ResultStatus>(solver.ResultStatus));
     116      algorithm.Results.AddOrUpdateResult($"Best{nameof(solver.ObjectiveValue)}",
    106117        new DoubleValue(solver.ObjectiveValue ?? double.NaN));
    107       algorithm.Results.AddOrUpdateResult("Best Objective Bound",
    108         new DoubleValue(solver.ObjectiveBound ?? double.NaN));
    109       algorithm.Results.AddOrUpdateResult("Absolute Gap", new DoubleValue(solver.AbsoluteGap ?? double.NaN));
    110       algorithm.Results.AddOrUpdateResult("Relative Gap", new DoubleValue(solver.RelativeGap ?? double.NaN));
    111       algorithm.Results.AddOrUpdateResult("Number of Constraints", new IntValue(solver.NumberOfConstraints));
    112       algorithm.Results.AddOrUpdateResult("Number of Variables", new IntValue(solver.NumberOfVariables));
    113       algorithm.Results.AddOrUpdateResult("Number of Nodes", new DoubleValue(solver.NumberOfNodes));
    114       algorithm.Results.AddOrUpdateResult("Iterations", new DoubleValue(solver.Iterations));
    115       algorithm.Results.AddOrUpdateResult("Solver Version", new StringValue(solver.SolverVersion));
    116       algorithm.Results.AddOrUpdateResult("Wall Time", new TimeSpanValue(solver.WallTime ?? TimeSpan.Zero));
     118
     119      if (solver.IsMip) {
     120        algorithm.Results.AddOrUpdateResult($"Best{nameof(solver.ObjectiveBound)}",
     121          new DoubleValue(solver.ObjectiveBound ?? double.NaN));
     122        algorithm.Results.AddOrUpdateResult(nameof(solver.AbsoluteGap),
     123          new DoubleValue(solver.AbsoluteGap ?? double.NaN));
     124        algorithm.Results.AddOrUpdateResult(nameof(solver.RelativeGap),
     125          new PercentValue(solver.RelativeGap ?? double.NaN));
     126      }
     127
     128      algorithm.Results.AddOrUpdateResult(nameof(solver.NumberOfConstraints), new IntValue(solver.NumberOfConstraints));
     129      algorithm.Results.AddOrUpdateResult(nameof(solver.NumberOfVariables), new IntValue(solver.NumberOfVariables));
     130
     131      if (solver.IsMip) {
     132        algorithm.Results.AddOrUpdateResult(nameof(solver.NumberOfNodes), new DoubleValue(solver.NumberOfNodes));
     133      }
     134
     135      algorithm.Results.AddOrUpdateResult(nameof(solver.Iterations), new DoubleValue(solver.Iterations));
     136      algorithm.Results.AddOrUpdateResult(nameof(solver.SolverVersion), new StringValue(solver.SolverVersion));
    117137    }
    118138  }
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/BopSolver.cs

    r16288 r16373  
    2020#endregion
    2121
     22using System;
    2223using HeuristicLab.Common;
    2324using HeuristicLab.Core;
     25using HeuristicLab.Data;
    2426using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base;
     27using HeuristicLab.Parameters;
    2528using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2629
     
    3235
    3336    public BopSolver() {
    34       Parameters.Remove(programmingTypeParam);
     37      Parameters.Remove(problemTypeParam);
     38      Parameters.Add(new FixedValueParameter<StringValue>(nameof(ProblemType), new StringValue("ZeroOneProgramming").AsReadOnly()));
     39      SolverSpecificParameters.Value =
     40        "# for file format, see Protocol Buffers text format (https://developers.google.com/protocol-buffers/docs/overview#whynotxml)" + Environment.NewLine +
     41        "# for parameters, see https://github.com/google/or-tools/blob/v6.10/ortools/bop/bop_parameters.proto" + Environment.NewLine +
     42        "# example:" + Environment.NewLine +
     43        "# random_seed: 10" + Environment.NewLine;
    3544    }
    3645
     
    4453    }
    4554
    46     public override bool SupportsPause => true;
    47 
    48     public override bool SupportsStop => true;
    49 
    5055    protected override OptimizationProblemType OptimizationProblemType =>
    51               OptimizationProblemType.BOP_INTEGER_PROGRAMMING;
     56               OptimizationProblemType.BopIntegerProgramming;
    5257  }
    5358}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/CoinOrSolver.cs

    r16288 r16373  
    2222using HeuristicLab.Common;
    2323using HeuristicLab.Core;
    24 using HeuristicLab.Data;
    2524using HeuristicLab.MathematicalOptimization.LinearProgramming.Algorithms.Solvers.Base;
    2625using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    3332
    3433    public CoinOrSolver() {
    35       programmingTypeParam.Value.ValueChanged += (sender, args) => {
    36         if (((EnumValue<LinearProgrammingType>)sender).Value == LinearProgrammingType.LinearProgramming) {
    37           incrementalityParam.Value = new BoolValue(true);
    38           incrementalityParam.Value.ValueChanged += (s, a) => {
    39             if (((BoolValue)s).Value) {
    40               qualityUpdateIntervalParam.Value = new TimeSpanValue(qualityUpdateIntervalParam.Value.Value);
    41             } else {
    42               qualityUpdateIntervalParam.Value = (TimeSpanValue)qualityUpdateIntervalParam.Value.AsReadOnly();
    43             }
    44           };
    45         } else {
    46           incrementalityParam.Value = (BoolValue)new BoolValue().AsReadOnly();
    47         }
    48       };
     34      Parameters.Remove(solverSpecificParametersParam);
    4935    }
    5036
     
    5844    }
    5945
     46    public override bool SupportsPause => false;
     47
     48    public override bool SupportsQualityUpdate => ProblemType == ProblemType.LinearProgramming;
     49
     50    public override bool SupportsStop => false;
     51
    6052    protected override OptimizationProblemType OptimizationProblemType =>
    61       LinearProgrammingType == LinearProgrammingType.LinearProgramming
    62         ? OptimizationProblemType.CLP_LINEAR_PROGRAMMING
    63         : OptimizationProblemType.CBC_MIXED_INTEGER_PROGRAMMING;
     53      ProblemType == ProblemType.LinearProgramming
     54        ? OptimizationProblemType.ClpLinearProgramming
     55        : OptimizationProblemType.CbcMixedIntegerProgramming;
    6456  }
    6557}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/CplexSolver.cs

    r16288 r16373  
    2020#endregion
    2121
     22using System;
    2223using HeuristicLab.Common;
    2324using HeuristicLab.Core;
     
    3637      Parameters.Add(libraryNameParam = new FixedValueParameter<FileValue>(nameof(LibraryName),
    3738        new FileValue { FileDialogFilter = FileDialogFilter, Value = Properties.Settings.Default.CplexLibraryName }));
     39      SolverSpecificParameters.Value =
     40        "CPLEX Parameter File Version 12.8.0" + Environment.NewLine +
     41        "# for file format, see https://www.ibm.com/support/knowledgecenter/SSSA5P_12.8.0/ilog.odms.cplex.help/CPLEX/FileFormats/topics/PRM.html" + Environment.NewLine +
     42        "# for parameters, see https://www.ibm.com/support/knowledgecenter/SSSA5P_12.8.0/ilog.odms.cplex.help/CPLEX/Parameters/topics/introListTopical.html" + Environment.NewLine +
     43        "# example:" + Environment.NewLine +
     44        "# CPXPARAM_RandomSeed 10" + Environment.NewLine;
    3845    }
    3946
     
    4855
    4956    protected override OptimizationProblemType OptimizationProblemType =>
    50       LinearProgrammingType == LinearProgrammingType.LinearProgramming
    51         ? OptimizationProblemType.CPLEX_LINEAR_PROGRAMMING
    52         : OptimizationProblemType.CPLEX_MIXED_INTEGER_PROGRAMMING;
     57      ProblemType == ProblemType.LinearProgramming
     58        ? OptimizationProblemType.CplexLinearProgramming
     59        : OptimizationProblemType.CplexMixedIntegerProgramming;
    5360  }
    5461}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/GlopSolver.cs

    r16288 r16373  
    2020#endregion
    2121
     22using System;
    2223using HeuristicLab.Common;
    2324using HeuristicLab.Core;
     
    3334
    3435    public GlopSolver() {
    35       programmingTypeParam.Value = (EnumValue<LinearProgrammingType>)programmingTypeParam.Value.AsReadOnly();
     36      problemTypeParam.Value = (EnumValue<ProblemType>)problemTypeParam.Value.AsReadOnly();
     37      SolverSpecificParameters.Value =
     38        "# for file format, see Protocol Buffers text format (https://developers.google.com/protocol-buffers/docs/overview#whynotxml)" + Environment.NewLine +
     39        "# for parameters, see https://github.com/google/or-tools/blob/v6.10/ortools/glop/parameters.proto" + Environment.NewLine +
     40        "# example:" + Environment.NewLine +
     41        "# random_seed: 10" + Environment.NewLine;
    3642    }
    3743
     
    4551    }
    4652
    47     public override bool SupportsPause => true;
    48 
    49     public override bool SupportsStop => true;
    50 
    5153    protected override OptimizationProblemType OptimizationProblemType =>
    52               OptimizationProblemType.GLOP_LINEAR_PROGRAMMING;
     54      OptimizationProblemType.GlopLinearProgramming;
    5355  }
    5456}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/GlpkSolver.cs

    r16288 r16373  
    3434
    3535    public GlpkSolver() {
     36      Parameters.Remove(solverSpecificParametersParam);
    3637      Parameters.Add(libraryNameParam = new FixedValueParameter<FileValue>(nameof(LibraryName),
    3738        new FileValue { FileDialogFilter = FileDialogFilter, Value = Properties.Settings.Default.GlpkLibraryName }));
    38 
    39       programmingTypeParam.Value.ValueChanged += (sender, args) => {
    40         if (((EnumValue<LinearProgrammingType>)sender).Value == LinearProgrammingType.LinearProgramming) {
    41           incrementalityParam.Value = new BoolValue(true);
    42           incrementalityParam.Value.ValueChanged += (s, a) => {
    43             if (((BoolValue)s).Value) {
    44               qualityUpdateIntervalParam.Value = new TimeSpanValue(qualityUpdateIntervalParam.Value.Value);
    45             } else {
    46               qualityUpdateIntervalParam.Value = (TimeSpanValue)qualityUpdateIntervalParam.Value.AsReadOnly();
    47             }
    48           };
    49         } else {
    50           incrementalityParam.Value = (BoolValue)new BoolValue().AsReadOnly();
    51         }
    52       };
    5339    }
    5440
     
    6248    }
    6349
     50    public override bool SupportsPause => ProblemType == ProblemType.LinearProgramming; // TODO: pause working for linear programs?
     51
     52    public override bool SupportsQualityUpdate => ProblemType == ProblemType.LinearProgramming;
     53
    6454    protected override OptimizationProblemType OptimizationProblemType =>
    65       LinearProgrammingType == LinearProgrammingType.LinearProgramming
    66         ? OptimizationProblemType.GLPK_LINEAR_PROGRAMMING
    67         : OptimizationProblemType.GLPK_MIXED_INTEGER_PROGRAMMING;
     55      ProblemType == ProblemType.LinearProgramming
     56        ? OptimizationProblemType.GlpkLinearProgramming
     57        : OptimizationProblemType.GlpkMixedIntegerProgramming;
    6858  }
    6959}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/GurobiSolver.cs

    r16288 r16373  
    2020#endregion
    2121
     22using System;
    2223using HeuristicLab.Common;
    2324using HeuristicLab.Core;
     
    3637      Parameters.Add(libraryNameParam = new FixedValueParameter<FileValue>(nameof(LibraryName),
    3738        new FileValue { FileDialogFilter = FileDialogFilter, Value = Properties.Settings.Default.GurobiLibraryName }));
     39      SolverSpecificParameters.Value =
     40        "# for file format, see http://www.gurobi.com/documentation/8.1/refman/prm_format.html" + Environment.NewLine +
     41        "# for parameters, see http://www.gurobi.com/documentation/8.1/refman/parameters.html" + Environment.NewLine +
     42        "# example:" + Environment.NewLine +
     43        "# Seed 10" + Environment.NewLine;
    3844    }
    3945
    4046    protected GurobiSolver(GurobiSolver original, Cloner cloner)
    4147          : base(original, cloner) {
    42       programmingTypeParam = cloner.Clone(original.programmingTypeParam);
     48      problemTypeParam = cloner.Clone(original.problemTypeParam);
    4349    }
    4450
     
    4854    }
    4955
    50     public override bool SupportsPause => true;
    51 
    52     public override bool SupportsStop => true;
    53 
    5456    protected override OptimizationProblemType OptimizationProblemType =>
    55               LinearProgrammingType == LinearProgrammingType.LinearProgramming
    56         ? OptimizationProblemType.GUROBI_LINEAR_PROGRAMMING
    57         : OptimizationProblemType.GUROBI_MIXED_INTEGER_PROGRAMMING;
     57      ProblemType == ProblemType.LinearProgramming
     58        ? OptimizationProblemType.GurobiLinearProgramming
     59        : OptimizationProblemType.GurobiMixedIntegerProgramming;
    5860  }
    5961}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Algorithms/Solvers/ScipSolver.cs

    r16288 r16373  
    2020#endregion
    2121
     22using System;
     23using System.Threading;
    2224using HeuristicLab.Common;
    2325using HeuristicLab.Core;
     
    3133  [Item("SCIP", "SCIP (http://scip.zib.de/) must be installed and licenced.")]
    3234  [StorableClass]
    33   public class ScipSolver : ExternalSolver {
     35  public class ScipSolver : ExternalIncrementalSolver {
     36
     37    private TimeSpan timeLimit = TimeSpan.Zero;
    3438
    3539    public ScipSolver() {
    3640      Parameters.Add(libraryNameParam = new FixedValueParameter<FileValue>(nameof(LibraryName),
    3741        new FileValue { FileDialogFilter = FileDialogFilter, Value = Properties.Settings.Default.ScipLibraryName }));
    38       programmingTypeParam.Value =
    39         (EnumValue<LinearProgrammingType>)new EnumValue<LinearProgrammingType>(LinearProgrammingType
    40           .MixedIntegerProgramming).AsReadOnly();
     42      problemTypeParam.Value =
     43        (EnumValue<ProblemType>)new EnumValue<ProblemType>(ProblemType.MixedIntegerProgramming).AsReadOnly();
     44      SolverSpecificParameters.Value =
     45        "# for file format and parameters, see https://scip.zib.de/doc/html/PARAMETERS.php" + Environment.NewLine +
     46        "# example:" + Environment.NewLine +
     47        "# branching/random/seed = 10" + Environment.NewLine;
    4148    }
    4249
     
    5057    }
    5158
    52     public override bool SupportsPause => true;
     59    protected override OptimizationProblemType OptimizationProblemType =>
     60      OptimizationProblemType.ScipMixedIntegerProgramming;
     61    protected override TimeSpan TimeLimit => timeLimit += QualityUpdateInterval;
    5362
    54     public override bool SupportsStop => true;
    55 
    56     protected override OptimizationProblemType OptimizationProblemType =>
    57       OptimizationProblemType.SCIP_MIXED_INTEGER_PROGRAMMING;
     63    public override void Solve(LinearProgrammingAlgorithm algorithm, CancellationToken cancellationToken) {
     64      timeLimit = TimeSpan.Zero;
     65      base.Solve(algorithm, cancellationToken);
     66    }
    5867  }
    5968}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Problems/ILinearProgrammingProblemDefinition.cs

    r16288 r16373  
    2727  public interface ILinearProgrammingProblemDefinition {
    2828
    29     void BuildModel(Solver solver);
     29    bool BuildModel(Solver solver);
    3030
    3131    void Analyze(Solver solver, ResultCollection results);
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Problems/LinearProgrammingProblem.cs

    r16288 r16373  
    2121
    2222using System.Drawing;
    23 using Google.OrTools.LinearSolver;
    2423using HeuristicLab.Common;
    2524using HeuristicLab.Common.Resources;
     
    3130namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Problems {
    3231
    33   [Item("Linear/Mixed Integer Programming Problem (LP/MIP)", "")]
     32  [Item("Linear/Mixed Integer Programming Problem (LP/MIP)", "Represents a linear/mixed integer problem.")]
    3433  [Creatable(CreatableAttribute.Categories.CombinatorialProblems)]
    3534  [StorableClass]
     
    5655    private FixedValueParameter<LinearProgrammingProblemDefinitionScript> LinearProgrammingProblemScriptParameter =>
    5756      (FixedValueParameter<LinearProgrammingProblemDefinitionScript>)Parameters["ProblemScript"];
    58 
    59     public void BuildModel(Solver solver) => ProblemDefinition.BuildModel(solver);
    6057
    6158    public override IDeepCloneable Clone(Cloner cloner) {
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Problems/LinearProgrammingProblemDefinitionScript.cs

    r16288 r16373  
    3333namespace HeuristicLab.MathematicalOptimization.LinearProgramming.Problems {
    3434
    35   [Item("Single-objective Problem Definition Script", "Script that defines the parameter vector and evaluates the solution for a programmable problem.")]
     35  [Item("Linear/Mixed Integer Programming Problem Definition Script", "Script that defines the model and evaluates the solution for a linear/mixed integer programming problem.")]
    3636  [StorableClass]
    3737  public sealed class LinearProgrammingProblemDefinitionScript : Script, ILinearProgrammingProblemDefinition, IStorableContent {
     
    144144    }
    145145
    146     public void BuildModel(Solver solver) => CompiledProblemDefinition.BuildModel(solver);
     146    public bool BuildModel(Solver solver) => CompiledProblemDefinition.BuildModel(solver);
    147147
    148148    public void Analyze(Solver solver, ResultCollection results) => CompiledProblemDefinition.Analyze(solver, results);
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Templates/CompiledLinearProgrammingProblemDefinition.cs

    r16288 r16373  
    1616    private Variable x;
    1717    private Variable y;
    18    
     18
    1919    public override void Initialize() {
    2020      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
    2121      // Add additional initialization code e.g. private variables that you need for evaluating
    2222    }
    23    
    24     public void BuildModel(Solver solver) {
     23
     24    public bool BuildModel(Solver solver) {
    2525      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
    2626      // Example model taken from https://developers.google.com/optimization/mip/integer_opt
     
    3232      // Define the objective
    3333      solver.Maximize(x + 10 * y);
     34      return true;
    3435    }
    35    
     36
    3637    public void Analyze(Solver solver, ResultCollection results) {
    3738      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
     
    4344      //results.AddOrUpdateResult("y", new DoubleValue(solver.LookupVariableOrNull("y").SolutionValue()));
    4445    }
    45    
     46
    4647    // Implement further classes and methods
    4748  }
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Wrapper/DoubleParam.cs

    r16372 r16373  
    2626
    2727    // Limit for relative MIP gap.
    28     RELATIVE_MIP_GAP = 0,
     28    RelativeMipGap = 0,
    2929
    3030    // Advanced usage: tolerance for primal feasibility of basic
     
    3232    // tolerance of integer solutions for MIP or the tolerance used
    3333    // during presolve.
    34     PRIMAL_TOLERANCE = 1,
     34    PrimalTolerance = 1,
    3535
    3636    // Advanced usage: tolerance for dual feasibility of basic solutions.
    37     DUAL_TOLERANCE = 2
    38   };
     37    DualTolerance = 2
     38  }
    3939}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Wrapper/IncrementalityValues.cs

    r16372 r16373  
    2525
    2626    // Start solve from scratch.
    27     INCREMENTALITY_OFF = 0,
     27    IncrementalityOff = 0,
    2828
    2929    // Reuse results from previous solve as much as the underlying
    3030    // solver allows.
    31     INCREMENTALITY_ON = 1
    32   };
     31    IncrementalityOn = 1
     32  }
    3333}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Wrapper/IntegerParam.cs

    r16372 r16373  
    2626
    2727    // Advanced usage: presolve mode.
    28     PRESOLVE = 1000,
     28    Presolve = 1000,
    2929
    3030    // Algorithm to solve linear programs.
    31     LP_ALGORITHM = 1001,
     31    LpAlgorithm = 1001,
    3232
    3333    // Advanced usage: incrementality from one solve to the next.
    34     INCREMENTALITY = 1002,
     34    Incrementality = 1002,
    3535
    3636    // Advanced usage: enable or disable matrix scaling.
    37     SCALING = 1003
    38   };
     37    Scaling = 1003
     38  }
    3939}
  • branches/2931_OR-Tools_LP_MIP/HeuristicLab.MathematicalOptimization/3.3/LinearProgramming/Wrapper/LpAlgorithmValues.cs

    r16372 r16373  
    2626    PrimalSimplex = 11,
    2727    BarrierAlgorithm = 12
    28   };
     28  }
    2929}
Note: See TracChangeset for help on using the changeset viewer.