Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/11/17 12:42:31 (7 years ago)
Author:
pkimmesw
Message:

#2665 Merged ExecExpandExpression and PushProgram due to performance reasons, Tested managed object pooling

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CodeExpressions.cs

    r14744 r14745  
    114114
    115115      if (isFirstList) {
    116         var expand1 = first as ExecExpandExpression;
     116        var expand1 = first as PushProgram;
    117117
    118118        if (isSecondList) {
    119           var expand2 = second as ExecExpandExpression;
    120           var size = expand2.State.Expressions.Count + expand1.State.Expressions.Count;
     119          var expand2 = second as PushProgram;
     120          var size = expand2.State.Length + expand1.State.Length;
    121121
    122122          // if size > maxPointsInProgram this expressions results in a NOOP
     
    125125          result = new Expression[size];
    126126
    127           Array.Copy(expand2.State.Expressions as Expression[], result, expand2.State.Expressions.Count);
     127          Array.Copy(expand2.State, result, expand2.State.Length);
    128128          Array.Copy(
    129               expand1.State.Expressions as Expression[],
     129              expand1.State,
    130130              0,
    131131              result,
    132               expand2.State.Expressions.Count,
    133               expand1.State.Expressions.Count);
     132              expand2.State.Length,
     133              expand1.State.Length);
    134134        } else {
    135           var size = expand1.State.Expressions.Count + 1;
     135          var size = expand1.State.Length + 1;
    136136
    137137          // if size > maxPointsInProgram this expressions results in a NOOP
     
    141141          result[0] = second;
    142142
    143           Array.Copy(expand1.State.Expressions as Expression[], 0, result, 1, expand1.State.Expressions.Count);
     143          Array.Copy(expand1.State, 0, result, 1, expand1.State.Length);
    144144        }
    145145      } else if (isSecondList) {
    146         var expand2 = second as ExecExpandExpression;
    147 
    148         var size = expand2.State.Expressions.Count + 1;
     146        var expand2 = second as PushProgram;
     147
     148        var size = expand2.State.Length + 1;
    149149
    150150        // if size > maxPointsInProgram this expressions results in a NOOP
     
    154154        result[0] = first;
    155155
    156         Array.Copy(expand2.State.Expressions as Expression[], 0, result, 1, expand2.State.Expressions.Count);
     156        Array.Copy(expand2.State as Expression[], 0, result, 1, expand2.State.Length);
    157157      } else {
    158158        result = new[] { second, first };
    159159      }
    160160
    161       var expression = new ExecExpandExpression(result);
     161      var expression = new PushProgram(result);
    162162
    163163      interpreter.CodeStack.SetTop(expression);
     
    194194    public override bool Eval(IPushInterpreter interpreter) {
    195195      if ((interpreter.CodeStack.Count == 0) ||
    196           (interpreter.CodeStack.Top.GetType() != typeof(ExecExpandExpression))) return false;
    197 
    198       var expand = interpreter.CodeStack.Top as ExecExpandExpression;
    199 
    200       if (expand.State.IsEmpty) return false;
    201       var first = expand.State.Expressions[expand.State.Expressions.Count - 1];
     196          (interpreter.CodeStack.Top.GetType() != typeof(PushProgram))) return false;
     197
     198      var expand = interpreter.CodeStack.Top as PushProgram;
     199
     200      if (expand.IsEmpty) return false;
     201      var first = expand.State[expand.State.Length - 1];
    202202
    203203      interpreter.CodeStack.SetTop(first);
     
    217217      if (interpreter.CodeStack.Count == 0) return false;
    218218
    219       ExecExpandExpression expandExpression;
     219      PushProgram expandExpression;
    220220      var top = interpreter.CodeStack.Top;
    221221
    222222      if (top.CanExpand) {
    223         var expand = (ExecExpandExpression)top;
    224 
    225         if (expand.State.IsEmpty) return false;
    226         var length = expand.State.Expressions.Count - 1;
     223        var expand = (PushProgram)top;
     224
     225        if (expand.IsEmpty) return false;
     226        var length = expand.State.Length - 1;
    227227        var newExpressions = new Expression[length];
    228228
    229         Array.Copy((Expression[])expand.State.Expressions, 0, newExpressions, 0, length);
    230 
    231         expandExpression = new ExecExpandExpression(newExpressions);
     229        Array.Copy((Expression[])expand.State, 0, newExpressions, 0, length);
     230
     231        expandExpression = new PushProgram(newExpressions);
    232232      } else {
    233         expandExpression = ExecExpandExpression.Empty;
     233        expandExpression = PushProgram.Empty;
    234234      }
    235235
     
    250250        return false;
    251251
    252       ExecExpandExpression result;
     252      PushProgram result;
    253253
    254254      if (interpreter.CodeStack.Top.CanExpand) {
    255         var first = (ExecExpandExpression)interpreter.CodeStack.Pop();
    256         var size = first.State.Expressions.Count + 1;
     255        var first = (PushProgram)interpreter.CodeStack.Pop();
     256        var size = first.State.Length + 1;
    257257
    258258        if (size > interpreter.Configuration.MaxPointsInProgram) return false;
     
    260260        var expressions = new Expression[size];
    261261
    262         expressions[first.State.Expressions.Count] = interpreter.CodeStack.Top;
    263         Array.Copy(first.State.Expressions as Expression[], expressions, first.State.Expressions.Count);
    264 
    265         result = new ExecExpandExpression(expressions);
     262        expressions[first.State.Length] = interpreter.CodeStack.Top;
     263        Array.Copy(first.State as Expression[], expressions, first.State.Length);
     264
     265        result = new PushProgram(expressions);
    266266      } else {
    267         result = new ExecExpandExpression(interpreter.CodeStack.Pop(), interpreter.CodeStack.Top);
     267        result = new PushProgram(interpreter.CodeStack.Pop(), interpreter.CodeStack.Top);
    268268      }
    269269
     
    286286      if ((interpreter.CodeStack.Count < 2) ||
    287287          (interpreter.CodeStack[interpreter.CodeStack.Count - 2].GetType() !=
    288            typeof(ExecExpandExpression))) return false;
     288           typeof(PushProgram))) return false;
    289289
    290290      var target = interpreter.CodeStack.Pop();
    291291      var source = interpreter.CodeStack.Top;
    292292
    293       var container = GetContainer(source as ExecExpandExpression, target);
    294       var result = container ?? ExecExpandExpression.Empty;
     293      var container = GetContainer(source as PushProgram, target);
     294      var result = container ?? PushProgram.Empty;
    295295
    296296      interpreter.CodeStack.SetTop(result);
     
    298298    }
    299299
    300     private static ExecExpandExpression GetContainer(ExecExpandExpression current, Expression target) {
     300    private static PushProgram GetContainer(PushProgram current, Expression target) {
    301301      if (current == target)
    302302        return null;
    303303
    304304      var subContainer =
    305           current.State.Expressions.Where(e => e.CanExpand)
    306               .Select(e => GetContainer(e as ExecExpandExpression, target))
     305          current.State.Where(e => e.CanExpand)
     306              .Select(e => GetContainer(e as PushProgram, target))
    307307              .Where(e => e != null);
    308308
    309       var execExpandExpressions = subContainer as IList<ExecExpandExpression> ?? subContainer.ToList();
     309      var execExpandExpressions = subContainer as IList<PushProgram> ?? subContainer.ToList();
    310310      return execExpandExpressions.Any()
    311           ? execExpandExpressions.OrderBy(c => c.State.Expressions.Count).LastOrDefault()
    312           : current.State.Expressions.Contains(target)
     311          ? execExpandExpressions.OrderBy(c => c.State.Length).LastOrDefault()
     312          : current.State.Contains(target)
    313313              ? current
    314314              : null;
     
    328328
    329329      var values = interpreter.CodeStack.Pop(2);
    330       var second = (ExecExpandExpression)values[0];
    331       var contains = second.State.Expressions.Contains(values[1]);
     330      var second = (PushProgram)values[0];
     331      var contains = second.State.Contains(values[1]);
    332332
    333333      interpreter.BooleanStack.Push(contains);
     
    414414    private void DetermineUniqueItems(Expression source, IDictionary<int, int> items) {
    415415      if (source.CanExpand) {
    416         var expand = source as ExecExpandExpression;
    417 
    418         foreach (var e in expand.State.Expressions) {
     416        var expand = source as PushProgram;
     417
     418        foreach (var e in expand.State) {
    419419          var id = e.GetHashCode();
    420420          if (!items.ContainsKey(id)) items.Add(id, 1);
     
    445445        return false;
    446446
    447       var expression = (ExecExpandExpression)interpreter.CodeStack.Top;
    448       var index = (int)Math.Abs(interpreter.IntegerStack.Pop() % expression.State.TotalCount);
     447      var expression = (PushProgram)interpreter.CodeStack.Top;
     448      var index = (int)Math.Abs(interpreter.IntegerStack.Pop() % expression.TotalCount);
    449449      var result = expression.GetFromTree(index);
    450450
     
    536536
    537537      var source = interpreter.CodeStack[interpreter.CodeStack.Count - 2];
    538       var target = (ExecExpandExpression)interpreter.CodeStack.Pop();
     538      var target = (PushProgram)interpreter.CodeStack.Pop();
    539539      var index = (int)interpreter.IntegerStack.Pop();
    540540
    541541      Expression[] newExpressions;
    542       if (target.State.Expressions.Count > 0) {
    543         index = target.State.Expressions.Count - 1 - Math.Abs(index % target.State.Expressions.Count);
    544 
    545         newExpressions = target.State.CopyExpressions();
     542      if (target.State.Length > 0) {
     543        index = target.State.Length - 1 - Math.Abs(index % target.State.Length);
     544
     545        newExpressions = target.CopyExpressions();
    546546        newExpressions[index] = source.CanExpand
    547             ? ((ExecExpandExpression)source).Copy()
     547            ? ((PushProgram)source).Copy()
    548548            : source;
    549549      } else {
     
    551551      }
    552552
    553       var result = new ExecExpandExpression(newExpressions);
     553      var result = new PushProgram(newExpressions);
    554554      interpreter.CodeStack.SetTop(result);
    555555
     
    573573
    574574      if (expression.CanExpand)
    575         count = ((ExecExpandExpression)expression).State.Expressions.Count;
     575        count = ((PushProgram)expression).State.Length;
    576576
    577577      interpreter.IntegerStack.Push(count);
     
    591591      var first = interpreter.CodeStack.Pop();
    592592      var second = interpreter.CodeStack.Top;
    593       var expandExpression = new ExecExpandExpression(second, first);
     593      var expandExpression = new PushProgram(second, first);
    594594
    595595      interpreter.CodeStack.SetTop(expandExpression);
     
    611611
    612612      var contains = expressions[1].CanExpand
    613           ? ((ExecExpandExpression)expressions[1]).State.Expressions.Contains(expressions[0])
     613          ? ((PushProgram)expressions[1]).State.Contains(expressions[0])
    614614          : expressions[1].Equals(expressions[0]);
    615615
     
    636636
    637637      if (expression.CanExpand) {
    638         var subExpression = (ExecExpandExpression)expression;
    639 
    640         if (subExpression.State.IsEmpty) {
    641           nthExpression = ExecExpandExpression.Empty;
     638        var subExpression = (PushProgram)expression;
     639
     640        if (subExpression.IsEmpty) {
     641          nthExpression = PushProgram.Empty;
    642642        } else {
    643           var index = (int)(subExpression.State.Expressions.Count - 1 -
    644                              Math.Abs(n % subExpression.State.Expressions.Count));
    645 
    646           nthExpression = subExpression.State.Expressions[index];
     643          var index = (int)(subExpression.State.Length - 1 -
     644                             Math.Abs(n % subExpression.State.Length));
     645
     646          nthExpression = subExpression.State[index];
    647647        }
    648648      } else {
     
    672672      var expression = interpreter.CodeStack.Top;
    673673
    674       Expression nthExpression = null;
     674      Expression nthExpression;
    675675
    676676      if (expression.CanExpand) {
    677         var subExpressions = ((ExecExpandExpression)expression).State.Expressions;
    678 
    679         if (subExpressions.Count < 2) {
    680           nthExpression = ExecExpandExpression.Empty;
     677        var subExpressions = ((PushProgram)expression).State;
     678
     679        if (subExpressions.Length < 2) {
     680          nthExpression = PushProgram.Empty;
    681681        } else {
    682           var index = (int)(subExpressions.Count - 2 - Math.Abs(n % (subExpressions.Count - 1)));
     682          var index = (int)(subExpressions.Length - 2 - Math.Abs(n % (subExpressions.Length - 1)));
    683683
    684684          nthExpression = subExpressions[index];
     
    702702      if (interpreter.CodeStack.Count == 0) return false;
    703703
    704       var result = interpreter.CodeStack.Pop().Equals(ExecExpandExpression.Empty);
     704      var result = interpreter.CodeStack.Pop().Equals(PushProgram.Empty);
    705705      interpreter.BooleanStack.Push(result);
    706706
     
    724724      var position = -1;
    725725      if (first.CanExpand) {
    726         var expand = (ExecExpandExpression)first;
    727         position = expand.State.Expressions.Count - 1
    728                    - Array.FindIndex((Expression[])expand.State.Expressions, e => e.Equals(second));
     726        var expand = (PushProgram)first;
     727        position = expand.State.Length - 1
     728                   - Array.FindIndex((Expression[])expand.State, e => e.Equals(second));
    729729      } else if (first.Equals(second)) {
    730730        position = 0;
     
    748748      var expression = interpreter.CodeStack.Pop();
    749749      var points = expression.CanExpand
    750           ? ((ExecExpandExpression)expression).State.Expressions.Count
     750          ? ((PushProgram)expression).State.Length
    751751          : 1;
    752752
     
    767767    public override bool Eval(IPushInterpreter interpreter) {
    768768      if ((interpreter.CodeStack.Count < 3) || (interpreter.CodeStack.Top.GetType() !=
    769                                                 typeof(ExecExpandExpression))) return false;
     769                                                typeof(PushProgram))) return false;
    770770
    771771      var expressions = interpreter.CodeStack.Pop(2);
    772772      var third = interpreter.CodeStack.Top;
    773773      var second = expressions[0];
    774       var first = expressions[1] as ExecExpandExpression;
    775       var newExpressions = new Expression[first.State.Expressions.Count];
    776 
    777       for (var i = 0; i < first.State.Expressions.Count; i++)
    778         newExpressions[i] = first.State.Expressions[i].Equals(third)
     774      var first = expressions[1] as PushProgram;
     775      var newExpressions = new Expression[first.State.Length];
     776
     777      for (var i = 0; i < first.State.Length; i++)
     778        newExpressions[i] = first.State[i].Equals(third)
    779779            ? second
    780780            /* no cloning needed here because first is removed and therefore newExpression is the only container of sub expressions */
    781             : first.State.Expressions[i];
    782 
    783       var result = new ExecExpandExpression(newExpressions);
     781            : first.State[i];
     782
     783      var result = new PushProgram(newExpressions);
    784784
    785785      interpreter.CodeStack.SetTop(result);
Note: See TracChangeset for help on using the changeset viewer.