Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/18/15 17:23:48 (8 years ago)
Author:
ascheibe
Message:

#1674 merged r13180,r13183,r13203,r13212,r13257 into stable

Location:
stable
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs

    r13197 r13259  
    3535
    3636namespace HeuristicLab.Problems.ExternalEvaluation {
    37   [Item("External Evaluation Problem", "A problem that is evaluated in a different process.")]
     37  [Item("External Evaluation Problem (single-objective)", "A problem that is evaluated in a different process.")]
    3838  [Creatable(CreatableAttribute.Categories.ExternalEvaluationProblems, Priority = 100)]
    3939  [StorableClass]
    40   public class ExternalEvaluationProblem : SingleObjectiveBasicProblem<IEncoding> {
     40  // BackwardsCompatibility3.3
     41  // Rename class to SingleObjectiveExternalEvaluationProblem
     42  public class ExternalEvaluationProblem : SingleObjectiveBasicProblem<IEncoding>, IExternalEvaluationProblem {
    4143
    4244    public static new Image StaticItemImage {
     
    8991      Parameters.Add(new OptionalValueParameter<EvaluationCache>("Cache", "Cache of previously evaluated solutions."));
    9092      Parameters.Add(new ValueParameter<CheckedItemCollection<IEvaluationServiceClient>>("Clients", "The clients that are used to communicate with the external application.", new CheckedItemCollection<IEvaluationServiceClient>() { new EvaluationServiceClient() }));
    91       Parameters.Add(new ValueParameter<SolutionMessageBuilder>("MessageBuilder", "The message builder that converts from HeuristicLab objects to SolutionMessage representation.", new SolutionMessageBuilder()));
     93      Parameters.Add(new ValueParameter<SolutionMessageBuilder>("MessageBuilder", "The message builder that converts from HeuristicLab objects to SolutionMessage representation.", new SolutionMessageBuilder()) { Hidden = true });
    9294      Parameters.Add(new FixedValueParameter<SingleObjectiveOptimizationSupportScript>("SupportScript", "A script that can provide neighborhood and analyze the results of the optimization.", new SingleObjectiveOptimizationSupportScript()));
    9395
     
    101103
    102104    public override double Evaluate(Individual individual, IRandom random) {
    103       return Cache == null ? EvaluateOnNextAvailableClient(BuildSolutionMessage(individual)).Quality
    104         : Cache.GetValue(BuildSolutionMessage(individual), m => EvaluateOnNextAvailableClient(m).Quality);
     105      var qualityMessage = Evaluate(BuildSolutionMessage(individual));
     106      if (!qualityMessage.HasExtension(SingleObjectiveQualityMessage.QualityMessage_))
     107        throw new InvalidOperationException("The received message is not a SingleObjectiveQualityMessage.");
     108      return qualityMessage.GetExtension(SingleObjectiveQualityMessage.QualityMessage_).Quality;
     109    }
     110    public virtual QualityMessage Evaluate(SolutionMessage solutionMessage) {
     111      return Cache == null
     112        ? EvaluateOnNextAvailableClient(solutionMessage)
     113        : Cache.GetValue(solutionMessage, EvaluateOnNextAvailableClient, GetQualityMessageExtensions());
    105114    }
    106115
     
    114123    #endregion
    115124
    116     #region Evaluation Helpers
     125    public virtual ExtensionRegistry GetQualityMessageExtensions() {
     126      var extensions = ExtensionRegistry.CreateInstance();
     127      extensions.Add(SingleObjectiveQualityMessage.QualityMessage_);
     128      return extensions;
     129    }
     130
     131    #region Evaluation
    117132    private HashSet<IEvaluationServiceClient> activeClients = new HashSet<IEvaluationServiceClient>();
    118133    private object clientLock = new object();
     134
    119135    private QualityMessage EvaluateOnNextAvailableClient(SolutionMessage message) {
    120136      IEvaluationServiceClient client = null;
     
    130146      try {
    131147        return client.Evaluate(message, GetQualityMessageExtensions());
    132       }
    133       finally {
     148      } finally {
    134149        lock (clientLock) {
    135150          activeClients.Remove(client);
     
    139154    }
    140155
    141     protected virtual ExtensionRegistry GetQualityMessageExtensions() {
    142       return ExtensionRegistry.CreateInstance();
    143     }
    144 
    145     private SolutionMessage BuildSolutionMessage(Individual individual) {
     156    private SolutionMessage BuildSolutionMessage(Individual individual, int solutionId = 0) {
    146157      lock (clientLock) {
    147158        SolutionMessage.Builder protobufBuilder = SolutionMessage.CreateBuilder();
    148         protobufBuilder.SolutionId = 0;
     159        protobufBuilder.SolutionId = solutionId;
    149160        var scope = new Scope();
    150161        individual.CopyToScope(scope);
     
    152163          try {
    153164            MessageBuilder.AddToMessage(variable.Value, variable.Name, protobufBuilder);
    154           }
    155           catch (ArgumentException ex) {
    156             throw new InvalidOperationException(string.Format("ERROR while building solution message: Parameter {0} cannot be added to the message", name), ex);
     165          } catch (ArgumentException ex) {
     166            throw new InvalidOperationException(string.Format("ERROR while building solution message: Parameter {0} cannot be added to the message", Name), ex);
    157167          }
    158168        }
Note: See TracChangeset for help on using the changeset viewer.