diff --git a/display_vec.py b/display_vec.py new file mode 100644 index 0000000000000000000000000000000000000000..148de978118f6150f09818cd44b09e0978b8d55f --- /dev/null +++ b/display_vec.py @@ -0,0 +1,34 @@ +import sys +import struct +import os +from matplotlib import pyplot as plt + +def getVector(path): + components = [] + with open(path, "rb") as fr: + byte = fr.read() + fr.close() + name, ext = os.path.splitext(fr.name) + if ext != ".vec": + print("File extension must be \".vec\"") + else: + endianness = byte[0] + endian = '<' if endianness else '>' + size_of_a_component = byte[1] + number_of_component = struct.unpack(endian + 'I', byte[2:6])[0] + for i in range(number_of_component): + components += struct.unpack(endian + 'd', byte[6 + i * 8:6 + (i + 1) * 8]) + return components + + +if len(sys.argv) < 3: + print("Usage python display_vec.py [X.vec] [Y.vec]") +else: + X = getVector(sys.argv[1]) + Y = getVector(sys.argv[2]) + + plt.plot(X, Y) + plt.title("Vector") + plt.xlabel("X") + plt.ylabel("Y") + plt.show() \ No newline at end of file diff --git a/display_vec2.py b/display_vec2.py new file mode 100644 index 0000000000000000000000000000000000000000..95e93d17c5ec58e444d3a7951a53f94c02282a12 --- /dev/null +++ b/display_vec2.py @@ -0,0 +1,52 @@ +import sys +import struct +import os +from matplotlib import pyplot as plt + +def getVector(path): + _X = [] + _Y = [] + with open(path, "rb") as fr: + byte = fr.read() + fr.close() + name, ext = os.path.splitext(fr.name) + if ext != ".vec": + print("File extension must be \".vec\"") + else: + endianness = byte[0] + endian = '<' if endianness else '>' + size_of_a_component = byte[1] + number_of_component = struct.unpack(endian + 'I', byte[2:6])[0] + for i in range(number_of_component): + _X += struct.unpack(endian + 'd', byte[6 + i * 8:6 + (i + 1) * 8]) + _Y += struct.unpack(endian + 'd', byte[6 + i * 8:6 + (i + 1) * 8]) + return [_X, _Y] + +def getLine(path): + _a = 0 + _b = 0 + with open(path, "rb") as fr: + byte = fr.read() + fr.close() + name, ext = os.path.splitext(fr.name) + if ext != ".pt": + print("File extension must be \".pt\"") + else: + endianness = byte[0] + endian = '<' if endianness else '>' + _a = struct.unpack(endian + 'd', byte[1:9]) + _b = struct.unpack(endian + 'd', byte[9:17]) + return [_a, _b] + + +if len(sys.argv) < 3: + print("Usage python display_vec.py [*.vec] [*.pt]") +else: + X, Y = getVector(sys.argv[1]) + a, b = getLine(sys.argv[2]) + + plt.plot(X, Y) + plt.title("Vector") + plt.xlabel("X") + plt.ylabel("Y") + plt.show() \ No newline at end of file diff --git a/prog b/prog index 6cd8a0dff6eaaff30ec227b6c4d158e1b4aed547..610e6c562b02960df9ccaa61584fb115cf3fcb5b 100755 Binary files a/prog and b/prog differ diff --git a/pt1.pt b/pt1.pt new file mode 100644 index 0000000000000000000000000000000000000000..931a6be24b382af91af28042a0c3369c2d7c7ec3 --- /dev/null +++ b/pt1.pt @@ -0,0 +1 @@ +�6)��t�?���g�? \ No newline at end of file diff --git a/pt1u2.pt b/pt1u2.pt new file mode 100644 index 0000000000000000000000000000000000000000..48d37fa9ef594bac1ada887b52b2b4341d414059 --- /dev/null +++ b/pt1u2.pt @@ -0,0 +1 @@ +��S��?-4��3�? \ No newline at end of file diff --git a/pt1u3.pt b/pt1u3.pt new file mode 100644 index 0000000000000000000000000000000000000000..d4ce7ca6fe3c82a1f0159562d5e2a80df69b79f2 Binary files /dev/null and b/pt1u3.pt differ diff --git a/pt2.pt b/pt2.pt new file mode 100644 index 0000000000000000000000000000000000000000..6caefe954dd8cea9a6cb88585aa279d0a597af08 --- /dev/null +++ b/pt2.pt @@ -0,0 +1 @@ +&�&��S�?�&���? \ No newline at end of file diff --git a/pt2u3.pt b/pt2u3.pt new file mode 100644 index 0000000000000000000000000000000000000000..d5944f1fcb8c6c1519c861e93f33fecb19e76980 --- /dev/null +++ b/pt2u3.pt @@ -0,0 +1 @@ +%���F�?�E���? \ No newline at end of file diff --git a/src/main.c b/src/main.c index 3b4d26f68141400e673ffbeaa0107cc96e3e12db..4417a716c04cc118368768b63312db15bc0cde9d 100644 --- a/src/main.c +++ b/src/main.c @@ -49,18 +49,22 @@ int main() { //Tests point drtTest; + printf("Test n°1\n"); drtTest.x = 0.8; drtTest.y = 1.2; vector vecTest = nuagePoints(drtTest, 30, 0, 20); - printf("Test n°1\n"); + export_vector("./vec1.vec", &vecTest); p = descenteGradient(0.00000001,drtTest,vecTest); + export_point("./pt1.pt", &p); printf("Sol Numérique Test 1 : a: %f b: %f\n",p.x,p.y); printf("Test n°2\n"); drtTest.x = 1; drtTest.y = 1; vector vecTest2 = nuagePoints(drtTest, 10, 0, 10); + export_vector("./vec2.vec", &vecTest2); p = descenteGradient(0.00000001,drtTest,vecTest2); + export_point("./pt2.pt", &p); printf("Sol Numérique Test 2 : a: %f b: %f\n",p.x,p.y); printf("Test validation croisée\n"); diff --git a/src/main.o b/src/main.o index a7fe83aa8afca880452e39f5723f48376e468f3b..0aec6bf97b760dbe4c46856af381034c4c0e940e 100644 Binary files a/src/main.o and b/src/main.o differ diff --git a/src/regressionLin.c b/src/regressionLin.c index d00a7679a6631ec0d2295e1776865eb7c6e1958d..7287f23882af5b1ef8621a6bd2986f0faaa1ba25 100644 --- a/src/regressionLin.c +++ b/src/regressionLin.c @@ -96,8 +96,10 @@ double* validationCroisee(point drtTest, vector g1, vector g2, vector g3){ vector g1g2; vector_concat(&g1g2,g1,g2); + export_vector("./vec1u2.vec", &g1g2); // Calculer la descenteGradient sur g1g2 point p1u2 = descenteGradient(0.00000001,drtTest,g1g2); + export_point("./pt1u2.pt", &p1u2); printf("p1u2 : %f %f\n",p1u2.x,p1u2.y); // Test sur g3 => point 2.1 de l'Analytique avec a et b les valeurs retournée sur p1u2 erreurs[0] = 0; @@ -113,8 +115,10 @@ double* validationCroisee(point drtTest, vector g1, vector g2, vector g3){ vector g1g3; vector_concat(&g1g3,g1,g3); + export_vector("./vec1u3.vec", &g1g3); // Calculer la descenteGradient sur g1g3 point p1u3 = descenteGradient(0.00000001,drtTest,g1g3); + export_point("./pt1u3.pt", &p1u3); printf("p1u3 : %f %f\n",p1u3.x,p1u3.y); // test sur g2 erreurs[1] = 0; @@ -129,8 +133,10 @@ double* validationCroisee(point drtTest, vector g1, vector g2, vector g3){ vector g2g3; vector_concat(&g2g3,g2,g3); + export_vector("./vec2u3.vec", &g2g3); // Calculer la descenteGradient sur g2g3 point p2u3 = descenteGradient(0.00000001,drtTest,g2g3); + export_point("./pt2u3.pt", &p2u3); printf("p2u3 : %f %f\n",p2u3.x,p2u3.y); // Test sur g1 erreurs[2] = 0; diff --git a/src/regressionLin.o b/src/regressionLin.o index b343cd3de997d15cabac4dec1c312c41c2297267..2afec9febe2e5577e28ef8b8cc1ab2c09289182b 100644 Binary files a/src/regressionLin.o and b/src/regressionLin.o differ diff --git a/src/vector.c b/src/vector.c index 4bc6e0f98a048fae24876667d51f27ed3a1f71a7..d7920f21f1943dcb0167bce4d3e69424616fe1a5 100644 --- a/src/vector.c +++ b/src/vector.c @@ -178,3 +178,45 @@ error_code vector_concat(vector* v1,vector v2, vector v3){ error = ok; return error; } + +uint8_t get_endianness() +{ + uint32_t endianness = 0x01020304; + // Return the endianness by accessing the first byte in memory + // which should be 1 if big-endian and 4 if little-endian + return *((uint8_t *)(&endianness)) == 4; +} + +void export_vector(const char *filename, vector *vec) +{ + FILE *output = fopen(filename, "w"); + + vector_metadata_t metadata; + metadata.endianness = get_endianness(); + metadata.size_of_a_component = sizeof(type); + metadata.number_of_component = vec->length; + + fwrite(&metadata, sizeof(vector_metadata_t), 1, output); + fwrite(vec->content, + metadata.size_of_a_component, + metadata.number_of_component, + output); + + fclose(output); +} + +void export_point(const char *filename, point *pt) +{ + FILE *output = fopen(filename, "w"); + + point_metadata_t metadata; + metadata.endianness = get_endianness(); + + fwrite(&metadata, sizeof(point_metadata_t), 1, output); + fwrite(pt, + sizeof(point), + 1, + output); + + fclose(output); +} \ No newline at end of file diff --git a/src/vector.h b/src/vector.h index 5866d4c036d4f1d19be5f0f1eac72518f42060b8..9e4f185485d939347a6ec85cb5885f438d2fa765 100644 --- a/src/vector.h +++ b/src/vector.h @@ -7,6 +7,7 @@ Hesge 2019 #define VECTOR_H #include <stdio.h> +#include <stdint.h> #include <stdlib.h> #include <stdbool.h> #include <math.h> @@ -27,6 +28,17 @@ typedef struct _vector { int length; // actual length } vector; +typedef struct point_metadata{ + uint8_t endianness; // 1 = little, 0 = big +} __attribute__((packed)) point_metadata_t; + +typedef struct vector_metadata +{ + uint8_t endianness; // 1 = little, 0 = big + uint8_t size_of_a_component; // in bytes + uint32_t number_of_component; +} __attribute__((packed)) vector_metadata_t; + typedef enum error_code { ok, out_of_bounds, memory_error, uninitialized } error_code; @@ -62,4 +74,8 @@ error_code vector_filter(vector *v, bool (*f)(type), vector *rhs); error_code vector_concat(vector* v1,vector v2, vector v3); +void export_vector(const char *filename, vector *vec); + +void export_point(const char *filename, point *pt); + #endif diff --git a/src/vector.o b/src/vector.o index 9dcdb2a81c35d2106b00e1a3a2b8f88edece5d8b..5fb17a6aad48d6f4b5f530fbbc3457e3d1fe7417 100644 Binary files a/src/vector.o and b/src/vector.o differ diff --git a/vec1.vec b/vec1.vec new file mode 100644 index 0000000000000000000000000000000000000000..25f216e7d5723716e0af62f2cd6866d1770d22cd Binary files /dev/null and b/vec1.vec differ diff --git a/vec1u2.vec b/vec1u2.vec new file mode 100644 index 0000000000000000000000000000000000000000..12817260ecdf4384751fc560097aecf1d750c6ba Binary files /dev/null and b/vec1u2.vec differ diff --git a/vec1u3.vec b/vec1u3.vec new file mode 100644 index 0000000000000000000000000000000000000000..e63c31bd9ea9f7c43ff6e0341c04ff59fab74416 Binary files /dev/null and b/vec1u3.vec differ diff --git a/vec2.vec b/vec2.vec new file mode 100644 index 0000000000000000000000000000000000000000..57e33e7cdcc9b5b0dddac7837f28d3b21fe16c7b Binary files /dev/null and b/vec2.vec differ diff --git a/vec2u3.vec b/vec2u3.vec new file mode 100644 index 0000000000000000000000000000000000000000..706dc39903dd61d750c3d7dd1489afba1e8e36df Binary files /dev/null and b/vec2u3.vec differ