Package org.encog.ml.prg

Source Code of org.encog.ml.prg.ProgramNode

/*
* Encog(tm) Core v3.3 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2014 Heaton Research, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*  
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.ml.prg;

import java.io.Serializable;

import org.encog.ml.prg.expvalue.ExpressionValue;
import org.encog.ml.prg.extension.ProgramExtensionTemplate;
import org.encog.ml.tree.TreeNode;
import org.encog.ml.tree.basic.BasicTreeNode;

/**
* Represents a program node in an EPL program.
*/
public class ProgramNode extends BasicTreeNode implements Serializable {
  /**
   * The serial id.
   */
  private static final long serialVersionUID = 1L;

  /**
   * The opcode that this node implements.
   */
  private final ProgramExtensionTemplate template;

  /**
   * The Encog program that this node belongs to.
   */
  private final EncogProgram owner;

  /**
   * Any data associated with this node. For example, const nodes will store
   * their value here.
   */
  private final ExpressionValue[] data;

  /**
   * Construct the program node.
   *
   * @param theOwner
   *            The owner of the node.
   * @param theTemplate
   *            The opcode that this node is based on.
   * @param theArgs
   *            The child nodes to this node.
   */
  public ProgramNode(final EncogProgram theOwner,
      final ProgramExtensionTemplate theTemplate,
      final ProgramNode[] theArgs) {
    this.owner = theOwner;
    this.data = new ExpressionValue[theTemplate.getDataSize()];
    this.template = theTemplate;
    addChildNodes(theArgs);

    for (int i = 0; i < this.data.length; i++) {
      this.data[i] = new ExpressionValue(0);
    }
  }

  /**
   * @return True if all children are constant.
   */
  public boolean allConstChildren() {
    boolean result = true;

    for (final TreeNode tn : getChildNodes()) {
      final ProgramNode node = (ProgramNode) tn;
      if (node.isVariable()) {
        result = false;
        break;
      }
    }

    return result;
  }

  /**
   * @return True if all descendants are constant.
   */
  public boolean allConstDescendants() {
    if (isVariable()) {
      return false;
    }

    if (isLeaf()) {
      return true;
    }

    for (final TreeNode tn : getChildNodes()) {
      final ProgramNode childNode = (ProgramNode) tn;
      if (!childNode.allConstDescendants()) {
        return false;
      }
    }

    return true;
  }

  /**
   * @return The evaluated value of this node.
   */
  public ExpressionValue evaluate() {
    return this.template.evaluate(this);
  }

  /**
   * Get the specified child node.
   *
   * @param index
   *            The index of this node.
   * @return The child node requested.
   */
  public ProgramNode getChildNode(final int index) {
    return (ProgramNode) getChildNodes().get(index);
  }

  /**
   * @return The node data.
   */
  public ExpressionValue[] getData() {
    return this.data;
  }

  /**
   * @return The name of this node (from the opcode template).
   */
  public String getName() {
    return this.template.getName();
  }

  /**
   * @return The EncogProgram that owns this node.
   */
  public EncogProgram getOwner() {
    return this.owner;
  }

  /**
   * @return the template
   */
  public ProgramExtensionTemplate getTemplate() {
    return this.template;
  }

  /**
   * @return Returns true if this node's value is variable.
   */
  public boolean isVariable() {
    return this.template.isVariable();
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public String toString() {
    final StringBuilder result = new StringBuilder();
    result.append("[ProgramNode: name=");
    result.append(this.template.getName());
    result.append(", childCount=");
    result.append(getChildNodes().size());
    result.append(", childNodes=");
    for (final TreeNode tn : getChildNodes()) {
      final ProgramNode node = (ProgramNode) tn;
      result.append(" ");
      result.append(node.getTemplate().getName());
    }
    result.append("]");
    return result.toString();
  }

}
TOP

Related Classes of org.encog.ml.prg.ProgramNode

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.