/// <summary> /// Given a tree node, the node is translated into code, this method is /// recursively called for each of the node's children. /// </summary> /// <param name="node">The node to translate</param> protected void WriteProgramBody(GPNode node) { // // Recursively work through the nodes if (node is GPNodeTerminal) { m_Writer.Write(((GPNodeTerminal)node).ToString()); // // There are no children, so don't need to make a recursive call } else if (node is GPNodeFunction) { if (node is GPNodeFunctionADF) { GPNodeFunctionADF adf = (GPNodeFunctionADF)node; m_Writer.Write(" _\n\t\tADF" + adf.WhichFunction); m_Writer.Write("("); // // The parameters to the ADF are its children for (int Param = 0; Param < adf.NumberArgs; Param++) { if (Param > 0) { m_Writer.Write(","); } WriteProgramBody(((GPNodeFunction)node).Children[Param]); } m_Writer.Write(") _\n\t\t"); } else if (node is GPNodeFunctionADL) { GPNodeFunctionADL adl = (GPNodeFunctionADL)node; m_Writer.Write(" _\n\t\tADL" + adl.WhichFunction); m_Writer.Write("("); // // The parameters to the ADL are its children for (int Param = 0; Param < adl.NumberArgs; Param++) { if (Param > 0) { m_Writer.Write(","); } WriteProgramBody(((GPNodeFunction)node).Children[Param]); } m_Writer.Write(") _\n\t\t"); } else if (node is GPNodeFunctionSetMem) { m_Writer.Write(" _\n\t\tSetMem("); WriteProgramBody(((GPNodeFunction)node).Children[0]); m_Writer.Write(","); WriteProgramBody(((GPNodeFunction)node).Children[1]); m_Writer.Write(")"); } else if (node is GPNodeFunctionGetMem) { m_Writer.Write(" _\n\t\tGetMem("); WriteProgramBody(((GPNodeFunction)node).Children[0]); m_Writer.Write(")"); } else { m_Writer.Write(" _\n\t\t" + node.ToString() + "("); // // The parameters to the function are its children for (short Param = 0; Param < m_FunctionSet[node.ToString().ToUpper()].Arity; Param++) { if (Param > 0) { m_Writer.Write(","); } WriteProgramBody(((GPNodeFunction)node).Children[Param]); } m_Writer.Write(")"); } } else { Console.WriteLine("Have an undefined node we are tying to write"); } }
/// <summary> /// Given a tree node, the node is translated into code, this method is /// recursively called for each of the node's children. /// </summary> /// <param name="node">The node to translate</param> protected void WriteProgramBody(GPNode node) { // // Recursively work through the nodes if (node is GPNodeTerminal) { if (node is GPNodeTerminalDouble || node is GPNodeTerminalInteger) { // // Put doubles on their own line, helps prevent the lines // from getting too long m_Writer.WriteLine(); m_Writer.Write(" . "); } m_Writer.Write(((GPNodeTerminal)node).ToString()); // // There are no children, so don't need to make a recursive call } else if (node is GPNodeFunction) { if (node is GPNodeFunctionADF) { GPNodeFunctionADF adf = (GPNodeFunctionADF)node; m_Writer.Write("\n . ADF" + adf.WhichFunction); m_Writer.Write("("); // // The parameters to the ADF are its children for (int Param = 0; Param < adf.NumberArgs; Param++) { if (Param > 0) { m_Writer.Write(","); } WriteProgramBody(((GPNodeFunction)node).Children[Param]); } m_Writer.Write(")\n . "); } else if (node is GPNodeFunctionADL) { GPNodeFunctionADL adl = (GPNodeFunctionADL)node; m_Writer.Write("\n . ADL" + adl.WhichFunction); m_Writer.Write("("); // // The parameters to the ADL are its children for (int Param = 0; Param < adl.NumberArgs; Param++) { if (Param > 0) { m_Writer.Write(","); } WriteProgramBody(((GPNodeFunction)node).Children[Param]); } m_Writer.Write(")\n . "); } else if (node is GPNodeFunctionSetMem) { m_Writer.Write("\n . SetMem("); WriteProgramBody(((GPNodeFunction)node).Children[0]); m_Writer.Write(","); WriteProgramBody(((GPNodeFunction)node).Children[1]); m_Writer.Write(")"); } else if (node is GPNodeFunctionGetMem) { m_Writer.Write("\n . GetMem("); WriteProgramBody(((GPNodeFunction)node).Children[0]); m_Writer.Write(")"); } else { m_Writer.Write("\n . " + node.ToString() + "("); // // The parameters to the function are its children for (short Param = 0; Param < m_FunctionSet[node.ToString().ToUpper()].Arity; Param++) { if (Param > 0) { m_Writer.Write(","); } WriteProgramBody(((GPNodeFunction)node).Children[Param]); } m_Writer.Write(")"); } } else { Console.WriteLine("Have an undefined node we are tying to write"); } }