changeset 441:f33f9dfb8422

Some Java for vector bits
author Chris Cannam
date Wed, 23 Oct 2013 08:10:03 +0100
parents 76d41e53fad2
children 1404b9b58868
files build.xml src/may/bits/VectorBits.java src/may/vector/blockfuncs.yeti
diffstat 3 files changed, 64 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/build.xml	Fri Oct 18 11:18:45 2013 +0100
+++ b/build.xml	Wed Oct 23 08:10:03 2013 +0100
@@ -25,11 +25,22 @@
 	     classpath="${basedir}/../yeti/yeti.jar:${extjars}" />
   </target>
 
-  <target name="classes" depends="taskdef">
+  <target name="prepare">
+    <mkdir dir="${basedir}/classes"/>
+  </target>
+
+  <target name="yeticlasses" depends="taskdef">
     <yetic srcdir="${basedir}/src" destdir="${basedir}/classes"
 	   includes="**/*.yeti" excludes="**/test/*.yeti" preload="yeti/lang/std:yeti/lang/io"/>
   </target>
 
+  <target name="javaclasses">
+    <javac srcdir="${basedir}/src" destdir="${basedir}/classes"
+	   includes="**/*.java" includeantruntime="false"/>
+  </target>
+
+  <target name="classes" depends="prepare,javaclasses,yeticlasses"/>
+
   <target name="jar" depends="classes,taskdef">
     <jar jarfile="${basedir}/may.jar">
       <fileset dir="${basedir}/classes"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/may/bits/VectorBits.java	Wed Oct 23 08:10:03 2013 +0100
@@ -0,0 +1,42 @@
+
+package may.bits;
+
+public class VectorBits
+{
+    public static double sum(double[] v) {
+	double tot = 0.0;
+	int len = v.length;
+	for (int i = 0; i < len; ++i) {
+	    tot += v[i];
+	}
+	return tot;
+    }
+
+    public static double[] multiply(double[] v1, double[] v2) {
+	int len = v1.length;
+	if (v2.length < len) {
+	    len = v2.length;
+	}
+	double[] out = new double[len];
+	for (int i = 0; i < len; ++i) {
+	    out[i] = v1[i] * v2[i];
+	}
+	return out;
+    }
+
+    public static void addTo(double[] out, double[] in, int len) {
+	for (int i = 0; i < len; ++i) {
+	    out[i] += in[i];
+	}
+    }
+
+    public static double[] scaled(double[] v, double factor) {
+	int len = v.length;
+	double[] out = new double[v.length];
+	for (int i = 0; i < len; ++i) {
+	    out[i] = v[i] * factor;
+	}
+	return out;
+    }
+}
+
--- a/src/may/vector/blockfuncs.yeti	Fri Oct 18 11:18:45 2013 +0100
+++ b/src/may/vector/blockfuncs.yeti	Wed Oct 23 08:10:03 2013 +0100
@@ -5,19 +5,15 @@
 
 load may.vector.type;
 
-//!!! "internal" vector function to retrieve data for read-only
+import may.bits: VectorBits;
+
+// "internal" vector function to retrieve data for read-only
 // purposes without copying
 raw =
    (raw' v is ~double[] -> ~double[] = v;
     raw' as vector -> ~double[]);
 
-sum' v =
-   (dat = raw v;
-    tot = new double[1];
-    for [0..length dat - 1] do i:
-        tot[0] := tot[0] + dat[i]
-    done;
-    tot[0]);
+sum' v = VectorBits#sum(raw v);
 
 max' v = 
    (dat = raw v;
@@ -73,10 +69,8 @@
    (len = head (sort (map vec.length bb));
     vv = map raw bb;
     out = new double[len];
-    for [0..len-1] do i:
-        for vv do v: 
-            out[i] := out[i] + v[i];
-        done;
+    for vv do v:
+        VectorBits#addTo(out, v, len);
     done;
     vec.vector out);
 
@@ -90,24 +84,16 @@
     done;
     vec.vector out);
 
-multiply b1 b2 =
-   (v1 = raw b1;
-    v2 = raw b2;
-    len = if length v1 < length v2 then length v1 else length v2 fi;
-    out = new double[len];
-    for [0..len-1] do i:
-        out[i] := v1[i] * v2[i]
-    done;
-    vec.vector out);
+multiply b1 b2 = VectorBits#multiply(raw b1, raw b2);
 
 scaled n v =
     if n == 1 then v
-    else vec.fromList (map (* n) (vec.list v));
+    else VectorBits#scaled(raw v, n);
     fi;
 
-divideBy n v =  // Not just "scaled (1/n)" -- this way we get exact rationals
+divideBy n v =
     if n == 1 then v
-    else vec.fromList (map (/ n) (vec.list v));
+    else VectorBits#scaled(raw v, 1.0 / n);
     fi;
 
 sqr v =