diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-05-28 00:38:24 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-05-28 00:38:24 +0000 |
commit | 69e5e3659b7cb45433333bd501cc82a4893cc3df (patch) | |
tree | a12c5c64292ca2e887ce461a217e1d9b94d088b5 | |
parent | 8f1bdd060645a82b24ed732f73a4516fb12b563b (diff) |
primitive vector support
-rw-r--r-- | src/jvm/clojure/lang/Numbers.java | 135 | ||||
-rw-r--r-- | src/primmath.clj | 224 |
2 files changed, 335 insertions, 24 deletions
diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java index 2ed3f117..d10d99e2 100644 --- a/src/jvm/clojure/lang/Numbers.java +++ b/src/jvm/clojure/lang/Numbers.java @@ -1268,7 +1268,15 @@ static public class F{ static public boolean neg(float x) {return x < 0;} static public boolean zero(float x) {return x == 0;} - static public float[] array(int size, Object init){ + static public float aget(float[] xs, int i){ + return xs[i]; + } + + static public int alength(float[] xs){ + return xs.length; + } + + static public float[] vec(int size, Object init){ float[] ret = new float[size]; if(init instanceof Number) { @@ -1285,6 +1293,21 @@ static public class F{ return ret; } + static public float[] vec(Object sizeOrSeq){ + if(sizeOrSeq instanceof Number) + return new float[((Number)sizeOrSeq).intValue()]; + else + { + ISeq s = RT.seq(sizeOrSeq); + int size = s.count(); + float[] ret = new float[size]; + for(int i = 0; i < size && s != null;i++,s=s.rest()) + ret[i] = ((Number)s.first()).intValue(); + return ret; + } + } + + static public float[] vsadd(float[] x, float y){ final float[] xs = x.clone(); for(int i=0;i<xs.length;i++) @@ -1588,12 +1611,20 @@ static public class F{ return xs; } - static public float[] vmap(float[] x, IFn fn) throws Exception{ + static public float[] vmap(IFn fn, float[] x) throws Exception{ float[] xs = x.clone(); for(int i=0;i<xs.length;i++) xs[i] = ((Number)fn.invoke(xs[i])).floatValue(); return xs; } + + static public float[] vmap(IFn fn, float[] x, float[] ys) throws Exception{ + float[] xs = x.clone(); + for(int i=0;i<xs.length;i++) + xs[i] = ((Number)fn.invoke(xs[i], ys[i])).floatValue(); + return xs; + } + } static public class D{ @@ -1613,7 +1644,15 @@ static public class D{ static public boolean neg(double x) {return x < 0;} static public boolean zero(double x) {return x == 0;} - static public double[] array(int size, Object init){ + static public double aget(double[] xs, int i){ + return xs[i]; + } + + static public int alength(double[] xs){ + return xs.length; + } + + static public double[] vec(int size, Object init){ double[] ret = new double[size]; if(init instanceof Number) { @@ -1630,6 +1669,20 @@ static public class D{ return ret; } + static public double[] vec(Object sizeOrSeq){ + if(sizeOrSeq instanceof Number) + return new double[((Number)sizeOrSeq).intValue()]; + else + { + ISeq s = RT.seq(sizeOrSeq); + int size = s.count(); + double[] ret = new double[size]; + for(int i = 0; i < size && s != null;i++,s=s.rest()) + ret[i] = ((Number)s.first()).intValue(); + return ret; + } + } + static public double[] vsadd(double[] x, double y){ final double[] xs = x.clone(); for(int i=0;i<xs.length;i++) @@ -1933,12 +1986,19 @@ static public class D{ return xs; } - static public double[] vmap(double[] x, IFn fn) throws Exception{ + static public double[] vmap(IFn fn, double[] x) throws Exception{ double[] xs = x.clone(); for(int i=0;i<xs.length;i++) xs[i] = ((Number)fn.invoke(xs[i])).doubleValue(); return xs; } + + static public double[] vmap(IFn fn, double[] x, double[] ys) throws Exception{ + double[] xs = x.clone(); + for(int i=0;i<xs.length;i++) + xs[i] = ((Number)fn.invoke(xs[i], ys[i])).doubleValue(); + return xs; + } } static public class I{ @@ -1958,7 +2018,15 @@ static public class I{ static public boolean neg(int x) {return x < 0;} static public boolean zero(int x) {return x == 0;} - static public int[] array(int size, Object init){ + static public int aget(int[] xs, int i){ + return xs[i]; + } + + static public int alength(int[] xs){ + return xs.length; + } + + static public int[] vec(int size, Object init){ int[] ret = new int[size]; if(init instanceof Number) { @@ -1975,6 +2043,20 @@ static public class I{ return ret; } + static public int[] vec(Object sizeOrSeq){ + if(sizeOrSeq instanceof Number) + return new int[((Number)sizeOrSeq).intValue()]; + else + { + ISeq s = RT.seq(sizeOrSeq); + int size = s.count(); + int[] ret = new int[size]; + for(int i = 0; i < size && s != null;i++,s=s.rest()) + ret[i] = ((Number)s.first()).intValue(); + return ret; + } + } + static public int[] vsadd(int[] x, int y){ final int[] xs = x.clone(); for(int i=0;i<xs.length;i++) @@ -2278,13 +2360,20 @@ static public class I{ return xs; } - static public int[] vmap(int[] x, IFn fn) throws Exception{ + static public int[] vmap(IFn fn, int[] x) throws Exception{ int[] xs = x.clone(); for(int i=0;i<xs.length;i++) xs[i] = ((Number)fn.invoke(xs[i])).intValue(); return xs; } + static public int[] vmap(IFn fn, int[] x, int[] ys) throws Exception{ + int[] xs = x.clone(); + for(int i=0;i<xs.length;i++) + xs[i] = ((Number)fn.invoke(xs[i], ys[i])).intValue(); + return xs; + } + } static public class L{ @@ -2304,7 +2393,15 @@ static public class L{ static public boolean neg(long x) {return x < 0;} static public boolean zero(long x) {return x == 0;} - static public long[] array(int size, Object init){ + static public long aget(long[] xs, int i){ + return xs[i]; + } + + static public int alength(long[] xs){ + return xs.length; + } + + static public long[] vec(int size, Object init){ long[] ret = new long[size]; if(init instanceof Number) { @@ -2321,6 +2418,21 @@ static public class L{ return ret; } + static public long[] vec(Object sizeOrSeq){ + if(sizeOrSeq instanceof Number) + return new long[((Number)sizeOrSeq).intValue()]; + else + { + ISeq s = RT.seq(sizeOrSeq); + int size = s.count(); + long[] ret = new long[size]; + for(int i = 0; i < size && s != null;i++,s=s.rest()) + ret[i] = ((Number)s.first()).intValue(); + return ret; + } + } + + static public long[] vsadd(long[] x, long y){ final long[] xs = x.clone(); for(int i=0;i<xs.length;i++) @@ -2624,13 +2736,20 @@ static public class L{ return xs; } - static public long[] vmap(long[] x, IFn fn) throws Exception{ + static public long[] vmap(IFn fn, long[] x) throws Exception{ long[] xs = x.clone(); for(int i=0;i<xs.length;i++) xs[i] = ((Number)fn.invoke(xs[i])).longValue(); return xs; } + static public long[] vmap(IFn fn, long[] x, long[] ys) throws Exception{ + long[] xs = x.clone(); + for(int i=0;i<xs.length;i++) + xs[i] = ((Number)fn.invoke(xs[i], ys[i])).longValue(); + return xs; + } + } } diff --git a/src/primmath.clj b/src/primmath.clj index 96d4f569..0dc85a93 100644 --- a/src/primmath.clj +++ b/src/primmath.clj @@ -7,7 +7,7 @@ ; You must not remove this notice, or any other, from this software. (in-ns 'int) -(clojure/refer 'clojure :exclude '(+ - * / == < <= > >= zero? pos? neg? inc dec array max min)) +(clojure/refer 'clojure :exclude '(+ - * / == < <= > >= zero? pos? neg? inc dec vec max min aget alength)) (import '(clojure.lang Numbers$I)) (definline + [x y] `(. Numbers$I add ~x ~y)) @@ -26,21 +26,31 @@ (definline dec [x] `(. Numbers$I dec ~x)) (definline negate [x] `(. Numbers$I negate ~x)) -(definline array [size init] `(. Numbers$I array ~size ~init)) -(definline vsadd [xs y] `(. Numbers$I vsadd ~xs ~y)) -(definline vssub [xs y] `(. Numbers$I vssub ~xs ~y)) -(definline vsdiv [xs y] `(. Numbers$I vsdiv ~xs ~y)) -(definline vsmul [xs y] `(. Numbers$I vsmul ~xs ~y)) -(definline svdiv [x ys] `(. Numbers$I svdiv ~x ~ys)) +(definline aget [xs i] `(. Numbers$I aget ~xs ~i)) +(definline alength [xs] `(. Numbers$I alength ~xs)) -(definline vsmuladd [xs y zs] `(. Numbers$I vsmuladd ~xs ~y ~zs)) -(definline vsmulsub [xs y zs] `(. Numbers$I vsmulsub ~xs ~y ~zs)) -(definline vsmulsadd [xs y z] `(. Numbers$I vsmuladd ~xs ~y ~z)) -(definline vsmulssub [xs y z] `(. Numbers$I vsmulssub ~xs ~y ~z)) +(defn vec + ([size-or-seq] (. Numbers$I vec size-or-seq)) + ([size init] (. Numbers$I vec size init))) + +(defn vmap + ([f xs] (. Numbers$I vmap f xs)) + ([f xs ys] (. Numbers$I vmap f xs ys))) + +(definline v+n [xs y] `(. Numbers$I vsadd ~xs ~y)) +(definline v-n [xs y] `(. Numbers$I vssub ~xs ~y)) +(definline v|n [xs y] `(. Numbers$I vsdiv ~xs ~y)) +(definline v*n [xs y] `(. Numbers$I vsmul ~xs ~y)) +(definline n|v [x ys] `(. Numbers$I svdiv ~x ~ys)) + +(definline v*n+v [xs y zs] `(. Numbers$I vsmuladd ~xs ~y ~zs)) +(definline v*n-v [xs y zs] `(. Numbers$I vsmulsub ~xs ~y ~zs)) +(definline v*n+n [xs y z] `(. Numbers$I vsmuladd ~xs ~y ~z)) +(definline v*n-n [xs y z] `(. Numbers$I vsmulssub ~xs ~y ~z)) (definline vabs [xs] `(. Numbers$I vabs ~xs)) -(definline vnegabs [xs] `(. Numbers$I vnegabs ~xs)) -(definline vneg [xs] `(. Numbers$I vneg ~xs)) +(definline vnegateabs [xs] `(. Numbers$I vnegabs ~xs)) +(definline vnegate [xs] `(. Numbers$I vneg ~xs)) (definline vsqr [xs] `(. Numbers$I vsqr ~xs)) (definline vsignedsqr [xs] `(. Numbers$I vsignedsqr ~xs)) (definline vreverse [xs] `(. Numbers$I vreverse ~xs)) @@ -57,9 +67,23 @@ (definline vthresh [xs thresh otherwise] `(. Numbers$I vthresh ~xs ~thresh ~otherwise)) (definline vdot [xs ys] `(. Numbers$I vdot ~xs ~ys)) +(definline v== [xs ys] `(. Numbers$I vequiv ~xs ~ys)) +(definline v+v [xs ys] `(. Numbers$I vadd ~xs ~ys)) +(definline v-v [xs ys] `(. Numbers$I vsub ~xs ~ys)) +(definline v*v [xs ys] `(. Numbers$I vmul ~xs ~ys)) +(definline v|v [xs ys] `(. Numbers$I vdiv ~xs ~ys)) +(definline vmaxv [xs ys] `(. Numbers$I vmax ~xs ~ys)) +(definline vminv [xs ys] `(. Numbers$I vmin ~xs ~ys)) + +(definline v+v*v [xs ys zs] `(. Numbers$I vaddmul ~xs ~ys ~zs)) +(definline v-v*v [xs ys zs] `(. Numbers$I vsubmul ~xs ~ys ~zs)) + +(definline v+v*n [xs ys z] `(. Numbers$I vaddsmul ~xs ~ys ~z)) +(definline v-v*n [xs ys z] `(. Numbers$I vsubsmul ~xs ~ys ~z)) +(definline v*v+n [xs ys z] `(. Numbers$I vmulsadd ~xs ~ys ~z)) (in-ns 'long) -(clojure/refer 'clojure :exclude '(+ - * / == < <= > >= zero? pos? neg? inc dec array)) +(clojure/refer 'clojure :exclude '(+ - * / == < <= > >= zero? pos? neg? inc dec vec max min aget alength)) (import '(clojure.lang Numbers$L)) (definline + [x y] `(. Numbers$L add ~x ~y)) @@ -78,8 +102,64 @@ (definline dec [x] `(. Numbers$L dec ~x)) (definline negate [x] `(. Numbers$L negate ~x)) +(definline aget [xs i] `(. Numbers$L aget ~xs ~i)) +(definline alength [xs] `(. Numbers$L alength ~xs)) + +(defn vec + ([size-or-seq] (. Numbers$L vec size-or-seq)) + ([size init] (. Numbers$L vec size init))) + +(defn vmap + ([f xs] (. Numbers$L vmap f xs)) + ([f xs ys] (. Numbers$L vmap f xs ys))) + +(definline v+n [xs y] `(. Numbers$L vsadd ~xs ~y)) +(definline v-n [xs y] `(. Numbers$L vssub ~xs ~y)) +(definline v|n [xs y] `(. Numbers$L vsdiv ~xs ~y)) +(definline v*n [xs y] `(. Numbers$L vsmul ~xs ~y)) +(definline n|v [x ys] `(. Numbers$L svdiv ~x ~ys)) + +(definline v*n+v [xs y zs] `(. Numbers$L vsmuladd ~xs ~y ~zs)) +(definline v*n-v [xs y zs] `(. Numbers$L vsmulsub ~xs ~y ~zs)) +(definline v*n+n [xs y z] `(. Numbers$L vsmuladd ~xs ~y ~z)) +(definline v*n-n [xs y z] `(. Numbers$L vsmulssub ~xs ~y ~z)) + +(definline vabs [xs] `(. Numbers$L vabs ~xs)) +(definline vnegateabs [xs] `(. Numbers$L vnegabs ~xs)) +(definline vnegate [xs] `(. Numbers$L vneg ~xs)) +(definline vsqr [xs] `(. Numbers$L vsqr ~xs)) +(definline vsignedsqr [xs] `(. Numbers$L vsignedsqr ~xs)) +(definline vreverse [xs] `(. Numbers$L vreverse ~xs)) +(definline vrunningsum [xs] `(. Numbers$L vrunningsum ~xs)) +(definline vsort [xs] `(. Numbers$L vsort ~xs)) +(definline vmax [xs] `(. Numbers$L vmax ~xs)) +(definline vmin [xs] `(. Numbers$L vmin ~xs)) +(definline vmean [xs] `(. Numbers$L vmean ~xs)) +(definline vrms [xs] `(. Numbers$L vrms ~xs)) +(definline vsum [xs] `(. Numbers$L vsum ~xs)) + +(definline vclip [xs low high] `(. Numbers$L vclip ~xs ~low ~high)) +(definline vclipcounts [xs low high] `(. Numbers$L vclipcounts ~xs ~low ~high)) +(definline vthresh [xs thresh otherwise] `(. Numbers$L vthresh ~xs ~thresh ~otherwise)) + +(definline vdot [xs ys] `(. Numbers$L vdot ~xs ~ys)) +(definline v== [xs ys] `(. Numbers$L vequiv ~xs ~ys)) +(definline v+v [xs ys] `(. Numbers$L vadd ~xs ~ys)) +(definline v-v [xs ys] `(. Numbers$L vsub ~xs ~ys)) +(definline v*v [xs ys] `(. Numbers$L vmul ~xs ~ys)) +(definline v|v [xs ys] `(. Numbers$L vdiv ~xs ~ys)) +(definline vmaxv [xs ys] `(. Numbers$L vmax ~xs ~ys)) +(definline vminv [xs ys] `(. Numbers$L vmin ~xs ~ys)) + +(definline v+v*v [xs ys zs] `(. Numbers$L vaddmul ~xs ~ys ~zs)) +(definline v-v*v [xs ys zs] `(. Numbers$L vsubmul ~xs ~ys ~zs)) + +(definline v+v*n [xs ys z] `(. Numbers$L vaddsmul ~xs ~ys ~z)) +(definline v-v*n [xs ys z] `(. Numbers$L vsubsmul ~xs ~ys ~z)) +(definline v*v+n [xs ys z] `(. Numbers$L vmulsadd ~xs ~ys ~z)) + (in-ns 'float) -(clojure/refer 'clojure :exclude '(+ - * / == < <= > >= zero? pos? neg? inc dec array)) +(clojure/refer 'clojure :exclude '(+ - * / == < <= > >= zero? pos? neg? inc dec vec max min aget alength)) (import '(clojure.lang Numbers$F)) (definline + [x y] `(. Numbers$F add ~x ~y)) @@ -98,8 +178,64 @@ (definline dec [x] `(. Numbers$F dec ~x)) (definline negate [x] `(. Numbers$F negate ~x)) +(definline aget [xs i] `(. Numbers$F aget ~xs ~i)) +(definline alength [xs] `(. Numbers$F alength ~xs)) + +(defn vec + ([size-or-seq] (. Numbers$F vec size-or-seq)) + ([size init] (. Numbers$F vec size init))) + +(defn vmap + ([f xs] (. Numbers$F vmap f xs)) + ([f xs ys] (. Numbers$F vmap f xs ys))) + +(definline v+n [xs y] `(. Numbers$F vsadd ~xs ~y)) +(definline v-n [xs y] `(. Numbers$F vssub ~xs ~y)) +(definline v|n [xs y] `(. Numbers$F vsdiv ~xs ~y)) +(definline v*n [xs y] `(. Numbers$F vsmul ~xs ~y)) +(definline n|v [x ys] `(. Numbers$F svdiv ~x ~ys)) + +(definline v*n+v [xs y zs] `(. Numbers$F vsmuladd ~xs ~y ~zs)) +(definline v*n-v [xs y zs] `(. Numbers$F vsmulsub ~xs ~y ~zs)) +(definline v*n+n [xs y z] `(. Numbers$F vsmuladd ~xs ~y ~z)) +(definline v*n-n [xs y z] `(. Numbers$F vsmulssub ~xs ~y ~z)) + +(definline vabs [xs] `(. Numbers$F vabs ~xs)) +(definline vnegateabs [xs] `(. Numbers$F vnegabs ~xs)) +(definline vnegate [xs] `(. Numbers$F vneg ~xs)) +(definline vsqr [xs] `(. Numbers$F vsqr ~xs)) +(definline vsignedsqr [xs] `(. Numbers$F vsignedsqr ~xs)) +(definline vreverse [xs] `(. Numbers$F vreverse ~xs)) +(definline vrunningsum [xs] `(. Numbers$F vrunningsum ~xs)) +(definline vsort [xs] `(. Numbers$F vsort ~xs)) +(definline vmax [xs] `(. Numbers$F vmax ~xs)) +(definline vmin [xs] `(. Numbers$F vmin ~xs)) +(definline vmean [xs] `(. Numbers$F vmean ~xs)) +(definline vrms [xs] `(. Numbers$F vrms ~xs)) +(definline vsum [xs] `(. Numbers$F vsum ~xs)) + +(definline vclip [xs low high] `(. Numbers$F vclip ~xs ~low ~high)) +(definline vclipcounts [xs low high] `(. Numbers$F vclipcounts ~xs ~low ~high)) +(definline vthresh [xs thresh otherwise] `(. Numbers$F vthresh ~xs ~thresh ~otherwise)) + +(definline vdot [xs ys] `(. Numbers$F vdot ~xs ~ys)) +(definline v== [xs ys] `(. Numbers$F vequiv ~xs ~ys)) +(definline v+v [xs ys] `(. Numbers$F vadd ~xs ~ys)) +(definline v-v [xs ys] `(. Numbers$F vsub ~xs ~ys)) +(definline v*v [xs ys] `(. Numbers$F vmul ~xs ~ys)) +(definline v|v [xs ys] `(. Numbers$F vdiv ~xs ~ys)) +(definline vmaxv [xs ys] `(. Numbers$F vmax ~xs ~ys)) +(definline vminv [xs ys] `(. Numbers$F vmin ~xs ~ys)) + +(definline v+v*v [xs ys zs] `(. Numbers$F vaddmul ~xs ~ys ~zs)) +(definline v-v*v [xs ys zs] `(. Numbers$F vsubmul ~xs ~ys ~zs)) + +(definline v+v*n [xs ys z] `(. Numbers$F vaddsmul ~xs ~ys ~z)) +(definline v-v*n [xs ys z] `(. Numbers$F vsubsmul ~xs ~ys ~z)) +(definline v*v+n [xs ys z] `(. Numbers$F vmulsadd ~xs ~ys ~z)) + (in-ns 'double) -(clojure/refer 'clojure :exclude '(+ - * / == < <= > >= zero? pos? neg? inc dec array)) +(clojure/refer 'clojure :exclude '(+ - * / == < <= > >= zero? pos? neg? inc dec vec max min aget alength)) (import '(clojure.lang Numbers$D)) (definline + [x y] `(. Numbers$D add ~x ~y)) @@ -117,3 +253,59 @@ (definline inc [x] `(. Numbers$D inc ~x)) (definline dec [x] `(. Numbers$D dec ~x)) (definline negate [x] `(. Numbers$D negate ~x)) + +(definline aget [xs i] `(. Numbers$D aget ~xs ~i)) +(definline alength [xs] `(. Numbers$D alength ~xs)) + +(defn vec + ([size-or-seq] (. Numbers$D vec size-or-seq)) + ([size init] (. Numbers$D vec size init))) + +(defn vmap + ([f xs] (. Numbers$D vmap f xs)) + ([f xs ys] (. Numbers$D vmap f xs ys))) + +(definline v+n [xs y] `(. Numbers$D vsadd ~xs ~y)) +(definline v-n [xs y] `(. Numbers$D vssub ~xs ~y)) +(definline v|n [xs y] `(. Numbers$D vsdiv ~xs ~y)) +(definline v*n [xs y] `(. Numbers$D vsmul ~xs ~y)) +(definline n|v [x ys] `(. Numbers$D svdiv ~x ~ys)) + +(definline v*n+v [xs y zs] `(. Numbers$D vsmuladd ~xs ~y ~zs)) +(definline v*n-v [xs y zs] `(. Numbers$D vsmulsub ~xs ~y ~zs)) +(definline v*n+n [xs y z] `(. Numbers$D vsmuladd ~xs ~y ~z)) +(definline v*n-n [xs y z] `(. Numbers$D vsmulssub ~xs ~y ~z)) + +(definline vabs [xs] `(. Numbers$D vabs ~xs)) +(definline vnegateabs [xs] `(. Numbers$D vnegabs ~xs)) +(definline vnegate [xs] `(. Numbers$D vneg ~xs)) +(definline vsqr [xs] `(. Numbers$D vsqr ~xs)) +(definline vsignedsqr [xs] `(. Numbers$D vsignedsqr ~xs)) +(definline vreverse [xs] `(. Numbers$D vreverse ~xs)) +(definline vrunningsum [xs] `(. Numbers$D vrunningsum ~xs)) +(definline vsort [xs] `(. Numbers$D vsort ~xs)) +(definline vmax [xs] `(. Numbers$D vmax ~xs)) +(definline vmin [xs] `(. Numbers$D vmin ~xs)) +(definline vmean [xs] `(. Numbers$D vmean ~xs)) +(definline vrms [xs] `(. Numbers$D vrms ~xs)) +(definline vsum [xs] `(. Numbers$D vsum ~xs)) + +(definline vclip [xs low high] `(. Numbers$D vclip ~xs ~low ~high)) +(definline vclipcounts [xs low high] `(. Numbers$D vclipcounts ~xs ~low ~high)) +(definline vthresh [xs thresh otherwise] `(. Numbers$D vthresh ~xs ~thresh ~otherwise)) + +(definline vdot [xs ys] `(. Numbers$D vdot ~xs ~ys)) +(definline v== [xs ys] `(. Numbers$D vequiv ~xs ~ys)) +(definline v+v [xs ys] `(. Numbers$D vadd ~xs ~ys)) +(definline v-v [xs ys] `(. Numbers$D vsub ~xs ~ys)) +(definline v*v [xs ys] `(. Numbers$D vmul ~xs ~ys)) +(definline v|v [xs ys] `(. Numbers$D vdiv ~xs ~ys)) +(definline vmaxv [xs ys] `(. Numbers$D vmax ~xs ~ys)) +(definline vminv [xs ys] `(. Numbers$D vmin ~xs ~ys)) + +(definline v+v*v [xs ys zs] `(. Numbers$D vaddmul ~xs ~ys ~zs)) +(definline v-v*v [xs ys zs] `(. Numbers$D vsubmul ~xs ~ys ~zs)) + +(definline v+v*n [xs ys z] `(. Numbers$D vaddsmul ~xs ~ys ~z)) +(definline v-v*n [xs ys z] `(. Numbers$D vsubsmul ~xs ~ys ~z)) +(definline v*v+n [xs ys z] `(. Numbers$D vmulsadd ~xs ~ys ~z)) |