/* SCCS - @(#)Nsl2Sigmoid.java 1.3 --- 09/01/99 -- 00:18:19 */
// Copyright: Copyright (c) 1997 University of Southern California Brain Project.
// Copyright: This software may be freely copied provided the toplevel
// Copyright: COPYRIGHT file is included with each such copy.
// Copyright: Email nsl@java.usc.edu.
/*
NSL 2.1. 7 used <= instead of < a lot of places
*/
////////////////////////////////////////////////////////////
//
// Sigmoid threshold routines
//
//
/**
Nsl2Sigmoid threshold routines.
There are four basic format for the evaluation method in
this routine:
1. eval(a) -> c
a is the input parameter to pass the threshold function:
if a <= 0, c = 0,
else if 0 < a <= 1, c = a*a*(3-2a),
else c = 1.
2. eval(dest, a) -> c
a is the parameter of the threshold function and
dest is the temporary space to hold the result.
The method returns the reference to dest.
3. eval(a, kx1, kx2, ky1, ky2) -> c
if a <= kx1, c = ky1,
else if kx1 < a <= kx2, c = s*s(3-2s), s = [(a-kx1)/(kx2-kx1)]
else, c = ky2.
2. eval(dest, a, kx1, kx2, ky1, ky2) -> c
a is the parameter of the threshold function and
dest is the temporary space to hold the result.
The method returns the reference to dest.
*/
////////////////////////////////////////////////////////////////////////////////
// sigmoid functions
package nslj.src.math;
import nslj.src.lang.*;
public final class Nsl2Sigmoid {
// native doubles
public static double eval (double a) {
if (a>1.0)
return 1.0;
else if (a>0)
return a*a*(3-2*a);
else
return 0;
}
public static double[] eval (double[] a) {
int i;
double[] tmp = new double[a.length];
for (i=0; i1)
tmp[i]=1;
else if (a[i]>0)
tmp[i]=a[i]*a[i]*(3-2*a[i]);
else
tmp[i]=0;
}
return tmp;
}
public static double[][] eval (double[][] a) {
int i,j;
int size1 = a.length;
int size2 = a[0].length;
double[][] tmp = new double[size1][size2];
for (i=0; i1)
tmp[i][j]=1;
else if (a[i][j]>0)
tmp[i][j]=a[i][j]*a[i][j]*(3-2*a[i][j]);
else
tmp[i][j]=0;
}
return tmp;
}
public static double eval (double a, double kx1, double kx2, double ky1, double ky2 ) {
double s;
if (a>kx2)
return ky2;
else if (a>kx1) {
s = (a-kx1)/(kx2-kx1);
return (ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
return ky1;
}
public static double[] eval (double[] a, double kx1, double kx2, double ky1, double ky2 ) {
return eval( new double[a.length], a, kx1, kx2, ky1, ky2);
}
public static double[] eval (double[] tmp, double[] a, double kx1, double kx2, double ky1, double ky2 ) {
int i;
int size1 = a.length;
double s;
for (i=0; ikx2)
tmp[i]=ky2;
else if (a[i]>kx1) {
s = (a[i]-kx1)/(kx2-kx1);
tmp[i]=(ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
tmp[i]=ky1;
}
return tmp;
}
public static double[][] eval (double[][] a, double kx1, double kx2, double ky1, double ky2 ) {
return eval( new double[a.length][a[0].length], a, kx1, kx2, ky1, ky2);
}
public static double[][] eval (double[][] tmp, double[][] a, double kx1, double kx2, double ky1, double ky2 ) {
int i, j;
int size1 = a.length;
int size2 = a[0].length;
double s;
for (i=0; ikx2)
tmp[i][j]=ky2;
else if (a[i][j]>kx1) {
s = (a[i][j]-kx1)/(kx2-kx1);
tmp[i][j]=(ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
tmp[i][j]=ky1;
}
return tmp;
}
/*******************************************/
//added by nippy.
public static double[][][] eval (double[][][] tmp, double[][][] a, double kx1, double kx2, double
ky1, double ky2 ) {
int i, j, k;
int size1 = a.length;
int size2 = a[0].length;
int size3 = a[0][0].length;
double s;
for (i=0; ikx2)
tmp[i][j][k]=ky2;
else if (a[i][j][k]>kx1)
{
s = (a[i][j][k]-kx1)/(kx2-kx1);
tmp[i][j][k]=(ky2-ky1)*s*s*(3.0-2.0*s)+ky1;
}
else
tmp[i][j][k]=ky1;
}
}
}
return tmp;
}
/************************************************************/
//added by nippy
// this method has been added to equip the NslDouble3 with the threshold functions.
public static double[][][] eval (NslDouble3 a) {
int i,j,k;
int size1 = a.getSize1();
int size2 = a.getSize2();
int size3 = a.getSize3();
double[][][] tmp = new double[size1][size2][size3];
double[][][] tmpa = a.getdouble3();
for (i=0; i1)
tmp[i][j][k]=1;
else if (tmpa[i][j][k]>0)
tmp[i][j][k]=tmpa[i][j][k]*tmpa[i][j][k]*(3.0-2.0*tmpa[i][j][k]);
else
tmp[i][j][k]=0;
}
}
}
return tmp;
}
// this method has been added to equip the NslDouble4 with the threshold functions.
public static double[][][][] eval (NslDouble4 a) {
int i,j,k,l;
int size1 = a.getSize1();
int size2 = a.getSize2();
int size3 = a.getSize3();
int size4 = a.getSize4();
double[][][][] tmp = new double[size1][size2][size3][size4];
double[][][][] tmpa = a.getdouble4();
for (i=0; i1)
tmp[i][j][k][l]=1;
else if (tmpa[i][j][k][l]>0)
tmp[i][j][k][l]=tmpa[i][j][k][l]*tmpa[i][j][k][l]*(3.0-2.0*tmpa[i][j][k][l]);
else
tmp[i][j][k][l]=0;
}
}
}
}
return tmp;
}
/*********************************************************/
//added by nippy
public static double[][][] eval (double[][][] tmp, NslDouble3 a, double kx1, double kx2, double ky1,
double ky2 ) {
int i, j, k;
int size1 = a.getSize1();
int size2 = a.getSize2();
int size3 = a.getSize3();
double[][][] tmpa=a.getdouble3();
double s;
for (i=0; ikx2)
tmp[i][j][k]=ky2;
else if (tmpa[i][j][k]>kx1)
{
s = (tmpa[i][j][k]-kx1)/(kx2-kx1);
tmp[i][j][k]=(ky2-ky1)*s*s*(3.0-2.0*s)+ky1;
}
else
tmp[i][j][k]=ky1;
}
}
}
return tmp;
}
// Nsl Types as input
// doubles
public static double eval (NslDouble0 a) {
double tmpa=a.getdouble();
if (tmpa>1.0)
return 1.0;
else if (tmpa>0)
return tmpa*tmpa*(3-2*tmpa);
else
return 0;
}
public static double[] eval (NslDouble1 a) {
int i;
double[] tmpa = a.getdouble1();
double[] tmp = new double[a.getSize()];
for (i=0; i1)
tmp[i]=1;
else if (tmpa[i]>0)
tmp[i]=tmpa[i]*tmpa[i]*(3-2*tmpa[i]);
else
tmp[i]=0;
}
return tmp;
}
public static double[][] eval (NslDouble2 a) {
int i,j;
int size1 = a.getSize1();
int size2 = a.getSize2();
double[][] tmp = new double[size1][size2];
double[][] tmpa = a.getdouble2();
for (i=0; i1)
tmp[i][j]=1;
else if (tmpa[i][j]>0)
tmp[i][j]=tmpa[i][j]*tmpa[i][j]*(3-2*tmpa[i][j]);
else
tmp[i][j]=0;
}
return tmp;
}
public static double eval (NslDouble0 a, double kx1, double kx2, double ky1, double ky2 ) {
double s;
if (a.getdouble()>kx2)
return ky2;
else if (a.getdouble()>kx1) {
s = (a.getdouble()-kx1)/(kx2-kx1);
return (ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
return ky1;
}
public static double eval (NslDouble0 a, NslDouble0 kx1, NslDouble0 kx2, NslDouble0 ky1, NslDouble0 ky2 ) {
double s;
if (a.getdouble()>kx2.getdouble())
return ky2.getdouble();
else if (a.getdouble()>kx1.getdouble()) {
s = (a.getdouble()-kx1.getdouble())/(kx2.getdouble()-kx1.getdouble());
return (ky2.getdouble()-ky1.getdouble())*s*s*(3-2*s)+ky1.getdouble();
}
else
return ky1.getdouble();
}
public static double[] eval (NslDouble1 a, double kx1, double kx2, double ky1, double ky2 ) {
return eval( new double[a.getSize()], a, kx1, kx2, ky1, ky2);
}
public static double[] eval (double[] tmp, NslDouble1 a, double kx1, double kx2, double ky1, double ky2 ) {
int i;
int size = a.getSize();
double[] tmpa=a.getdouble1();
double s;
for (i=0; ikx2)
tmp[i]=ky2;
else if (tmpa[i]>kx1) {
s = (tmpa[i]-kx1)/(kx2-kx1);
tmp[i]=(ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
tmp[i]=ky1;
}
return tmp;
}
public static double[] eval (NslDouble1 a, NslDouble0 kx1, NslDouble0 kx2, NslDouble0 ky1, NslDouble0 ky2 ) {
return eval( new double[a.getSize()], a, kx1, kx2, ky1, ky2);
}
public static double[] eval (double[] tmp, NslDouble1 a, NslDouble0 kx1, NslDouble0 kx2, NslDouble0 ky1, NslDouble0 ky2 ) {
int i;
int size = a.getSize();
double[] tmpa=a.getdouble1();
double tmpkx1=kx1.getdouble();
double tmpkx2=kx2.getdouble();
double tmpky1=ky1.getdouble();
double tmpky2=ky2.getdouble();
double s;
for (i=0; itmpkx2)
tmp[i]=tmpky2;
else if (tmpa[i]>tmpkx1) {
s = (tmpa[i]-tmpkx1)/(tmpkx2-tmpkx1);
tmp[i]=(tmpky2-tmpky1)*s*s*(3-2*s)+tmpky1;
}
else
tmp[i]=tmpky1;
}
return tmp;
}
public static double[][] eval (NslDouble2 a, double kx1, double kx2, double ky1, double ky2 ) {
return eval( new double[a.getSize1()][a.getSize2()], a, kx1, kx2, ky1, ky2);
}
public static double[][] eval (double[][] tmp, NslDouble2 a, double kx1, double kx2, double ky1, double ky2 ) {
int i, j;
int size1 = a.getSize1();
int size2 = a.getSize2();
double[][] tmpa=a.getdouble2();
double s;
for (i=0; ikx2)
tmp[i][j]=ky2;
else if (tmpa[i][j]>kx1) {
s = (tmpa[i][j]-kx1)/(kx2-kx1);
tmp[i][j]=(ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
tmp[i][j]=ky1;
}
return tmp;
}
public static double[][] eval (NslDouble2 a, NslDouble0 kx1, NslDouble0 kx2, NslDouble0 ky1, NslDouble0 ky2 ) {
return eval( new double[a.getSize1()][a.getSize2()], a, kx1, kx2, ky1, ky2);
}
public static double[][] eval (double[][] tmp, NslDouble2 a, NslDouble0 kx1, NslDouble0 kx2, NslDouble0 ky1, NslDouble0 ky2 ) {
int i, j;
int size1 = a.getSize1();
int size2 = a.getSize2();
double[][] tmpa=a.getdouble2();
double tmpkx1=kx1.getdouble();
double tmpkx2=kx2.getdouble();
double tmpky1=ky1.getdouble();
double tmpky2=ky2.getdouble();
double s;
for (i=0; itmpkx2)
tmp[i][j]=tmpky2;
else if (tmpa[i][j]>tmpkx1) {
s = (tmpa[i][j]-tmpkx1)/(tmpkx2-tmpkx1);
tmp[i][j]=(tmpky2-tmpky1)*s*s*(3-2*s)+tmpky1;
}
else
tmp[i][j]=tmpky1;
}
return tmp;
}
/* native floats */
public static float eval (float a) {
double tmp = (double)a;
if (tmp>1.0)
return (float)1.0;
else if (a>0){
tmp=(a*a*(3-2*a));
return (float)tmp;
}
else
return (float)0;
}
public static float[] eval (float[] a) {
int i;
float[] tmp = new float[a.length];
for (i=0; i1)
tmp[i]=(float)1;
else if (a[i]>0)
tmp[i]=(a[i]*a[i]*(3-2*a[i]));
else
tmp[i]=0;
}
return tmp;
}
public static float[][] eval (float[][] a) {
int i,j;
int size1 = a.length;
int size2 = a[0].length;
float[][] tmp = new float[size1][size2];
for (i=0; i1)
tmp[i][j]=1;
else if (a[i][j]>0)
tmp[i][j]=a[i][j]*a[i][j]*(3-2*a[i][j]);
else
tmp[i][j]=0;
}
return (float[][])tmp;
}
public static float eval (float a, float kx1, float kx2, float ky1, float ky2 ) {
float s;
if (a>kx2)
return ky2;
else if (a>kx1) {
s = (a-kx1)/(kx2-kx1);
return (ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
return ky1;
}
public static float[] eval (float[] a, float kx1, float kx2, float ky1, float ky2 ) {
return eval( new float[a.length], a, kx1, kx2, ky1, ky2);
}
public static float[] eval (float[] tmp, float[] a, float kx1, float kx2, float ky1, float ky2 ) {
int i;
int size1 = a.length;
float s;
for (i=0; ikx2)
tmp[i]=ky2;
else if (a[i]>kx1) {
s = (a[i]-kx1)/(kx2-kx1);
tmp[i]=(ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
tmp[i]=ky1;
}
return tmp;
}
public static float[][] eval (float[][] a, float kx1, float kx2, float ky1, float ky2 ) {
return eval( new float[a.length][a[0].length], a, kx1, kx2, ky1, ky2);
}
public static float[][] eval (float[][] tmp, float[][] a, float kx1, float kx2, float ky1, float ky2 ) {
int i, j;
int size1 = a.length;
int size2 = a[0].length;
float s;
for (i=0; ikx2)
tmp[i][j]=ky2;
else if (a[i][j]>kx1) {
s = (a[i][j]-kx1)/(kx2-kx1);
tmp[i][j]=(ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
tmp[i][j]=ky1;
}
return tmp;
}
// Nsl Types as input
// floats
public static float eval (NslFloat0 a) {
float tmpa=a.getfloat();
if (tmpa>1.0)
return 1;
else if (tmpa>0)
return tmpa*tmpa*(3-2*tmpa);
else
return 0;
}
public static float[] eval (NslFloat1 a) {
int i;
float[] tmpa = a.getfloat1();
float[] tmp = new float[a.getSize()];
for (i=0; i1)
tmp[i]=1;
else if (tmpa[i]>0)
tmp[i]=tmpa[i]*tmpa[i]*(3-2*tmpa[i]);
else
tmp[i]=0;
}
return tmp;
}
public static float[][] eval (NslFloat2 a) {
int i,j;
int size1 = a.getSize1();
int size2 = a.getSize2();
float[][] tmp = new float[size1][size2];
float[][] tmpa = a.getfloat2();
for (i=0; i1)
tmp[i][j]=1;
else if (tmpa[i][j]>0)
tmp[i][j]=tmpa[i][j]*tmpa[i][j]*(3-2*tmpa[i][j]);
else
tmp[i][j]=0;
}
return tmp;
}
public static float eval (NslFloat0 a, float kx1, float kx2, float ky1, float ky2 ) {
float s;
if (a.getfloat()>kx2)
return ky2;
else if (a.getfloat()>kx1) {
s = (a.getfloat()-kx1)/(kx2-kx1);
return (ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
return ky1;
}
public static float eval (NslFloat0 a, NslFloat0 kx1, NslFloat0 kx2, NslFloat0 ky1, NslFloat0 ky2 ) {
float s;
if (a.getfloat()>kx2.getfloat())
return ky2.getfloat();
else if (a.getfloat()>kx1.getfloat()) {
s = (a.getfloat()-kx1.getfloat())/(kx2.getfloat()-kx1.getfloat());
return (ky2.getfloat()-ky1.getfloat())*s*s*(3-2*s)+ky1.getfloat();
}
else
return ky1.getfloat();
}
public static float[] eval (NslFloat1 a, float kx1, float kx2, float ky1, float ky2 ) {
return eval( new float[a.getSize()], a, kx1, kx2, ky1, ky2);
}
public static float[] eval (float[] tmpc, NslFloat1 a, float kx1, float kx2, float ky1, float ky2 ) {
int i;
int size = a.getSize();
float[] tmpa=a.getfloat1();
float s;
for (i=0; ikx2)
tmpc[i]=ky2;
else if (tmpa[i]>kx1) {
s = (tmpa[i]-kx1)/(kx2-kx1);
tmpc[i]=(ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
tmpc[i]=ky1;
}
return tmpc;
}
public static float[] eval (NslFloat1 a, NslFloat0 kx1, NslFloat0 kx2, NslFloat0 ky1, NslFloat0 ky2 ) {
return eval( new float[a.getSize()], a, kx1, kx2, ky1, ky2);
}
public static float[] eval (float[] tmpc, NslFloat1 a, NslFloat0 kx1, NslFloat0 kx2, NslFloat0 ky1, NslFloat0 ky2 ) {
int i;
int size = a.getSize();
float[] tmpa=a.getfloat1();
float tmpkx1=kx1.getfloat();
float tmpkx2=kx2.getfloat();
float tmpky1=ky1.getfloat();
float tmpky2=ky2.getfloat();
float s;
for (i=0; itmpkx2)
tmpc[i]=tmpky2;
else if (tmpa[i]>tmpkx1) {
s = (tmpa[i]-tmpkx1)/(tmpkx2-tmpkx1);
tmpc[i]=(tmpky2-tmpky1)*s*s*(3-2*s)+tmpky1;
}
else
tmpc[i]=tmpky1;
}
return tmpc;
}
public static float[][] eval (NslFloat2 a, float kx1, float kx2, float ky1, float ky2 ) {
return eval( new float[a.getSize1()][a.getSize2()], a, kx1, kx2, ky1, ky2);
}
public static float[][] eval (float[][] tmp, NslFloat2 a, float kx1, float kx2, float ky1, float ky2 ) {
int i, j;
int size1 = a.getSize1();
int size2 = a.getSize2();
float[][] tmpa=a.getfloat2();
float s;
for (i=0; ikx2)
tmp[i][j]=ky2;
else if (tmpa[i][j]>kx1) {
s = (tmpa[i][j]-kx1)/(kx2-kx1);
tmp[i][j]=(ky2-ky1)*s*s*(3-2*s)+ky1;
}
else
tmp[i][j]=ky1;
}
return tmp;
}
public static float[][] eval (NslFloat2 a, NslFloat0 kx1, NslFloat0 kx2, NslFloat0 ky1, NslFloat0 ky2 ) {
return eval( new float[a.getSize1()][a.getSize2()], a, kx1, kx2, ky1, ky2);
}
public static float[][] eval (float[][] tmp, NslFloat2 a, NslFloat0 kx1, NslFloat0 kx2, NslFloat0 ky1, NslFloat0 ky2 ) {
int i, j;
int size1 = a.getSize1();
int size2 = a.getSize2();
float[][] tmpa=a.getfloat2();
float tmpkx1=kx1.getfloat();
float tmpkx2=kx2.getfloat();
float tmpky1=ky1.getfloat();
float tmpky2=ky2.getfloat();
float s;
for (i=0; itmpkx2)
tmp[i][j]=tmpky2;
else if (tmpa[i][j]>tmpkx1) {
s = (tmpa[i][j]-tmpkx1)/(tmpkx2-tmpkx1);
tmp[i][j]=(tmpky2-tmpky1)*s*s*(3-2*s)+tmpky1;
}
else
tmp[i][j]=tmpky1;
}
return tmp;
}
}