/* SCCS - @(#)NslProd.java 1.6 --- 09/01/99 -- 00:18:08 */ // 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. //////////////////////////////////////////////////////////// // // Production routines // // /** Production routines. There are two basic format for the evaluation method in this routine: 1, eval(a, b) -> c a, b are the parameter of the evaluation function to do matrix multiplication with a and b and the result is passed out as c 2. eval(dest, a, b) -> c a, b are the parameter of the evaluation function and dest is the temporary space to hold the result. The method returns the reference to dest. */ package nslj.src.math; import nslj.src.lang.*; //public final class NslProd { //99/6/24 aa: new long name public class NslProd { // product /* doubles */ public static double[][] eval(double[][] x, double[] w) { return eval(new double[x.length][w.length], x, w); } public static double[][] eval(double[][] dest, double[][] x, double[] w) { int size = x.length; int vsize = x[0].length; if (vsize != 1) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != size || dest[0].length != w.length) { dest = new double[size][w.length]; } for (int i = 0; i < size; i++) { for (int j = 0; j < w.length; j++) dest[i][j] = x[i][0]*w[j]; } return dest; } public static double[] eval(double[] x,double[][] w) { return eval(new double[w[0].length], x, w); } public static double[] eval(double[] dest, double[] x, double[][] w) { int size = w.length; int vsize = w[0].length; if (x.length != size) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != vsize) { dest = new double[vsize]; } for (int i = 0; i < vsize; i++) { dest[i] = 0; for (int j = 0; j < size; j++) dest[i] += x[j] * w[j][i]; } return dest; } public static double[][] eval(double[][] w, double[][] x) { return eval(new double[w.length][x[0].length], w, x); } public static double[][] eval(double[][] dest, double[][] w, double[][] x) { int isize = w.length; int jsize = x[0].length; int size = w[0].length; if (size != x.length) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != isize || dest[0].length != jsize) { dest = new double[isize][jsize]; } for (int i = 0; i < isize; i++) for (int j = 0; j < jsize; j++) { dest[i][j] = 0; for (int k = 0; k < size; k++) dest[i][j] = dest[i][j] + w[i][k]*x[k][j]; } return dest; } /* Added by Weifang */ public static double[][] eval(NslDouble2 w, NslDouble1 x) { return eval(w.getdouble2(),x.getdouble1()); } public static double[][] eval(NslDouble2 w, double[] x) { return eval(w.getdouble2(),x); } public static double[][] eval(double[][] w, NslDouble1 x) { return eval(w,x.getdouble1()); } public static double[][] eval(double[][] dest, NslDouble2 w, NslDouble1 x) { return eval(dest, w.getdouble2(),x.getdouble1()); } public static double[][] eval(double[][] dest, NslDouble2 w, double[] x) { return eval(dest, w.getdouble2(),x); } public static double[][] eval(double[][] dest, double[][] w, NslDouble1 x) { return eval(dest, w,x.getdouble1()); } //---- public static double[] eval(NslDouble1 w, NslDouble2 x) { return eval(w.getdouble1(), x.getdouble2()); } public static double[] eval(NslDouble1 w, double[][] x) { return eval(w.getdouble1(), x); } public static double[] eval(double[] w, NslDouble2 x) { return eval(w, x.getdouble2()); } public static double[] eval(double[] dest, NslDouble1 w, NslDouble2 x) { return eval(dest, w.getdouble1(), x.getdouble2()); } public static double[] eval(double[] dest, NslDouble1 w, double[][] x) { return eval(dest, w.getdouble1(), x); } public static double[] eval(double[] dest, double[] w, NslDouble2 x) { return eval(dest, w, x.getdouble2()); } //---- public static double[][] eval(NslDouble2 w, NslDouble2 x) { return eval(w.getdouble2(), x.getdouble2()); } public static double[][] eval(NslDouble2 w, double[][] x) { return eval(w.getdouble2(), x); } public static double[][] eval(double[][] w, NslDouble2 x) { return eval(w, x.getdouble2()); } public static double[][] eval(double[][] dest, NslDouble2 w, NslDouble2 x) { return eval(dest, w.getdouble2(), x.getdouble2()); } public static double[][] eval(double[][] dest, NslDouble2 w, double[][] x) { return eval(dest, w.getdouble2(), x); } public static double[][] eval(double[][] dest, double[][] w, NslDouble2 x) { return eval(dest, w, x.getdouble2()); } /* floats */ public static float[][] eval(float[][] x, float[] w) { return eval(new float[x.length][w.length], x, w); } public static float[][] eval(float[][] dest, float[][] x, float[] w) { int size = x.length; int vsize = x[0].length; if (vsize != 1) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != size || dest[0].length != w.length) { dest = new float[size][w.length]; } for (int i = 0; i < size; i++) { for (int j = 0; j < w.length; j++) dest[i][j] = x[i][0]*w[j]; } return dest; } public static float[] eval(float[] x,float[][] w) { return eval(new float[w[0].length], x, w); } public static float[] eval(float[] dest, float[] x, float[][] w) { int size = w.length; int vsize = w[0].length; if (x.length != size) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != vsize) { dest = new float[vsize]; } for (int i = 0; i < vsize; i++) { dest[i] = 0; for (int j = 0; j < size; j++) dest[i] += x[j] * w[j][i]; } return dest; } public static float[][] eval(float[][] w, float[][] x) { return eval(new float[w.length][x[0].length], w, x); } public static float[][] eval(float[][] dest, float[][] w, float[][] x) { int isize = w.length; int jsize = x[0].length; int size = w[0].length; if (size != x.length) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != isize || dest[0].length != jsize) { dest = new float[isize][jsize]; } for (int i = 0; i < isize; i++) for (int j = 0; j < jsize; j++) { dest[i][j] = 0; for (int k = 0; k < size; k++) dest[i][j] = dest[i][j] + w[i][k]*x[k][j]; } return dest; } /* Added by Weifang */ public static float[][] eval(NslFloat2 w, NslFloat1 x) { return eval(w.getfloat2(),x.getfloat1()); } public static float[][] eval(NslFloat2 w, float[] x) { return eval(w.getfloat2(),x); } public static float[][] eval(float[][] w, NslFloat1 x) { return eval(w,x.getfloat1()); } public static float[][] eval(float[][] dest, NslFloat2 w, NslFloat1 x) { return eval(dest, w.getfloat2(),x.getfloat1()); } public static float[][] eval(float[][] dest, NslFloat2 w, float[] x) { return eval(dest, w.getfloat2(),x); } public static float[][] eval(float[][] dest, float[][] w, NslFloat1 x) { return eval(dest, w,x.getfloat1()); } //---- public static float[] eval(NslFloat1 w, NslFloat2 x) { return eval(w.getfloat1(), x.getfloat2()); } public static float[] eval(NslFloat1 w, float[][] x) { return eval(w.getfloat1(), x); } public static float[] eval(float[] w, NslFloat2 x) { return eval(w, x.getfloat2()); } public static float[] eval(float[] dest, NslFloat1 w, NslFloat2 x) { return eval(dest, w.getfloat1(), x.getfloat2()); } public static float[] eval(float[] dest, NslFloat1 w, float[][] x) { return eval(dest, w.getfloat1(), x); } public static float[] eval(float[] dest, float[] w, NslFloat2 x) { return eval(dest, w, x.getfloat2()); } //---- public static float[][] eval(NslFloat2 w, NslFloat2 x) { return eval(w.getfloat2(), x.getfloat2()); } public static float[][] eval(NslFloat2 w, float[][] x) { return eval(w.getfloat2(), x); } public static float[][] eval(float[][] w, NslFloat2 x) { return eval(w, x.getfloat2()); } public static float[][] eval(float[][] dest, NslFloat2 w, NslFloat2 x) { return eval(dest, w.getfloat2(), x.getfloat2()); } public static float[][] eval(float[][] dest, NslFloat2 w, float[][] x) { return eval(dest, w.getfloat2(), x); } public static float[][] eval(float[][] dest, float[][] w, NslFloat2 x) { return eval(dest, w, x.getfloat2()); } /* ints */ public static int[][] eval(int[][] x, int[] w) { return eval(new int[x.length][w.length], x, w); } public static int[][] eval(int[][] dest, int[][] x, int[] w) { int size = x.length; int vsize = x[0].length; if (vsize != 1) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != size || dest[0].length != w.length) { dest = new int[size][w.length]; } for (int i = 0; i < size; i++) { for (int j = 0; j < w.length; j++) dest[i][j] = x[i][0]*w[j]; } return dest; } public static int[] eval(int[] x,int[][] w) { return eval(new int[w[0].length], x, w); } public static int[] eval(int[] dest, int[] x, int[][] w) { int size = w.length; int vsize = w[0].length; if (x.length != size) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != vsize) { dest = new int[vsize]; } for (int i = 0; i < vsize; i++) { dest[i] = 0; for (int j = 0; j < size; j++) dest[i] += x[j] * w[j][i]; } return dest; } public static int[][] eval(int[][] w, int[][] x) { return eval(new int[w.length][x[0].length], w, x); } public static int[][] eval(int[][] dest, int[][] w, int[][] x) { int isize = w.length; int jsize = x[0].length; int size = w[0].length; if (size != x.length) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != isize || dest[0].length != jsize) { dest = new int[isize][jsize]; } for (int i = 0; i < isize; i++) for (int j = 0; j < jsize; j++) { dest[i][j] = 0; for (int k = 0; k < size; k++) dest[i][j] = dest[i][j] + w[i][k]*x[k][j]; } return dest; } /* Added by Weifang */ public static int[][] eval(NslInt2 w, NslInt1 x) { return eval(w.getint2(),x.getint1()); } public static int[][] eval(NslInt2 w, int[] x) { return eval(w.getint2(),x); } public static int[][] eval(int[][] w, NslInt1 x) { return eval(w,x.getint1()); } public static int[][] eval(int[][] dest, NslInt2 w, NslInt1 x) { return eval(dest, w.getint2(),x.getint1()); } public static int[][] eval(int[][] dest, NslInt2 w, int[] x) { return eval(dest, w.getint2(),x); } public static int[][] eval(int[][] dest, int[][] w, NslInt1 x) { return eval(dest, w,x.getint1()); } //---- public static int[] eval(NslInt1 w, NslInt2 x) { return eval(w.getint1(), x.getint2()); } public static int[] eval(NslInt1 w, int[][] x) { return eval(w.getint1(), x); } public static int[] eval(int[] w, NslInt2 x) { return eval(w, x.getint2()); } public static int[] eval(int[] dest, NslInt1 w, NslInt2 x) { return eval(dest, w.getint1(), x.getint2()); } public static int[] eval(int[] dest, NslInt1 w, int[][] x) { return eval(dest, w.getint1(), x); } public static int[] eval(int[] dest, int[] w, NslInt2 x) { return eval(dest, w, x.getint2()); } //---- public static int[][] eval(NslInt2 w, NslInt2 x) { return eval(w.getint2(), x.getint2()); } public static int[][] eval(NslInt2 w, int[][] x) { return eval(w.getint2(), x); } public static int[][] eval(int[][] w, NslInt2 x) { return eval(w, x.getint2()); } public static int[][] eval(int[][] dest, NslInt2 w, NslInt2 x) { return eval(dest, w.getint2(), x.getint2()); } public static int[][] eval(int[][] dest, NslInt2 w, int[][] x) { return eval(dest, w.getint2(), x); } public static int[][] eval(int[][] dest, int[][] w, NslInt2 x) { return eval(dest, w, x.getint2()); } /* boolean */ public static boolean[][] eval(boolean[][] x, boolean[] w) { return eval(new boolean[x.length][w.length], x, w); } public static boolean[][] eval(boolean[][] dest, boolean[][] x, boolean[] w) { int size = x.length; int vsize = x[0].length; if (vsize != 1) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != size || dest[0].length != w.length) { dest = new boolean[size][w.length]; } for (int i = 0; i < size; i++) { for (int j = 0; j < w.length; j++) dest[i][j] = x[i][0] && w[j]; } return dest; } public static boolean[] eval(boolean[] x,boolean[][] w) { return eval(new boolean[w[0].length], x, w); } public static boolean[] eval(boolean[] dest, boolean[] x, boolean[][] w) { int size = w.length; int vsize = w[0].length; if (x.length != size) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != vsize) { dest = new boolean[vsize]; } for (int i = 0; i < vsize; i++) { dest[i] = false; for (int j = 0; j < size; j++) dest[i] = dest[i] || x[j] && w[j][i]; } return dest; } public static boolean[][] eval(boolean[][] w, boolean[][] x) { return eval(new boolean[w.length][x[0].length], w, x); } public static boolean[][] eval(boolean[][] dest, boolean[][] w, boolean[][] x) { int isize = w.length; int jsize = x[0].length; int size = w[0].length; if (size != x.length) { System.out.println("Inconsistent Array dimensions"); return dest; } if (dest.length != isize || dest[0].length != jsize) { dest = new boolean[isize][jsize]; } for (int i = 0; i < isize; i++) for (int j = 0; j < jsize; j++) { dest[i][j] = false; for (int k = 0; k < size; k++) dest[i][j] = dest[i][j] || w[i][k] && x[k][j]; } return dest; } /* Added by Weifang */ public static boolean[][] eval(NslBoolean2 w, NslBoolean1 x) { return eval(w.getboolean2(),x.getboolean1()); } public static boolean[][] eval(NslBoolean2 w, boolean[] x) { return eval(w.getboolean2(),x); } public static boolean[][] eval(boolean[][] w, NslBoolean1 x) { return eval(w,x.getboolean1()); } public static boolean[][] eval(boolean[][] dest, NslBoolean2 w, NslBoolean1 x) { return eval(dest, w.getboolean2(),x.getboolean1()); } public static boolean[][] eval(boolean[][] dest, NslBoolean2 w, boolean[] x) { return eval(dest, w.getboolean2(),x); } public static boolean[][] eval(boolean[][] dest, boolean[][] w, NslBoolean1 x) { return eval(dest, w,x.getboolean1()); } //---- public static boolean[] eval(NslBoolean1 w, NslBoolean2 x) { return eval(w.getboolean1(), x.getboolean2()); } public static boolean[] eval(NslBoolean1 w, boolean[][] x) { return eval(w.getboolean1(), x); } public static boolean[] eval(boolean[] w, NslBoolean2 x) { return eval(w, x.getboolean2()); } public static boolean[] eval(boolean[] dest, NslBoolean1 w, NslBoolean2 x) { return eval(dest, w.getboolean1(), x.getboolean2()); } public static boolean[] eval(boolean[] dest, NslBoolean1 w, boolean[][] x) { return eval(dest, w.getboolean1(), x); } public static boolean[] eval(boolean[] dest, boolean[] w, NslBoolean2 x) { return eval(dest, w, x.getboolean2()); } //---- public static boolean[][] eval(NslBoolean2 w, NslBoolean2 x) { return eval(w.getboolean2(), x.getboolean2()); } public static boolean[][] eval(NslBoolean2 w, boolean[][] x) { return eval(w.getboolean2(), x); } public static boolean[][] eval(boolean[][] w, NslBoolean2 x) { return eval(w, x.getboolean2()); } public static boolean[][] eval(boolean[][] dest, NslBoolean2 w, NslBoolean2 x) { return eval(dest, w.getboolean2(), x.getboolean2()); } public static boolean[][] eval(boolean[][] dest, NslBoolean2 w, boolean[][] x) { return eval(dest, w.getboolean2(), x); } public static boolean[][] eval(boolean[][] dest, boolean[][] w, NslBoolean2 x) { return eval(dest, w, x.getboolean2()); } /* Nsl Dot product added here for compatibility with previous models */ /* this methods should be erased. */ /* doubles */ public static double eval(double[] w, double[] x) { int size = w.length; double c = 0.0; if (size != x.length) { System.out.println("Inconsistent Array dimensions"); return c; } for (int i = 0; i < size; i++) c = c + w[i]*x[i]; return c; } public static double eval(NslDouble1 w, NslDouble1 x) { return eval(x.getdouble1(),w.getdouble1()); } /* floats */ public static float eval(float[] w,float[] x) { int size = w.length; float c = 0; if (size != x.length) { System.out.println("Inconsistent Array dimensions"); return c; } for (int i = 0; i < size; i++) c = c + w[i]*x[i]; return c; } public static float eval(NslFloat1 w, NslFloat1 x) { return eval(x.getfloat1(),w.getfloat1()); } /* ints */ public static int eval(int[] w,int[] x) { int size = w.length; int c = 0; if (size != x.length) { System.out.println("Inconsistent Array dimensions"); return c; } for (int i = 0; i < size; i++) c = c + w[i]*x[i]; return c; } public static int eval(NslInt1 w, NslInt1 x) { return eval(x.getint1(),w.getint1()); } /* booleans */ public static boolean eval(boolean[] w, boolean[] x) { int size = w.length; boolean c = false; if (size != x.length) { System.out.println("Inconsistent Array dimensions"); return c; } for (int i = 0; i < size; i++) c = c || w[i] && x[i]; return c; } public static boolean eval(NslBoolean1 w, NslBoolean1 x) { return eval(x.getboolean1(),w.getboolean1()); } }