Borderbasix

proj3.hpp
Go to the documentation of this file.
1 #ifndef ALREADY_proj3
2 #define ALREADY_proj3
3 #include<algorithm>
4 template<typename typPk,typename typdump,typename Base,
5  typename monomial_server>
6 void rewrite(typPk &Pk,const typdump &dump,const Base &b,
7  monomial_server &serv)
8 {
9  typedef typename typPk::value_type polyalp;
10  typedef typename polyalp::monom_t mon;
11  typedef typename typdump::value_type dumpstruct;
12  typedef typename dumpstruct::pol_t pol;
13  typename typPk::iterator iter=Pk.begin();
14  //cout<<"Pk.size dans rewrite "<<Pk.size()<<endl;
15  for(;iter!=Pk.end();iter++)
16  //pour chaque poly de Pk
17  {
18  polyalp tmp(mon(0));
19  for(typename polyalp::iterator itermon=iter->begin();
20  itermon!=iter->end();itermon++)
21  //pour chaque mon du polynome *iter
22  {
23  if (!IsinB(*itermon,b))
24  {
25  pol ttmp;
26  ttmp.size=-1;
27  ttmp.nf=NULL;
28  //cout<<"findcorresppol "<<*itermon<<endl;
29  findcorresppol(*itermon,dump,ttmp);
30  //cout<<"invconv"<<endl;
31  //fincorresppol ne touche pas son parametre de sortie qd
32  //le monome recherche n'existe pas
33  //il existe ce monome?
34  if(ttmp.size!=-1)
35  {
36  // cout<<"trouve "<<endl;
37  //tmp*=mon(ttmp.ind.GetCoeff());
38  tmp+=invconv<polyalp>(ttmp,serv)*mon(itermon->GetCoeff()/ttmp.ind.GetCoeff());
39  }
40  }
41 
42  }
43  // cout<<"le pol que je vais enlever"<<endl;
44  // cout<<tmp<<endl;
45  //cout<<"fin du pol"<<endl;
46  // cout<<"le poly avant reecriture "<<*iter<<endl;
47  (*iter)-=tmp;
48  //cout<<"poly apres reecriture!!\n"<<(*iter)<<endl;
49  }
50  return;
51 }
52 #ifdef uninf
53 //void reinit_multiple();
54 #endif
55 template<typename T,typename typdump,typename Base, typename monomial_server>
56 void proj(T &Crochet,const typdump &dump, const Base &b,
57  monomial_server &serv)
58 {
59  typedef typename typdump::value_type::pol_t pol;
60  typedef typename T::value_type polyalp;
61  typedef typename polyalp::monom_t mon;
62  typedef typename mon::coeff_t coeff;
63  typename T::iterator iter=Crochet.begin();
64 #ifdef unimul
65  serv.reinit_multiple();
66 #endif
67 #ifdef uninf
68  serv.reinit_nf();
69 #endif
70  // int degiter=Degree(*iter);
71  for(;iter!=Crochet.end();iter++)
72  {
73  // cout<<"le pol que je vais reduire"<<endl;
74  //cout<<*iter<<endl;
75 
76  list<mon> monared;
77 #ifdef LAMBDA
78 
79  std::copy_if(iter->begin(), iter->end(), monared.begin(),
80  [&b](mon &m) { return !IsinB(m,b);});
81 
82 #else
83  for(typename polyalp::iterator iterpol=iter->begin();
84  iterpol!=iter->end();iterpol++)
85  {
86  if (!IsinB(*iterpol,b))
87  monared.push_back(*iterpol);
88  //cout<<"mon dans proj "<<*iterpol<<" b? "<<IsinB(*iterpol,b)<<endl;
89  }
90 #endif
91 
92  for(typename list<mon>::iterator itermon=monared.begin();itermon!=monared.end();itermon++)
93  {
94  // cout<<"dans le for sur monared "<<b.nbvar()<<endl;
95 #ifdef projfast
96  polyalp result(0);
97  pol accumul;
98  mon *exce;
99  int sizeex;
100  accumul.size=1;
101  accumul.nf=(coeff*)MAC_REV_MALLOC<coeff>(sizeof(coeff));
102  accumul.nf[0]=1;
103  for(int i=0;i<b.nbvar();i++)
104  for(int j=0;j<itermon->GetDegree(i);j++)
105  {
106  pol tmp;
107  //if(result.size()!=0)
108  result*=mon(i,1);
109  tmp=mult(i,accumul,dump,b,&exce,sizeex);
110  MAC_REV_FREE<coeff>(accumul.nf,accumul.size*sizeof(coeff));
111  accumul=tmp;
112  for(int k=0;k<sizeex-1;k++)
113  result+=exce[k];
114  MAC_REV_FREE<mon>(exce,sizeex*sizeof(mon));
115  }
116  for(int k=0;k<accumul.size;k++)
117  if(!Iszero(accumul.nf[k]))
118  {
119  mon tmpmon;
120  serv.int2mon(k,tmpmon);
121  // cout<<"tmpmon "<<tmpmon<<endl;
122  result+=tmpmon*accumul.nf[k];
123  }
124  MAC_REV_FREE<coeff>(accumul.nf,accumul.size*sizeof(coeff));
125 #else
126  polyalp result(1);
127  for(int i=0;i<b.nbvar();i++)
128  for(int j=0;j<itermon->GetDegree(i);j++)
129  {
130  result*=mon(i,1);
131  // int flag=0;
132  //cout<<"nbtour dans la boucle "<<itermon->GetDegree(i)<<"J"<<j<<endl;
133  for (typename polyalp::iterator iterres=result.begin();
134  iterres!=result.end();iterres++)
135  {
136  if (!IsinB(*iterres,b))
137  {
138  T tmp;
139  tmp.push_back(result);
140  //cout<<"rewrite"<<endl;
141  rewrite(tmp,dump,b,serv);
142  //cout<<"sortie rewrite"<<endl;
143  result=tmp.front();
144  break;
145  }
146  }
147  }
148 #endif
149  coeff Coeff;
150  for(typename polyalp::iterator iterpol=iter->begin();
151  iterpol!=iter->end();iterpol++)
152  if ((itermon->rep)==(iterpol->rep))
153  {
154  Coeff=iterpol->GetCoeff();
155  break;
156  }
157  // cout<<"iter avant reecriture "<<*iter<<" Coeff "<<Coeff<<endl;
158  *iter+=result*mon(Coeff);
159  // cout<<"result "<<endl<<result<<endl;
160  *iter-=polyalp(mon((*itermon)*(coeff)(Coeff/itermon->GetCoeff())));
161  // cout<<"iter apres reecriture dans proj "<<*iter<<endl<<endl;
162  }
163  }
164  //stab(Crochet);
165  return;
166 
167  }
168 #endif //ALREADY_proj3
void int2mon(const int &i, mon &res)
Definition: placemon3.hpp:664
Definition: dump.hpp:2
void rewrite(typPk &Pk, const typdump &dump, const Base &b, monomial_server &serv)
Definition: proj3.hpp:6
void proj(T &Crochet, const typdump &dump, const Base &b, monomial_server &serv)
Definition: proj3.hpp:56
Definition: pol.hpp:6
void findcorresppol(const mon &m, const typdump &dump, pol &res)
Definition: corealgo.hpp:2031
typpol mult(int i, const typpol &pol, const typdump &dump, const Base &b, mon **exce, int &exsize)
Definition: corealgo.hpp:1077
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
Definition: placemon3.hpp:14
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
#define pol
Definition: pol2ter.hpp:3
T * nf
Definition: pol.hpp:12
Home  |  Download & InstallContributions