Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/23/15 18:38:37 (8 years ago)
Author:
mkommend
Message:

#2521: refactored programmable problem

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/ProblemDefinitionScript.cs

    r13218 r13345  
    3030
    3131namespace HeuristicLab.Problems.Programmable {
    32   [Item("ProblemDefinitionScript", "Script that defines the parameter vector and evaluates the solution for a programmable problem.")]
    3332  [StorableClass]
    34   public abstract class ProblemDefinitionScript : Script, IProblemDefinition {
    35     protected bool SuppressEvents { get; set; }
    36 
     33  public abstract class ProblemDefinitionScript : Script {
    3734    [Storable]
    3835    private VariableStore variableStore;
     
    4138    }
    4239
    43     [Storable]
    44     private bool codeChanged;
    45 
    4640    [StorableConstructor]
    4741    protected ProblemDefinitionScript(bool deserializing) : base(deserializing) { }
     
    4943      : base(original, cloner) {
    5044      variableStore = cloner.Clone(original.variableStore);
    51       codeChanged = original.codeChanged;
    5245    }
    5346    protected ProblemDefinitionScript()
     
    5952      variableStore = new VariableStore();
    6053    }
     54  }
    6155
    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) {
    6491    }
    6592
    6693    private readonly object compileLock = new object();
    67     private volatile IProblemDefinition compiledProblemDefinition;
    68     protected IProblemDefinition CompiledProblemDefinition {
     94    private volatile CompiledProblemDefinition<TEncoding, TSolution> compiledProblemDefinition;
     95    protected CompiledProblemDefinition<TEncoding, TSolution> CompiledProblemDefinition {
    6996      get {
    7097        // double checked locking pattern
     
    88115      var assembly = base.Compile();
    89116      var types = assembly.GetTypes();
    90       if (!types.Any(x => typeof(CompiledProblemDefinition).IsAssignableFrom(x)))
     117      if (!types.Any(x => typeof(CompiledProblemDefinition<TEncoding, TSolution>).IsAssignableFrom(x)))
    91118        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)
    93120        throw new ProblemDefinitionScriptException("The compiled code contains multiple problem definitions." + Environment.NewLine + "Only one subclass of CompiledProblemDefinition is allowed.");
    94121
    95       CompiledProblemDefinition inst;
     122      CompiledProblemDefinition<TEncoding, TSolution> inst;
    96123      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) {
    99127        compiledProblemDefinition = null;
    100128        throw new ProblemDefinitionScriptException("Instantiating the problem definition failed." + Environment.NewLine + "Check your default constructor.", e);
     
    103131      try {
    104132        inst.vars = new Variables(VariableStore);
    105         inst.Initialize();
    106       } catch (Exception e) {
     133        inst.Encoding = encoding;
     134      }
     135      catch (Exception e) {
    107136        compiledProblemDefinition = null;
    108137        throw new ProblemDefinitionScriptException("Initializing the problem definition failed." + Environment.NewLine + "Check your Initialize() method.", e);
     
    112141        compiledProblemDefinition = inst;
    113142        if (fireChanged) OnProblemDefinitionChanged();
    114       } catch (Exception e) {
     143      }
     144      catch (Exception e) {
    115145        compiledProblemDefinition = null;
    116146        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.