/* SCCS - @(#)NslSigmoid2.java 1.4 - 09/01/99 - 00:18:10 */
// 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.
////////////////////////////////////////////////////////////
//
// Sigmoid2 threshold routines
//
//
/**
Sigmoid 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 NslSigmoid2 {
private static double value(double x)
{
return (1.0/(1.0+Math.exp(-x)));
}
public static double eval (double a) {
return value(a);
}
public static double[] eval (double[] a) {
int i;
double[] tmp = new double[a.length];
for (i=0; i=kx2)
return ky2;
else if (a>=kx1) {
s = (a-kx1)/(kx2-kx1);
return (ky2-ky1)*s*s*(3.0-2.0*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; i=kx2)
tmp[i]=ky2;
else if (a[i]>=kx1) {
s = (a[i]-kx1)/(kx2-kx1);
tmp[i]=(ky2-ky1)*s*s*(3.0-2.0*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; i=kx2)
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.0-2.0*s)+ky1;
}
else
tmp[i][j]=ky1;
}
return tmp;
}
*/
/* Added by Weifang */
public static double eval (NslDouble0 a) {
double tmpa=a.getdouble();
return value(tmpa);
}
public static double[] eval (NslDouble1 a) {
int i;
double[] tmpa = a.getdouble1();
double[] tmp = new double[a.getSize()];
for (i=0; i=kx2)
return ky2;
else if (a.getdouble()>=kx1) {
s = (a.getdouble()-kx1)/(kx2-kx1);
return (ky2-ky1)*s*s*(3.0-2.0*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.0-2.0*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; i=kx2)
tmp[i]=ky2;
else if (tmpa[i]>=kx1) {
s = (tmpa[i]-kx1)/(kx2-kx1);
tmp[i]=(ky2-ky1)*s*s*(3.0-2.0*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; i=tmpkx2)
tmp[i]=tmpky2;
else if (tmpa[i]>=tmpkx1) {
s = (tmpa[i]-tmpkx1)/(tmpkx2-tmpkx1);
tmp[i]=(tmpky2-tmpky1)*s*s*(3.0-2.0*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; i=kx2)
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.0-2.0*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; i=tmpkx2)
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.0-2.0*s)+tmpky1;
}
else
tmp[i][j]=tmpky1;
}
return tmp;
}
*/
/* floats */
private static float value(float x)
{
float tmp;
tmp=(float)(1/(1+Math.exp(-x)));
return tmp;
}
public static float eval (float a) {
return value(a);
}
public static float[] eval (float[] a) {
int i;
float[] tmp = new float[a.length];
for (i=0; i=kx2)
return ky2;
else if (a>=kx1) {
s = (a-kx1)/(kx2-kx1);
return (ky2-ky1)*s*s*(3.0-2.0*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; i=kx2)
tmp[i]=ky2;
else if (a[i]>=kx1) {
s = (a[i]-kx1)/(kx2-kx1);
tmp[i]=(ky2-ky1)*s*s*(3.0-2.0*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; i=kx2)
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.0-2.0*s)+ky1;
}
else
tmp[i][j]=ky1;
}
return tmp;
}
*/
/* Added by Weifang */
public static float eval (NslFloat0 a) {
float tmpa=a.getfloat();
return value(tmpa);
}
public static float[] eval (NslFloat1 a) {
int i;
float[] tmpa = a.getfloat1();
float[] tmp = new float[a.getSize()];
for (i=0; i=kx2)
return ky2;
else if (a.getfloat()>=kx1) {
s = (a.getfloat()-kx1)/(kx2-kx1);
return (ky2-ky1)*s*s*(3.0-2.0*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.0-2.0*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[] tmp, 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; i=kx2)
tmp[i]=ky2;
else if (tmpa[i]>=kx1) {
s = (tmpa[i]-kx1)/(kx2-kx1);
tmp[i]=(ky2-ky1)*s*s*(3.0-2.0*s)+ky1;
}
else
tmp[i]=ky1;
}
return tmp;
}
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[] tmp, 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; i=tmpkx2)
tmp[i]=tmpky2;
else if (tmpa[i]>=tmpkx1) {
s = (tmpa[i]-tmpkx1)/(tmpkx2-tmpkx1);
tmp[i]=(tmpky2-tmpky1)*s*s*(3.0-2.0*s)+tmpky1;
}
else
tmp[i]=tmpky1;
}
return tmp;
}
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; i=kx2)
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.0-2.0*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; i=tmpkx2)
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.0-2.0*s)+tmpky1;
}
else
tmp[i][j]=tmpky1;
}
return tmp;
}
*/
}