Logo
Distributed Genetic Programming Framework
print print

File org.dgpf.gp.regression.base.Calculation.java

Here you can find all the information about the file org.dgpf.gp.regression.base.Calculation.java. You may explore it here or download it onto your local disk.
/*
 * Copyright (c) 2006 Thomas Weise
 * 
 * E-Mail           : tweise@gmx.de
 * Creation Date    : 2006-07-24 13:39:06
 * Original Filename: org.dgpf.gp.regression.Calculation.java
 * Version          : 1.0.0
 * Last modification: 2006-07-24
 *                by: Thomas Weise
 * 
 * License          : GNU LESSER GENERAL PUBLIC LICENSE
 *                    Version 2.1, February 1999
 *                    You should have received a copy of this license along
 *                    with this library; if not, write to the Free Software
 *                    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *                    MA 02111-1307, USA or download the license under
 *                    http://www.gnu.org/copyleft/lesser.html.
 *                    
 * Warranty         : This software is provided "as is" without any
 *                    warranty; without even the implied warranty of
 *                    merchantability or fitness for a particular purpose.
 *                    See the Gnu Lesser General Public License for more
 *                    details.
 */

 
package org.dgpf.gp.regression.base;

import org.sfc.text.Text;


/**
 * This object holds one or more expressions representing a formula found
 * by regression.
 *
 * @author Thomas Weise
 */

public class Calculation  extends FormulaBase
  {
/**
 * The serial version uid.
 */

  private static  final long  serialVersionUID  = 1;
  
/**
 * This value denotes a target variable which holds a value wanted by
 * the system.
 */

  public  static  final byte  TARGET_VARIABLE   = 1;
/**
 * This value denotes a provided variable where the provided data is
 * initially stored in.
 */

  public  static  final byte  PROVIDED_VARIABLE = (TARGET_VARIABLE << 1);
/**
 * This value denotes a variable that is send to another node in the
 * network each turn.
 */

  public  static  final byte  OUTPUT_VARIABLE   = (PROVIDED_VARIABLE << 1);
/**
 * This value denotes a variable where the value received from an output
 * variable should be stored in.
 */

  public  static  final byte  INPUT_VARIABLE    = (OUTPUT_VARIABLE << 1);
  
/**
 * The formulas in execution order.
 */

            Formula[]     m_formulas ;
/**
 * The internal costs.
 */

  transient double        m_costs;
/**
 * The types of variables - or combinations of the values:
 * @see #INPUT_VARIABLE
 * @see #TARGET_VARIABLE
 * @see #PROVIDED_VARIABLE
 * @see #OUTPUT_VARIABLE
 */

            byte[]        m_variable_types  ;
/**
 * The start values of the variables.
 */

            double[]      m_start_values    ;
          
/**
 * Create a new formula providing the expressions it should consist of.
 * @param p_formulas      The formulas to be executed.
 * @param p_types         The types of the variables.
 * @param p_start_values  The start values of the variables.
 */

  public  Calculation (final Formula[] p_formulas,
                       final byte[]    p_types,
                       final double[]  p_start_values)
    {
    this();
    this.m_formulas       = p_formulas;
    this.m_variable_types = p_types; 
    this.m_start_values   = p_start_values;
    }
  
  
/**
 * The internal constructor.
 */

  Calculation ()
    {
    super();
    }
  
/**
 * Obtain the count of formulas this formula consists of.
 * @return The count of formulas this formula consists of.
 */

  public  final int get_formula_count()
    {
    return this.m_formulas.length;
    }
  
/**
 * Obtain the formulas at the specified index.
 * @param p_index   The index of the formulas to be obtained.
 * @return  The formulas at index <code>p_index</code>. 
 */

  public  final Formula  get_formula  (final int p_index)
    {
    return this.m_formulas[p_index];
    }
  


/**
 * Store this objects content into a string builder.
 * @param p_sb  The string builder to store stuff into.
 */

  @Override
  public  void  to_string (final StringBuilder p_sb)
    {
    int        l_i, l_j;
    Formula[]  l_e;
    byte[]     l_b;
    double[]   l_s;  
    
    l_e = this.m_formulas;
    l_j = l_e.length;
    for(l_i = 0; l_i < l_j; l_i++)
      {
      l_e[l_i].to_string(p_sb);
      p_sb.append(Text.LINE_BREAK_CHARS);
      }
    
    l_b = this.m_variable_types;
    
    p_sb.append(Text.LINE_BREAK_CHARS);
    p_sb.append("variables: ");
    AggregationUtils.get_variable_name(0, p_sb);
    p_sb.append("..");
    AggregationUtils.get_variable_name(l_b.length-1, p_sb);
    
    p_sb.append(Text.LINE_BREAK_CHARS);
    p_sb.append("initial  :");
    l_s = this.m_start_values;
    for(l_i = 0; l_i < l_b.length; l_i++)
      {
      p_sb.append(' ');
      p_sb.append(l_s[l_i]);
      }
    
    p_sb.append(Text.LINE_BREAK_CHARS);
    p_sb.append("target   :");
    for(l_i = 0; l_i < l_b.length; l_i++)
      {
      if((l_b[l_i] & TARGET_VARIABLE) != 0)
        {
        p_sb.append(' ');
        AggregationUtils.get_variable_name(l_i, p_sb);
        }
      }
    
    p_sb.append(Text.LINE_BREAK_CHARS);    
    p_sb.append("provided :");
    for(l_i = 0; l_i < l_b.length; l_i++)
      {
      if((l_b[l_i] & PROVIDED_VARIABLE) != 0)
        {
        p_sb.append(' ');
        AggregationUtils.get_variable_name(l_i, p_sb);
        }
      }    
    
    p_sb.append(Text.LINE_BREAK_CHARS);
    p_sb.append("output   :");
    for(l_i = 0; l_i < l_b.length; l_i++)
      {
      if((l_b[l_i] & OUTPUT_VARIABLE) != 0)
        {
        p_sb.append(' ');
        AggregationUtils.get_variable_name(l_i, p_sb);
        }
      }
    
    p_sb.append(Text.LINE_BREAK_CHARS);
    p_sb.append("input    :");
    for(l_i = 0; l_i < l_b.length; l_i++)
      {
      if((l_b[l_i] & INPUT_VARIABLE) != 0)
        {
        p_sb.append(' ');
        AggregationUtils.get_variable_name(l_i, p_sb);
        }
      }
    }
  
/**
 * Compute the expression value.
 * @param p_calculator  The calculator this expression should be evaluated
 *                      on.
 * @return  The computed expression value.
 */

  @Override
  public  final  double  compute (final  Calculator    p_calculator)
    {    
    Formula[]  l_e;
    int        l_i, l_j;
    
    l_e = this.m_formulas;
    l_j = l_e.length;
    l_j--;
    
    for(l_i = 0; l_i < l_j; l_i++)
      {
      l_e[l_i].compute(p_calculator);
      }
    
    return l_e[l_j].compute(p_calculator);
    }
  
  

/**
 * Returns the costs that will arise when executing this expression.
 * This is defined as the costs of exactly this expression plus the costs
 * of all sub-expressions.
 * @return The costs of executing this expression.
 */

  @Override
  public  final double      get_costs  () 
    {
    int        l_i;
    double     l_s;
    Formula[]  l_e;
    
    if(this.m_costs > 0.0d) return this.m_costs;
    
    l_e = this.m_formulas;
    l_i = l_e.length;
    l_s = 0.0d;
    for(--l_i; l_i >= 0; l_i--)
      {
      l_s += l_e[l_i].get_costs();
      }
    
    return (this.m_costs = l_s);
    }
  
/**
 * Returns the index of the highest variable used.
 * @return The index of the highest variable used.
 */

  @Override
  public  final  int     get_variable_count  ()
    {
    return this.m_variable_types.length;
    }
  
/**
 * Check if another object is equal to this one.
 * @param p_o   The object to check.
 * @return  <code>true</code> if and only if <code>p_o</code> is exactly
 *          the same object than this one.
 */

  @Override
  public  boolean equals  (final Object p_o)
    {
    Formula[] l_f1, l_f2;
    byte[]    l_b1, l_b2;
    int       l_i;
    
    if(p_o == thisreturn true;
    
    if(p_o instanceof Calculation)
      {
      l_f1 = this.m_formulas;
      l_f2 = ((Calculation)p_o).m_formulas;
            
      if(l_f1 != l_f2)
        {
        l_i = l_f1.length;
        if(l_i != l_f2.length) return false;
          
        for(--l_i; l_i >= 0; l_i--)
          {
          if(!(l_f1[l_i].equals(l_f2[l_i]))) return false;
          }
        }
      
      l_b1 = this.m_variable_types;
      l_b2 = ((Calculation)p_o).m_variable_types;      
      if(l_b1 != l_b2)
        {
        l_i = l_b1.length;
        if(l_i != l_b2.length) return false;
        
        for(--l_i; l_i >= 0; l_i--)
          {
          if(l_b1[l_i] != l_b2[l_i]) return false;
          }
        }
        
      return true;
      }
    
    return false;
    }
  
/**
 * Get a string that can be copy-pasted into a java file an that creates
 * this construct.
 * @param p_b The string builder to add with. 
 */

  @Override
  public final  void    to_creation_string (final StringBuilder p_b)
    {
    int       l_i;
    Formula[] l_f;
    byte[]    l_b;
    double[]  l_d;
    
    p_b.append("new Calculation(new Formula[] {");
    
    l_f = this.m_formulas;
    for(l_i = 0; l_i < l_f.length; l_i++)
      {
      p_b.append(Text.LINE_BREAK_CHARS);
      p_b.append("  ");
      l_f[l_i].to_creation_string(p_b);
      p_b.append(',');
      }
    p_b.append("},");
    
    p_b.append(Text.LINE_BREAK_CHARS);
    p_b.append("                new byte[] {");
    
    l_b = this.m_variable_types;
    for(l_i = 0; l_i < l_b.length; l_i++)
      {
      p_b.append(Text.LINE_BREAK_CHARS);
      p_b.append("  ((byte)");
      p_b.append(l_b[l_i]);
      p_b.append("),");
      }     
    p_b.append("},");
    
    p_b.append(Text.LINE_BREAK_CHARS);
    p_b.append("                new double[] {");
    
    l_d = this.m_start_values;
    for(l_i = 0; l_i < l_b.length; l_i++)
      {
      p_b.append(Text.LINE_BREAK_CHARS);
      p_b.append(l_d[l_i]);
      p_b.append(',');
      }    
    
    p_b.append("});");
    }
  
  
/**
 * Check how the specified variable is used.
 * @param p_index The index of the variable.
 * @return  An or-combination of <code>1</code> if the variable is read and
 *          <code>2</code> if it is written to.
 */

  @Override
  public  final int  get_variable_usage       (final int p_index)
    {
    int       l_i, l_u;
    Formula[] l_f;
    
    l_u = 0;
    l_f = this.m_formulas;
    for(l_i = (l_f.length-1); l_i >= 0; l_i--)
      {
      l_u |= l_f[l_i].get_variable_usage(p_index);
      if(l_u == 3) return 3;
      }
    
    return l_u;
    }
  

/**
 * Obtain the depth of the construct.
 * @return The depth of the construct.
 */

  @Override
  public  int     get_depth           ()
    {
    Formula[] l_f;
    int       l_i, l_u;
    
    l_f = this.m_formulas;
    l_u = 0;
    for(l_i = (l_f.length-1); l_i >= 0; l_i--)
      {
      l_u = Math.max(l_u, l_f[l_i].get_depth());
      }
    
    return l_u;
    }
  }

File Information:

file name:Calculation.java
package:org.dgpf.gp.regression.base
qualified name:org.dgpf.gp.regression.base.Calculation.java
file type:Java Source File
download location:download http://dgpf.sourceforge.net/source/org/dgpf/gp/regression/base/Calculation.java
size:10.687 KB (10944 B)
uploaded: 2015-07-22 04:10:56 GMT+0000
last update: 2006-08-15 04:57:00 GMT+0000
last access: 2017-11-24 00:22:42 GMT+0000

statistics online since 2006-01-02.   RSS Feed
Contact us by sending an email to tweise@gmx.de to receive further information, to report errors, or to join our project.
All content on this site (http://dgpf.sourceforge.net/) is LGPL-licensed.
http://dgpf.sourceforge.net/scripts/source/source.php last modified at 2015-07-22 04:10:53 GMT+0000 served at 2017-11-24 00:22:42 GMT+0000.
Valid CSS Valid XHTML 1.1
Valid RSS SourceForge.net Logo