- Timestamp:
- 11/16/15 16:45:17 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs
r12012 r13180 30 30 using System.Text.RegularExpressions; 31 31 using System.Threading; 32 using Google.ProtocolBuffers; 32 33 using HeuristicLab.Common; 33 34 using HeuristicLab.Common.Resources; … … 47 48 48 49 public readonly string Key; 49 public double Value; 50 51 public CacheEntry(string key, double value) { 52 Key = key; 53 Value = value; 50 51 private QualityMessage message; 52 private byte[] rawMessage; 53 54 public byte[] RawMessage { 55 get { return rawMessage; } 56 set { 57 rawMessage = value; 58 message = null; 59 } 54 60 } 55 61 56 62 public CacheEntry(string key) { 57 63 Key = key; 64 } 65 66 public QualityMessage GetMessage(ExtensionRegistry extensions) { 67 if (message == null && rawMessage != null) 68 message = QualityMessage.ParseFrom(ByteString.CopyFrom(rawMessage), extensions); 69 return message; 70 } 71 public void SetMessage(QualityMessage value) { 72 message = value; 73 rawMessage = value.ToByteArray(); 58 74 } 59 75 … … 69 85 } 70 86 87 public string QualityString(IFormatProvider formatProvider = null) { 88 if (formatProvider == null) formatProvider = CultureInfo.CurrentCulture; 89 if (RawMessage == null) return "-"; 90 var msg = message ?? CreateBasicQualityMessage(); 91 switch (msg.Type) { 92 case QualityMessage.Types.Type.SingleObjectiveQualityMessage: 93 return msg.GetExtension(SingleObjectiveQualityMessage.QualityMessage_).Quality.ToString(formatProvider); 94 case QualityMessage.Types.Type.MultiObjectiveQualityMessage: 95 var qualities = msg.GetExtension(MultiObjectiveQualityMessage.QualityMessage_).QualitiesList; 96 return string.Format("[{0}]", string.Join(",", qualities.Select(q => q.ToString(formatProvider)))); 97 default: 98 return "-"; 99 } 100 } 101 private QualityMessage CreateBasicQualityMessage() { 102 var extensions = ExtensionRegistry.CreateInstance(); 103 ExternalEvaluationMessages.RegisterAllExtensions(extensions); 104 return QualityMessage.ParseFrom(ByteString.CopyFrom(rawMessage), extensions); 105 } 106 71 107 public override string ToString() { 72 return string.Format("{{{0} : {1}}}", Key, Value);73 } 74 } 75 76 public delegate double Evaluator(SolutionMessage message);108 return string.Format("{{{0} : {1}}}", Key, QualityString()); 109 } 110 } 111 112 public delegate QualityMessage Evaluator(SolutionMessage message); 77 113 #endregion 78 114 … … 126 162 127 163 #region Persistence 164 #region BackwardsCompatibility3.4 128 165 [Storable(Name = "Cache")] 129 166 private IEnumerable<KeyValuePair<string, double>> Cache_Persistence { 130 get { 131 if (IsPersistent) { 132 return GetCacheValues(); 133 } else { 134 return Enumerable.Empty<KeyValuePair<string, double>>(); 135 } 136 } 167 get { return Enumerable.Empty<KeyValuePair<string, double>>(); } 137 168 set { 138 SetCacheValues(value); 139 } 169 var rawMessages = value.ToDictionary(kvp => kvp.Key, 170 kvp => QualityMessage.CreateBuilder() 171 .SetSolutionId(0) 172 .SetExtension( 173 SingleObjectiveQualityMessage.QualityMessage_, 174 SingleObjectiveQualityMessage.CreateBuilder().SetQuality(kvp.Value).Build()) 175 .Build().ToByteArray()); 176 SetCacheValues(rawMessages); 177 } 178 } 179 #endregion 180 [Storable(Name = "CacheNew")] 181 private IEnumerable<KeyValuePair<string, byte[]>> CacheNew_Persistence { 182 get { return IsPersistent ? GetCacheValues() : Enumerable.Empty<KeyValuePair<string, byte[]>>(); } 183 set { SetCacheValues(value); } 140 184 } 141 185 [StorableHook(HookType.AfterDeserialization)] … … 149 193 protected EvaluationCache(bool deserializing) : base(deserializing) { } 150 194 protected EvaluationCache(EvaluationCache original, Cloner cloner) 151 : base(original, cloner) {195 : base(original, cloner) { 152 196 SetCacheValues(original.GetCacheValues()); 153 197 Hits = original.Hits; … … 190 234 } 191 235 192 public double GetValue(SolutionMessage message, Evaluator evaluate) {236 public QualityMessage GetValue(SolutionMessage message, Evaluator evaluate, ExtensionRegistry extensions) { 193 237 var entry = new CacheEntry(message.ToString()); 194 238 bool lockTaken = false; … … 205 249 Monitor.Exit(cacheLock); 206 250 OnChanged(); 207 return node.Value. Value;251 return node.Value.GetMessage(extensions); 208 252 } else { 209 253 if (!waited && activeEvaluations.Contains(entry.Key)) { … … 217 261 OnChanged(); 218 262 try { 219 entry. Value = evaluate(message);263 entry.SetMessage(evaluate(message)); 220 264 Monitor.Enter(cacheLock, ref lockTaken); 221 265 index[entry] = list.AddLast(entry); 222 266 Trim(); 223 } 224 finally { 267 } finally { 225 268 if (!lockTaken) 226 269 Monitor.Enter(cacheLock, ref lockTaken); … … 231 274 } 232 275 OnChanged(); 233 return entry. Value;276 return entry.GetMessage(extensions); 234 277 } 235 278 } 236 279 } 237 } 238 finally { 280 } finally { 239 281 if (lockTaken) 240 282 Monitor.Exit(cacheLock); … … 250 292 } 251 293 252 private IEnumerable<KeyValuePair<string, double>> GetCacheValues() {294 private IEnumerable<KeyValuePair<string, byte[]>> GetCacheValues() { 253 295 lock (cacheLock) { 254 return index.ToDictionary(kvp => kvp.Key.Key, kvp => kvp.Key. Value);255 } 256 } 257 258 private void SetCacheValues(IEnumerable<KeyValuePair<string, double>> value) {296 return index.ToDictionary(kvp => kvp.Key.Key, kvp => kvp.Key.RawMessage); 297 } 298 } 299 300 private void SetCacheValues(IEnumerable<KeyValuePair<string, byte[]>> value) { 259 301 lock (cacheLock) { 260 list = new LinkedList<CacheEntry>();261 i ndex = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>();302 if (list == null) list = new LinkedList<CacheEntry>(); 303 if (index == null) index = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>(); 262 304 foreach (var kvp in value) { 263 var entry = new CacheEntry(kvp.Key) { Value = kvp.Value };305 var entry = new CacheEntry(kvp.Key) { RawMessage = kvp.Value }; 264 306 index[entry] = list.AddLast(entry); 265 307 } … … 274 316 "\"{0}\", {1}", 275 317 Regex.Replace(entry.Key, "\\s", "").Replace("\"", "\"\""), 276 entry. Value));318 entry.QualityString(CultureInfo.InvariantCulture))); 277 319 } 278 320 }
Note: See TracChangeset
for help on using the changeset viewer.