Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.Algorithms.PushGP/HeuristicLab.Algorithms.PushGP/Expressions/DefineExpressions.cs @ 14392

Last change on this file since 14392 was 14392, checked in by pkimmesw, 8 years ago

#2665 Full Push 3.0 instruction set and tests; Added first benchmark test (count odds) for random walk tests;

File size: 3.8 KB
Line 
1using System;
2using System.Collections.Generic;
3using HeuristicLab.Algorithms.PushGP.Interpreter;
4using HeuristicLab.Algorithms.PushGP.Stack;
5
6namespace HeuristicLab.Algorithms.PushGP.Expressions
7{
8    /// <summary>
9    /// Defines the name on top of the NAME stack as an instruction that will push the top item of the T stack onto the EXEC stack.
10    /// </summary>
11    /// <typeparam name="T">Stacktype</typeparam>
12    public abstract class DefineExpression<T> : Expression
13    {
14        public DefineExpression(string stringRepresentation) : base(stringRepresentation)
15        { }
16
17        protected void Eval(IStack<T> stack, IStack<string> nameStack, IDictionary<string, Expression> customExpressions, Func<T, Expression> creator)
18        {
19            // not enough arguments on stack
20            if (nameStack.Count == 0 ||
21                stack.Count < 1)
22                return;
23
24            var name = nameStack.Pop();
25            var expression = creator(stack.Top);
26
27            if (customExpressions.ContainsKey(name))
28            {
29                customExpressions[name] = expression;
30            }
31            else
32            {
33                customExpressions.Add(name, expression);
34            }
35        }
36    }
37
38    public class CodeDefineExpression : DefineExpression<Expression>
39    {
40        public CodeDefineExpression() : base("CODE.DEFINE")
41        {
42        }
43
44        public override void Eval(IInterpreter interpreter)
45        {
46            if (interpreter.Configuration.TopLevelPushCode &&
47                interpreter.CodeStack.Count < 2)
48                return;
49
50            this.Eval(
51                interpreter.CodeStack,
52                interpreter.NameStack,
53                interpreter.CustomExpressions,
54                v => new ExecPushExpression(v));
55
56            interpreter.CodeStack.Pop();
57        }
58    }
59
60    public class ExecDefineExpression : DefineExpression<Expression>
61    {
62        public ExecDefineExpression() : base("EXEC.DEFINE")
63        {
64        }
65
66        public override void Eval(IInterpreter interpreter)
67        {
68            if (interpreter.ExecStack.Count < 2)
69                return;
70
71            this.Eval(
72                interpreter.ExecStack,
73                interpreter.NameStack,
74                interpreter.CustomExpressions,
75                v => new ExecPushExpression(v));
76
77            interpreter.ExecStack.Pop();
78        }
79    }
80
81    public class FloatDefineExpression : DefineExpression<double>
82    {
83        public FloatDefineExpression() : base("FLOAT.DEFINE")
84        {
85        }
86
87        public override void Eval(IInterpreter interpreter)
88        {
89            this.Eval(
90                interpreter.FloatStack,
91                interpreter.NameStack,
92                interpreter.CustomExpressions,
93                v => new FloatPushExpression(v));
94        }
95    }
96
97    public class IntegerDefineExpression : DefineExpression<long>
98    {
99        public IntegerDefineExpression() : base("INTEGER.DEFINE")
100        {
101        }
102
103        public override void Eval(IInterpreter interpreter)
104        {
105            this.Eval(
106                interpreter.IntegerStack,
107                interpreter.NameStack,
108                interpreter.CustomExpressions,
109                v => new IntegerPushExpression(v));
110        }
111    }
112
113    public class BooleanDefineExpression : DefineExpression<bool>
114    {
115        public BooleanDefineExpression() : base("BOOLENA.DEFINE")
116        {
117        }
118
119        public override void Eval(IInterpreter interpreter)
120        {
121            this.Eval(
122                interpreter.BooleanStack,
123                interpreter.NameStack,
124                interpreter.CustomExpressions,
125                v => new BooleanPushExpression(v));
126        }
127    }
128}
Note: See TracBrowser for help on using the repository browser.