From 7cdce459933f5e3ad37b4ca9ef27ec6f1da06acf Mon Sep 17 00:00:00 2001
From: Nicolas Fley <nicolas.fley@student.ecp.fr>
Date: Thu, 16 Mar 2017 00:21:26 +0100
Subject: [PATCH] convergence of iterative gradient conjugate

---
 grad_conj/algebre.c                     | 107 ++++++++++++++++++++++--
 grad_conj/algebre.h                     |  13 ++-
 grad_conj/bin/Debug/grad_conj.exe       | Bin 71699 -> 77274 bytes
 grad_conj/customError.h                 |   4 +
 grad_conj/grad_conj.depend              |  17 ++--
 grad_conj/iterative_methods.c           |  52 ++++++++++++
 grad_conj/iterative_methods.h           |   2 +-
 grad_conj/main.c                        |  24 ++++++
 grad_conj/mathObject.c                  |  20 ++++-
 grad_conj/mathObject.h                  |   3 +
 grad_conj/obj/Debug/algebre.o           | Bin 3489 -> 6807 bytes
 grad_conj/obj/Debug/iterative_methods.o | Bin 1497 -> 3755 bytes
 grad_conj/obj/Debug/main.o              | Bin 2576 -> 3607 bytes
 grad_conj/obj/Debug/mathObject.o        | Bin 6808 -> 7532 bytes
 14 files changed, 224 insertions(+), 18 deletions(-)

diff --git a/grad_conj/algebre.c b/grad_conj/algebre.c
index 6a1f08d..37371db 100644
--- a/grad_conj/algebre.c
+++ b/grad_conj/algebre.c
@@ -5,22 +5,100 @@
 #include "customError.h"
 #include "algebre.h"
 
-Vector * prod_mat_vec(Matrix * matrix, Vector * vector){
+/* MATRIX x VECTOR */
+
+void prod_mat_vec(Vector * vector_res, Matrix * matrix, Vector * vector){
+    if(vector->t!=0)
+        exit(TRANSPOSED_VECTOR_USED);
     if(matrix->width!=vector->size)
         exit(UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION);
-    Vector * vector_res = allocateVector(matrix->height);
+    if(vector_res->size!=matrix->height)
+        exit(CONTAINER_RES_DO_NOT_FIT);
     for(int i=0; i!=matrix->height; i++){
         vector_res->c[i]=0;
         for(int j=0; j!=matrix->width; j++){
             vector_res->c[i]+=matrix->c[i][j]*vector->c[j];
         }
     }
-    return vector_res;
+}
+
+/* VECTOR_t x MATRIX */
+
+void prod_vec_mat(Vector * vector_res, Vector * vector, Matrix * matrix){
+    if(vector->t!=1)
+        exit(NON_TRANSPOSED_VECTOR_USED);
+    if(matrix->height!=vector->size)
+        exit(UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION);
+    if(vector_res->size!=matrix->width)
+        exit(CONTAINER_RES_DO_NOT_FIT);
+    vector_res->t=1;
+    for(int i=0; i!=matrix->width; i++){
+        vector_res->c[i]=0;
+        for(int j=0; j!=matrix->height; j++){
+            vector_res->c[i]+=matrix->c[j][i]*vector->c[j];
+        }
+    }
+}
+
+/* VECTOR + alpha x VECTOR */
+void sum_vec_alpha_vec(Vector * vector_res, Vector * vector1, float alpha, Vector * vector2){
+    if(vector_res->size!=vector1->size || vector1->size != vector2->size)
+        exit(UNCOMPATIBLE_ALGEBRIC_ADDITION);
+    for(int i=0;i!=vector1->size;i++)
+        vector_res->c[i]=vector1->c[i]+alpha*vector2->c[i];
+}
+
+/* VECTOR_t x MATRIX x VECTOR */
+
+float prod_vec_t_mat_vec(Vector * vector, Matrix * matrix){
+    vector->t=1;
+    Vector * subVec = allocateVector(matrix->width);
+    prod_vec_mat(subVec,vector,matrix);
+    vector->t=0;
+    float res = prod_vec_t_vec(subVec,vector);
+    freeVector(subVec);
+    return res;
+}
+
+/* NORM */
+
+float norm_vec_2(Vector * vector){
+    float res=0;
+    for(int i=0;i!=vector->size;i++)
+        res+=vector->c[i]*vector->c[i];
+    return res;
+}
+
+/* VECTOR_t x VECTOR */
+
+float prod_vec_t_vec(Vector * vector_t, Vector * vector){
+    if(vector_t->t!=1)
+        exit(NON_TRANSPOSED_VECTOR_USED);
+    if(vector->t!=0)
+        exit(TRANSPOSED_VECTOR_USED);
+    if(vector->size!=vector_t->size)
+        exit(UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION);
+    float res=0;
+    for(int i=0;i!=vector->size;i++)
+        res+=vector->c[i]*vector_t->c[i];
+    return res;
+}
+
+/* VECTOR x Scal without creating new object */
+
+void prod_vec_scal(Vector * vector_res, Vector * vector, float scal){
+    if(vector_res->size!=vector->size)
+        exit(CONTAINER_RES_DO_NOT_FIT);
+    for(int i=0; i!=vector->size; i++){
+        vector_res->c[i]=vector->c[i]*scal;
+    }
 }
 
 void testAlgebric(){
     Vector * vector = allocateVector(8);
     Vector * vector2 = allocateVector(8);
+    Vector * vector_res_5 = allocateVector(5);
+    Vector * vector_res_8 = allocateVector(8);
     Matrix * matrix = allocateMatrix(5,8);
     Matrix * matrix2 = allocateMatrix(8,8);
     initProbVector(vector,10);
@@ -28,14 +106,31 @@ void testAlgebric(){
     initProbVector(vector2,10);
     initProbMatrix(matrix2,10);
 
-    Vector * vector_res_prod_mat_vec = prod_mat_vec(matrix,vector);
+    prod_mat_vec(vector_res_5,matrix,vector);
+    printf("prod_mat_vec : \n");
+    printVector(vector_res_5);
+
+    vector->t=1;
+    prod_vec_mat(vector_res_8,vector,matrix2);
+    printf("prod_vec_mat : \n");
+    printVector(vector_res_8);
+
+    printf("prod_vec_t_vec : %f\n",prod_vec_t_vec(vector,vector2));
+    printf("prod_vec_t_mat_vec : %f\n",prod_vec_t_mat_vec(vector,matrix2));
+    printf("norm_vec_2 : %f\n",norm_vec_2(vector));
 
-    printVector(vector_res_prod_mat_vec);
+    printf("sum_vec_alpha_vec : \n");
+    sum_vec_alpha_vec(vector,vector,-1,vector);
+    printVector(vector);
 
-    freeVector(vector_res_prod_mat_vec);
+    printf("prod_vec_scal_u : \n");
+    prod_vec_scal(vector_res_8,vector_res_8,10.0);
+    printVector(vector_res_8);
 
     freeVector(vector);
     freeVector(vector2);
+    freeVector(vector_res_5);
+    freeVector(vector_res_8);
     freeMatrix(matrix);
     freeMatrix(matrix2);
 }
diff --git a/grad_conj/algebre.h b/grad_conj/algebre.h
index 2482e95..b1a61f8 100644
--- a/grad_conj/algebre.h
+++ b/grad_conj/algebre.h
@@ -1,6 +1,17 @@
 #ifndef ALGEBRE_H_INCLUDED
 #define ALGEBRE_H_INCLUDED
 
-Vector * prod_mat_vec(Matrix * matrix, Vector * vector);
+void prod_mat_vec(Vector * vector_res, Matrix * matrix, Vector * vector);
+void prod_vec_mat(Vector * vector_res, Vector * vector, Matrix * matrix);
+
+void sum_vec_alpha_vec(Vector * vector_res, Vector * vector1, float alpha, Vector * vector2);
+
+float prod_vec_t_mat_vec(Vector * vector, Matrix * matrix);
+float prod_vec_t_vec(Vector * vector_t, Vector * vector);
+float norm_vec_2(Vector * vector);
+
+void prod_vec_scal(Vector * vector_res, Vector * vector, float scal);
+
+void testAlgebric();
 
 #endif // ALGEBRE_H_INCLUDED
diff --git a/grad_conj/bin/Debug/grad_conj.exe b/grad_conj/bin/Debug/grad_conj.exe
index 7be3e4cba3ea6c3c1c4ea50e36694bc24fde84b3..9bf973f8c18faa718cf3d1a71920c3af1a2e7010 100644
GIT binary patch
delta 17875
zcmbQdf#ue1mI)nFY$s1fFuY)3ILE}m@PL7xk(-f8lA(`*f#J}^Mf#i#j0_Ac3=AJ~
zC*E4d71GPVz#zcDz|c3ji&0y15(5fwU@$nKSCo=ilE}dDg^PiKVFLpL0}lfO!<5PQ
z7^V1RBpDbO4lpn<NHH)lESSv3<j=Tkau}03<DtoQOzN6PP|RWg8K!S&0v2olkqV3q
z3``6R496y)W0Ep+7GhvvFkob05Mf|oI02GJU<U>PCw&t`u)tep1_p)zh#wg4OqOGo
zGGk(8U|>jKWME)p0C^a!3`T&pnwf*SHXyP9YU{JfdCbR{9J(i)u>>={?wZ`qVk*6*
zi-Do}2V?2k<1Q*Jj0_A6$5~W37#J8{%<h_eo5g@BvuiRhs~fvw7X!l!7xBqatTKlG
zIvE(6PyBy*;otxNNV>Q|x*kF0w*345KW##A^BakU2Ad}@XVnr}46^7A%ZtaN3=A*!
zi7_y|h!mRqlvUA_t&4$Sp~3?PhE5k1mTqT*P8O9HpE^;*0zhK-IvE&VFm^F8bc=E<
zaA4>Zco8Gbz|j2U!;2>%)82PZ_Ggn4Z02HM=sf&lPbULIr;N&rlCH^BY_?3jos)O6
zm3y>+T=#~h^#Fg%Mu=A#HaLKkTSFukE4*@G0C`CmBrK!y!W%5k(RmCcs0kG`>zrJ{
zZotITIe8Vk6w`~2$;a3Y*emoM81@zDPyWkpkukl4fuZ>g%gMtNCWLlAZGNNC?JCgi
zz|nf3gy%Sm${S_|h8I)X85p`<dAbEaQVf=dz%nmEGF4z14v-8_w*w1Q3X}w1#J4jr
z9C!T!iqhBB-L4#yYdNGWIl3KKx<kJle8j|fsM{6H^Zj!0Ars??n_wFpIJ%+yZia5(
z4{#ZQ$rm^z>v_5vtX)5pE@^iC!U%GY1B<om7yj0=|Ns9_IC&W6dY*0vj^-bXU`M_N
zIdV-K$oT@@0W2U*DDIyKmIAw9pc^Iwc78cT=C}g~IGuq!!p^|(x(4bKeX!ec`UDh$
zF!zIe@@4Wd4&{1*Zjg&VlrDyNKmg<&O!tFb!vk_nDIdte0^P16ARgF5??4_}*@_5S
zOK32{odSvnSRjG|RRk2|;6SYhh4KwwfqMsUN<mxz4$v>9dtsqx(e26s^)bk122e`Y
z<z`^$bp6up%G2qh!qM%@0Z#d@UqEsZ|Nj4nXaPkts$3QW1H;YOC*7`3I$b|>gVfin
zypZByV7Te}0UB8XH{aci{d3&)2T1p8J(y2^fRe`rklP`F4CCKBdDHdJy@NMn|1`V)
zU<9dVuy*}Xdg7+*AE<#EAVIX)uWJFtJ}6PtBd6&MsIUM?3oPcrY1*%afdS;OFUMU!
zz#Ik+)X)!T4ukPQ4*LRf*q3J458#vuPNyesx_&`+*kmsb-g<E2dfbeNKy{D<kaGpt
zE^vfF;|nde&ckC1R{FJYf};q=Ed_Hw9A{AhmAfy}z}z<w*?NW-;b8s?P$2;-J7LO>
zu!0PEf+P%*eX$lS`~V~js$jqosq!M5lL1`xK!l!v(!yIdWT6irAy*Vt4?sfo$Js#9
z@dc8Wo<P#l8<33R@Bjagv#6wOaA0_m+XPYs7G~uFF~7i5<pYRLkO3^+t}j43&p~vS
zfOHyzb%KRYbAoh!fLH-eu9yG*um68HMup`#i%JVfwHR16$Ve8b$3Fe}4^uG{q~c2>
z$Pln@*S~P7O(3b8jo|v{Fo?Yus?0@&=jMx>4{pYQathRqV9m0BKsn`0XFZF`3lmVV
zu&CSsX>4s|V7STpW`hF*M9&L|bHN_i_ZOrG%wz=n1#Hq44v>q$;d>Iy1P9YTFcYkH
zGnfgElS`~1wcvn1&dR_r;pE|ZNFkpAN^}gJuHfv+qVmF>9TfQwK$(?A<%K1fcL&PT
z2J>z}d9q;M6==zRleJ)@1H;YOH=qpjqT5vf5<8%xf~DK_3Mh7beu8{)r4te~_0X_^
zmLg!MvHS+9xB>AwSY!q}+})Rc|Nnn8_DHwukxthSFSQs!5>VrBfQ)wm$-92I_wi=z
zg>F}nAv`x-FF*nl<Qf)`qgYg4%>M<pq#o0OYk&Oz57P1g<Y161!I1||6n8*&q=5B;
znPBUn&N*|_^~_CIk((!Py}bWmUYY$(*E2UtKirHx(d~+?`wTe6LtR#X0^&5N0<ag@
ze*OOsDvv?N#eTTy`r$_Ei`%YW?)|*!`T|s{ytwK5=BDchs6FLOuQhMFz5ol{jZqP}
z3wACztsQ4k`2b2(F7@D278EV6ACO$g+gMxw#omdZfxmCpzyJRmYr&j4*_*B+$6Zu-
z9Gv(Wpt(a}qXWZ>e{~EDuZ2Mw!v&mW0ziT<>p(F8jwOGv#~{H1W`ccV31)($UXKl&
z=D-b$;N~YEn%@M}zcAzhmlGbKqV+h73W$1PTgL#dYeMT77+yRERdG3N3=A(6AQ@Xg
zoq^%SDi#J%o67}M5P<}av#5Zm7h;THaR(T`38Kyhqz+X4b-Spzfa35F3%FFTk5OUi
zc2Thb39+z(T>_#Qx?NNpKw@=_U@;$%vtDO`M7te0x<gcaz(s#I1C-e-BY;zm5ma@#
zs5o?U?CR|3=;%E0{Z%gu*TEmmorgM4)F1pIuX(8RLZ^$0%xxDHnR^FsN;kWx_%MQv
zW3YBn@hR;(&Z1HR3hRPeP~k8Gl*3|Fc)-pERly*qf?A(YpBeoD7o5!?9d@-03_Cz>
z?~aAkiNVcpRF1Q#fcgY4JZl*kCWmv$DX7;nFmxX3cKy&9z|rmc0o>Xv1-15GfP&t#
zcJfp%6~@PtcX1gr-k<!AOH*ZQ4Whm(2PFvC53dtn*w=syjoYpd?y_oZo@~v%l&_~6
zMd%%OgjQKK0|O{^gGwAw^XE(bO)!%K6x@;3pwt9r`c+RZ;IUI&0P@DgDv%yfRmuTs
zBYmhpahyd3RM)&%Up4tWkF4+tkgDb?22cm!5QyDgHTge}OvnWgI|U@}qQU~w0CFsg
z%8N2k>z_sCDM;G13S=j^ELHyx4!Rd0VLgQKK8R|DO%4n%*sCVz^SavmfY`e$!RZ;&
z(1eBRxk`|izjV8P=?>-S6zFyZ)m7jqaOF7ofC=Qw)s>T9^2#vnt(?rxr_N^r*6;up
zY&Lw_dIHB?|A4f-76%6nOLyoWaC*Dx%5zhq+4T>svGb?&{)Cf<Cp&P6$AjAuf|ZDP
zQ318sklPX9#uL090c%8n1N2MjC0HXu0%9Y`nVTy>0RxVV6_e}ubn0h=JZ)D2iVIMK
z8=|%T5?BYUgRmH+hN}WKU^apTzm_AS=O=^>Zc(WI`~Sbw^~-S<6>x0b14*IARx~91
z<H6Cjz8vH#aQOy}%p(x#(;!PGLS<Q0UT7jkW*0*E14Q)=km}@eushQxfZ=9;ekW$8
z->)`L7D{HcaG2}B(ER&<iDK*R5}yAebHV)AjHMulZqRUGc=7e+|NqTLB%%)+-hR#0
zdAQe^v0J3oVeV!<kz{5jlg*nai;FPU`)qb#cyZw0|NjeP9yl<x9w=cy+`A1FwL8A-
za$q>l3K9i%D0D&G<{#{J55mKOo8Krj|KR5Dd%?iK&}|BmY5m6E+7IH%{@CTf(0ZF6
z)J|aN=KZtFfnhhpZU=_ell(3F7#J9KgH(4rgE~C?t<IokLi1ss#@}CdP1cummD;iy
z+(VQBIpD?XzyJS(m4l`GBy}V~dW$YKA5n;oi$C1?t#^+)Na5};yCz?joX^y-d2@->
z1~#S#n>VW|R<Q~`+U&qk!rS@bMe(=)|Btgh+B|uq+G(aon<v+)H#2?NJegTTlj+;$
z$$A?4Oy4$dj@MYn%=BmTWPY7mrazlE_vw6Lapu_Kz|dR90JX>PK&N)|5tit<_}Ig}
zC29=&ShhGY>;#P-bYB0wthAt8M+K~42S^C4Y9GUv%|{L0g+wlFfpoxM#5*y70@+yi
z!j{bnE{SY%Pq#QQ7#?`x^7=od%g?_(T;!$l|Ns9xf9`s@W%7KlIZVu3C);}WGf8co
ze9k*u5^U5D{(T2P&5sw3R$%kQbuVn0Z0GYDq)6MhRsy8x#c>Oe9RD`oX8x9k><kPb
zI}i9qGJ+II`!4`H>cti_sG>O~Dj-A7`(I{K*}8d2z;;$9sjZu1!$g^w{%o0C67h}c
z-ImQck-_Xt3${%@nDB&Y?zYLx6D^o#Zkzlt(THinw#lMNN!DAoIWXMe-2oz54{UQ_
zxb31M(CMNgV0c2?MMdBa?}=>=47#Q)AUp3JtOHAdl-%LHux;|DBtIsF?VFjBix`>S
zY@1w`;wtrJn*+nm8kIQy?Jg>D$6Zu%K=FOY<f_E>$yZaHnI3GLES0Jz_GFs_!)psf
zMBO}iL-)b9$ziGYnQm;GY@Sx7qOje8q2&O7i!ciVsOD5@J;2}34t529YZo&E!wudK
z+a_O4y92U!bGjnahi#j$r6)2oJ=wO|GW!+_zr=P2hAlj4oh~XdH(8%-o2*pe!}Mj_
z=7NGbOadU=Zyvb8`(m2|!wuFq+cwJ-UuI`FnBc(hLZW%|w<=jyra#*@i#8Z=NIx(A
z|9=7m{Qv*|zrkDwkbf9J?8%88Tev`jR}2me3;}aD^L2$W)fW`yr^M$bmc*B(CM#Ge
zFo5}GsmUNQ6h2IaY8n?pQ3*&HR4Yg#FTW@k#Emynuu=dC6qiEyi8%!si69viGmDe!
z6LaEAL1GLH3<{3fAYCas3N<xFH8l#h3aW+%dZuYQ3b`P58W%%weokpgW`3SRMq;r-
zUVe!}QEFmxMrw*eNk*zdVsUnAib6qAYI0^VNDasV3YmEdswoP^C8-5^3=9bUY5Apj
zDGKG8B~BSI`C>g#-KbLHnVguDT$+;zw#Q0=A-yOuMIkvqFH4~)wYW5=1nk(o=53~+
za8)(cGn$;!^GnDmO@WIcvsj^|C^4_NAip>@WpY-pG^cZZL8XF~g1`6Vmfjeq1)7r|
z^<Jyr<mSL2<PO0Pkk~LWTGAif9NfW{FNRwD0ZQYtv;l{FgWKe~{;>LQ84e5!vmp2`
zl<kuV;lsp1G*6}jLmX6`G2MY-E0jG4N`uspf$PDR-+~(A4s}3zrUS#QGzW&#G>Ah&
zpftz=b0jv1kBmQOL)0USeM-j^L&(=dB#%QC{m*n@C`fl;a7}k$kV<!8*p%VG0J0n;
z2BJY4VRT`J0|UtL{YVZn&w{82iG$RFFpLe-=b4w5nU`5o$>5jh$6&y~P$pRBz_7U#
zf}fN*Fl;EBoHWsI^MQ#DERzd54s4nhz*zqrlu#Y{I9i#Ucv+bqALU_TVF1;BppoU>
z!T<k%LXm$5mycm!VCW6`|GySRz7j59!@$7sD&+tFJQVpXxcnRj1_q1J|MmX^Q55*X
z73^VPV8{&p|9=LG{1mwS9R>!5hoS%f$D+tb!sS8DL%Fd3|4l(<8q9;thD;y@paFT1
zHpZ&ST+{d_Z<xs;ArtZce;$g`EU?l^(<D?B7#P4|5)$?Qe+j590yECNnVC70@#tY5
z7M4lVB)DMedZH)ao35lJ7xVxBW{@>7<xJ~AmNS5qB``2BY>b(#G((ArId-z!3^^v#
z*vV-#<d~XcC%4UzQ*wy=|33mnZwOp3XdJ&HZt}4iN=_@{{{J^dR+bM|1$M0mBLl<k
zxc~p7kmZ@ezzRSyoWaPz@HKAos~J+}9gGYN-{b!O4?|HJ1XsF(k%2)s{{R2wDDsOZ
z*H4$_1tk=aaZBR=|8JP=IA3^j#Y_jLGf9(o%`{^zN&f$zdGf(&@{<D=axx}QmYXHU
zRFFK`Y?c!1oaF!iWhO6NtIjkbd2-t<Ii>^2lb6l1Viie&YT>eg2K$fX$$Yb|m}F8W
zd(GBk%1N1AHQSEqOv>b4vz?eUQYZhLEyom*I$3T`8q<T+$!&A|m=>f@zBWgXjUnUz
z|D%kP|1B1utT@-5DJOGs)?6#L1)2Z<YcYXE56-n_s>q)FZ>}5DgzU*~^R!sEWdHxq
zHMw!A@Z^qp8cZ#PlQ+%NV|6L||37~6!j)o^f6sGd@+g{YH$RN&LFwda^Zl3%$|gUX
z@5Fkh?En9rlMUBMOm<zM&g4-sId6dyQ%S|-Nei@?W>iexw?L2SM8)KH3#6FtR7~bt
z=*PrUIXP;f9*F8%=*MJJIr-MYI;K69lcN?XF|DYYT(?Mz^-k6Q|Ds?sk1kSX+EYFG
z)gn8ln3~C2i|v^9)J)D=tjBbwZt|?fdQ5*BC!boZ$Ewr%|NrsHigP3;i!M=S+S5AO
zYKa+>N!#S2C1y-#+9t1B;>N_%G5OOHBc_Co$!bgGm<l>3yDc?iI?*w?ZmAyAkG{$4
zmbx(&%$@vgX%_30dH??}pUgN<cyh%u1y-K<|NqxcHe4e$dHXV7CWQr)*_OL8Wh|KN
zw_J(!$%6m?%O)>eDLT1pxg4v`!vFtMAg*3s&&IIm|Nmv8ll2x$PEKCY$SSb?|9@Gq
zG0ZD1nQm;KY`4-5MAfa7WBRdu^1PL1k`6om{|99dP)Y+OtqukT2A>`O|Gx%nV_#*-
z^knB`r&V4|8M`L;t<qxc+4cYb6|g%mtWsez*gg5%Dl68M-T(hT1BZm~YGqlGJ^%l!
zg3NQ~Q%K}vVE`GM!pOj&v*-W+2(YosS1Ypm?EU{g56pYM+Lb9{-(<Ztc1#}oC+DqE
zVlCPK|NrjEhHIoJZ&+i&bmze2S8KvpTMqvJ|8uhLVwuT_Yt5N-4o#l5R*y;N$mCON
z%_bLg9NDyvg@b*8rUOHOro(2zZJ!w@8nA6<*&)D`WDlCu1Gxv9zL^*%u!1Kr85kHE
zq#PK)#Sn`884j5I2N?$ja1n$eufqeAPmyzAxWc+Qv7?KTqX%m0<b?;KMG|w;Q<I8P
z^^zGJL>w3(PMEylaQx(JdnVWOFtbbo%|8}rR;4m9v&{z?&XUZ)%nlZ1DPdsd0Euxh
zu(HemO*XQyq~+u%mN2k|r6!l;7cnq%fx?p=q>YD}=P}5r^30Ty3<hRCkUj>MjMU8Z
zj1mTBeh`-hWV8TC70AFzj12V*Y`%#lMVS>0%tGrK85lUg%}i*slYx;7<YG`g#W*L2
ziGhKWkAZ=Kkqg9Rn#jNjvXqglh>3xLX(9_J$PF+#4z7tJ4h)kS7#O%S85jjYRx?e^
z;aVf&z>o?O%wk{^1`F0t%wS+(U}agz2qIs?T>x$9GB8T3i#jlXYC^_2Z{aSGhPeQ2
zCzQtmagQ{_Jse!kq6il#gDsnw!!=LTfgug*0@e8p4D}35U>9&;w1*iObtJ_c7(kUQ
z<D5)pnCEq%R`ZmB!{3mB5h}vM18zz)FzSHgX(9(yg%Ml@50|@`0|RKZ4iqT*U?<g2
z%wb^Q1qV9F%kXA91EVR(m}z1T44`V9an4zg3&7qrg}MOZT~mm6S-6W!lfqJy85qqW
z(mC8ksl^P8Rv=SAUgSgc02mk@L82_;4h(_ypa`9#z{0=)i9bh(ZU%^MCy+X(i6vb8
z;tmXspkT{nU~~pMd}0BryURd!dx6x4iaRiXS`LhJx>y((prH_7!ocVSH5+0RgjYY2
zg&XY9K#*2Y8d)xmuqp^*RR%0wf`X_xIWdQUG4idr0|Ti2!8qqN$noHW8Hr*6l*hsY
z)d8`9gNs+ffx!yumza8p4LJ-9{3WTyC63^%nwiYNnCK<pzyNB%FwUu9Wnd5h2YnL6
zf*fv0<Qp+CCPPFrpd#@_sm1Z842&rd;S^+H3kJqih;RaEjRXT@S`ib283WVA817tf
z7BpgDOozl~1cP7%BLhP-D+7ZNgK&Iiei8%Idyq32ESN#Xjo#!12Vy3d?ib;N6<U3h
z=O0d}j{#->_=1um2Bs?@HUmq1a$X4o)76y>3=AwR@kxorsSHflKvEnm@o71U=?qNQ
zL2^7S@oAYksSHdvKs*7K_~eYlqNLI^2Bw=J0TGt?q|&tF%qj+^TOhs!OMFRgL0Vp7
zZYl%QZIE#?46H0?L5YdY&C|z~f$7dw1_lOZNH8(*Ftf}DxeQvyflOck6-4Y{QE(Xt
z5(5=UOR<-6d5jDU%#cuG;9=(Z3^EN?%z?B*in)4lIS1lH$~llSkf9)J5XIacMg|6U
zQ0Flo)OloJ<bs7E;~WWQ1_q8K21YIrgJ~iIha&?cmmD*=eB-Eqi*s<K78GaZ<mWLk
za)BK@k%trHw|Y=Nnt_oU<N~INF`PvVjJyz&A~=iU^HM8H7#R5=0wJ6Q42=8`b^xbi
z1p}i1gyX}R&A=!GF(HQ&TBHa=Z1La(XW}9TMiGcW22=oQcDg7;*o8AGwIq>&Q4GR$
z;LOd;i!Wke6o>FrICJwWQ}gmtL1GdRu>=NImUZAV_$MO+16L9w1A{&@0|Pe$4>a|u
zfCjc=z^U)r<OK(kxnR{{Ce!2vhqWhL96Zb@Ir-1Q^m@=b9_D7oL{Lm}u%zUdCV>(b
z4@*vdUb+I53r`s=Eb>eY3@o6~V_;$1393<8k{MXo!J;fB3@jWVF;FC`f~pzx+K+|n
z9dgQG;VEXSXJBA~Bn=imkX}gA$S7f8;RkU+DT76zn2CV_WGKiQSju1#vSDIi;L1(R
z%wu5W1*wI3k#UY0C@d0-(vzVwOcNQn6N}Qz7#Mj$QcM$Bc#0D9vKbipc7iei57<A9
zVEcKCOA<>;iy0XCPl7_EM1vPp&@eCxf^1+eIl;i2#K0(N!_2_ITylhg*O7ry$_dOl
zz`$F<z$gupVJflVn<MMM09xt9o5{ea0MUB}Ty^?`qfL(qRDo79F(@+dhcYrS1T%w{
zVhKWH&jS>D!fc?j;~>-Ig$H6McOT~Fg0xr|80?rQFF5?JUK_L?i<xCAD06{5z|6J?
z8X?T=U{P>Z1&M*eZZ^m}=n=xql@7{YpqVlrW}astqacyN%m>m3j|^sh5Em2~%mN@)
z91N@`V4GpF!7Q{1)EG$2$;nSnEJ=knQW$wtm>3v9?gouhGtNnwY<^TV31k~1A4rC2
zVg~niIR^&N!Z4mp21XH(Eli*~mX+lVBLf33sFxm4l%E7KFSs%{wWJ7C+{;MGJ1~HH
zjEr+WGchpmfsK@b7|FnAG<n}qS$VLBC#G;)%R4ZD#=AilC_pXXc9Ea_>!`ZZS$PMB
zGH{&=$}13KwBW{oB(xwpSh%mqJ1~G6KOkeYA%Z#FcjYH1A5)fhR&Zbl0;!%eml@_7
zL#Q#_o(hwf9#b}%ssL*ne1)sAhN+pY0BLD~47Y(9zC>a2pJU2N%!&>Scfp2(>U}P-
zS3Myba~L>aAr5U{GR7sbFfcq&bYKAWi5cgBc;Ld0fiVtZE&~@R;V{O7WI#d9%Ccl~
z<8hJtbPFX1h7hnlyIB|*_`s^tA*vYoj6f3U5EEFq?UfuD+(5}MlYub<BACO#Adr@s
zlLK={PLGlU1E|BzIERZBW?T-`IL<OqqaX(oLoD2rlpGkMwV>wZLd+{+VBk&8FQ|l>
zSFm5nfdSM(XPlGH%D})0YFp$NWu|B5fs87E8=RUP57NfK2o+-CzOOXd;DpHJ>&JQP
z%O#Z^7?eO>nKKFQsB)-YP`fTOuLNdcowc$91E`zNIOhsnZ5>oCx1+KH1889(D8lL?
zE`~KqU<PzdRCZthjRP>w`OnG#3U);X2F7lP2{{ac(V&u>4Y|qipLMfg*8#>!r*bB9
zpXHrgeM&%*n^BNah>d}P+k}Cc!;0IQ+f$fHf`NgDb@InEQj_nV=4a%aeDSo1?Q|ze
zMqvg9emzEeNr*y_J_m_u5ODz$24+5lc0oo)PhpUHAw>oT2I0vzXObrWKO?Ej!HQxF
zC#t1fFkRdrT|AR*&SXzse>zhf=0<*)yZ}gEaI?)B7Df$(gVZG<PJ%iW-3@+cRoJ^g
zWfVi%WWMwMlf%v#axrr<rqADfefQJdlY7r8b2_B2-Tid;_1*I)_nwogU&X-0!pP>u
zcE>&)%(}*QeK!LW3-d$}!DK237W86U;E+E5Ge`4$j`?eCjnX4Qk`NVIa22*j>1%g`
z?7=0AY_Kv^n?2h?yY#0|pFZVC=Sb(!2SWpn=H2V&g9s)iVJ0PEjs?3pKCj!&v3A{B
zFkoV4U}U_`09yLm0P>^|LuN^8QDRAES!#T4YDq?ZO7Y~lbE=^YQVt9tzqee!e*H$}
z#3+ttj?WxQ9JY}h6FHu8G=ogGeL9gtk>jZk$ZBCGWnt!mG_Z%CurUjtn8>k*!vJI>
z*uslo3;QPXoo@)uO)SaqPs&P7F44<i01ePFurh(_O=cd(c`?l#c9Bt0pE*juaM*Gv
za@c~xYCecyN`-hjf{mGL*KQ^?5e^Y1Rt84K1K{|o1bJohpYsMxDRPtbE*$Zk&k;F)
zx2=9DNGl|)^&$Gb*cO(8A`22n9J*i^d$BFBO-Bl0j>k~pg|?IVE=usu-|djTd-v1b
z9QwOC6esIlyfk?Nv)QCed|Z&`DyR*=nfKBg#?35OjxjQoa7-?^B{likRVhZ>$&A<B
z>(yBq7#JB8z^jcJ7`Pc37$n({MdTP67^b0!7=fxmc4Renj0_B+C?bB03=D5kL}D2k
z7`!-Oy7Wpw%|`|Xhsn{`I9Wl12nLf6-j3x?0kyM1n6YP~qNs5;I0_gTKvO2njG(~{
zQ1K3`#Syq1ss^;In3+*;a^W3O#@5N)*OiT@KxKHq2KF(6EJx^ruogho@PgGyPTqJ`
za`Kr+3X^AD=VO%sRoRn2-Vjv_Wnf_V_n(0Q)EZ!5*ap=DF#$xbW@KP!;F|1kSBbxY
z3t|m3BWUzR3hXP;T1HTlg_*Gh<|~k2Aie^%h*&^|pkR=%^cX=+Rt5%U#uXD4MOj-J
z85k5M^Iw<e2YC$S9f-$nPhR*%l4%YoVwLz^K<!VkUqFMNj3C!D=1*q7sm%0&2kgEN
zJTUixMt_9B?gOzP?$dy|4>V8&abE&60|ThLh~hj3ko&H|-S-;iJ_oq_GMOOD;h7n)
zPBy$H$_ff-$;sZgl$kbwUCLC$G+F11^yL3H*csnW-hNA-?Gz&eLki#Igy(Ygw-^~1
zr1(J&g(b{Sj0_BCQAC)S7#N%dkk#-pF)&O;5s_wMU|<$RR-+DD_m3iC&cwiAA%v{P
z9n`PwK@kdOVqn;hA`;KUz#u7%tSy^~fx#L@q=JcoVIo`vmgZCVK)OKD3aU6Qz%c*{
z9Y_pJ03~2>!q?$}C46x<1_oW!@MmBEN5MfRSQ60z=>w;c1W+7+6TclZEDny~O#Gk>
z1xfr8pv2E~1ROhRJK*UEq!pw9)&3SH1_lQaP>ND>5P|upfti7UA5|R#14ADZ1H%Dv
zkW!`t;*;0hbz)o0#K5pXVzR?ssmXlzIK&r7fD8b|G%Sd~B9j}RNVBbFVqn-H0ZJ5F
z2S8B=R~jE55ANF-NTO@rATfE`y)>=MAWPtqAXhzOVqh?kLRTIjIa%%gHycnpc>!D!
zq+F1hfk8nUrW_<<#LU2O04@S^tb^3#hzCxp?#v7f3uIx+VUh_lAQ4bxb2BqAC{8ZC
zB0BlX0~IC{=E=VvC@~etPnLU_#Z)0bx$9vTcY{1kvDV~|*Ci)+J>{C*_sEP3X4o3}
z$p=0wL51y@PH;{xxFx5R#LU1@pbgRq3PO-O3z!)g5_Di9Fx?yECyPB+VtT+l+3K+z
zYZJ&XlNUab7Kh0n0P6rb6|@Xc66{o)M_iNFJ(gnn!aVuZW4Zdt%nS?$MlgdxRxM#>
zVEAB+EV7lEfx*E9S>!k~1H%Lqky{{LC?cTU0t%)uT`(tYFaU{wob-@|fkAF^`V&#6
zKg^Tsp2)HN0R^`yC}Ak_u`n<!z|ad30qNBS6+mnfEDQ`6z#9Ct!Ay|Rpb&#ub^&Yz
zNJAC4MF8?1GByMC9Q@IB1(;3Fc<RQ)z%qHmQzZ+71eiQXr#naoTqHg>sVFBkk0Bum
zrUqv7g1E_C&)n1|B*P>?nuAyv7z9#aA~2;Nk|viuQ(|gJ1?Q)R)XDpvDXC3hV_<-k
z9-tl=Xz3-$00fR@VPG(*28ESGHVXqoKn=R72Gx^op3AXSvM?}Ar~#?7=>!E4Tph@$
zSs<OYFr6TgWh@K~pmmav<^#-y6KW>!dM;PLg@u8kp#fPrXc=fiBeKYOkR>Q0_gEMh
z4m2UFc?sH&g(C75<d7C*HLR=*3<p|~MTFy785lmaAq&Z|GB7x_Ba3K(LaGy4#1tgb
zg)HI#66uDC!2Fm{KY81WEG7o_%}Or?IGH$lC!2iAViM?`yx`L%Enij!h6fU$!3jvL
zFfhchGB9XB(-bJ47#K2H85j(DC(rq;#H7(X`M~EarUw#}b-p<9*MTKK_JI;2Cn)7|
zf~H?wdKnlPC-1!{KKb1p4yFfO;8vW?OODC+zVy`3WMyCg)gYkhASQ<R_~g`z%n}BJ
z9*{Ah6b_24jjRj|32>44g3=Pupy&d)*Fb7O`w&12)BgVlHNin5k69TQ0+=AX$3S!1
z3=AJx85kr`M40N?7#JSFjRt8GVPjy>K~bavavL-VAO;z;F)&;}(dER(z~BS&Cs<v4
zT2X2$Xww>s69YkZLASF(%*kS_XJAl4v8<Affx!aB=vFoch7Bm%X0tIcRG_HY#m2z!
z1Vzn7HU@?@C?>ySV_;Z<qK1{7Arj<e2G9aah>Jwn85lsdCdkVW5j}PWhC3+QoY@%|
zcCaG{Y&bgu1E|A*&{e`d+2Om0s|JcIr-RyJ;6Q@K>;`to4n$DOVq%CdO3VYbq9>pP
z+mXpLzbn^Y1nFg9U_iw0OOS{FvIrB%9}EgeYGgPdX&Ir*f`fq}1SMQREqhQXfQ*B9
zIfetY3lG_YRlXby3^PzX(+9Q;(!PXfTYw?5frEkJ3rg4>;9y`-;F#R;L$3ZjNI8m2
z9&<1-6rhN_=U`ws0Jj#D@{1W57-pb^&wr2~QFIA&GB9YMh$wL~Fhs!30r}S0nv(%M
zI0q^uAny0!WMGg%(H6nUz_0^FTMj1!LxKF{gr9Qt&72GjEGWrfCMN@f0v7`V!pLRd
zsWId@y3WbKumZ)BZ=4JaAK-x$p9ad_3=A(&{0Lf<t$?CSq#o472MxP|a~#M^N?Z&K
zpgsg573y;#CohniAdoJUM3cqEz`%i$C`-8*7_Ojrte=a4;Q>3ONQ8vde6D&11`!k&
zt>t21Xh0F!#l^tjfD(KsxEL6A!2Jqx&;u?8h7BlcK5>D@i;)u+3pWG90u+-)xEV|t
zK+7-@L2bazz|a6UD89I)C^<hTCjliGJ-8<u{1%BRKoJb*W?(o0*9dY`7B>UK92EO1
zxY6Cz!Og%>gQ8{{Hv@wL`{V_`<%Ab;GcbTUB8Zq+H~Hdk(fS)G79ZwjU@$>3;v&cz
zl(@LV&A<?YqUH@Zq(VZN{U6kQW^h2t_Ix}H3=$|_lHg%raHvNy2)w%io)qE}OY$>8
zo=4GU#lyhRfg<9?!@yvG;*Ag<1_sdDAc%wFb5nDZ3o02lps2~@VPM$9<cwUTl=49K
zL_@TJZ0_P=U_h<HR`4(|G@ux?d9wOn<@%#M3=CUPJaY}ypJo6}rNFAcM?4G+A5fhB
z5#$*ZT@1Vo3_8&K14-AsybKH;D7s{L85mx`MdC~HbMjfsQ;R&hC!hOkpr*;oz~BIm
zF_^vPybKIGP~7auJ6YwQQgk3M1A_@l=@84y0A2@%NW_`Y-WsATuH<E401XE~)Wnx3
z7w4qrF<78j&^meHKT&=Kurpva%k;@d|0&lmMR8tyGI&Ux;RjrId`V_5sG<%)h{UJm
z=BK2>t3*h!Y=OE9QI8zwWnkEV5|}r585j~!M4r|2GBDhLhaD)6zk>{7LM{-w_!t-_
zplB20V_-M|FC^lNQo*k7fIAUnjtL(Fg9VB%2R;Ud2ow=NzIq1mIv+$5%K#Y-nt_H!
zIs-!uA9@Wrk&l6)1a44#dTL2(UKzs$6zdm&91V9O$U*D)7#Ji_Vqga!!_-tp)%pw+
zorm}s7`DK5#usO%gGTu);A-M?!M<fU02cw7euodac?A-A1zKl-(jJiIXJGh&64<8v
z3=9hOC_)b4KE41_SrN&PUbJO{)gYHA75tF09})d+{0s~|@IV4NXbM;ta?Bp)XJD{l
zGK6LN_{60Aq7nuM4ipDn<Y!>G01pq4LGP#UWMovXXAxjv_=6%LDFDeX&~^g@1B03X
z1H%cFfHD$bU;r(zKt#E_03?q?G7!jucmW266)29V5nx~d4W=N}^neWVK=I%V0S1OE
zC=S{yz`#%e?)NJ&FfmGi8vOOw1Q-|=pcwuZJgkKrFsy<gXCRA+2{JHDL9tC$5RxuI
z`45B{7z_j%7z9vEwi0Au0L_*mJnK;}$iM&_ihyVfg<6JClqHDXDyRV&jbeQlR2L$~
zmkBa3%t7(~P7E~{1qB%xZlEZ7FnuF4qiB5uN-TX4WMJSyv5!rN0km2f+H{HscY+ug
zKA`B56JlV<KnVa{AqIvCDAxIaL{QYE2r)3MsYg*%E5yKX1}+j`P?VWhlE$zC#j?pl
z3=E(#Kt!-D5ke2PV?qoJZ`fez8x*H^K;8h&nS;xh_~4w>)B*>Sf}VQh?%Y=)NYo<I
zF@rDzLja1aC4|v)rG_vAg9C~ajf5E(K*PxhCk6;JF!;d3HBOj;K`%8UKCLKmx-%=|
z=Q#M{uH3{DhIq_%X7O+Zh}B>5;DsKbDM=#+WO>jkD+IqdIWcFt2^*t7S3G<@%k(BT
T#wq-Wc~kJ@<#t|nMm9kJ0fASX

delta 12813
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

diff --git a/grad_conj/customError.h b/grad_conj/customError.h
index 5047c43..825e95d 100644
--- a/grad_conj/customError.h
+++ b/grad_conj/customError.h
@@ -4,5 +4,9 @@
 #define ERROR_NO_MEMORY_LEFT 1000
 #define UNCOMPATIBLE_ALGEBRIC_MULTIPLICATION 1001
 #define NON_SQUARE_MATRIX 1002
+#define NON_TRANSPOSED_VECTOR_USED 1003
+#define TRANSPOSED_VECTOR_USED 1004
+#define CONTAINER_RES_DO_NOT_FIT 1005
+#define UNCOMPATIBLE_ALGEBRIC_ADDITION 1006
 
 #endif // CUSTOMERROR_H_INCLUDED
diff --git a/grad_conj/grad_conj.depend b/grad_conj/grad_conj.depend
index 9f7b888..cce5b3e 100644
--- a/grad_conj/grad_conj.depend
+++ b/grad_conj/grad_conj.depend
@@ -1,40 +1,41 @@
 # depslib dependency file v1.0
-1489421217 source:b:\mes documents\progra\calcint\grad_conj\mathobject.c
+1489617942 source:b:\mes documents\progra\calcint\grad_conj\mathobject.c
 	<stdlib.h>
 	<stdio.h>
 	"mathObject.h"
 	"customError.h"
 
-1489420631 b:\mes documents\progra\calcint\grad_conj\mathobject.h
+1489612623 b:\mes documents\progra\calcint\grad_conj\mathobject.h
 
-1489421052 b:\mes documents\progra\calcint\grad_conj\customerror.h
+1489596942 b:\mes documents\progra\calcint\grad_conj\customerror.h
 
-1489420337 source:b:\mes documents\progra\calcint\grad_conj\main.c
+1489619150 source:b:\mes documents\progra\calcint\grad_conj\main.c
 	<stdio.h>
 	<stdlib.h>
 	<time.h>
 	<mpi.h>
 	<time.h>
+	<math.h>
 	"customError.h"
 	"mathObject.h"
 	"algebre.h"
 	"iterative_methods.h"
 
-1489419800 source:b:\mes documents\progra\calcint\grad_conj\algebre.c
+1489617314 source:b:\mes documents\progra\calcint\grad_conj\algebre.c
 	<stdlib.h>
 	<stdio.h>
 	"mathObject.h"
 	"customError.h"
 	"algebre.h"
 
-1489419451 b:\mes documents\progra\calcint\grad_conj\algebre.h
+1489617252 b:\mes documents\progra\calcint\grad_conj\algebre.h
 
-1489420232 source:b:\mes documents\progra\calcint\grad_conj\iterative_methods.c
+1489619088 source:b:\mes documents\progra\calcint\grad_conj\iterative_methods.c
 	<stdlib.h>
 	<stdio.h>
 	"mathObject.h"
 	"customError.h"
 	"algebre.h"
 
-1489420308 b:\mes documents\progra\calcint\grad_conj\iterative_methods.h
+1489612728 b:\mes documents\progra\calcint\grad_conj\iterative_methods.h
 
diff --git a/grad_conj/iterative_methods.c b/grad_conj/iterative_methods.c
index 9666c0c..a2a62ae 100644
--- a/grad_conj/iterative_methods.c
+++ b/grad_conj/iterative_methods.c
@@ -5,3 +5,55 @@
 #include "customError.h"
 #include "algebre.h"
 
+#define MAX_ITERATION 1000000
+
+void grad_conj(Vector * b, Matrix * A, Vector * x, float epsilon){
+    int size_vec=b->size;
+
+    Vector * r = allocateVector(size_vec);
+    Vector * r_next = allocateVector(size_vec);
+    Vector * p = allocateVector(size_vec);
+    Vector * Ax = allocateVector(size_vec);
+
+    int k=0;
+    float alpha;
+    float norm_r;
+    float norm_r_next;
+    float beta;
+    float min_r=1000000.0;
+    float moyenne_r=0;
+
+    prod_mat_vec(Ax,A,x);
+    sum_vec_alpha_vec(r,b,-1.0,Ax);
+    copyVector(r,p);
+
+    norm_r=norm_vec_2(r);
+    while(norm_r>epsilon && k < MAX_ITERATION){
+        alpha=norm_r/prod_vec_t_mat_vec(p,A);
+        sum_vec_alpha_vec(x,x,alpha,p);
+        prod_mat_vec(Ax,A,p);
+        sum_vec_alpha_vec(r_next,r,-1.0*alpha,Ax);
+        norm_r_next=norm_vec_2(r_next);
+        if(norm_r_next>epsilon){
+            beta=norm_r_next/norm_r;
+            copyVector(r_next,r);
+            sum_vec_alpha_vec(p,r,beta,p);
+            k+=1;
+        }
+        norm_r=norm_r_next;
+        moyenne_r+=(norm_r-moyenne_r)/k;
+        if(min_r>norm_r){
+            printf("k : %d, ||r|| = %10.5f, m = %f\n",k,norm_r,moyenne_r);
+            min_r=norm_r;
+        }
+    }
+    if(k>=MAX_ITERATION)
+        printf("Solution has not reached the asked precision : %f in %d step.",epsilon,MAX_ITERATION);
+    else
+        printf("Solution found with %d steps.\n",k);
+
+    freeVector(r);
+    freeVector(r_next);
+    freeVector(p);
+    freeVector(Ax);
+}
diff --git a/grad_conj/iterative_methods.h b/grad_conj/iterative_methods.h
index 4e6cc23..3f37233 100644
--- a/grad_conj/iterative_methods.h
+++ b/grad_conj/iterative_methods.h
@@ -1,6 +1,6 @@
 #ifndef ITERATIVE_METHODS_H_INCLUDED
 #define ITERATIVE_METHODS_H_INCLUDED
 
-
+void grad_conj(Vector * b, Matrix * A, Vector * x, float epsilon);
 
 #endif // ITERATIVE_METHODS_H_INCLUDED
diff --git a/grad_conj/main.c b/grad_conj/main.c
index badc960..d291b55 100644
--- a/grad_conj/main.c
+++ b/grad_conj/main.c
@@ -3,6 +3,7 @@
 #include <time.h>
 #include <mpi.h>
 #include <time.h>
+#include <math.h>
 
 #include "customError.h"
 #include "mathObject.h"
@@ -20,4 +21,27 @@ int main (int argc, char *argv[]) {
     testVector();
 
     testAlgebric();
+
+    Vector * b = allocateVector(10000);
+    Matrix * A = allocateMatrix(10000,10000);
+    Vector * x = allocateVector(10000);
+
+    initProbVector(b,5.0);
+    fillVector(x,0);
+    initProbMatrixSymetric(A,5.0);
+    for(int i=0;i!=A->width;i++){
+        A->c[i][i]+=A->width/15;
+    }
+    /*
+    printf("\n\n########\nproblem : b-Ax=0 \n");
+    printf("A : \n");
+    printMatrix(A);
+    printf("b : \n");
+    printVector(b);*/
+
+    printf("calculation : \n");
+    grad_conj(b,A,x,0.000001);
+
+    printf("grad conj result : \n");
+    //printVector(x);
 }
diff --git a/grad_conj/mathObject.c b/grad_conj/mathObject.c
index 246086c..5ff139a 100644
--- a/grad_conj/mathObject.c
+++ b/grad_conj/mathObject.c
@@ -59,7 +59,7 @@ void freeMatrix(Matrix * matrix){
 void printMatrix(Matrix * matrix){
     for(int i=0; i<matrix->height; i++){
         for(int j=0; j<matrix->width; j++){
-            printf("%5.1f, ",matrix->c[i][j]);
+            printf("%5.2f, ",matrix->c[i][j]);
         }
         printf("\n");
     }
@@ -94,6 +94,7 @@ void testMatrix(){
 Vector * allocateVector(int size){
     Vector * vector = malloc(sizeof(Vector));
     vector->size = size;
+    vector->t = 0;
     vector->c = (float *)malloc(size * sizeof(float));
     if(vector->c == NULL)
         exit(ERROR_NO_MEMORY_LEFT);
@@ -104,6 +105,17 @@ void initProbVector(Vector * vector, int max_value){
         vector->c[i]=((float)rand())/32768.0*(float)max_value;
     }
 }
+void fillVector(Vector * vector, float val){
+    for(int i = 0;i!=vector->size;i++)
+        vector->c[i]=val;
+}
+void copyVector(Vector * vec_original, Vector * vec_copy){
+    if(vec_original->size!=vec_copy->size)
+        exit(CONTAINER_RES_DO_NOT_FIT);
+    for(int i=0;i!=vec_original->size;i++){
+        vec_copy->c[i]=vec_original->c[i];
+    }
+}
 void freeVector(Vector * vector){
     free(vector->c);
     free(vector);
@@ -113,8 +125,10 @@ void freeVector(Vector * vector){
 
 void printVector(Vector * vector){
     for(int i=0; i<vector->size; i++){
-        printf("%5.1f \n",vector->c[i]);
+        printf("%5.2f \n",vector->c[i]);
     }
+    if(vector->t)
+        printf("is transposed\n");
 }
 
 /* TEST BASIC FUNCTIONALITY */
@@ -126,6 +140,8 @@ void testVector(){
     printf("OK\nInitialisation : ");
     initProbVector(vector,10);
     printf("OK\n");
+    copyVector(vector,vector);
+    printf("Copy : OK\n");
     printVector(vector);
     printf("Printing : OK\nFree : ");
     freeVector(vector);
diff --git a/grad_conj/mathObject.h b/grad_conj/mathObject.h
index 7a17847..2799838 100644
--- a/grad_conj/mathObject.h
+++ b/grad_conj/mathObject.h
@@ -5,6 +5,7 @@ typedef struct vector{
 
     int size;
     float * c;
+    int t;
 
 }Vector;
 
@@ -25,6 +26,8 @@ void testMatrix();
 
 Vector * allocateVector(int);
 void initProbVector(Vector *, int);
+void fillVector(Vector * vector, float val);
+void copyVector(Vector *, Vector *);
 void freeVector(Vector *);
 void printVector(Vector *);
 void testVector();
diff --git a/grad_conj/obj/Debug/algebre.o b/grad_conj/obj/Debug/algebre.o
index d7a488fe512475e6c801609a47c3cc1e17b198fb..a15ad74ba1e829337ddc7b94d2ba14f5501ddca8 100644
GIT binary patch
literal 6807
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
Tf(8rVe3*OzC}xlif=U1YaL8Z7

delta 1805
zcmbPkx=@<ehmnf`1QfU!7!)V+iVGfLWMEjr$iQ%h10>AAATZH1+)m#F!hw-O%nS?}
z%nS@UoDdOS1_lNP1_391Lo<i~lzhp+z);0D@sk=`GCKpqJI={+jB;G(7#J9u*%=s^
zxF)+X%CYe=FfasiOwM9dV~n4;P-OB_Mt-#j1_p*=4h9Auh~pTTz~&n`gmyk{exuRt
z%F!**?aDLx1EZLv14}21$_tQvovv?=yM6(&URQU!zL_k|ET#XZ+kvG!^vl6VOpJ%R
zUBNuxF9#noF`l@|05ZmbqZ`WaX6W|)Fgb-;S&pNd!P@mh>5^vGFN|O{EY_}H_*={V
z|Njp%_6n=In2QPvD0q&usIW3HFu-h|tj{JU|Khld3Jb{D-L79?E<*^tnViC=s`COS
z0aD|l!qV;f1|-t{@BjZ!*C*YsPe447N4i~~Oy0+C!ZG3G;RzEa@G(!G#gWf+ka03M
z=eK$eW|j^{1_qYm%&JrdX14ht^(@H@%<N!M23D3nMg|5Z7M8S}{KOIlwy@OXlKdhD
zX3i8w1_pMJVjgDhn;-+qGgC@37?^n>CS;^$re~BeF!O=9EFc5<L8>?ySi#n@`6iYW
zWmYgS*9$IXWMJSZD9TTX&rK|eFH22kVC2XJ#S{Yr!$}4P2F5uc9yo<CauhQ$FfdJI
z-~`zWQN}cpg{utgsQ9APVg^QTkZPuhDcpt(3=ESQ7#O%R85ns$u3(y&!|lVsz>o?O
z%wk{!JFT8+Vg>^P11rmPMi6<Qk%57yB(=E2F(*AWsVFm<fl(CXh#z2w{9<BY;00SP
z2C*dvYPAsqqc}t)1C)jt7$qPMP2tJ~`_qVlQ4%7O0M!9<Y<xjcz9y2l<snAIFz`iy
z9K+1Oz|SBMpP8S;!1VqX(_~e?d~;7>K}I1q2Z?D;l8nL(44kYC%zRed*4&=LOcD$X
zTqX?690)EqHzP<j0|U=w0e*2gUK13>e2k2q!XQKV6&V;91SY%ktMVOW1jQ%>pJJF?
z!QaXznSOmYhwx-}0cCAlgY>6QInp`OIrPEMfWv3qy0vT9u4Q6oU}S{&lmQYKlVt=g
z>p=m>;K;|(%H+h$%5?N74+{%}3<Cp$4FdziSq26MP@p2@zkubz3M3gA7(^Jf7#J9&
zz^v<V)-yQkF9QREG+0)I5ysMDWB}_IVX$RnV5pY`O9#LOlNlKpAY#po3=DE$Sy1Yh
z2eW1}GB7|`pmGbsTF=P9pa7QL1!u7_Fff23nVTUOlyDdr7}yv}85kG@85kJ28B!S;
z7=*#BW%Y0-BNGDyD2KB#2r$8<<=`wwxNI1l)d^?KfUDa9XMvo+4You8?u2GI3*=ys
zZR{cp4j{qFe?>!?PBKhBAST5MieQ1s_r*dd2Cx`|Tn&nA76t|eW=2q94DuI91c4i&
zOpt-hj4vlTigNZth1e#q6_+-i2jzjX1v4Y4P)15aP`Oo58dTUZGxAMz6y@Iv6$0gJ
zW=6q@j-tW`phBQhkC_ovb~8<Omr$-h1r-NH1*BZKg(30^L*y5R2p8O83gDW6fk7NY
pL>WaypOJw<Z}L6KP#)y+Y4SPA(#if(j>6EgFg~p)H5FQ(0RXLwF|7aq

diff --git a/grad_conj/obj/Debug/iterative_methods.o b/grad_conj/obj/Debug/iterative_methods.o
index 797a45098251cbfc9931813348776a3bae0bd086..519f3eb08eb188be76b7fd5afa2ba6cef9faed4b 100644
GIT binary patch
literal 3755
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

delta 724
zcmZ22dy|{jhmn&31U@k{FbGZL6`$xMGSMQ$PTvG1h`{ZP3=B1l3=CJ8A!1An3=9qo
z0#5pdW)J}=nZv-qz|1`Hlai$b0|P@oGXuj5s18P$4ii(TS_oyyz`)QBRRb28?91pZ
zb^uuftkb}unQ`(VmdeS_tkLz1mqHjB7+B&9N{Sd5uYlMLEb+;CB@B#L7cwv~u&~4@
zB^IYLFkS;maj?Xv<s_yvFkT1A@vy|FW#*(ZFx~+11X$veGZKrEO4Aq^Z-N9wSmKjP
z(~2{z7#MGX_!2DfCAkG@d5O8H42-uy#>p_STC*HwU|?W#^Yn3LV7zmdfq{XEg(WQ~
zKe2>?J&KWmp^A}#frEiFJ~Kawf$@Dl$m@)PjH(>M+{_%4IXPVF85uo=8HE`bI20Ke
z7&uKBm^rMtt+_pg?Imp_85kHuKqi6%g9S{&2vEo|G3YZeFfcOy=Hq2xWMl-J&A`Bz
zY^9%@nU`L!pP84OQ<{>>z))P0l9{iU!2nX>?(A%(pyBQps;OYAXRN1W05Xw{fq{XG
zfq{XWp`3w%fe*|AiE)5flkK_18T}_$bIVVD#4S8|Ew}r`02bq9kUmfVgQA%clqf(6
z0V)Wk@}V><SWV7EM^XM-s1V3>W=4t0_jyG5d!S<MU}csQ9YvLAK!rdll9^Eu%0p0#
n85kyi=QW?ai&s=Qvm~`Bu_UuBH9j}BBqKkiSTA|<cV0&T>X>e8

diff --git a/grad_conj/obj/Debug/main.o b/grad_conj/obj/Debug/main.o
index 4e88e17f0dd7d1fed42d8b72bd526874f303500f..c5611a3ed116db893bfc856ffcd9d3680ac00b64 100644
GIT binary patch
delta 1812
zcmbOrGF^t(hmo5B1k|_~7}O{7iVK!7GBBKBWME+71PL=R2u(B%_tYy&Ni0c(2!Kcp
z1_lNPW)KU39T*H8^i2?a5G#S1fgyvLfnf*KF!qUS#aUl7Ffg2$?8qoG@vbo2W_AXK
zf1DG)$#Gp}U|_h+&cGnVHCc{PiD?DLWG6;7rp+9avlx}MZ5S9Bj&m?D$Z&y-Wnf?g
zIe@{yA++;paPyN7&2Iu;fFzE)sCZ1?#;9I@oJB=Ioq+)?*y*C;a@<9Q1tfqb?tsR(
z0jXnUU|{HWQE};HQ330}`R-<n3QM<(iVaKzNtFYVm=DMaud}*cRO%hN9XPr}RD2FT
zVq(0|%>ZTg$_RA3s9=|4yl@j_t3x-(uFj5*j?NR`U-hzZ9sI%Ed8qTm!5{LPhdM8G
zx~Rz9c2SYJckrfkvx|xkBiJ+sYZn!t(yrqyDj@s8POiVn3gX<1QQ-l*+eL)~q_ooo
z><_rlj<cxnGeARW2S{^w?4Of|lM{22OLG!SGV}8ktP~j1ixN{5lJoPj6pB)dOLIy<
zVhnrD+e~Aa85meVx)@j(-TgupoDB^XO!bWQ3>0)H|7Q$lDq-9l!c@Rm&%=_FpO>zX
zl3$vXlghwcmYQ6WU&O$}!XnSaz`#<RS(VDb!nPA+5KA%x3p-eprG$Zn10=@5z{;Y^
z#K6GB!jhJgpIE}c76#GJ!u5`kfq^+Uv7{)of`NyHrx;{fd1gvU1_KKpNGk(NMrvky
zMtunb3qOd@0y16zqzq&z$Qm|Zh;9}k8zu$@uH3}TJO)NykXn#yKskYNju|rp19xIk
zdNNdoX(E_g#=yu6l46?3!c&x(m(9Qkwvz|!9SEDZxFoTpw78yuk^dwk0|Qfu25(7f
zaR~#XAjk&hk`oNPNeqmVHp~nR%q2${cpVuSrJTT=0}Q+s42;qs8Kx2&zBLRC3=Iqn
z47`~Pj0zCFXBZe5SXulTL8KlNh^%B{VBimBWMBwpW?&Ft5RA{vPhwzt@4-AdkL8#+
zH=`h<5E}ynKO>{3FrzR7gMcCf1B2k?2v${LkUv5G1>uVf3=B*ReUm4!HhAYImSp%R
zWu+#U=w&c~G8_Xd6G#m+597R;W)8c^sHo2zrC&H~ITSf;8JJj@=Yt5QR6zzN7Dl!R
zHfF9}yP4EPI7FCOC#$kq)hjSCFvu`K(hS&6M?Q{LCMRB2_hx41Ova;!d01E&K&6os
z0|SEygFFKRgEW|>4%H~apu@nxAPW{VWME*B1GCH+7{F>p7@Qaw7(kYYFhnshFn~NL
z!jJ_Qi*I6JU{C^UnZm%ppbTcMU|?VX<rEPHeMSZbP~pPHV8Y12pbD0?f{R5lGBBut
z#S-CSX>fIH3=9l>lMk{9I}0%|FmN*@F@ih*Vx5AsCWDeE0|NsagFH0furYx2@ql#*
zK*NQNVfJKR_FPs__y|p|XAc!dE_y+^jhRtnqNAvABq%08iGYEDfte9h&azK_%`V9f
zGLo6`^+ZR}$qF1CjO>#&Ih0j7z=}WxEI1mWS|L;)gks>FT*#r!4hjKgMnRDF4ICWo
zpx9t$w3)o0qqZKT?h1$iV+96qT3~nr=79*9$QKX?jA0@ya9d#_0w^N!1*Ij$U>zU=
zrbYurjWHwRWIN7F@$rc{Ir+(nC8^M20M3VI<@n6J%#whj{3MusT4qiTj17~6s12^n
TO)V+POlF7&6>;&PB8~w7MwLjx

delta 796
zcmbO(GeLychmnf`1QggA8004MiVHe0Ffc4(WMF7u0|_%QuuU`#x6?O)aA0IF69dB&
zMh1pGFhvXu3=RwePWpysFePC62Ll5`A<M*1YHXRT3=BWmCd)C(am{C7VCZCJVBle&
z?8d0Xs4?-Q$mCi^VJ2g?$&(nBv@94H7~I(y7{u7YMldjf%{Fid?R?t&<U{itgBKw2
z<1Q*XlkYRCbM64~P9E-Lnw-U)!{orQ`37?VV?7H?T26jq2?JMdVrCu#BhOBdDzHHe
z42*N~nHU(j6N}Q5p)yPp!Q3(iMjnt9(?k}YqQtyx21Z_xKAz&ts#GYOx40y+q_miU
zk?$lU0|Qfu1aC=daR~#X07xNIi4Gr#>zJdRo|;sYnasc_1`_9IU|?nOXJlXy2n7W!
z69a=FgHU{Cei8%I`%<RKN7;_4=rP($GILmQTXTB~+ek7n@Jlc-FbFU*dI~cNGcX7$
zGB7X*O<u&VDh!Gqs9zXnGcYhPG1N`I#oi#wz`)7`5@+USoDkE@VHX)SpNVPmQVy$n
z83qOh5N3gTpTUujqm{{tm$l|74+}^TlmI~1i7?19Ffd3mFffQPs4*}wNP$_}3=9m?
zV3q;YAQ1*r1_lOMuox)*c^DWNxEZn-7#KjNu`v{ZoDLRCVq{>@7XmX+F)}bfSYH@n
z3PGAdmUA-*z%_SI7Us%j1^JR~aw}Kp!~hoKNRYpv3YZx|Ne`qEDhQ=gp)@N40|PVT
zkBN?=oW)Qfw#mWV%Iu)T#LPH<axJ$kBgf>~+{%ocllOBgvxDqsX0(|6lDn4q3IoGr
L8{V+Vw!GB<`MY(N

diff --git a/grad_conj/obj/Debug/mathObject.o b/grad_conj/obj/Debug/mathObject.o
index 65e0dc38b65d1f77b1afa3f54ffce01b019a3a9a..2b419c5fb1c3ebcf4acee0206d84d84d17ddf09d 100644
GIT binary patch
delta 3151
zcmbPX`o@aahmo5B1a3(%Fz8O?6&Jk1%D`}jk%7TO1SHJBU@_4&ooxam1H%ILiHnr<
z#Mu}a3^*AWD#Retx(o~q4h#ZL`i5o@0Vt`%$iU#vKk<_qTd@EGgO$W&IYv3IBa93T
zlLZ(U{3Is3F)A^I3r)^qRAb5)nmmb7Nf0F2EX2SNAptRhck)rjKa3rd4>4_G?ATn&
ze1}nvhk=3N1xU8j^-H(wm+nxGPJwRMFUK7?K!TG~Sz{SHCLd<isTVlz`UfQRTD;qp
zquYU{JM_=NM@)<tZo2Z^lxTMS!w3>)uy*}ZdVj*n!=ar|o8M@Fgao=>dAb=a50&s7
zXHj{}47KgJ>ld(LDj->qVP8Oo9Rg`^VCnY#a_}J&<B6LLH>H|gzkp5VV6b-mQhI5^
z$;mHS6CA<nI9d;Y4P|D88Va}fIE#uPOz=31iW1C^$5~WB-g=?>Z}Mywh2-de|NkFn
zQE`Pyce{S+bWvdeQ7kGijzDC!VFp2kHUEP(c_3?IQF-wJqS^wcdcw)Ws-}8Ilkc$o
z5;96t;9|%uRwyY-%quR)FHTLFe2ZP0(>cGOQo%~W-+S^G_82B%w#h*pMT}P_ALaPY
z!o$omb@BmD(fX;33=AwRB@E0Qix?OfI2c%2W-~G{FtM<t<>V)pFtCNCCYR(FF)(wb
zGcqu+gMyTYndccuQ+Z}eNd^NmA4neqOGavDdPWHYGe3yS!jjCuEC5mkG7w}1n{Q%C
zQDy}Lv(P3+1_qAAoSgjR#FA8BafmP@ZweF0YzBsH3=9m6b5bTJa%nTBOz!29XM8hx
zEtfjaXC?*)K9CYdnUu*7xKtTuPiEux=ZRs432UWHPUMc{nF|*%OqqO)+l=QcT);YI
zG6#=0j{*w=0~gpN&y>mWJd*WEEDQ`a%nS?>V5>nq&f?6fR0hU4kYAW4GH`+X%@_}o
zVVao3z{;|Ok%56XGcU6wpeR2H8bXZeSC|<XLcnJ1W?^9918Yi$Xky?4xt%c`Vjv6m
zZDs}rHwFd<o=gVD`V5F@4g-TgT4qiT%)A^876t}muz6gpF!OSt=5dxK<}fhkfa7W+
z3%4E%1A`XSyj+NJB@7I_$@vA9FyjiMSr{0iz{aJsGB9wKr6$Mc7iFer*5`qYDu5fD
znj8<($G`{`V&Sf4VPG(anqCYsJ%@pTH?1f&6=r(*Ru%>ZP&QzkGYRh4a;TXMyah#>
zc_lElb=O%K7{b6V0To;+kdUf_D(1e6WLrJlHvW>-Vz>z%x~vQg%fTl6XJvrKPdCJX
z90tK?Mg|5hHU<VE2I2V3{3HgZ_x~ra<^8Uq$7nCf%wffC&8;pe$SB0-ATixZl2Mp}
zL6DKrQy9b$Qe<FY5T3k=Pn8$sG*Bu5;RBnW@Od*b&Y!F=AREBI#KJrgL~!UbFtISQ
zd9f|9O~1YyBmxnB3>98zn|^(*Lpm0T`MVv`ckh0>n?rv$hvMdJ0VPIRP~u~7<l|^%
za^huW3OUNd!or}yz`(%5$iQ%8@+v`PM;&N#fUC*}D`JpgU|{fIWMGJg#xGo+DGaOt
zB%i^^z_4@jIYH_A4n_us+tBbws0@OuT*1h|U<eIeg#2Q#JOe)i1A`g^1A_>IA)MvU
zz`&pm7Au8|t%QqRhO=HWFfeE^)PppCWnf?cRYhzJa~MH_ATf}=5HThu1_n*Af%0&c
z7MzvE1k;<(1WEHE44q624BB8FE8wzgnHU&!z+zkAVmp}_>cQDWgyA||@DALVZ*Z~S
zaLv5TFzbYvVb-a@#Wa~=mK4CnO5tK%%&^c}3uo1zW`+gV7iO5>8CYPJl(WEOkFvl*
z;R2lX7p{(p73LU4R+wHjR+wYV;9}NrF(-&vJp&tqJ6v-tM38}vAqg&40~c$AYn}xc
zn-3S;2p8K1*Lwmkb{4LVje&tdih+TFo1uV#fuUZ2fq{XIp@M;dK@KbkN|~T^&dsoy
zkpZ0IxfukQ7#JYx9GGBYesHlCIBPOob|IW~94-rrScoaC%rNsr>X~5%D#2L>aA{XK
zD+|u5gsW?Zi>-mPcEe>)!o}{vS<Eaji-lMq_SSPVn85`@pn}{CRdBIRxY%?!Ybjjz
zB%E~vF8c*8Ccz4`E)dQtg|k{%85k7m!GXRIF1P_C2o~E17kdO}eT2(`ViDBF;|50z
zBv{)RVAg>m5F{qT-~tsBVMu|qI^e7o48agBA`B<sf}qABL^B5?OcvA<g^2mU#d6@R
z9yn_ah&9<(>|i~p@?~UDV1P6uu7L_076t}{$Rh>@22c%%5P8SIzyPYX5F)=A7#Kix
z6GDWYk%0kJ*FZ${N>VFIK=lEr=3!u9U}gkW5*8ql$&up8OcNL<I*OPGGlB#d7+Aq7
z#Mu}aK<#aa7>tyMssRNnGoubjAEWMMX$fUx8>kGZ8Oh8DYF|SIU|ON2J&4N*wn1W|
rqbOtW<aP;V;W(&TQ1<|$nRoJDiEhS>$)1we`4Mdka0NeET&fWOmDKI!

delta 2435
zcmaE3HN%wGhmo5B1f0Ye7_=wyiVO0vGBBKBWMI$`0tquP7*8}!XRBajV7S3HagmZ<
zA}a$!00#qung~Q%gMop;fkD7Y-_Q&q040SO85lP5PW+_Cc9@TWVVme=IYv3INsJ5(
zkNFrFPKi!-V^m@)6_}jGsK(SQFnJQAl3)uX1H(cA28Ju55F@xJA7%W*STOkz(<a7(
z&85tD7=<_(7#LoFWIJ8Ibi01(4&|8qkx^uFBda%K!Q`{7I+NSjqO>NQJRI8jwE2z3
zaTXP3MyQ74EGkMc&Bs|(zy@8KtiZ15@$cXN|HoNWTw$`^u3tJ?R9?jX2Mc?k39CSa
z6=3F0IC*%&gbAvqdWMsiu>WE)OjF>Ryn#b{@?Unf$-g;FnPOQd8*vsfa!y{#`JIJ>
znWcO30xr?|Zbk+M76w+9iHr;kOe`#EIr)ht3~XVk$tC$k49uMAj0_CyAaC+8bKe0e
zEze9T$zWjST?7(j$w<vi&nRJF<^yqASdtl-`9Z2U7+6_A2DAAlmK0@HFfa?QU}Rw6
zNX*H}PfjdJg^DurMltb%jA3Bd#=yY9I45edH@7xp)Z}t*dDcga3=F)J^JK&&7-c}R
zo53nxGBGglfwVBnL`^=$t;#rY@&|5zo*-tJuvXM$Z=Oh=$#4O~sL306%y?eI1+1ec
zf8y~r5o2Ls-~yZE8O6lFz%(%j;XbJE8RH^Y7#M1p85sP)mPbr3<duv7iGftJvdjWG
zF*7f-B%mli38p9Q6f*-u2w43_76t}BP~b79K{PS&f!xlR1_~^ui7ea~nHd<|7#J9M
zG8q`tC-?D*)o07GFff2p2jiSOaNXHZ-3+`1MVWaeFq?`TSU~9=6mW8^Fq?{?YPsE5
z7#Pf<W*0*&%wb^QFG($i8&K82!obi8cB&^U0|OU3g8~BsV=csl90q}CMh1ouRt5$^
z2BG-O{3HgZ_nwoT`M>iqGI|O#3NtVWDl#xI2u)5BQ03)h1qCGp_idgc;LSMsfuOAX
z^|cP^3`{J{6F~&WV+JM`Mm8_Dg%0VvcR$_Dp}*NzNQqGv6u1nId>pMzPQ0v4UPpOY
zSU?V8U}0onI5)XRSea32@&{q*dJjeh1{bK8;p%I^${A!B7#K1b85mliK7z|LwL%my
zFz_=lFsLvvFo-Z1!dd<d3=FDZu~N9$O1Ri%IO`<?14F$USm9SN$-uzIFo%(W0U`!U
z+@Lauje&`Yfk7RtLLSc2g0r%iK-Pow<})!cfQl;-hE66122HSz6>!<LObiTKV6iQ5
zv7PmBE!W|Kci>{*;9|ewnt7RF)(J7gtW$xDX)?nsDS(TW!o|9nVWG7c%BmM(ILHhO
zu2;-3zkh>k)?<PB-4f19V}Us#n+4{CPPkYf3(N^q;bODk>Ndc|wt~d!!2xm}E_em5
z`59d7HAo>?-CwvE6D!OTHU<U;2?hoRZiWH|NO{4=P{F_ePCVS;<Rb@`UCGG60AaB~
ziyJluGp2f&pbK2E3eEz>B1Fq{CYZXtaM??67ASH+WdIuk7c)$q1e~P?Eu`2Otl_K#
z7^|KkAFi+#CdjY|&e{l<-47SL0%!e%vp85_7VCgY7zR*s^n!~Oz{Tp}V!dEiJt*L2
z!=?AbS?9pgAX!lGLwxrOF2(^Wn!uLmz**L;FeiYbL<}700`MqlgR>N%ED;7528I}L
z!7sv)0vGInvsS=aC*Ukl<qUF+2m=QrB(_Bubl@x>I4cLlntWB_U^uAcW@J!cU;>w8
z*BBTWK&3H4<PoTS!NS0R5P8qQzyK;lAtHJusTCz)y&yFV49tw6V$pcApj0|z#pHuh
zqQ<|WvY^tEnGw`}0TlvJK`6z}2w{MNhM7?aq>oW_@^vX?RTZcVsKvm{2x`DU1t1#0
yq`_o)X=Q$Es065jV`dbb=qM`e1{DG|v6vY_4IJ*tmD1ge0h3u}u223VQvm=Sh)~M_

-- 
GitLab