Chris@47: Chris@222: module yetilab.vector.vector; Chris@5: Chris@222: load yetilab.vector.vectortype; Chris@9: Chris@211: import java.util: Arrays; Chris@26: Chris@211: //!!! This is supposed to be 100% immutable and without copying when duplicating for read only Chris@211: Chris@211: zeros n = Chris@211: new double[n]; Chris@211: Chris@211: consts m n = Chris@211: (a = zeros n; Chris@211: for [0..n-1] do i: Chris@211: a[i] := m; Chris@211: done; Chris@211: a); Chris@211: Chris@211: ones = consts 1.0; Chris@211: Chris@211: fromList l is list? -> ~double[] = Chris@211: (arr = array(l); Chris@211: len = length arr; Chris@211: v = zeros len; Chris@211: for [0..len-1] do i: Chris@211: v[i] := arr[i]; Chris@211: done; Chris@211: v); Chris@211: Chris@211: list' a is ~double[] -> list = Chris@211: list a; Chris@211: Chris@211: array' a is ~double[] -> array = Chris@211: array a; Chris@211: Chris@211: length' = Chris@211: length . list'; Chris@211: Chris@211: empty?' = Chris@211: empty? . list'; Chris@211: Chris@260: //!!! doc note: argument order chosen for consistency with std module function Chris@260: at' v n is ~double[] -> number -> number = Chris@214: v[n]; Chris@214: Chris@211: floats a is ~double[] -> ~float[] = Chris@211: (len = length' a; Chris@211: f = new float[len]; Chris@211: for [0..len-1] do i: Chris@211: f[i] := a[i]; Chris@211: done; Chris@211: f); Chris@211: Chris@211: fromFloats ff is ~float[] -> ~double[] = Chris@211: (len = length (list ff); Chris@211: a = new double[len]; Chris@211: for [0..len-1] do i: Chris@211: a[i] := ff[i]; Chris@211: done; Chris@211: a); Chris@211: Chris@211: equal v1 v2 = Chris@211: list' v1 == list' v2; Chris@211: Chris@226: equalUnder comparator v1 v2 = Chris@226: length' v1 == length' v2 and Chris@226: all id (map2 comparator (list' v1) (list' v2)); Chris@226: Chris@211: copyOf v is ~double[] -> ~double[] = Chris@211: Arrays#copyOf(v, list' v |> length); Chris@211: Chris@260: //!!! doc note: argument order chosen for consistency with std module function Chris@236: slice v start end is ~double[] -> number -> number -> ~double[] = Chris@260: Arrays#copyOfRange(v, start, end); Chris@236: Chris@211: resizedTo n v is number -> ~double[] -> ~double[] = Chris@211: Arrays#copyOf(v, n); Chris@211: Chris@211: concat vv is list?<~double[]> -> ~double[] = Chris@211: (len = sum (map length' vv); Chris@211: vout = zeros len; Chris@211: var base = 0; Chris@211: for vv do v: Chris@211: vlen = length' v; Chris@211: for [0..vlen-1] do i: vout[base + i] := v[i] done; Chris@211: base := base + vlen; Chris@211: done; Chris@211: vout); Chris@208: Chris@5: { Chris@211: zeros, Chris@211: consts, Chris@211: ones, Chris@211: vector v = v, Chris@211: primitive = copyOf, Chris@211: floats, Chris@211: fromFloats, Chris@211: fromList, Chris@211: list = list', Chris@211: array = array', Chris@211: length = length', Chris@211: empty? = empty?', Chris@214: at = at', Chris@211: equal, Chris@226: equalUnder, Chris@236: slice, Chris@211: resizedTo, Chris@211: concat, Chris@47: } as { Chris@211: zeros is number -> vector, Chris@211: consts is number -> number -> vector, Chris@211: ones is number -> vector, Chris@211: vector is ~double[] -> vector, Chris@211: primitive is vector -> ~double[], Chris@211: floats is vector -> ~float[], Chris@211: fromFloats is ~float[] -> vector, Chris@211: fromList is list? -> vector, Chris@211: list is vector -> list, Chris@211: array is vector -> array, Chris@211: length is vector -> number, Chris@211: empty? is vector -> boolean, Chris@260: at is vector -> number -> number, Chris@211: equal is vector -> vector -> boolean, Chris@226: equalUnder is (number -> number -> boolean) -> vector -> vector -> boolean, Chris@260: slice is vector -> number -> number -> vector, Chris@211: resizedTo is number -> vector -> vector, Chris@211: concat is list? -> vector, Chris@5: } Chris@5: Chris@27: Chris@47: