Moka libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
MatricePMQ.cc
Go to the documentation of this file.
1 #include "Matrice.hh"
2 #include "MatricePMQ.hh"
3 #include <iostream>
4 #include <cassert>
5 
7 {
8  P=new Matrice(i,i);
9  Pinv=new Matrice(i,i);
10  Q=new Matrice(j,j);
11  Qinv=new Matrice(j,j);
12  M=new Matrice(i,j);
13 
14  assert(P!=NULL);
15  assert(Pinv!=NULL);
16  assert(Q!=NULL);
17  assert(Qinv!=NULL);
18  assert(M!=NULL);
19 
20 
21  if ( valid() )
22  {
23  for(int n=0;n<i;n++)
24  {
25  Pinv->setVal(n,n,1);
26  P->setVal(n,n,1);
27  }
28 
29  for(int n=0;n<j;n++)
30  {
31  Q->setVal(n,n,1);
32  Qinv->setVal(n,n,1);
33  }
34  }
35 }
36 
38 { return P->valid() && Pinv->valid() && Q->valid() && Qinv->valid() && M->valid(); }
39 
40 // AIE AIE AIE !!!
41 // MatricePMQ::MatricePMQ(const MatricePMQ & source)
42 // {
43 // Pinv=source.Pinv;
44 // P=source.P;
45 // Q=source.Q;
46 // Qinv=source.Qinv;
47 // M=source.M;
48 // }
49 
51 {
52  delete P;
53  delete Pinv;
54  delete Q;
55  delete Qinv;
56  delete M;
57 }
58 
59 unsigned long MatricePMQ::size() const
60 { return P->size()+Pinv->size()+Q->size()+Qinv->size()+M->size(); }
61 
63 {
64  M->inverseLigne(c.i,pos);
65  Pinv->inverseLigne(c.i,pos);
66  P->inverseColonne(c.i,pos);
67  M->inverseColonne(c.j,pos);
68  Q->inverseColonne(c.j,pos);
69  Qinv->inverseLigne(c.j,pos);
70 }
71 
73 {
74  if ( !valid() ) return;
75 
76  int a=M->getnbli();
77  int b=M->getnbcol();
78  int min=a;
79  int coeff;
80  int indice;
81  coord c1;
82  coord c2;
83  coord c3;
84  coord cc;
85 
86  if(min>b){
87  min=b;}
88 
89  for(int i=0;i<min;i++)
90  {
91  //on amene le plus petit element en position (i,i)
92  do{
93  cc=M->getMinElemNonZero(i);
94 
95  if(!no(cc))
96  {
97  deplacePMQ(cc,i);
98  c1=M->verifyDiviseLigne(i);
99  if(!no(c1))
100  {
101  coeff=M->getVal(c1.i,c1.j)/M->getVal(i,i);
102  addColonnePMQ(c1.j,i,-coeff);
103  }
104  else
105  {
106  c2=M->verifyDiviseColonne(i);
107  if(!no(c2))
108  {
109  coeff=M->getVal(c2.i,c2.j)/M->getVal(i,i);
110  addLignePMQ(c2.i,i,-coeff);
111  }
112  else
113  {
114  c3=M->verifyOthers(i);
115  if(!no(c3))
116  {
117  coeff=M->getVal(c3.i,c3.j)/M->getVal(i,i);
118  addLignePMQ(c3.i,i,-coeff);
119  addLignePMQ(i,c3.i,1);
120  }
121  else
122  {
123  zeroOnLignePMQ(i);
124  zeroOnColonnePMQ(i);
125  if(M->getVal(i,i)<0)
126  {
127  multiplyColonnePMQ(i,-1);
128  }
129  c1.i=-1;
130  c1.j=-1;
131  c2.i=-1;
132  c2.j=-1;
133  c3.i=-1;
134  c3.j=-1;
135  }
136  }
137  }
138  }
139  else
140  {
141  c1.i=-1;
142  c1.j=-1;
143  c2.i=-1;
144  c2.j=-1;
145  c3.i=-1;
146  c3.j=-1;
147 
148  }
149  }
150  while(!(no(c1)&&no(c2)&&no(c3)));
151  }
152 
153 
154  for(int i=0;i<b/2;i++)
155  {
156  inverseColonnePMQ(i,b-i-1);
157  }
158 
159  indice=0;
160  for(int i=0;i<min;i++)
161  {
162  if(M->getVal(i,b-1-i)!=0)
163  indice++;
164 
165  else
166  break;
167  }
168 
169  for(int i=0;i<indice/2;i++)
170  {
171  inverseLignePMQ(i,indice-i-1);
172  }
173 }
174 
176 
177  int coeff;
178  int a;
179  int b;
180  for(int i=pos+1;i<M->getnbcol();i++)
181  {
182  a=M->getVal(pos,i);
183  b=M->getVal(pos,pos);
184  coeff=a/b;
185  addColonnePMQ(i,pos,-coeff);
186 
187  }
188 }
189 
191 {
192  int coeff;
193  int a;
194  int b;
195 
196  for(int i=pos+1;i<M->getnbli();i++)
197  {
198  a=M->getVal(i,pos);
199  b=M->getVal(pos,pos);
200  coeff=a/b;
201  addLignePMQ(i,pos,-coeff);
202  }
203 
204 }
205 
206 
208 {
209  return Pinv;
210 }
211 
213 {
214  return P;
215 }
216 
218 {
219  return M;
220 }
221 
223  return Q;
224 }
225 
227 {
228  return Qinv;
229 }
230 
232 {
233  M->inverseLigne(i,j);
234  P->inverseColonne(i,j);
235  Pinv->inverseLigne(i,j);
236 }
237 
239 {
240  M->inverseColonne(i,j);
241  Q->inverseColonne(i,j);
242  Qinv->inverseLigne(i,j);
243 }
244 
245 void MatricePMQ::multiplyLignePMQ(int i,int coeff)
246 {
247  M->multiplyLigne(i,coeff);
248  P->multiplyColonne(i,coeff);
249  Pinv->multiplyLigne(i,coeff);
250 }
251 
252 void MatricePMQ::multiplyColonnePMQ(int i,int coeff)
253 {
254  M->multiplyColonne(i,coeff);
255  Q->multiplyColonne(i,coeff);
256  Qinv->multiplyLigne(i,coeff);
257 }
258 
259 void MatricePMQ::addLignePMQ(int i,int j,int coeff)
260 {
261  M->addLigne(i,j,coeff);
262  P->addColonne(j,i,-coeff);
263  Pinv->addLigne(i,j,coeff);
264 }
265 
266 void MatricePMQ::addColonnePMQ(int i,int j,int coeff)
267 {
268  M->addColonne(i,j,coeff);
269  Q->addColonne(i,j,coeff);
270  Qinv->addLigne(j,i,-coeff);
271 }
272 
273 void MatricePMQ::setValPMQ(int i,int j,int val)
274 {
275  M->setVal(i,j,val);
276 }
277 
278 int MatricePMQ::getValPMQ(int i,int j)
279 {
280  return M->getVal(i,j);
281 }
282 
284 {
285  std::cout << "Pinv" << std::endl;
286  Pinv->affiche();
287  std::cout << "P" << std::endl;
288  P->affiche();
289  std::cout << "M" << std::endl;
290  M->affiche();
291  std::cout << "Q" << std::endl;
292  Q->affiche();
293  std::cout << "Qinv" << std::endl;
294  Qinv->affiche();
295 
296 }