diff --git a/src/main/java/ch/hepia/numeric/Transposed.java b/src/main/java/ch/hepia/numeric/Transposed.java index 9154658958fe87fa3224a8c4ece78a5f554e5296..16f11540636653f6da9b0ba04276ec88356f1b95 100644 --- a/src/main/java/ch/hepia/numeric/Transposed.java +++ b/src/main/java/ch/hepia/numeric/Transposed.java @@ -1,6 +1,8 @@ package ch.hepia.numeric; import java.util.List; import java.util.ArrayList; +import java.util.function.DoubleFunction; +import java.util.function.Function; public class Transposed{ private List<Double> vecT; @@ -9,6 +11,16 @@ public class Transposed{ this.vecT = new ArrayList<>(); }; + private Transposed(Double... elements) { + List<Double> vec = new ArrayList<>(); + for (double elem : elements){vec.add(elem);} + this.vecT = vec; + } + + public Transposed(List<Double> elements){ + this.vecT = elements; + } + public Transposed(Vector That){ this.vecT = new ArrayList<>(); for (double elem : That.getValues()){vecT.add(elem);} @@ -18,6 +30,10 @@ public class Transposed{ return this.vecT; } + void set(int i, double value) { + this.vecT.set(i, value); + } + public int len() { return this.getValues().size(); } @@ -35,7 +51,32 @@ public class Transposed{ } return res; //throw new UnsupportedOperationException("This feature isn't implemented yet"); - }; + } + + public Transposed add(Transposed that) { + List<Double> newVec = new ArrayList<>(); + for(int i=0; i < this.len();i++){ + newVec.add(this.get(i)+that.get(i)); + } + return new Transposed(newVec); + } + + public static Transposed zeros(int nb) { + List<Double> newVec = new ArrayList<>(); + for (int i = 0; i < nb ; i++){ + newVec.add(0.0); + } + return new Transposed(newVec); + } + + public static Transposed sum(List<Transposed> vs) { + Transposed totalVec = Transposed.zeros(vs.get(0).len()); + for (Transposed vec : vs){ + totalVec = totalVec.add(vec); + } + return totalVec; + } + public Transposed sub(Transposed That){ Transposed resT = new Transposed(); Integer count = 0; @@ -47,7 +88,111 @@ public class Transposed{ //throw new UnsupportedOperationException("This feature isn't implemented yet"); }; - @Override + public Transposed mul(double m) { + List<Double> newVec = new ArrayList<>(); + for (int i=0; i<this.len();i++){ + newVec.add(this.get(i)*m); + } + return new Transposed(newVec); + } + + public static Transposed of(Double... elements) { + return new Transposed(elements); + } + + public static Transposed of(List<Double> elements) { + return new Transposed(elements); + } + + public static Transposed empty() { + return new Transposed(); + } + + public double norm() { + double sum = 0.0; + for (int i=0; i<this.len();i++){ + sum += Math.pow(this.get(i),2.0); + } + return Math.sqrt(sum); + } + + public static double norms(List<Transposed> vs) { + return Transposed.sum(vs).norm(); + } + + public Transposed map(DoubleFunction<Double> f) { + List<Double> accVec = this.getValues(); + List<Double> newVec = new ArrayList<>(); + + for (Double val : accVec){ + newVec.add(f.apply(val)); + } + return new Transposed(newVec); + } + + public static Transposed ones(int nb) { + List<Double> newVec = new ArrayList<>(); + for (int i = 0; i < nb ; i++){ + newVec.add(1.0); + } + return new Transposed(newVec); + } + + public static Transposed fill(int nb, double value) { + List<Double> newVec = new ArrayList<>(); + for (int i = 0; i < nb ; i++){ + newVec.add(value); + } + return new Transposed(newVec); + } + + public static Transposed tabulate(int nb, Function<Integer, Double> f) { + List<Double> newVec = new ArrayList<>(); + for (int i=0; i < nb; i++){ + newVec.add(f.apply(i)); + } + return new Transposed(newVec); + } + + public Transposed concat(Transposed that) { + List<Double> newVec = this.getValues(); + newVec.addAll(that.getValues()); + return new Transposed(newVec); + } + + public Transposed sliceFrom(int i) { + List<Double> newVec = new ArrayList<>(); + for (int j=0; j < this.len();j++){ + if (j >= i){ + newVec.add(this.get(j)); + } + } + return new Transposed(newVec); + } + + public Transposed sliceTo(int i) { + List<Double> newVec = new ArrayList<>(); + for (int j=0; j < this.len();j++){ + if (j < i){ + newVec.add(this.get(j)); + } + } + return new Transposed(newVec); + } + + public Transposed slice(int from, int to) { + Transposed newVec = this; + newVec = newVec.sliceFrom(from); + newVec = newVec.sliceTo(to-from); + return newVec; + } + + public Transposed removed(int i) { + List<Double> newVec = this.getValues(); + newVec.remove(i); + return new Transposed(newVec); + } + @Override public String toString() { String tr = "Transposed["; for (double val: this.getValues()){ diff --git a/src/test/java/ch/hepia/numeric/AppTest.java b/src/test/java/ch/hepia/numeric/AppTest.java index 3b2ddd7cdb355cfc0b6cad3e147e18926480a292..e5f5072e911f828b139301cc7ccb8ebff4d1d728 100644 --- a/src/test/java/ch/hepia/numeric/AppTest.java +++ b/src/test/java/ch/hepia/numeric/AppTest.java @@ -88,4 +88,53 @@ class VectorTest { Vector v2 = Vector.of(-1.0, -2.0, -3.0); assertEquals(v1.concat(v2), Vector.of(1.0, 2.0, 3.0, -1.0, -2.0, -3.0)); } +// Test Transposed : + @Test + void transposedMainOp() { + Transposed v1 = Transposed.of(1.0, 2.0, 3.0); + Transposed v2 = Transposed.of(-1.0, -2.0, -3.0); + assertEquals(v1.add(v2), Transposed.of(0.0, 0.0, 0.0)); + assertEquals(v1.sub(v2), Transposed.of(2.0, 4.0, 6.0)); + assertEquals(v1.mul(3.0), Transposed.of(3.0, 6.0, 9.0)); + assertEquals(Transposed.empty().len(), 0); + assertEquals(Transposed.of(1.0, 2.0, 1.0).len(), 3); + } + + @Test + void transposedNormAndSum() { + assertEquals(Transposed.of(1.0, 2.0, 2.0).norm(), 3.0); + assertEquals(Transposed.sum(List.of(Transposed.of(1.0, 2.0, 1.0), Transposed.of(0.0, 0.0, 1.0))).norm(), 3.0); + assertEquals( + Transposed.sum(List.of(Transposed.of(1.0, 2.0, 1.0), Transposed.of(0.0, 0.0, 1.0))).norm(), + Transposed.norms(List.of(Transposed.of(1.0, 2.0, 1.0), Transposed.of(0.0, 0.0, 1.0))) + ); + assertEquals(Transposed.sum(List.of(Transposed.of(1.0, 2.0, 1.0), Transposed.of(0.0, 0.0, 1.0))), Transposed.of(1.0, 2.0, 2.0)); + } + + @Test + void transposedCreation() { + assertEquals(Transposed.zeros(3), Transposed.of(0.0, 0.0, 0.0)); + assertEquals(Transposed.ones(3), Transposed.of(1.0, 1.0, 1.0)); + assertEquals(Transposed.of(1.0, 2.0).map( d -> d * 2.0), Transposed.of(2.0, 4.0)); + assertEquals(Transposed.fill(3, 1.7), Transposed.of(1.7, 1.7, 1.7)); + assertEquals(Transposed.tabulate(4, i -> i*5.0), Transposed.of(0.0, 5.0, 10.0, 15.0)); + } + + @Test + void transposedConcat() { + Transposed v1 = Transposed.of(1.0, 2.0, 3.0); + Transposed v2 = Transposed.of(-1.0, -2.0, -3.0); + assertEquals(v1.concat(v2), Transposed.of(1.0, 2.0, 3.0, -1.0, -2.0, -3.0)); + } + + @Test + void transposedSlice() { + Transposed v = Transposed.of(1.0, 2.0, 3.0, 4.0, 5.0); + assertEquals(v.sliceFrom(2), Transposed.of(3.0, 4.0, 5.0)); + assertEquals(v.sliceTo(3), Transposed.of(1.0, 2.0, 3.0)); + assertEquals(v.slice(2,4), Transposed.of(3.0, 4.0)); + assertEquals(v.slice(4,4), Transposed.empty()); + assertEquals(v.slice(4,2), Transposed.empty()); + assertEquals(v.removed(2), Transposed.of(1.0, 2.0, 4.0, 5.0)); + } }