Changeset 14745 for branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CodeExpressions.cs
- Timestamp:
- 03/11/17 12:42:31 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Expressions/CodeExpressions.cs
r14744 r14745 114 114 115 115 if (isFirstList) { 116 var expand1 = first as ExecExpandExpression;116 var expand1 = first as PushProgram; 117 117 118 118 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; 121 121 122 122 // if size > maxPointsInProgram this expressions results in a NOOP … … 125 125 result = new Expression[size]; 126 126 127 Array.Copy(expand2.State .Expressions as Expression[], result, expand2.State.Expressions.Count);127 Array.Copy(expand2.State, result, expand2.State.Length); 128 128 Array.Copy( 129 expand1.State .Expressions as Expression[],129 expand1.State, 130 130 0, 131 131 result, 132 expand2.State. Expressions.Count,133 expand1.State. Expressions.Count);132 expand2.State.Length, 133 expand1.State.Length); 134 134 } else { 135 var size = expand1.State. Expressions.Count+ 1;135 var size = expand1.State.Length + 1; 136 136 137 137 // if size > maxPointsInProgram this expressions results in a NOOP … … 141 141 result[0] = second; 142 142 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); 144 144 } 145 145 } 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; 149 149 150 150 // if size > maxPointsInProgram this expressions results in a NOOP … … 154 154 result[0] = first; 155 155 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); 157 157 } else { 158 158 result = new[] { second, first }; 159 159 } 160 160 161 var expression = new ExecExpandExpression(result);161 var expression = new PushProgram(result); 162 162 163 163 interpreter.CodeStack.SetTop(expression); … … 194 194 public override bool Eval(IPushInterpreter interpreter) { 195 195 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]; 202 202 203 203 interpreter.CodeStack.SetTop(first); … … 217 217 if (interpreter.CodeStack.Count == 0) return false; 218 218 219 ExecExpandExpressionexpandExpression;219 PushProgram expandExpression; 220 220 var top = interpreter.CodeStack.Top; 221 221 222 222 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; 227 227 var newExpressions = new Expression[length]; 228 228 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); 232 232 } else { 233 expandExpression = ExecExpandExpression.Empty;233 expandExpression = PushProgram.Empty; 234 234 } 235 235 … … 250 250 return false; 251 251 252 ExecExpandExpressionresult;252 PushProgram result; 253 253 254 254 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; 257 257 258 258 if (size > interpreter.Configuration.MaxPointsInProgram) return false; … … 260 260 var expressions = new Expression[size]; 261 261 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); 266 266 } else { 267 result = new ExecExpandExpression(interpreter.CodeStack.Pop(), interpreter.CodeStack.Top);267 result = new PushProgram(interpreter.CodeStack.Pop(), interpreter.CodeStack.Top); 268 268 } 269 269 … … 286 286 if ((interpreter.CodeStack.Count < 2) || 287 287 (interpreter.CodeStack[interpreter.CodeStack.Count - 2].GetType() != 288 typeof( ExecExpandExpression))) return false;288 typeof(PushProgram))) return false; 289 289 290 290 var target = interpreter.CodeStack.Pop(); 291 291 var source = interpreter.CodeStack.Top; 292 292 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; 295 295 296 296 interpreter.CodeStack.SetTop(result); … … 298 298 } 299 299 300 private static ExecExpandExpression GetContainer(ExecExpandExpressioncurrent, Expression target) {300 private static PushProgram GetContainer(PushProgram current, Expression target) { 301 301 if (current == target) 302 302 return null; 303 303 304 304 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)) 307 307 .Where(e => e != null); 308 308 309 var execExpandExpressions = subContainer as IList< ExecExpandExpression> ?? subContainer.ToList();309 var execExpandExpressions = subContainer as IList<PushProgram> ?? subContainer.ToList(); 310 310 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) 313 313 ? current 314 314 : null; … … 328 328 329 329 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]); 332 332 333 333 interpreter.BooleanStack.Push(contains); … … 414 414 private void DetermineUniqueItems(Expression source, IDictionary<int, int> items) { 415 415 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) { 419 419 var id = e.GetHashCode(); 420 420 if (!items.ContainsKey(id)) items.Add(id, 1); … … 445 445 return false; 446 446 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); 449 449 var result = expression.GetFromTree(index); 450 450 … … 536 536 537 537 var source = interpreter.CodeStack[interpreter.CodeStack.Count - 2]; 538 var target = ( ExecExpandExpression)interpreter.CodeStack.Pop();538 var target = (PushProgram)interpreter.CodeStack.Pop(); 539 539 var index = (int)interpreter.IntegerStack.Pop(); 540 540 541 541 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(); 546 546 newExpressions[index] = source.CanExpand 547 ? (( ExecExpandExpression)source).Copy()547 ? ((PushProgram)source).Copy() 548 548 : source; 549 549 } else { … … 551 551 } 552 552 553 var result = new ExecExpandExpression(newExpressions);553 var result = new PushProgram(newExpressions); 554 554 interpreter.CodeStack.SetTop(result); 555 555 … … 573 573 574 574 if (expression.CanExpand) 575 count = (( ExecExpandExpression)expression).State.Expressions.Count;575 count = ((PushProgram)expression).State.Length; 576 576 577 577 interpreter.IntegerStack.Push(count); … … 591 591 var first = interpreter.CodeStack.Pop(); 592 592 var second = interpreter.CodeStack.Top; 593 var expandExpression = new ExecExpandExpression(second, first);593 var expandExpression = new PushProgram(second, first); 594 594 595 595 interpreter.CodeStack.SetTop(expandExpression); … … 611 611 612 612 var contains = expressions[1].CanExpand 613 ? (( ExecExpandExpression)expressions[1]).State.Expressions.Contains(expressions[0])613 ? ((PushProgram)expressions[1]).State.Contains(expressions[0]) 614 614 : expressions[1].Equals(expressions[0]); 615 615 … … 636 636 637 637 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; 642 642 } 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]; 647 647 } 648 648 } else { … … 672 672 var expression = interpreter.CodeStack.Top; 673 673 674 Expression nthExpression = null;674 Expression nthExpression; 675 675 676 676 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; 681 681 } 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))); 683 683 684 684 nthExpression = subExpressions[index]; … … 702 702 if (interpreter.CodeStack.Count == 0) return false; 703 703 704 var result = interpreter.CodeStack.Pop().Equals( ExecExpandExpression.Empty);704 var result = interpreter.CodeStack.Pop().Equals(PushProgram.Empty); 705 705 interpreter.BooleanStack.Push(result); 706 706 … … 724 724 var position = -1; 725 725 if (first.CanExpand) { 726 var expand = ( ExecExpandExpression)first;727 position = expand.State. Expressions.Count- 1728 - 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)); 729 729 } else if (first.Equals(second)) { 730 730 position = 0; … … 748 748 var expression = interpreter.CodeStack.Pop(); 749 749 var points = expression.CanExpand 750 ? (( ExecExpandExpression)expression).State.Expressions.Count750 ? ((PushProgram)expression).State.Length 751 751 : 1; 752 752 … … 767 767 public override bool Eval(IPushInterpreter interpreter) { 768 768 if ((interpreter.CodeStack.Count < 3) || (interpreter.CodeStack.Top.GetType() != 769 typeof( ExecExpandExpression))) return false;769 typeof(PushProgram))) return false; 770 770 771 771 var expressions = interpreter.CodeStack.Pop(2); 772 772 var third = interpreter.CodeStack.Top; 773 773 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) 779 779 ? second 780 780 /* 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); 784 784 785 785 interpreter.CodeStack.SetTop(result);
Note: See TracChangeset
for help on using the changeset viewer.