Changeset 9271 for branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Compiler
- Timestamp:
- 03/04/13 14:43:44 (12 years ago)
- Location:
- branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter
- Files:
-
- 1 added
- 2 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Compiler/Instruction.cs
r7259 r9271 32 32 // an optional object value (addresses for calls, argument index for arguments) 33 33 public object iArg0; 34 // hold the value of the instruction 35 public double value; 34 36 } 35 37 } -
branches/HeuristicLab.DataAnalysis.Symbolic.LinearInterpreter/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Compiler/SymbolicExpressionTreeCompiler.cs
r8798 r9271 27 27 public static class SymbolicExpressionTreeCompiler { 28 28 29 public static Instruction[] Compile (ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper) {30 return Compile (tree, opCodeMapper, Enumerable.Empty<Func<Instruction, Instruction>>());29 public static Instruction[] CompilePrefix(ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper) { 30 return CompilePrefix(tree, opCodeMapper, Enumerable.Empty<Func<Instruction, Instruction>>()); 31 31 } 32 public static Instruction[] Compile (ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper, IEnumerable<Func<Instruction, Instruction>> postInstructionCompiledHooks) {32 public static Instruction[] CompilePrefix(ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper, IEnumerable<Func<Instruction, Instruction>> postInstructionCompiledHooks) { 33 33 Dictionary<string, ushort> entryPoint = new Dictionary<string, ushort>(); 34 34 List<Instruction> code = new List<Instruction>(); 35 35 // compile main body branches 36 36 foreach (var branch in tree.Root.GetSubtree(0).Subtrees) { 37 code.AddRange(Compile (branch, opCodeMapper, postInstructionCompiledHooks));37 code.AddRange(CompilePrefix(branch, opCodeMapper, postInstructionCompiledHooks)); 38 38 } 39 39 // compile function branches … … 44 44 if (code.Count > ushort.MaxValue) throw new ArgumentException("Code for the tree is too long (> ushort.MaxValue)."); 45 45 entryPoint[branch.FunctionName] = (ushort)code.Count; 46 code.AddRange(Compile (branch.GetSubtree(0), opCodeMapper, postInstructionCompiledHooks));46 code.AddRange(CompilePrefix(branch.GetSubtree(0), opCodeMapper, postInstructionCompiledHooks)); 47 47 } 48 48 // address of all functions is fixed now … … 59 59 } 60 60 61 private static IEnumerable<Instruction> Compile (ISymbolicExpressionTreeNode branch, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper, IEnumerable<Func<Instruction, Instruction>> postInstructionCompiledHooks) {61 private static IEnumerable<Instruction> CompilePrefix(ISymbolicExpressionTreeNode branch, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper, IEnumerable<Func<Instruction, Instruction>> postInstructionCompiledHooks) { 62 62 foreach (var node in branch.IterateNodesPrefix()) { 63 Instruction instr = new Instruction(); 64 int subtreesCount = node.SubtreeCount; 65 if (subtreesCount > 255) throw new ArgumentException("Number of subtrees is too big (>255)"); 66 instr.nArguments = (byte)subtreesCount; 67 instr.opCode = opCodeMapper(node); 68 if (node.Symbol is Argument) { 69 var argNode = (ArgumentTreeNode)node; 70 instr.iArg0 = (ushort)argNode.Symbol.ArgumentIndex; 71 } 72 instr.dynamicNode = node; 73 foreach (var hook in postInstructionCompiledHooks) { 74 instr = hook(instr); 75 } 76 yield return instr; 77 } 78 } 79 80 public static Instruction[] CompilePostfix(ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper) { 81 return CompilePostfix(tree, opCodeMapper, Enumerable.Empty<Func<Instruction, Instruction>>()); 82 } 83 public static Instruction[] CompilePostfix(ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper, IEnumerable<Func<Instruction, Instruction>> postInstructionCompiledHooks) { 84 Dictionary<string, ushort> entryPoint = new Dictionary<string, ushort>(); 85 List<Instruction> code = new List<Instruction>(); 86 // compile main body branches 87 foreach (var branch in tree.Root.GetSubtree(0).Subtrees) { 88 code.AddRange(CompilePostfix(branch, opCodeMapper, postInstructionCompiledHooks)); 89 } 90 // compile function branches 91 var functionBranches = from node in tree.IterateNodesPostfix() 92 where node.Symbol is Defun 93 select node; 94 foreach (DefunTreeNode branch in functionBranches) { 95 if (code.Count > ushort.MaxValue) throw new ArgumentException("Code for the tree is too long (> ushort.MaxValue)."); 96 entryPoint[branch.FunctionName] = (ushort)code.Count; 97 code.AddRange(CompilePostfix(branch.GetSubtree(0), opCodeMapper, postInstructionCompiledHooks)); 98 } 99 // address of all functions is fixed now 100 // iterate through code again and fill in the jump locations 101 for (int i = 0; i < code.Count; i++) { 102 Instruction instr = code[i]; 103 if (instr.dynamicNode.Symbol is InvokeFunction) { 104 var invokeNode = (InvokeFunctionTreeNode)instr.dynamicNode; 105 instr.iArg0 = entryPoint[invokeNode.Symbol.FunctionName]; 106 } 107 } 108 109 return code.ToArray(); 110 } 111 112 private static IEnumerable<Instruction> CompilePostfix(ISymbolicExpressionTreeNode branch, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper, IEnumerable<Func<Instruction, Instruction>> postInstructionCompiledHooks) { 113 foreach (var node in branch.IterateNodesPostfix()) { 114 Instruction instr = new Instruction(); 115 int subtreesCount = node.SubtreeCount; 116 if (subtreesCount > 255) throw new ArgumentException("Number of subtrees is too big (>255)"); 117 instr.nArguments = (byte)subtreesCount; 118 instr.opCode = opCodeMapper(node); 119 if (node.Symbol is Argument) { 120 var argNode = (ArgumentTreeNode)node; 121 instr.iArg0 = (ushort)argNode.Symbol.ArgumentIndex; 122 } 123 instr.dynamicNode = node; 124 foreach (var hook in postInstructionCompiledHooks) { 125 instr = hook(instr); 126 } 127 yield return instr; 128 } 129 } 130 131 public static Instruction[] CompileBreadth(ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper) { 132 return CompileBreadth(tree, opCodeMapper, Enumerable.Empty<Func<Instruction, Instruction>>()); 133 } 134 public static Instruction[] CompileBreadth(ISymbolicExpressionTree tree, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper, IEnumerable<Func<Instruction, Instruction>> postInstructionCompiledHooks) { 135 Dictionary<string, ushort> entryPoint = new Dictionary<string, ushort>(); 136 List<Instruction> code = new List<Instruction>(); 137 // compile main body branches 138 foreach (var branch in tree.Root.GetSubtree(0).Subtrees) { 139 code.AddRange(CompileBreadth(branch, opCodeMapper, postInstructionCompiledHooks)); 140 } 141 // compile function branches 142 var functionBranches = from node in tree.IterateNodesBreadth() 143 where node.Symbol is Defun 144 select node; 145 foreach (DefunTreeNode branch in functionBranches) { 146 if (code.Count > ushort.MaxValue) throw new ArgumentException("Code for the tree is too long (> ushort.MaxValue)."); 147 entryPoint[branch.FunctionName] = (ushort)code.Count; 148 code.AddRange(CompileBreadth(branch.GetSubtree(0), opCodeMapper, postInstructionCompiledHooks)); 149 } 150 // address of all functions is fixed now 151 // iterate through code again and fill in the jump locations 152 for (int i = 0; i < code.Count; i++) { 153 Instruction instr = code[i]; 154 if (instr.dynamicNode.Symbol is InvokeFunction) { 155 var invokeNode = (InvokeFunctionTreeNode)instr.dynamicNode; 156 instr.iArg0 = entryPoint[invokeNode.Symbol.FunctionName]; 157 } 158 } 159 160 return code.ToArray(); 161 } 162 163 private static IEnumerable<Instruction> CompileBreadth(ISymbolicExpressionTreeNode branch, Func<ISymbolicExpressionTreeNode, byte> opCodeMapper, IEnumerable<Func<Instruction, Instruction>> postInstructionCompiledHooks) { 164 foreach (var node in branch.IterateNodesBreadth()) { 63 165 Instruction instr = new Instruction(); 64 166 int subtreesCount = node.SubtreeCount;
Note: See TracChangeset
for help on using the changeset viewer.