Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/15/16 10:20:58 (8 years ago)
Author:
gkronber
Message:

#2434: merged changes r14026:14078 from trunk to branch

Location:
branches/crossvalidation-2434
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/crossvalidation-2434

  • branches/crossvalidation-2434/HeuristicLab.Parameters/3.3/LookupParameter.cs

    r12012 r14079  
    5050    public string TranslatedName {
    5151      get {
    52         string translatedName;
    53         GetValueParameterAndTranslateName(out translatedName);
     52        string translatedName = Name;
     53        GetValueParameterAndTranslateName(ExecutionContext, ref translatedName);
    5454        return translatedName;
    5555      }
     
    6161
    6262    private Lazy<ThreadLocal<IItem>> cachedActualValues;
    63     private IItem CachedActualValue {
     63    protected IItem CachedActualValue {
    6464      get { return cachedActualValues.Value.Value; }
     65      set { cachedActualValues.Value.Value = value; }
    6566    }
    6667
     
    128129    }
    129130
    130     private IValueParameter GetValueParameterAndTranslateName(out string actualName) {
     131    protected static IValueParameter GetValueParameterAndTranslateName(IExecutionContext executionContext, ref string translatedName) {
    131132      IValueParameter valueParam;
    132133      ILookupParameter lookupParam;
    133       IExecutionContext currentExecutionContext = ExecutionContext;
    134 
    135       actualName = Name;
     134      IExecutionContext currentExecutionContext = executionContext;
     135
    136136      while (currentExecutionContext != null) {
    137         valueParam = currentExecutionContext.Parameters[actualName] as IValueParameter;
    138         lookupParam = currentExecutionContext.Parameters[actualName] as ILookupParameter;
     137        IParameter param = null;
     138        while (currentExecutionContext != null && !currentExecutionContext.Parameters.TryGetValue(translatedName, out param))
     139          currentExecutionContext = currentExecutionContext.Parent;
     140        if (currentExecutionContext == null) break;
     141
     142        valueParam = param as IValueParameter;
     143        lookupParam = param as ILookupParameter;
    139144
    140145        if ((valueParam == null) && (lookupParam == null))
    141146          throw new InvalidOperationException(
    142147            string.Format("Parameter look-up chain broken. Parameter \"{0}\" is not an \"{1}\" or an \"{2}\".",
    143                           actualName, typeof(IValueParameter).GetPrettyName(), typeof(ILookupParameter).GetPrettyName())
     148                          translatedName, typeof(IValueParameter).GetPrettyName(), typeof(ILookupParameter).GetPrettyName())
    144149          );
    145150
     
    148153          else if (lookupParam == null) return valueParam;
    149154        }
    150         if (lookupParam != null) actualName = lookupParam.ActualName;
     155        translatedName = lookupParam.ActualName;
    151156
    152157        currentExecutionContext = currentExecutionContext.Parent;
    153         while ((currentExecutionContext != null) && !currentExecutionContext.Parameters.ContainsKey(actualName))
    154           currentExecutionContext = currentExecutionContext.Parent;
    155158      }
    156159      return null;
    157160    }
    158     private IVariable LookupVariable(string name) {
    159       IScope scope = ExecutionContext.Scope;
    160       while ((scope != null) && !scope.Variables.ContainsKey(name))
     161    protected static IVariable LookupVariable(IScope scope, string name) {
     162      IVariable variable = null;
     163      while (scope != null && !scope.Variables.TryGetValue(name, out variable))
    161164        scope = scope.Parent;
    162       return scope != null ? scope.Variables[name] : null;
    163     }
     165      return scope != null ? variable : null;
     166    }
     167
    164168    protected override IItem GetActualValue() {
    165169      if (CachedActualValue != null) return CachedActualValue;
    166       string name;
     170
     171      string translatedName = Name;
     172      var value = GetValue(ExecutionContext, ref translatedName);
     173      if (value != null && !(value is T))
     174        throw new InvalidOperationException(
     175          string.Format("Type mismatch. Variable \"{0}\" does not contain a \"{1}\".",
     176                        translatedName,
     177                        typeof(T).GetPrettyName())
     178        );
     179      CachedActualValue = value;
     180      return value;
     181    }
     182
     183    protected static IItem GetValue(IExecutionContext executionContext, ref string name) {
    167184      // try to get value from context stack
    168       IValueParameter param = GetValueParameterAndTranslateName(out name);
     185      IValueParameter param = GetValueParameterAndTranslateName(executionContext, ref name);
    169186      if (param != null) return param.Value;
    170187
    171188      // try to get variable from scope
    172       IVariable var = LookupVariable(name);
    173       if (var != null) {
    174         if (!(var.Value is T))
    175           throw new InvalidOperationException(
    176             string.Format("Type mismatch. Variable \"{0}\" does not contain a \"{1}\".",
    177                           name,
    178                           typeof(T).GetPrettyName())
    179           );
    180         cachedActualValues.Value.Value = var.Value;
    181         return var.Value;
    182       }
    183       return null;
    184     }
     189      IVariable var = LookupVariable(executionContext.Scope, name);
     190      return var != null ? var.Value : null;
     191    }
     192
    185193    protected override void SetActualValue(IItem value) {
    186194      if (!(value is T))
     
    189197                        typeof(T).GetPrettyName())
    190198        );
    191       cachedActualValues.Value.Value = value;
    192 
     199      CachedActualValue = value;
     200
     201      string translatedName = Name;
     202      SetValue(ExecutionContext, ref translatedName, value);
     203    }
     204
     205    protected static void SetValue(IExecutionContext executionContext, ref string name, IItem value) {
    193206      // try to set value in context stack
    194       string name;
    195       IValueParameter param = GetValueParameterAndTranslateName(out name);
     207      IValueParameter param = GetValueParameterAndTranslateName(executionContext, ref name);
    196208      if (param != null) {
    197209        param.Value = value;
     
    200212
    201213      // try to set value in scope
    202       IVariable var = LookupVariable(name);
     214      IVariable var = LookupVariable(executionContext.Scope, name);
    203215      if (var != null) {
    204216        var.Value = value;
     
    207219
    208220      // create new variable
    209       ExecutionContext.Scope.Variables.Add(new Variable(name, value));
     221      executionContext.Scope.Variables.Add(new Variable(name, value));
    210222    }
    211223
Note: See TracChangeset for help on using the changeset viewer.