diff --git a/README.md b/README.md index a4766887d5d14ef8fef172cd93e41ad2345d6c74..766773b722f92175cb1284a292500ca7261437a9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Numeric + Ce repository contient l'énoncé du TP "numeric" et un squelette maven. Nous vous conseillons de vous abonner aux notifications (watch) pour ne pas manquer des annonces ou des changements. @@ -8,6 +9,42 @@ Après avoir choisi votre binôme, vous devrez **impérativement** : - Ajouter Joel Cavat (@joel.cavat), Jeremy Gobet (@jeremy.gobet) et Steven Liatti (@steven.liatti) en tant que *Reporter* de votre repository. - Lire attentivement l'énoncé. +## Fonctionnalités à réaliser sur les vecteurs (itération 1) + +Le projet contient déjà un ensemble de tests unitaires. Faites-en sorte que le projet compile et que les tests passsent. + +Vous devez réaliser des fonctionnalités sur les calculs vectoriels (dans un premier temps). Utilisez le package `ch.hepia.numeric` pour mettre vos classes. + +Opération sur les vecteurs (méthodes d'instance), regardez les tests unitaires pour comprendre comment elles fonctionnent + +- [ ] `add(), mul(), sub()` pour les opérations de bases +- [ ] `norm()` pour calculer la norme d'un vecteur +- [ ] `t()` pour retourner la vesion transposée +- [ ] `get()` pour retourner un élément +- [ ] `set()` en tant que méthode non publique pour modifier une valeur +- [ ] `map()` pour retourner une version transformée +- [ ] `removed()` pour retourner une sans un des éléments +- [ ] `concat()` pour concatener deux vecteurs +- [ ] `copy()` pour copier un vecteur +- [ ] `slice(), sliceTo(), sliceFrom()` pour les opérations de slicing +- [ ] `toString()` et `equals()` pour une représentation et la comparaison de vecteur +- ... + +Opérations statiques (méthodes de classes), regardez les tests unitaires pour comprendre comment elles fonctionnent + +- [ ] `of()` +- [ ] `empty()` +- [ ] `fill()` +- [ ] `zeros()` +- [ ] `ones()` +- [ ] `linespace()` +- [ ] `tabulate()` +- [ ] `sum()` +- [ ] `norms()` + +## Fonctionnalités à réaliser sur les matrices (prochaine itération) + +TBD # Maven @@ -29,7 +66,7 @@ mvn package java -cp target/my-app-0.1.jar ch.hepia.my_app.App ``` -- ou, à l'aide du plugin `exec-maven-plugin`: +- ou, à l'aide du plugin `exec-maven-plugin` (plus simple): ``` mvn exec:java diff --git a/src/main/java/ch/hepia/my_app/App.java b/src/main/java/ch/hepia/my_app/App.java index 438990991a9c116a303f71501217cfedf23ccbb5..c6a365b6f3b39d15b0e091caae5b45c34ae9b214 100644 --- a/src/main/java/ch/hepia/my_app/App.java +++ b/src/main/java/ch/hepia/my_app/App.java @@ -1,4 +1,4 @@ -package ch.hepia.my_app; +package ch.hepia; /** * Hello world! diff --git a/src/main/java/ch/hepia/numeric/Vector.java b/src/main/java/ch/hepia/numeric/Vector.java new file mode 100644 index 0000000000000000000000000000000000000000..d210742e36bae5513ad8ee5176c15633db40a1c8 --- /dev/null +++ b/src/main/java/ch/hepia/numeric/Vector.java @@ -0,0 +1,129 @@ +package ch.hepia.numeric; + +import java.util.List; +import java.util.function.DoubleFunction; +import java.util.function.Function; + +final public class Vector { + private Vector() {} + private Vector(Double... elements) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + private Vector(List<Double> elements) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Transposed t() { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public int len() { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public double get(int i) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + void set(int i, double value) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector add(Vector that) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector mul(double m) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector sub(Vector that) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public double norm() { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector sliceFrom(int i) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector sliceTo(int i) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector slice(int from, int to) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector removed(int i) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector concat(Vector that) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector map(DoubleFunction<Double> f) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public Vector copy() { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + void checkVectorLengthOrThrow(Vector that){ + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static Vector of(Double... elements) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static Vector of(List<Double> elements) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static Vector empty() { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static Vector fill(int nb, double value) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static Vector zeros(int nb) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static Vector ones(int nb) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static Vector linespace(double from, double to, int nb) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static Vector tabulate(int nb, Function<Integer, Double> f) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static Vector sum(List<Vector> vs) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + public static double norms(List<Vector> vs) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + + @Override + public String toString() { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } + + @Override + public boolean equals(Object obj) { + throw new UnsupportedOperationException("This feature isn't implemented yet"); + } +} diff --git a/src/test/java/ch/hepia/my_app/AppTest.java b/src/test/java/ch/hepia/my_app/AppTest.java deleted file mode 100644 index 11494066e0985a78203deba5c5cb3fcf29ae028d..0000000000000000000000000000000000000000 --- a/src/test/java/ch/hepia/my_app/AppTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package ch.hepia.my_app; - -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertFalse; - - -/** - * Unit test for simple App. - */ -class AppTest { - - @Test - void dummyTest() { - assertTrue(true); - } -} diff --git a/src/test/java/ch/hepia/numeric/AppTest.java b/src/test/java/ch/hepia/numeric/AppTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a3c1134fcaedeb0659877d25c0912734fdc79a11 --- /dev/null +++ b/src/test/java/ch/hepia/numeric/AppTest.java @@ -0,0 +1,84 @@ +package ch.hepia.numeric; + +import org.junit.jupiter.api.Test; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; + + +class VectorTest { + + @Test + void vectorMainOperations() { + Vector v1 = Vector.of(1.0, 2.0, 3.0); + Vector v2 = Vector.of(-1.0, -2.0, -3.0); + assertEquals(v1.add(v2), Vector.of(0.0, 0.0, 0.0)); + assertEquals(v1.sub(v2), Vector.of(2.0, 4.0, 6.0)); + assertEquals(v1.mul(3.0), Vector.of(3.0, 6.0, 9.0)); + assertEquals(Vector.empty().len(), 0); + assertEquals(Vector.of(1.0, 2.0, 1.0).len(), 3); + } + @Test + void vectorCreation() { + assertEquals(Vector.zeros(3), Vector.of(0.0, 0.0, 0.0)); + assertEquals(Vector.ones(3), Vector.of(1.0, 1.0, 1.0)); + assertEquals(Vector.of(1.0, 2.0).map( d -> d * 2.0), Vector.of(2.0, 4.0)); + assertEquals(Vector.fill(3, 1.7), Vector.of(1.7, 1.7, 1.7)); + assertEquals(Vector.tabulate(4, i -> i*5.0), Vector.of(0.0, 5.0, 10.0, 15.0)); + } + @Test + void vectorLinespace() { + assertEquals(Vector.linespace(0.0, 1.0, 3), Vector.of(0.0, 0.5, 1.0)); + assertEquals(Vector.linespace(0.0, 1.0, 5), Vector.of(0.0, 0.25, 0.5, 0.75, 1.0)); + } + @Test + void vectorNormAndSum() { + assertEquals(Vector.of(1.0, 2.0, 2.0).norm(), 3.0); + assertEquals(Vector.sum(List.of(Vector.of(1.0, 2.0, 1.0), Vector.of(0.0, 0.0, 1.0))).norm(), 3.0); + assertEquals( + Vector.sum(List.of(Vector.of(1.0, 2.0, 1.0), Vector.of(0.0, 0.0, 1.0))).norm(), + Vector.norms(List.of(Vector.of(1.0, 2.0, 1.0), Vector.of(0.0, 0.0, 1.0))) + ); + assertEquals(Vector.sum(List.of(Vector.of(1.0, 2.0, 1.0), Vector.of(0.0, 0.0, 1.0))), Vector.of(1.0, 2.0, 2.0)); + } + @Test + void vectorTranspose() { + Vector v1 = Vector.of(1.0, 2.0, 3.0); + Vector v2 = Vector.of(1.0, 0.0, -1.0); + assertEquals(v1.t().dot(v2), -2.0); + /* + * v1.dot(v2) should not compile !!! + * only a transposed vector with a vector + */ + Vector v3 = Vector.of(1.0, 2.0, 3.0); + Vector v4 = Vector.of(1.0, 2.0, 3.0); + assertEquals( v3.t().dot(v4), 14.0 ); + assertEquals( v3.t().sub(v4.t()), Vector.of(0.0, 0.0, 0.0).t() ); + } + + @Test + void vectorToString() { + Vector v = Vector.of(1.0, 2.0, 3.0); + assertEquals(v.toString(), "Vector[1.0, 2.0, 3.0]"); + assertEquals(v.t().toString(), "Transposed[1.0, 2.0, 3.0]"); + } + + @Test + void vectorSlice() { + Vector v = Vector.of(1.0, 2.0, 3.0, 4.0, 5.0); + assertEquals(v.sliceFrom(2), Vector.of(3.0, 4.0, 5.0)); + assertEquals(v.sliceTo(3), Vector.of(1.0, 2.0, 3.0)); + assertEquals(v.slice(2,4), Vector.of(3.0, 4.0)); + assertEquals(v.slice(4,4), Vector.empty()); + assertEquals(v.slice(4,2), Vector.empty()); + assertEquals(v.removed(2), Vector.of(1.0, 2.0, 4.0, 5.0)); + } + @Test + void vectorConcat() { + Vector v1 = Vector.of(1.0, 2.0, 3.0); + 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)); + } +}