Borderbasix

proj3sdp.hpp
Go to the documentation of this file.
1 #ifndef ALREADY_proj3
2 #define ALREADY_proj3
3 template<typename typPk,typename typdump,typename Base,
4  typename monomial_server>
5 void rewrite(typPk &Pk,const typdump &dump,const Base &b,
6  monomial_server &serv)
7 {
8  typedef typename typPk::value_type polyalp;
9  typedef typename polyalp::monom_t mon;
10  typedef typename typdump::value_type dumpstruct;
11  typedef typename dumpstruct::pol_t pol;
12  typename typPk::iterator iter=Pk.begin();
13  //cout<<"Pk.size dans rewrite "<<Pk.size()<<endl;
14  for(;iter!=Pk.end();iter++)
15  //pour chaque poly de Pk
16  {
17  polyalp tmp(mon(0));
18  for(typename polyalp::iterator itermon=iter->begin();
19  itermon!=iter->end();itermon++)
20  //pour chaque mon du polynome *iter
21  {
22  if (!IsinB(*itermon,b))
23  {
24  pol ttmp;
25  ttmp.size=-1;
26  ttmp.nf=NULL;
27  // cout<<"findcorresppol "<<*itermon<<endl;
28  findcorresppol(*itermon,dump,ttmp);
29  // cout<<"invconv"<<endl;
30  //fincorresppol ne touche pas son parametre de sortie qd
31  //le monome recherche n'existe pas
32  //il existe ce monome?
33  if(ttmp.size!=-1)
34  {
35  // cout<<"trouve "<<endl;
36  //tmp*=mon(ttmp.ind.GetCoeff());
37  tmp+=invconv<polyalp>(ttmp,serv)*mon(itermon->GetCoeff()/ttmp.ind.GetCoeff());
38  }
39  }
40 
41  }
42  // cout<<"le pol que je vais enlever"<<endl;
43  // cout<<tmp<<endl;
44 // cout<<"fin du pol"<<endl;
45 // cout<<"le poly avant reecriture "<<*iter<<endl;
46  (*iter)-=tmp;
47 // cout<<"poly apres reecriture!!\n"<<(*iter)<<endl;
48  }
49  return;
50 }
51 
52 template<typename typPk,typename typdump,typename Base,
53  typename monomial_server>
54 void rewrite2(typPk &Pk,const typdump &dump,const Base &b,
55  monomial_server &serv)
56 {
57  typedef typename typPk::value_type polyalp;
58  typedef typename polyalp::monom_t mon;
59  typedef typename typdump::value_type dumpstruct;
60  typedef typename dumpstruct::pol_t pol;
61  typename typPk::iterator iter=Pk.begin();
62  mon div,coc;
63  //cout<<"Pk.size dans rewrite "<<Pk.size()<<endl;
64  for(;iter!=Pk.end();iter++)
65  //pour chaque poly de Pk
66  {
67  polyalp tmp(mon(0));
68  for(typename polyalp::iterator itermon=iter->begin();
69  itermon!=iter->end();itermon++)
70  //pour chaque mon du polynome *iter
71  {
72  div=mon(1);
73  coc=mon(1);
74  if (!IsinB2(*itermon,b,div,coc))
75  {
76  pol ttmp;
77  ttmp.size=-1;
78  ttmp.nf=NULL;
79  // cout<<"findcorresppol "<<*itermon<<endl;
80  findcorresppol(div,dump,ttmp);
81  *itermon=div*coc;
82  // cout<<"invconv"<<endl;
83  //fincorresppol ne touche pas son parametre de sortie qd
84  //le monome recherche n'existe pas
85  //il existe ce monome?
86  if(ttmp.size!=-1)
87  {
88  // cout<<"trouve "<<endl;
89  //tmp*=mon(ttmp.ind.GetCoeff());
90  tmp+=invconv<polyalp>(ttmp,serv)*mon(itermon->GetCoeff()/ttmp.ind.GetCoeff());
91  }
92  }
93 
94  }
95  // cout<<"le pol que je vais enlever"<<endl;
96  // cout<<tmp<<endl;
97 // cout<<"fin du pol"<<endl;
98  cout<<"le poly avant reecriture "<<*iter<<endl;
99  (*iter)-=tmp;
100  cout<<"poly apres reecriture!!\n"<<(*iter)<<endl;
101  }
102  return;
103 }
104 
105 #ifdef uninf
106 //void reinit_multiple();
107 #endif
108 template<typename T,typename typdump,typename Base, typename monomial_server>
109 void proj(T &Crochet,const typdump &dump, const Base &b,
110  monomial_server &serv)
111 {
112  typedef typename typdump::value_type::pol_t pol;
113  typedef typename T::value_type polyalp;
114  typedef typename polyalp::monom_t mon;
115  typedef typename mon::coeff_t coeff;
116 
117 #ifdef unimul
118  serv.reinit_multiple();
119 #endif
120 #ifdef uninf
121  serv.reinit_nf();
122 #endif
123  int num_count=0;
124  for(typename T::iterator iter=Crochet.begin();iter!=Crochet.end();iter++,num_count++)
125  {
126  list<mon> monared;
127  //cout<<"le pol que je vais reduire"<<num_count<<endl;
128  //cout<<*iter<<endl;
129  int degiter=Degree(*iter);
130  for(typename polyalp::iterator iterpol=iter->begin();iterpol!=iter->end();iterpol++)
131  {
132  if (!IsinB(*iterpol,b))
133  monared.push_back(*iterpol);
134  // cout<<"mon dans proj "<<*iterpol<<" b? "<<IsinB(*iterpol,b)<<endl;
135  }
136  for(typename list<mon>::iterator itermon=monared.begin();itermon!=monared.end();itermon++)
137  {
138  // cout<<"dans le for sur monared "<<b.nbvar()<<endl;
139 #ifdef projfast
140  polyalp result(0);
141  pol accumul;
142  mon *exce;
143  int sizeex;
144  accumul.size=1;
145  accumul.nf=(coeff*)MAC_REV_MALLOC<coeff>(sizeof(coeff));
146  accumul.nf[0]=1;
147  for(int i=0;i<b.nbvar();i++)
148  for(int j=0;j<itermon->GetDegree(i);j++)
149  {
150  pol tmp;
151  //if(result.size()!=0)
152  result*=mon(i,1);
153  tmp=mult(i,accumul,dump,b,&exce,sizeex);
154  MAC_REV_FREE<coeff>(accumul.nf,accumul.size*sizeof(coeff));
155  accumul=tmp;
156  for(int k=0;k<sizeex-1;k++)
157  result+=exce[k];
158  MAC_REV_FREE<mon>(exce,sizeex*sizeof(mon));
159  }
160  for(int k=0;k<accumul.size;k++)
161  if(!Iszero(accumul.nf[k]))
162  {
163  mon tmpmon;
164  serv.int2mon(k,tmpmon);
165  // cout<<"tmpmon "<<tmpmon<<endl;
166  result+=tmpmon*accumul.nf[k];
167  }
168  MAC_REV_FREE<coeff>(accumul.nf,accumul.size*sizeof(coeff));
169 #else
170  // cout<<"itermon"<<*itermon<<endl;
171  polyalp result(1);
172  for(int i=0;i<b.nbvar();i++)
173 
174 
175  for(int j=0;j<itermon->GetDegree(i);j++)
176  {
177 // cout<<"i"<<i<<endl;
178 // cout<<"j"<<j<<endl;
179  result*=mon(i,1);
180  int flag=0;
181 // cout<<"nbtour dans la boucle "<<itermon->GetDegree(i)<<"J"<<j<<endl;
182  for (typename polyalp::iterator iterres=result.begin();
183  iterres!=result.end();iterres++)
184  {
185  if (!IsinB(*iterres,b)) flag=1;
186 // cout<<"IsinB("<<*iterres<<") "<<IsinB(*iterres,b)<<endl;
187  }
188  if (flag)
189  {
190  T tmp;
191  tmp.push_back(result);
192 // cout<<"rewrite"<<endl;
193  rewrite(tmp,dump,b,serv);
194 // cout<<"sortie rewrite"<<endl;
195  result=tmp.front();
196 // cout<<"result"<<result<<endl;
197  }
198 
199  }
200 #endif
201  coeff Coeff;
202  for(typename polyalp::iterator iterpol=iter->begin();
203  iterpol!=iter->end();iterpol++)
204  if ((itermon->rep)==(iterpol->rep))
205  {
206  // cout<<"iterpol->rep"<<iterpol->rep<<endl;
207  // cout<<"itermon->rep"<<itermon->rep<<endl;
208  // cout<<"pasa por aqui"<<endl;
209  Coeff=iterpol->GetCoeff();
210  break;
211  }
212 
213 // cout<<"iter avant reecriture "<<*iter<<endl;
214  //cout<<"result"<<result<<endl;
215  //cout<<"monomio"<<mon(Coeff)<<endl;
216  *iter+=result*mon(Coeff);
217  *iter-=polyalp(mon((*itermon)*(coeff)(Coeff/itermon->GetCoeff())));
218  // cout<<"iter apres reecriture "<<*iter<<endl<<endl;
219 
220 
221  }
222  }
223  //stab(Crochet);
224  return;
225 
226 }
227 
228 template<typename T,typename typdump,typename Base, typename monomial_server>
229 void projS(T &Crochet,const typdump &dump, const Base &b,
230  monomial_server &serv)
231 {
232  typedef typename typdump::value_type::pol_t pol;
233  typedef typename T::value_type polyalp;
234  typedef typename polyalp::monom_t mon;
235  typedef typename mon::coeff_t coeff;
236 
237  typename T::iterator iter=Crochet.begin();
238 #ifdef unimul
239  serv.reinit_multiple();
240 #endif
241 #ifdef uninf
242  serv.reinit_nf();
243 #endif
244  for(;iter!=Crochet.end();iter++)
245  {
246  list<mon> monared,listdiv,listcoc;
247  mon div,coc;
248  cout<<"le pol que je vais reduire"<<endl;
249  cout<<*iter<<endl;
250  int degiter=Degree(*iter);
251  for(typename polyalp::iterator iterpol=iter->begin();iterpol!=iter->end();iterpol++)
252  {
253  div=mon(1);
254  coc=mon(1);
255  if (!IsinB2(*iterpol,b,div,coc))
256  {
257  monared.push_back(*iterpol);
258  listdiv.push_back(div);
259  listcoc.push_back(coc);
260 
261  }
262  cout<<"mon dans proj "<<*iterpol<<" b? "<<IsinB(*iterpol,b)<<endl;
263  }
264  typename list<mon>::iterator itermon=monared.begin();
265  typename list<mon>::iterator iterdiv=listdiv.begin();
266  typename list<mon>::iterator itercoc=listcoc.begin();
267  for(;itermon!=monared.end();itermon++,iterdiv++,itercoc++)
268  {
269  // cout<<"dans le for sur monared "<<b.nbvar()<<endl;
270 
271  cout<<"itermon"<<*itermon<<endl;
272  cout<<"divisor"<<*iterdiv<<endl;
273  cout<<"cocient"<<*itercoc<<endl;
274  polyalp result(1);
275  mon divisor,quotient;
276  //for(int i=0;i<b.nbvar();i++)
277 
278 
279  //for(int j=0;j<itermon->GetDegree(i);j++)
280  // {
281 
282 // cout<<"i"<<i<<endl;
283 // cout<<"j"<<j<<endl;
284  result*=*iterdiv;
285  divisor=*iterdiv;
286  T tmp;
287  tmp.push_back(result);
288  cout<<"rewrite"<<endl;
289  rewrite2(tmp,dump,b,serv);
290  cout<<"sortie rewrite"<<endl;
291  result=tmp.front();
292  cout<<"result"<<result<<endl;
293  quotient=*itercoc;
294  for (;divisor!=mon(1);)
295  {
296 
297  result*=quotient;
298  cout<<"result"<<result<<endl;
299  int flag=0;
300 // cout<<"nbtour dans la boucle "<<itermon->GetDegree(i)<<"J"<<j<<endl;
301  for (typename polyalp::iterator iterres=result.begin();
302  iterres!=result.end();iterres++)
303  {
304  div=mon(1);
305  coc=mon(1);
306  if (!IsinB2(*iterres,b,div,coc)){
307 
308  flag=1;
309  // quotient=coc;
310  // divisor=div;
311  }
312  cout<<"IsinB("<<*iterres<<") "<<IsinB(*iterres,b)<<endl;
313  }
314  if (flag)
315  {
316  T tmp;
317  tmp.push_back(result);
318 // cout<<"rewrite"<<endl;
319  rewrite2(tmp,dump,b,serv);
320 // cout<<"sortie rewrite"<<endl;
321  result=tmp.front();
322 // cout<<"result"<<result<<endl;
323  }
324  cout<<"divisor"<<divisor<<endl;
325  }
326 
327  coeff Coeff;
328  for(typename polyalp::iterator iterpol=iter->begin();
329  iterpol!=iter->end();iterpol++)
330  if ((itermon->rep)==(iterpol->rep))
331  {
332  // cout<<"iterpol->rep"<<iterpol->rep<<endl;
333  // cout<<"itermon->rep"<<itermon->rep<<endl;
334  // cout<<"pasa por aqui"<<endl;
335  Coeff=iterpol->GetCoeff();
336  break;
337  }
338 
339 // cout<<"iter avant reecriture "<<*iter<<endl;
340  //cout<<"result"<<result<<endl;
341  //cout<<"monomio"<<mon(Coeff)<<endl;
342  *iter+=result*mon(Coeff);
343  *iter-=polyalp(mon((*itermon)*(coeff)(Coeff/itermon->GetCoeff())));
344  // cout<<"iter apres reecriture "<<*iter<<endl<<endl;
345 
346 
347  }
348  }
349  //stab(Crochet);
350  return;
351 
352 }
353 
354 
355 #endif //ALREADY_proj3
void int2mon(const int &i, mon &res)
Definition: placemon3.hpp:664
Definition: dump.hpp:2
M div(const M &m1, const M &m2)
Definition: Monom.hpp:217
Definition: pol.hpp:6
void findcorresppol(const mon &m, const typdump &dump, pol &res)
Definition: corealgo.hpp:2031
int IsinB2(const mon &m, const Base &b, mon &div, mon &coc)
Definition: IsinB3sdp.hpp:110
typpol mult(int i, const typpol &pol, const typdump &dump, const Base &b, mon **exce, int &exsize)
Definition: corealgo.hpp:1077
long flag
Definition: alp_f2c.H:52
int nbvar()
Definition: types.hpp:37
void reinit_multiple()
Definition: placemon3.hpp:85
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
MSKint32t k
Definition: mosek.h:2713
C coeff_t
Definition: Monom.hpp:26
void rewrite(typPk &Pk, const typdump &dump, const Base &b, monomial_server &serv)
Definition: proj3sdp.hpp:5
Definition: placemon3.hpp:14
void proj(T &Crochet, const typdump &dump, const Base &b, monomial_server &serv)
Definition: proj3sdp.hpp:109
dynamicexp< X, E >::degree_t Degree(const dynamicexp< X, E > &t)
Definition: dynamicexp.hpp:91
MPoly< R, O > Coeff(const MPoly< R, O > &P, int i)
Definition: MPolyFunction.hpp:66
int IsinB(const mon &m, const Base &b)
Definition: IsinB3.hpp:68
Mon mon
Definition: solver_bb_floating.cpp:136
Definition: types.hpp:14
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
int Iszero(const Scl< MPQ > &c)
Definition: Iszero.hpp:14
int size
Definition: pol.hpp:10
cont< pol< mon, T > > Crochet(const cont< pol< mon, T > > &P, int k)
Definition: corealgo.hpp:6
void projS(T &Crochet, const typdump &dump, const Base &b, monomial_server &serv)
Definition: proj3sdp.hpp:229
void rewrite2(typPk &Pk, const typdump &dump, const Base &b, monomial_server &serv)
Definition: proj3sdp.hpp:54
#define pol
Definition: pol2ter.hpp:3
T * nf
Definition: pol.hpp:12
Home  |  Download & InstallContributions