Changeset 13259 for stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs
- Timestamp:
- 11/18/15 17:23:48 (8 years ago)
- Location:
- stable
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 13180,13183,13203,13212,13257
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs
r13197 r13259 35 35 36 36 namespace 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.")] 38 38 [Creatable(CreatableAttribute.Categories.ExternalEvaluationProblems, Priority = 100)] 39 39 [StorableClass] 40 public class ExternalEvaluationProblem : SingleObjectiveBasicProblem<IEncoding> { 40 // BackwardsCompatibility3.3 41 // Rename class to SingleObjectiveExternalEvaluationProblem 42 public class ExternalEvaluationProblem : SingleObjectiveBasicProblem<IEncoding>, IExternalEvaluationProblem { 41 43 42 44 public static new Image StaticItemImage { … … 89 91 Parameters.Add(new OptionalValueParameter<EvaluationCache>("Cache", "Cache of previously evaluated solutions.")); 90 92 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 }); 92 94 Parameters.Add(new FixedValueParameter<SingleObjectiveOptimizationSupportScript>("SupportScript", "A script that can provide neighborhood and analyze the results of the optimization.", new SingleObjectiveOptimizationSupportScript())); 93 95 … … 101 103 102 104 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()); 105 114 } 106 115 … … 114 123 #endregion 115 124 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 117 132 private HashSet<IEvaluationServiceClient> activeClients = new HashSet<IEvaluationServiceClient>(); 118 133 private object clientLock = new object(); 134 119 135 private QualityMessage EvaluateOnNextAvailableClient(SolutionMessage message) { 120 136 IEvaluationServiceClient client = null; … … 130 146 try { 131 147 return client.Evaluate(message, GetQualityMessageExtensions()); 132 } 133 finally { 148 } finally { 134 149 lock (clientLock) { 135 150 activeClients.Remove(client); … … 139 154 } 140 155 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) { 146 157 lock (clientLock) { 147 158 SolutionMessage.Builder protobufBuilder = SolutionMessage.CreateBuilder(); 148 protobufBuilder.SolutionId = 0;159 protobufBuilder.SolutionId = solutionId; 149 160 var scope = new Scope(); 150 161 individual.CopyToScope(scope); … … 152 163 try { 153 164 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); 157 167 } 158 168 }
Note: See TracChangeset
for help on using the changeset viewer.