src/core/net/sf/basedb/util/jep/Log2Function.java

Code
Comments
Other
Rev Date Author Line
2086 17 Mar 06 nicklas 1 /*
2086 17 Mar 06 nicklas 2   $Id$
2086 17 Mar 06 nicklas 3
4889 06 Apr 09 nicklas 4   Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg
2086 17 Mar 06 nicklas 5
2304 22 May 06 jari 6   This file is part of BASE - BioArray Software Environment.
2304 22 May 06 jari 7   Available at http://base.thep.lu.se/
2086 17 Mar 06 nicklas 8
2086 17 Mar 06 nicklas 9   BASE is free software; you can redistribute it and/or
2086 17 Mar 06 nicklas 10   modify it under the terms of the GNU General Public License
4479 05 Sep 08 jari 11   as published by the Free Software Foundation; either version 3
2086 17 Mar 06 nicklas 12   of the License, or (at your option) any later version.
2086 17 Mar 06 nicklas 13
2086 17 Mar 06 nicklas 14   BASE is distributed in the hope that it will be useful,
2086 17 Mar 06 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
2086 17 Mar 06 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2086 17 Mar 06 nicklas 17   GNU General Public License for more details.
2086 17 Mar 06 nicklas 18
2086 17 Mar 06 nicklas 19   You should have received a copy of the GNU General Public License
4515 11 Sep 08 jari 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
2086 17 Mar 06 nicklas 21 */
2086 17 Mar 06 nicklas 22 package net.sf.basedb.util.jep;
2086 17 Mar 06 nicklas 23
2086 17 Mar 06 nicklas 24 import net.sf.basedb.core.BaseException;
2086 17 Mar 06 nicklas 25 import net.sf.basedb.core.query.Expression;
2086 17 Mar 06 nicklas 26 import net.sf.basedb.core.query.Expressions;
2086 17 Mar 06 nicklas 27
2086 17 Mar 06 nicklas 28 import java.util.Stack;
2086 17 Mar 06 nicklas 29
2086 17 Mar 06 nicklas 30 import org.nfunk.jep.Node;
2086 17 Mar 06 nicklas 31 import org.nfunk.jep.ParseException;
2086 17 Mar 06 nicklas 32
2086 17 Mar 06 nicklas 33
2086 17 Mar 06 nicklas 34 /**
2086 17 Mar 06 nicklas 35   A JEP function class that adds a <code>log2(expression)</code> function to a 
2086 17 Mar 06 nicklas 36   JEP expression parser. The function will look take the 2-based logarithm of
2086 17 Mar 06 nicklas 37   it's argument.
2086 17 Mar 06 nicklas 38   <p>
2302 22 May 06 nicklas 39   This function is added automatically by the {@link Jep#newJep(String, JepFunction[])}
2086 17 Mar 06 nicklas 40   method to the parser.
2086 17 Mar 06 nicklas 41
2086 17 Mar 06 nicklas 42   @author Nicklas
2086 17 Mar 06 nicklas 43   @version 2.0
2086 17 Mar 06 nicklas 44   @base.modified $Date$
2086 17 Mar 06 nicklas 45   @see Jep
2086 17 Mar 06 nicklas 46 */
2086 17 Mar 06 nicklas 47 public class Log2Function
2086 17 Mar 06 nicklas 48   implements JepExpressionFunction
2086 17 Mar 06 nicklas 49 {
2086 17 Mar 06 nicklas 50
2086 17 Mar 06 nicklas 51   /**
2086 17 Mar 06 nicklas 52     Get the singleton instance of this function.
2086 17 Mar 06 nicklas 53     @return The Log2Function object
2086 17 Mar 06 nicklas 54    */
2086 17 Mar 06 nicklas 55   public static Log2Function getInstance()
2086 17 Mar 06 nicklas 56   {
2086 17 Mar 06 nicklas 57     return theInstance;
2086 17 Mar 06 nicklas 58   }
2086 17 Mar 06 nicklas 59   
2086 17 Mar 06 nicklas 60   /**
2086 17 Mar 06 nicklas 61      The one and only instance of this function.
2086 17 Mar 06 nicklas 62   */
2086 17 Mar 06 nicklas 63   private static final Log2Function theInstance = new Log2Function();
2086 17 Mar 06 nicklas 64   
2086 17 Mar 06 nicklas 65   /**
2086 17 Mar 06 nicklas 66     The natural logarithm of 2. This is used when calculating the 2-based
2086 17 Mar 06 nicklas 67     logarithm of a value since it can be calculated as: <code>ln(x) / ln(2)</code>
2086 17 Mar 06 nicklas 68   */
2086 17 Mar 06 nicklas 69   private static final double LOG2 = Math.log(2);
2086 17 Mar 06 nicklas 70   
2086 17 Mar 06 nicklas 71   /**
2086 17 Mar 06 nicklas 72     Create a new instance of this function.
2086 17 Mar 06 nicklas 73   */
2086 17 Mar 06 nicklas 74   private Log2Function()
2086 17 Mar 06 nicklas 75   {}
2086 17 Mar 06 nicklas 76   
2086 17 Mar 06 nicklas 77   /*
2086 17 Mar 06 nicklas 78     From the JepFunction interface
2086 17 Mar 06 nicklas 79     -------------------------------------------
2086 17 Mar 06 nicklas 80   */
2086 17 Mar 06 nicklas 81   /**
2086 17 Mar 06 nicklas 82     @return The string "log2"
2086 17 Mar 06 nicklas 83   */
6127 14 Sep 12 nicklas 84   @Override
2086 17 Mar 06 nicklas 85   public String getFunctionName()
2086 17 Mar 06 nicklas 86   {
2086 17 Mar 06 nicklas 87     return "log2";
2086 17 Mar 06 nicklas 88   }
2086 17 Mar 06 nicklas 89   // -------------------------------------------
2086 17 Mar 06 nicklas 90   /*
2086 17 Mar 06 nicklas 91     From the JepExpressionFunction interface
2086 17 Mar 06 nicklas 92     -------------------------------------------
2086 17 Mar 06 nicklas 93   */
2086 17 Mar 06 nicklas 94   /**
2086 17 Mar 06 nicklas 95     Use the {@link Expressions#log2(Expression)} method to create an
2086 17 Mar 06 nicklas 96     expression taking the 2-based logarithm of the argument.
2086 17 Mar 06 nicklas 97   */
6127 14 Sep 12 nicklas 98   @Override
2086 17 Mar 06 nicklas 99   public Expression toExpression(Node node)
2086 17 Mar 06 nicklas 100   {
2086 17 Mar 06 nicklas 101     int numChildren = node.jjtGetNumChildren();
2086 17 Mar 06 nicklas 102     if (numChildren != 1)
2086 17 Mar 06 nicklas 103     {
2086 17 Mar 06 nicklas 104       throw new BaseException("Invalid number of arguments for 'log2' function: " + numChildren);
2086 17 Mar 06 nicklas 105     }
2086 17 Mar 06 nicklas 106     return Expressions.log2(Jep.nodeToExpression(node.jjtGetChild(0)));
2086 17 Mar 06 nicklas 107   }
2086 17 Mar 06 nicklas 108   // -------------------------------------------
2086 17 Mar 06 nicklas 109   /*
2086 17 Mar 06 nicklas 110     From the PostfixMathCommandI interface
2086 17 Mar 06 nicklas 111     -------------------------------------------
2086 17 Mar 06 nicklas 112   */
2086 17 Mar 06 nicklas 113   /**
2086 17 Mar 06 nicklas 114     @return Always 1
2086 17 Mar 06 nicklas 115   */
6127 14 Sep 12 nicklas 116   @Override
2086 17 Mar 06 nicklas 117   public int getNumberOfParameters()
2086 17 Mar 06 nicklas 118   {
2086 17 Mar 06 nicklas 119     return 1;
2086 17 Mar 06 nicklas 120   }
6127 14 Sep 12 nicklas 121   @Override
2086 17 Mar 06 nicklas 122   public void setCurNumberOfParameters(int n)
2086 17 Mar 06 nicklas 123   {}
6127 14 Sep 12 nicklas 124   @Override
2474 31 Jul 06 nicklas 125   public boolean checkNumberOfParameters(int n)
2474 31 Jul 06 nicklas 126   {
2474 31 Jul 06 nicklas 127     return n == 1;
2474 31 Jul 06 nicklas 128   }
6127 14 Sep 12 nicklas 129   @Override
6875 20 Apr 15 nicklas 130   @SuppressWarnings({"unchecked", "rawtypes"})
2086 17 Mar 06 nicklas 131   public void run(Stack stack)
2086 17 Mar 06 nicklas 132     throws ParseException
2086 17 Mar 06 nicklas 133   {
2086 17 Mar 06 nicklas 134     if (stack == null || stack.empty()) 
2086 17 Mar 06 nicklas 135     {
2086 17 Mar 06 nicklas 136       throw new ParseException("Stack is empty");
2086 17 Mar 06 nicklas 137     }
2086 17 Mar 06 nicklas 138     Object argument = stack.pop();
6314 02 Sep 13 nicklas 139     if (argument instanceof Number)
2086 17 Mar 06 nicklas 140     {
2086 17 Mar 06 nicklas 141       stack.push(log2((Number)argument));
2086 17 Mar 06 nicklas 142     }
2086 17 Mar 06 nicklas 143     else
2086 17 Mar 06 nicklas 144     {
2086 17 Mar 06 nicklas 145       throw new ParseException("Invalid parameter type: " + argument + "; expected number");
2086 17 Mar 06 nicklas 146     }
2086 17 Mar 06 nicklas 147   }
2086 17 Mar 06 nicklas 148   // -------------------------------------------
2086 17 Mar 06 nicklas 149
2086 17 Mar 06 nicklas 150   /**
2086 17 Mar 06 nicklas 151     Calculate the 2-based logarithm of the argument.
4020 29 Nov 07 martin 152      @param argument A number to calculate on
4020 29 Nov 07 martin 153      @return a double object
4020 29 Nov 07 martin 154      @throws ParseException If the logarithm could not be calculated.  
2086 17 Mar 06 nicklas 155   */
2317 24 May 06 nicklas 156   public double log2(Number argument)
2086 17 Mar 06 nicklas 157     throws ParseException
2086 17 Mar 06 nicklas 158   {
2086 17 Mar 06 nicklas 159     return Math.log(argument.doubleValue()) / LOG2;
2086 17 Mar 06 nicklas 160   }
2086 17 Mar 06 nicklas 161 }