Changeset 14029 for branches/crossvalidation-2434/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs
- Timestamp:
- 07/08/16 14:40:02 (8 years ago)
- Location:
- branches/crossvalidation-2434
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/crossvalidation-2434
- Property svn:mergeinfo changed
-
branches/crossvalidation-2434/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs
r12012 r14029 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 private object lockObject = new object(); 55 56 public byte[] RawMessage { 57 get { return rawMessage; } 58 set { 59 lock (lockObject) { 60 rawMessage = value; 61 message = null; 62 } 63 } 54 64 } 55 65 56 66 public CacheEntry(string key) { 57 67 Key = key; 68 } 69 70 public QualityMessage GetMessage(ExtensionRegistry extensions) { 71 lock (lockObject) { 72 if (message == null && rawMessage != null) 73 message = QualityMessage.ParseFrom(ByteString.CopyFrom(rawMessage), extensions); 74 } 75 return message; 76 } 77 public void SetMessage(QualityMessage value) { 78 lock (lockObject) { 79 message = value; 80 rawMessage = value.ToByteArray(); 81 } 58 82 } 59 83 … … 69 93 } 70 94 95 public string QualityString(IFormatProvider formatProvider = null) { 96 if (formatProvider == null) formatProvider = CultureInfo.CurrentCulture; 97 if (RawMessage == null) return "-"; 98 var msg = message ?? CreateBasicQualityMessage(); 99 switch (msg.Type) { 100 case QualityMessage.Types.Type.SingleObjectiveQualityMessage: 101 return msg.GetExtension(SingleObjectiveQualityMessage.QualityMessage_).Quality.ToString(formatProvider); 102 case QualityMessage.Types.Type.MultiObjectiveQualityMessage: 103 var qualities = msg.GetExtension(MultiObjectiveQualityMessage.QualityMessage_).QualitiesList; 104 return string.Format("[{0}]", string.Join(",", qualities.Select(q => q.ToString(formatProvider)))); 105 default: 106 return "-"; 107 } 108 } 109 private QualityMessage CreateBasicQualityMessage() { 110 var extensions = ExtensionRegistry.CreateInstance(); 111 ExternalEvaluationMessages.RegisterAllExtensions(extensions); 112 return QualityMessage.ParseFrom(ByteString.CopyFrom(rawMessage), extensions); 113 } 114 71 115 public override string ToString() { 72 return string.Format("{{{0} : {1}}}", Key, Value);73 } 74 } 75 76 public delegate double Evaluator(SolutionMessage message);116 return string.Format("{{{0} : {1}}}", Key, QualityString()); 117 } 118 } 119 120 public delegate QualityMessage Evaluator(SolutionMessage message); 77 121 #endregion 78 122 … … 126 170 127 171 #region Persistence 172 #region BackwardsCompatibility3.4 128 173 [Storable(Name = "Cache")] 129 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 } 174 private IEnumerable<KeyValuePair<string, double>> Cache_Persistence_backwardscompatability { 175 get { return Enumerable.Empty<KeyValuePair<string, double>>(); } 137 176 set { 138 SetCacheValues(value); 139 } 177 var rawMessages = value.ToDictionary(kvp => kvp.Key, 178 kvp => QualityMessage.CreateBuilder() 179 .SetSolutionId(0) 180 .SetExtension( 181 SingleObjectiveQualityMessage.QualityMessage_, 182 SingleObjectiveQualityMessage.CreateBuilder().SetQuality(kvp.Value).Build()) 183 .Build().ToByteArray()); 184 SetCacheValues(rawMessages); 185 } 186 } 187 #endregion 188 [Storable(Name = "CacheNew")] 189 private IEnumerable<KeyValuePair<string, byte[]>> Cache_Persistence { 190 get { return IsPersistent ? GetCacheValues() : Enumerable.Empty<KeyValuePair<string, byte[]>>(); } 191 set { SetCacheValues(value); } 140 192 } 141 193 [StorableHook(HookType.AfterDeserialization)] … … 149 201 protected EvaluationCache(bool deserializing) : base(deserializing) { } 150 202 protected EvaluationCache(EvaluationCache original, Cloner cloner) 151 : base(original, cloner) {203 : base(original, cloner) { 152 204 SetCacheValues(original.GetCacheValues()); 153 205 Hits = original.Hits; … … 190 242 } 191 243 192 public double GetValue(SolutionMessage message, Evaluator evaluate) {244 public QualityMessage GetValue(SolutionMessage message, Evaluator evaluate, ExtensionRegistry extensions) { 193 245 var entry = new CacheEntry(message.ToString()); 194 246 bool lockTaken = false; … … 205 257 Monitor.Exit(cacheLock); 206 258 OnChanged(); 207 return node.Value. Value;259 return node.Value.GetMessage(extensions); 208 260 } else { 209 261 if (!waited && activeEvaluations.Contains(entry.Key)) { … … 217 269 OnChanged(); 218 270 try { 219 entry. Value = evaluate(message);271 entry.SetMessage(evaluate(message)); 220 272 Monitor.Enter(cacheLock, ref lockTaken); 221 273 index[entry] = list.AddLast(entry); 222 274 Trim(); 223 } 224 finally { 275 } finally { 225 276 if (!lockTaken) 226 277 Monitor.Enter(cacheLock, ref lockTaken); … … 231 282 } 232 283 OnChanged(); 233 return entry. Value;284 return entry.GetMessage(extensions); 234 285 } 235 286 } 236 287 } 237 } 238 finally { 288 } finally { 239 289 if (lockTaken) 240 290 Monitor.Exit(cacheLock); … … 250 300 } 251 301 252 private IEnumerable<KeyValuePair<string, double>> GetCacheValues() {302 private IEnumerable<KeyValuePair<string, byte[]>> GetCacheValues() { 253 303 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) {304 return index.ToDictionary(kvp => kvp.Key.Key, kvp => kvp.Key.RawMessage); 305 } 306 } 307 308 private void SetCacheValues(IEnumerable<KeyValuePair<string, byte[]>> value) { 259 309 lock (cacheLock) { 260 list = new LinkedList<CacheEntry>();261 i ndex = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>();310 if (list == null) list = new LinkedList<CacheEntry>(); 311 if (index == null) index = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>(); 262 312 foreach (var kvp in value) { 263 var entry = new CacheEntry(kvp.Key) { Value = kvp.Value };313 var entry = new CacheEntry(kvp.Key) { RawMessage = kvp.Value }; 264 314 index[entry] = list.AddLast(entry); 265 315 } … … 274 324 "\"{0}\", {1}", 275 325 Regex.Replace(entry.Key, "\\s", "").Replace("\"", "\"\""), 276 entry. Value));326 entry.QualityString(CultureInfo.InvariantCulture))); 277 327 } 278 328 }
Note: See TracChangeset
for help on using the changeset viewer.