/// <summary> /// Display an expression as LISP (the programming language) /// </summary> /// <param name="node">The root node.</param> /// <returns>The LISP for the expression.</returns> public String DisplayExpressionLISP(TreeGenomeNode node) { var result = new StringBuilder(); if (DetermineChildCount(node.Opcode) == 0) { result.Append(GetOpcodeText(node.Opcode)); } else { result.Append("("); result.Append(GetOpcodeText(node.Opcode)); foreach (TreeGenomeNode child in node.Children) { result.Append(" "); result.Append(DisplayExpressionLISP(child)); } result.Append(")"); } return(result.ToString()); }
/// <inheritdoc /> public override double Evaluate(TreeGenomeNode node, double[] varValues) { switch (node.Opcode) { case OPCODE_NEG: return(-(Evaluate(node.Children[0], varValues))); case OPCODE_ADD: return(Evaluate(node.Children[0], varValues) + Evaluate(node.Children[1], varValues)); case OPCODE_SUB: return(Evaluate(node.Children[0], varValues) - Evaluate(node.Children[1], varValues)); case OPCODE_DIV: return(Evaluate(node.Children[0], varValues) / Evaluate(node.Children[1], varValues)); case OPCODE_MUL: return(Evaluate(node.Children[0], varValues) * Evaluate(node.Children[1], varValues)); case OPCODE_POWER: return(Math.Pow(Evaluate(node.Children[0], varValues), Evaluate(node.Children[1], varValues))); case OPCODE_SQRT: return(Math.Sqrt(Evaluate(node.Children[0], varValues))); default: int index = node.Opcode - OPCODE_VAR_CONST; if (index >= (constValues.Length + varCount)) { throw new AIFHError("Invalid opcode: " + node.Opcode); } if (index < varCount) { return(varValues[index]); } return(constValues[index - varCount]); } }