Changeset 13345 for branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/ProblemDefinitionScript.cs
- Timestamp:
- 11/23/15 18:38:37 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/ProblemDefinitionScript.cs
r13218 r13345 30 30 31 31 namespace HeuristicLab.Problems.Programmable { 32 [Item("ProblemDefinitionScript", "Script that defines the parameter vector and evaluates the solution for a programmable problem.")]33 32 [StorableClass] 34 public abstract class ProblemDefinitionScript : Script, IProblemDefinition { 35 protected bool SuppressEvents { get; set; } 36 33 public abstract class ProblemDefinitionScript : Script { 37 34 [Storable] 38 35 private VariableStore variableStore; … … 41 38 } 42 39 43 [Storable]44 private bool codeChanged;45 46 40 [StorableConstructor] 47 41 protected ProblemDefinitionScript(bool deserializing) : base(deserializing) { } … … 49 43 : base(original, cloner) { 50 44 variableStore = cloner.Clone(original.variableStore); 51 codeChanged = original.codeChanged;52 45 } 53 46 protected ProblemDefinitionScript() … … 59 52 variableStore = new VariableStore(); 60 53 } 54 } 61 55 62 IEncoding IProblemDefinition.Encoding { 63 get { return CompiledProblemDefinition.Encoding; } 56 [Item("ProblemDefinitionScript", "Script that defines the parameter vector and evaluates the solution for a programmable problem.")] 57 [StorableClass] 58 public abstract class ProblemDefinitionScript<TEncoding, TSolution> : ProblemDefinitionScript, IProblemDefinition<TEncoding, TSolution> 59 where TEncoding : class, IEncoding<TSolution> 60 where TSolution : class, ISolution { 61 62 [Storable] 63 private bool codeChanged; 64 65 [Storable] 66 private TEncoding encoding; 67 internal TEncoding Encoding { 68 get { return encoding; } 69 set { encoding = value; } 70 } 71 72 TEncoding IProblemDefinition<TEncoding, TSolution>.Encoding { 73 get { return Encoding; } 74 } 75 76 internal void Initialize() { 77 CompiledProblemDefinition.Initialize(); 78 } 79 80 [StorableConstructor] 81 protected ProblemDefinitionScript(bool deserializing) : base(deserializing) { } 82 protected ProblemDefinitionScript(ProblemDefinitionScript<TEncoding, TSolution> original, Cloner cloner) 83 : base(original, cloner) { 84 codeChanged = original.codeChanged; 85 } 86 protected ProblemDefinitionScript() 87 : base() { 88 } 89 protected ProblemDefinitionScript(string code) 90 : base(code) { 64 91 } 65 92 66 93 private readonly object compileLock = new object(); 67 private volatile IProblemDefinitioncompiledProblemDefinition;68 protected IProblemDefinitionCompiledProblemDefinition {94 private volatile CompiledProblemDefinition<TEncoding, TSolution> compiledProblemDefinition; 95 protected CompiledProblemDefinition<TEncoding, TSolution> CompiledProblemDefinition { 69 96 get { 70 97 // double checked locking pattern … … 88 115 var assembly = base.Compile(); 89 116 var types = assembly.GetTypes(); 90 if (!types.Any(x => typeof(CompiledProblemDefinition ).IsAssignableFrom(x)))117 if (!types.Any(x => typeof(CompiledProblemDefinition<TEncoding, TSolution>).IsAssignableFrom(x))) 91 118 throw new ProblemDefinitionScriptException("The compiled code doesn't contain a problem definition." + Environment.NewLine + "The problem definition must be a subclass of CompiledProblemDefinition."); 92 if (types.Count(x => typeof(CompiledProblemDefinition ).IsAssignableFrom(x)) > 1)119 if (types.Count(x => typeof(CompiledProblemDefinition<TEncoding, TSolution>).IsAssignableFrom(x)) > 1) 93 120 throw new ProblemDefinitionScriptException("The compiled code contains multiple problem definitions." + Environment.NewLine + "Only one subclass of CompiledProblemDefinition is allowed."); 94 121 95 CompiledProblemDefinition inst;122 CompiledProblemDefinition<TEncoding, TSolution> inst; 96 123 try { 97 inst = (CompiledProblemDefinition)Activator.CreateInstance(types.Single(x => typeof(CompiledProblemDefinition).IsAssignableFrom(x))); 98 } catch (Exception e) { 124 inst = (CompiledProblemDefinition<TEncoding, TSolution>)Activator.CreateInstance(types.Single(x => typeof(CompiledProblemDefinition<TEncoding, TSolution>).IsAssignableFrom(x))); 125 } 126 catch (Exception e) { 99 127 compiledProblemDefinition = null; 100 128 throw new ProblemDefinitionScriptException("Instantiating the problem definition failed." + Environment.NewLine + "Check your default constructor.", e); … … 103 131 try { 104 132 inst.vars = new Variables(VariableStore); 105 inst.Initialize(); 106 } catch (Exception e) { 133 inst.Encoding = encoding; 134 } 135 catch (Exception e) { 107 136 compiledProblemDefinition = null; 108 137 throw new ProblemDefinitionScriptException("Initializing the problem definition failed." + Environment.NewLine + "Check your Initialize() method.", e); … … 112 141 compiledProblemDefinition = inst; 113 142 if (fireChanged) OnProblemDefinitionChanged(); 114 } catch (Exception e) { 143 } 144 catch (Exception e) { 115 145 compiledProblemDefinition = null; 116 146 throw new ProblemDefinitionScriptException("Using the problem definition in the problem failed." + Environment.NewLine + "Examine this error message carefully (often there is an issue with the defined encoding).", e);
Note: See TracChangeset
for help on using the changeset viewer.