Class Functions
- java.lang.Object
-
- cern.jet.math.Functions
-
public class Functions extends java.lang.ObjectFunction objects to be passed to generic methods. Contains the functions ofMathas function objects, as well as a few more basic functions.Function objects conveniently allow to express arbitrary functions in a generic manner. Essentially, a function object is an object that can perform a function on some arguments. It has a minimal interface: a method apply that takes the arguments, computes something and returns some result value. Function objects are comparable to function pointers in C used for call-backs.
Unary functions are of type
DoubleFunction, binary functions of typeDoubleDoubleFunction. All can be retrieved via public static final variables named after the function. Unary predicates are of typeDoubleProcedure, binary predicates of typeDoubleDoubleProcedure. All can be retrieved via public static final variables named isXXX.Binary functions and predicates also exist as unary functions with the second argument being fixed to a constant. These are generated and retrieved via factory methods (again with the same name as the function). Example:
- Functions.pow gives the function ab.
- Functions.pow.apply(2,3)==8.
- Functions.pow(3) gives the function a3.
- Functions.pow(3).apply(2)==8.
bindArg1(DoubleDoubleFunction,double)andbindArg2(DoubleDoubleFunction,double). The order of arguments can be swapped so that the first argument becomes the second and vice-versa. See methodswapArgs(DoubleDoubleFunction). Example:- Functions.pow gives the function ab.
- Functions.bindArg2(Functions.pow,3) gives the function x3.
- Functions.bindArg1(Functions.pow,3) gives the function 3x.
- Functions.swapArgs(Functions.pow) gives the function ba.
Even more general, functions can be chained (composed, assembled). Assume we have two unary functions g and h. The unary function g(h(a)) applying both in sequence can be generated via
chain(DoubleFunction,DoubleFunction):- Functions.chain(g,h);
chain(DoubleFunction,DoubleDoubleFunction):- Functions.chain(g,f);
chain(DoubleDoubleFunction,DoubleFunction,DoubleFunction):- Functions.chain(f,g,h);
- chain(plus,sin,chain(square,cos));
new DoubleDoubleFunction() { public final double apply(double a, double b) { return Math.sin(a) + Math.pow(Math.cos(b),2); } }For aliasing see
functions. Try this// should yield 1.4399560356056456 in all cases double a = 0.5; double b = 0.2; double v = Math.sin(a) + Math.pow(Math.cos(b),2); System.out.println(v); Functions F = Functions.functions; DoubleDoubleFunction f = F.chain(F.plus,F.sin,F.chain(F.square,F.cos)); System.out.println(f.apply(a,b)); DoubleDoubleFunction g = new DoubleDoubleFunction() { public double apply(double a, double b) { return Math.sin(a) + Math.pow(Math.cos(b),2); } }; System.out.println(g.apply(a,b));Performance
Surprise. Using modern non-adaptive JITs such as SunJDK 1.2.2 (java -classic) there seems to be no or only moderate performance penalty in using function objects in a loop over traditional code in a loop. For complex nested function objects (e.g. F.chain(F.abs,F.chain(F.plus,F.sin,F.chain(F.square,F.cos)))) the penalty is zero, for trivial functions (e.g. F.plus) the penalty is often acceptable.Iteration Performance [million function evaluations per second]
Pentium Pro 200 Mhz, SunJDK 1.2.2, NT, java -classic,30000000 iterations
3000000 iterations (10 times less) F.plus a+b F.chain(F.abs,F.chain(F.plus,F.sin,F.chain(F.square,F.cos))) Math.abs(Math.sin(a) + Math.pow(Math.cos(b),2)) 10.8 29.6 0.43 0.35 - Version:
- 1.0, 09/24/99
-
-
Field Summary
Fields Modifier and Type Field Description static DoubleFunctionabsFunction that returns Math.abs(a).static DoubleFunctionacosFunction that returns Math.acos(a).static DoubleFunctionasinFunction that returns Math.asin(a).static DoubleFunctionatanFunction that returns Math.atan(a).static DoubleDoubleFunctionatan2Function that returns Math.atan2(a,b).static DoubleFunctionceilFunction that returns Math.ceil(a).static DoubleDoubleFunctioncompareFunction that returns a < b ? -1 : a > b ? 1 : 0.static DoubleFunctioncosFunction that returns Math.cos(a).static DoubleDoubleFunctiondivFunction that returns a / b.static DoubleDoubleFunctionequalsFunction that returns a == b ? 1 : 0.static DoubleFunctionexpFunction that returns Math.exp(a).static DoubleFunctionfloorFunction that returns Math.floor(a).static FunctionsfunctionsLittle trick to allow for "aliasing", that is, renaming this class.static DoubleDoubleFunctiongreaterFunction that returns a > b ? 1 : 0.static DoubleFunctionidentityFunction that returns its argument.static DoubleDoubleFunctionIEEEremainderFunction that returns Math.IEEEremainder(a,b).static DoubleFunctioninvFunction that returns 1.0 / a.static DoubleDoubleProcedureisEqualFunction that returns a == b.static DoubleDoubleProcedureisGreaterFunction that returns a > b.static DoubleDoubleProcedureisLessFunction that returns a < b.static DoubleDoubleFunctionlessFunction that returns a < b ? 1 : 0.static DoubleDoubleFunctionlgFunction that returns Math.log(a) / Math.log(b).static DoubleFunctionlogFunction that returns Math.log(a).static DoubleFunctionlog2Function that returns Math.log(a) / Math.log(2).static DoubleDoubleFunctionmaxFunction that returns Math.max(a,b).static DoubleDoubleFunctionminFunction that returns Math.min(a,b).static DoubleDoubleFunctionminusFunction that returns a - b.static DoubleDoubleFunctionmodFunction that returns a % b.static DoubleDoubleFunctionmultFunction that returns a * b.static DoubleFunctionnegFunction that returns -a.static DoubleDoubleFunctionplusFunction that returns a + b.static DoubleDoubleFunctionplusAbsFunction that returns Math.abs(a) + Math.abs(b).static DoubleDoubleFunctionpowFunction that returns Math.pow(a,b).static DoubleFunctionrintFunction that returns Math.rint(a).static DoubleFunctionsignFunction that returns a < 0 ? -1 : a > 0 ? 1 : 0.static DoubleFunctionsinFunction that returns Math.sin(a).static DoubleFunctionsqrtFunction that returns Math.sqrt(a).static DoubleFunctionsquareFunction that returns a * a.static DoubleFunctiontanFunction that returns Math.tan(a).
-
Constructor Summary
Constructors Modifier Constructor Description protectedFunctions()Makes this class non instantiable, but still let's others inherit from it.
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static DoubleFunctionbetween(double from, double to)Constructs a function that returns (from<=a && a<=to) ? 1 : 0.static DoubleFunctionbindArg1(DoubleDoubleFunction function, double c)Constructs a unary function from a binary function with the first operand (argument) fixed to the given constant c.static DoubleFunctionbindArg2(DoubleDoubleFunction function, double c)Constructs a unary function from a binary function with the second operand (argument) fixed to the given constant c.static DoubleDoubleFunctionchain(DoubleDoubleFunction f, DoubleFunction g, DoubleFunction h)Constructs the function f( g(a), h(b) ).static DoubleDoubleFunctionchain(DoubleFunction g, DoubleDoubleFunction h)Constructs the function g( h(a,b) ).static DoubleFunctionchain(DoubleFunction g, DoubleFunction h)Constructs the function g( h(a) ).static DoubleFunctioncompare(double b)Constructs a function that returns a < b ? -1 : a > b ? 1 : 0.static DoubleFunctionconstant(double c)Constructs a function that returns the constant c.static voiddemo1()Demonstrates usage of this class.static voiddemo2(int size)Benchmarks and demonstrates usage of trivial and complex functions.static DoubleFunctiondiv(double b)Constructs a function that returns a / b.static DoubleFunctionequals(double b)Constructs a function that returns a == b ? 1 : 0.static DoubleFunctiongreater(double b)Constructs a function that returns a > b ? 1 : 0.static DoubleFunctionIEEEremainder(double b)Constructs a function that returns Math.IEEEremainder(a,b).static DoubleProcedureisBetween(double from, double to)Constructs a function that returns from<=a && a<=to.static DoubleProcedureisEqual(double b)Constructs a function that returns a == b.static DoubleProcedureisGreater(double b)Constructs a function that returns a > b.static DoubleProcedureisLess(double b)Constructs a function that returns a < b.static DoubleFunctionless(double b)Constructs a function that returns a < b ? 1 : 0.static DoubleFunctionlg(double b)Constructs a function that returns Math.log(a) / Math.log(b).protected static voidmain(java.lang.String[] args)Tests various methods of this class.static DoubleFunctionmax(double b)Constructs a function that returns Math.max(a,b).static DoubleFunctionmin(double b)Constructs a function that returns Math.min(a,b).static DoubleFunctionminus(double b)Constructs a function that returns a - b.static DoubleDoubleFunctionminusMult(double constant)Constructs a function that returns a - b*constant.static DoubleFunctionmod(double b)Constructs a function that returns a % b.static DoubleFunctionmult(double b)Constructs a function that returns a * b.static DoubleFunctionplus(double b)Constructs a function that returns a + b.static DoubleDoubleFunctionplusMult(double constant)Constructs a function that returns a + b*constant.static DoubleFunctionpow(double b)Constructs a function that returns Math.pow(a,b).static DoubleFunctionrandom()Constructs a function that returns a new uniform random number in the open unit interval(0.0,1.0)(excluding 0.0 and 1.0).static DoubleFunctionround(double precision)Constructs a function that returns the number rounded to the given precision; Math.rint(a/precision)*precision.static DoubleDoubleFunctionswapArgs(DoubleDoubleFunction function)Constructs a function that returns function.apply(b,a), i.e.
-
-
-
Field Detail
-
functions
public static final Functions functions
Little trick to allow for "aliasing", that is, renaming this class. Writing code likeFunctions.chain(Functions.plus,Functions.sin,Functions.chain(Functions.square,Functions.cos));
is a bit awkward, to say the least. Using the aliasing you can instead write
Functions F = Functions.functions;
F.chain(F.plus,F.sin,F.chain(F.square,F.cos));
-
abs
public static final DoubleFunction abs
Function that returns Math.abs(a).
-
acos
public static final DoubleFunction acos
Function that returns Math.acos(a).
-
asin
public static final DoubleFunction asin
Function that returns Math.asin(a).
-
atan
public static final DoubleFunction atan
Function that returns Math.atan(a).
-
ceil
public static final DoubleFunction ceil
Function that returns Math.ceil(a).
-
cos
public static final DoubleFunction cos
Function that returns Math.cos(a).
-
exp
public static final DoubleFunction exp
Function that returns Math.exp(a).
-
floor
public static final DoubleFunction floor
Function that returns Math.floor(a).
-
identity
public static final DoubleFunction identity
Function that returns its argument.
-
inv
public static final DoubleFunction inv
Function that returns 1.0 / a.
-
log
public static final DoubleFunction log
Function that returns Math.log(a).
-
log2
public static final DoubleFunction log2
Function that returns Math.log(a) / Math.log(2).
-
neg
public static final DoubleFunction neg
Function that returns -a.
-
rint
public static final DoubleFunction rint
Function that returns Math.rint(a).
-
sign
public static final DoubleFunction sign
Function that returns a < 0 ? -1 : a > 0 ? 1 : 0.
-
sin
public static final DoubleFunction sin
Function that returns Math.sin(a).
-
sqrt
public static final DoubleFunction sqrt
Function that returns Math.sqrt(a).
-
square
public static final DoubleFunction square
Function that returns a * a.
-
tan
public static final DoubleFunction tan
Function that returns Math.tan(a).
-
atan2
public static final DoubleDoubleFunction atan2
Function that returns Math.atan2(a,b).
-
compare
public static final DoubleDoubleFunction compare
Function that returns a < b ? -1 : a > b ? 1 : 0.
-
div
public static final DoubleDoubleFunction div
Function that returns a / b.
-
equals
public static final DoubleDoubleFunction equals
Function that returns a == b ? 1 : 0.
-
greater
public static final DoubleDoubleFunction greater
Function that returns a > b ? 1 : 0.
-
IEEEremainder
public static final DoubleDoubleFunction IEEEremainder
Function that returns Math.IEEEremainder(a,b).
-
isEqual
public static final DoubleDoubleProcedure isEqual
Function that returns a == b.
-
isLess
public static final DoubleDoubleProcedure isLess
Function that returns a < b.
-
isGreater
public static final DoubleDoubleProcedure isGreater
Function that returns a > b.
-
less
public static final DoubleDoubleFunction less
Function that returns a < b ? 1 : 0.
-
lg
public static final DoubleDoubleFunction lg
Function that returns Math.log(a) / Math.log(b).
-
max
public static final DoubleDoubleFunction max
Function that returns Math.max(a,b).
-
min
public static final DoubleDoubleFunction min
Function that returns Math.min(a,b).
-
minus
public static final DoubleDoubleFunction minus
Function that returns a - b.
-
mod
public static final DoubleDoubleFunction mod
Function that returns a % b.
-
mult
public static final DoubleDoubleFunction mult
Function that returns a * b.
-
plus
public static final DoubleDoubleFunction plus
Function that returns a + b.
-
plusAbs
public static final DoubleDoubleFunction plusAbs
Function that returns Math.abs(a) + Math.abs(b).
-
pow
public static final DoubleDoubleFunction pow
Function that returns Math.pow(a,b).
-
-
Method Detail
-
between
public static DoubleFunction between(double from, double to)
Constructs a function that returns (from<=a && a<=to) ? 1 : 0. a is a variable, from and to are fixed.
-
bindArg1
public static DoubleFunction bindArg1(DoubleDoubleFunction function, double c)
Constructs a unary function from a binary function with the first operand (argument) fixed to the given constant c. The second operand is variable (free).- Parameters:
function- a binary function taking operands in the form function.apply(c,var).- Returns:
- the unary function function(c,var).
-
bindArg2
public static DoubleFunction bindArg2(DoubleDoubleFunction function, double c)
Constructs a unary function from a binary function with the second operand (argument) fixed to the given constant c. The first operand is variable (free).- Parameters:
function- a binary function taking operands in the form function.apply(var,c).- Returns:
- the unary function function(var,c).
-
chain
public static DoubleDoubleFunction chain(DoubleDoubleFunction f, DoubleFunction g, DoubleFunction h)
Constructs the function f( g(a), h(b) ).- Parameters:
f- a binary function.g- a unary function.h- a unary function.- Returns:
- the binary function f( g(a), h(b) ).
-
chain
public static DoubleDoubleFunction chain(DoubleFunction g, DoubleDoubleFunction h)
Constructs the function g( h(a,b) ).- Parameters:
g- a unary function.h- a binary function.- Returns:
- the unary function g( h(a,b) ).
-
chain
public static DoubleFunction chain(DoubleFunction g, DoubleFunction h)
Constructs the function g( h(a) ).- Parameters:
g- a unary function.h- a unary function.- Returns:
- the unary function g( h(a) ).
-
compare
public static DoubleFunction compare(double b)
Constructs a function that returns a < b ? -1 : a > b ? 1 : 0. a is a variable, b is fixed.
-
constant
public static DoubleFunction constant(double c)
Constructs a function that returns the constant c.
-
demo1
public static void demo1()
Demonstrates usage of this class.
-
demo2
public static void demo2(int size)
Benchmarks and demonstrates usage of trivial and complex functions.
-
div
public static DoubleFunction div(double b)
Constructs a function that returns a / b. a is a variable, b is fixed.
-
equals
public static DoubleFunction equals(double b)
Constructs a function that returns a == b ? 1 : 0. a is a variable, b is fixed.
-
greater
public static DoubleFunction greater(double b)
Constructs a function that returns a > b ? 1 : 0. a is a variable, b is fixed.
-
IEEEremainder
public static DoubleFunction IEEEremainder(double b)
Constructs a function that returns Math.IEEEremainder(a,b). a is a variable, b is fixed.
-
isBetween
public static DoubleProcedure isBetween(double from, double to)
Constructs a function that returns from<=a && a<=to. a is a variable, from and to are fixed.
-
isEqual
public static DoubleProcedure isEqual(double b)
Constructs a function that returns a == b. a is a variable, b is fixed.
-
isGreater
public static DoubleProcedure isGreater(double b)
Constructs a function that returns a > b. a is a variable, b is fixed.
-
isLess
public static DoubleProcedure isLess(double b)
Constructs a function that returns a < b. a is a variable, b is fixed.
-
less
public static DoubleFunction less(double b)
Constructs a function that returns a < b ? 1 : 0. a is a variable, b is fixed.
-
lg
public static DoubleFunction lg(double b)
Constructs a function that returns Math.log(a) / Math.log(b). a is a variable, b is fixed.
-
main
protected static void main(java.lang.String[] args)
Tests various methods of this class.
-
max
public static DoubleFunction max(double b)
Constructs a function that returns Math.max(a,b). a is a variable, b is fixed.
-
min
public static DoubleFunction min(double b)
Constructs a function that returns Math.min(a,b). a is a variable, b is fixed.
-
minus
public static DoubleFunction minus(double b)
Constructs a function that returns a - b. a is a variable, b is fixed.
-
minusMult
public static DoubleDoubleFunction minusMult(double constant)
Constructs a function that returns a - b*constant. a and b are variables, constant is fixed.
-
mod
public static DoubleFunction mod(double b)
Constructs a function that returns a % b. a is a variable, b is fixed.
-
mult
public static DoubleFunction mult(double b)
Constructs a function that returns a * b. a is a variable, b is fixed.
-
plus
public static DoubleFunction plus(double b)
Constructs a function that returns a + b. a is a variable, b is fixed.
-
plusMult
public static DoubleDoubleFunction plusMult(double constant)
Constructs a function that returns a + b*constant. a and b are variables, constant is fixed.
-
pow
public static DoubleFunction pow(double b)
Constructs a function that returns Math.pow(a,b). a is a variable, b is fixed.
-
random
public static DoubleFunction random()
Constructs a function that returns a new uniform random number in the open unit interval(0.0,1.0)(excluding 0.0 and 1.0). Currently the engine isMersenneTwisterand is seeded with the current time.Note that any random engine derived from
RandomEngineand any random distribution derived fromAbstractDistributionare function objects, because they implement the proper interfaces. Thus, if you are not happy with the default, just pass your favourite random generator to function evaluating methods.
-
round
public static DoubleFunction round(double precision)
Constructs a function that returns the number rounded to the given precision; Math.rint(a/precision)*precision. Examples:precision = 0.01 rounds 0.012 --> 0.01, 0.018 --> 0.02 precision = 10 rounds 123 --> 120 , 127 --> 130
-
swapArgs
public static DoubleDoubleFunction swapArgs(DoubleDoubleFunction function)
Constructs a function that returns function.apply(b,a), i.e. applies the function with the first operand as second operand and the second operand as first operand.- Parameters:
function- a function taking operands in the form function.apply(a,b).- Returns:
- the binary function function(b,a).
-
-