Borderbasix

pol2bis.hpp
Go to the documentation of this file.
1 #ifndef polbis
2 #define polbis pol
3 #include"ugly.hpp"
4 
5 int nbbits[256]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
6 
7 template<typename T> void *MAC_REV_MALLOC(int size);
8 template<typename T> void *MAC_REV_REALLOC(void*ptr,int,int);
9 template<typename T> void MAC_REV_FREE(void*ptr,int size);
10 
11 template<typename mon,typename T>
12 struct polbis
13 {
14  typedef mon monom_t;
15  typedef T coeff_t;
17  T * nf;
18  unsigned char *nfind;
19  int size,sizenf;
20  //size correspond a nf et sizenf a nfind
21  // pol operator*(const mon&t);//multi par un monome
22  polbis operator*(const T &t);
23  polbis &operator-=(const polbis &Q);
24  polbis &operator=(const polbis &Q);
25  polbis &operator/=(const T &t);
26 };
27 
28 //
29 //l'autre par un coeff constant
30 //
31 template<typename mon,typename T>
34 {
35  //int tmpsize=this->size;
36  for(int i=0;i<this->size;i++)
37  this->nf[i]*=toto;
38  return *this;
39 }
40 
41 template<typename mon,typename T>
43 {
44  int sizeres=0;
45  polbis<mon,T> res;
46  // cout<<"on m'appelle"<<endl;
47  if(sizenf<Q.sizenf)
48  {
49  T *ptrnf=nf,*ptrresnf,*ptrQnf;
50  for(int i=0;i<sizenf;i++)
51  sizeres+=nbbits[nfind[i]&Q.nfind[i]];
52 
53  for(int i=sizenf;i<Q.sizenf;i++)
54  sizeres+=nbbits[Q.nfind[i]];
55  res.size=sizeres;
56  //res.nfind=malloc(Q.sizenf);
57  res.nf=(T*)MAC_REV_MALLOC<T>(res.size*sizeof(T));
58  ptrresnf=res.nf;
59  ptrQnf=Q.nf;
60  for(int i=0;i<sizenf;i++)
61  {
62  for(int j=0;j<8;j++)
63  {
64  if((nfind[i]>>j)&1)
65  *(ptrresnf++)=*(ptrnf++);
66  if ((Q.nfind[i]>>j)&1)
67  *(ptrresnf-1)-=*(ptrQnf++);
68  }
69  }
70  for(int i=sizenf;i<Q.sizenf;i++)
71  {
72  for(int j=0;j<8;j++)
73  if((Q.nfind[i]>>j)&1)
74  *(ptrresnf++)=((T)-1)*(*(ptrQnf++));
75  }
76  }
77  else
78  {
79  T *ptrnf=nf,*ptrresnf,*ptrQnf;
80  for(int i=0;i<Q.nizenf;i++)
81  sizeres+=nbbits[nfind[i]&Q.nfind[i]];
82 
83  for(int i=Q.sizenf;i<sizenf;i++)
84  sizeres+=nbbits[nfind[i]];
85 
86  res.size=sizeres;
87  // res.nfind=malloc(sizenf);
88  res.nf=(T*)MAC_REV_MALLOC<T>(res.size*sizeof(T));
89  ptrresnf=res.nf;
90  ptrQnf=Q.nf;
91  for(int i=0;i<Q.sizenf;i++)
92  {
93  for(int j=0;j<8;j++)
94  {
95  if((nfind[i]>>j)&1)
96  *(ptrresnf++)=*(ptrnf++);
97  if((Q.nfind[i]>>j)&1)
98  *(ptrresnf-1)-=*(ptrQnf++);
99  }
100  }
101  for(int i=Q.sizenf;i<sizenf;i++)
102  {
103  for(int j=0;j<8;j++)
104  if((nfind[i]>>j)&1)
105  *(ptrresnf++)=*(ptrnf++);
106  }
107 
108  }
109  if(sizenf<Q.sizenf)
110  nfind=(unsigned char*)realloc(nfind,Q.sizenf);
111  for(int i=0;i<Q.sizenf;i++)
112  nfind[i]|=Q.nfind[i];
113  MAC_REV_FREE<T>(sizenf*sizeof(T));
114  free(nfind);
115  nfind=res.nfind;
116  nf=res.nf;
117  sizenf=res.sizenf;
118  size=res.size;
119  return *this;
120 }
121 //attention l'operateur -= n'agit que sur les nf
122 
123 //
124 //operateur d'affectation sans recopie de nf!!!!
125 //
126 template<typename mon,typename T>
128 {
129  nf=Q.nf;
130  nfind=Q.nfind;
131  size=Q.size;
132  sizenf=Q.sizenf;
133  ind=Q.ind;
134  return *this;
135 }
136 
137 template<typename mon,typename T>
139 {
140  for(int i=0;i<this->size;i++)
141  this->nf[i]/=t;
142  return *this;
143 }
144 
145 template<typename polyalp, typename mon, typename T, typename monomial_server>
146 polyalp invconv(const polbis<mon,T> & p, monomial_server &serv)
147 {
148  typedef typename polyalp::order_t ord;
149  polyalp res(0);
150  T *tmpptr=p.nf;
151  for(int i=0;i<p.sizenf;i++)
152  {
153  //cout<<"i dans invconv "<<i<<" sizeplace "<<sizeplacemon()<<endl;
154  for(int j=0;j<8;j++)
155  if ((p.nfind[i]>>j)&1)
156  {
157  mon tmp;
158  serv.int2mon(8*i+j,tmp);
159  // cout<<"8*i+j vaut"<<8*i+j<<endl;
160  //cout<<"j'aoute le monome "<<tmp<<endl;
161  //cout<<"LE COEFF EST "<<p.nf[i]<<endl;
162  //cout<<"res dans invconv"<<endl<<res<<endl;
163  res+=tmp*(*(tmpptr++));
164  }
165  }
166  if (!Iszero(p.ind.GetCoeff()))
167  res+=p.ind;
168  //cout<<"res dans invconv"<<endl<<res<<endl;
169  return res;
170 }
171 
172 
173 // renvoit mon/x_i .... mais suppose qu'on ne fait pas n'importe quoi
174 //necessaire pour convert
175 
176 template <typename Mon,typename Base>
177 Mon divmon(const Mon &mon,int i,const Base &b)
178 {
179  Mon res(1);
180  for(int j=0;j<b.nvar();j++)
181  if(i==j)
182  {
183  res*=Mon(j,mon.GetDegree(j)-1);
184  }
185  else
186  {
187  res*=Mon(j,mon.GetDegree(j));
188  }
189  return res;
190 }
191 
192 //converti un polyalp en polbis
193 template<typename polbis,typename polyalp,typename Base,
194  typename monomial_server>
195 polbis convert(const polyalp &P,const Base &b, monomial_server &serv)
196 {
197  typedef typename polyalp::order_t ord;
198  typedef typename polyalp::monom_t mon;
199  typedef typename mon::coeff_t coeff;
200  coeff *tmp;
201  polbis res;
202  int i,maxind=-1,j,p=0;
203  i=0;
204  res.ind=mon(0);
205  for(typename polyalp::const_iterator iter=P.begin();iter!=P.end();iter++)
206  if ((IsinB(*iter,b))&&(serv.mon2int(*iter)>maxind))
207  maxind=serv.mon2int(*iter);
208  maxind++;
209  res.sizenf=(maxind/8)+1;
210  res.nfind=(unsigned char*)malloc((maxind/8+1));
211  memset(res.nfind,0,res.sizenf);
212  tmp=(coeff*)MAC_REV_MALLOC<coeff>((maxind)*sizeof(coeff));
213  for(int i=0;i<maxind;i++)
214  tmp[i]=0;
215  for(typename polyalp::const_iterator iter=P.begin();iter!=P.end();iter++)
216  {
217  if(IsinB(*iter,b))
218  {
219  if(!Iszero(iter->GetCoeff()))
220  {
221  int stockind=serv.mon2int(*iter);
222  tmp[stockind]=iter->GetCoeff();
223  res.nfind[stockind/8]|=(unsigned char)(1<<(stockind%8));
224  p++;
225  }
226  }
227  else
228  res.ind=*iter;
229  }
230  res.size=p;//l'ind n'est pas comptabilise dans la nf
231  res.nf=(coeff*)MAC_REV_MALLOC<coeff>(res.size*sizeof(coeff));
232  for( i=0;i<res.size;i++)
233  res.nf[i]=0;
234 
235  j=0;
236  for(int i=0;i<maxind;i++)
237  if(!Iszero(coeff(tmp[i])))
238  res.nf[j++]=tmp[i];
239  MAC_REV_FREE<coeff>(tmp,(maxind)*sizeof(coeff));
240 
241  p=0;
242  for(int i=0;i<res.sizenf;i++)
243  p+=nbbits[res.nfind[i]];
244 #ifdef DEB
245  cout<<"pol.size "<<P.size()<<" kkk "<<p<<endl;
246 #endif
247  return res;
248 }
249 
250 template<typename mon,typename T, typename monomial_server>
252 {
253  int mmax=-1;
254  for(int i=0;i<p.sizenf;i++)
255  if(p.nfind[i])
256  {
257  mon tmpmon;
258  for(int j=0;j<8;j++)
259  if((p.nfind[i]>>j)&1)
260  {
261  serv.int2mon(8*i+j,tmpmon);
262  mmax=(mmax<tmpmon.GetDegree())?tmpmon.GetDegree():mmax;
263  }
264  }
265  if(!Iszero(p.ind.GetCoeff()))
266  mmax=(mmax<p.ind.GetDegree())?p.ind.GetDegree():mmax;
267  return mmax;//p.ind.GetDegree();
268 }
269 
270 template<typename mon,typename T>
271 int hasmonom(const polbis<mon,T>& p,const mon & m)
272 {
273  int tmpind=mon2int(m);
274  return (tmpind/8<p.sizenf) && ((p.nfind[tmpind/8]>>(tmpind%8))&1);
275 }
276 
277 template<typename mon, typename T>
279 {
280  mon tmp;
281  int cpt=0,i,tmpcpt;
282  //for(i=0;(i<p.sizenf) ;i++)
283  // cpt+=nbbits[p.nfind[i]];
284  //cout<<endl<<"nbbits "<<cpt<<endl<<" et j "<<j<<endl;
285  //cpt=0;
286  for(i=0;(cpt<j) && (i<p.sizenf) ;i++)
287  cpt+=nbbits[p.nfind[i]];
288  tmpcpt=8*i;
289  (i==p.sizenf?i--:i);
290  for(int k=128;cpt>j;k>>=1)
291  if(p.nfind[i]&&k)
292  {tmpcpt--;cpt--;}
293  int2mon(tmpcpt,tmp);
294  return tmp;
295 }
296 #endif
void int2mon(const int &i, mon &res)
Definition: placemon3.hpp:664
void * MAC_REV_REALLOC(void *ptr, int, int)
Definition: memory.hpp:49
int mon2int(const mon &mm)
Definition: placemon3.hpp:679
T coeff_t
Definition: pol2bis.hpp:15
void free(void *)
T * nf
Definition: pol2bis.hpp:17
C GetCoeff() const
Definition: Monom.hpp:67
Definition: pol.hpp:6
int size
Definition: pol2bis.hpp:19
void MAC_REV_FREE(void *ptr, int size)
Definition: memory.hpp:65
typpol nf(int var, int indmon, const typdump &dump, const Base &b)
Definition: corealgo.hpp:1001
int Degree(const polbis< mon, T > &p, monomial_server &serv)
Definition: pol2bis.hpp:251
int hasmonom(const polbis< mon, T > &p, const mon &m)
Definition: pol2bis.hpp:271
int nbbits[256]
Definition: pol2bis.hpp:5
mon monofindex(int j, pol< mon, T > &p)
Definition: pol2bis.hpp:278
void * malloc(YYSIZE_T)
polbis & operator=(const polbis &Q)
Definition: pol2bis.hpp:127
int mon2int(const mon &mm)
Definition: placemon.hpp:294
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
void int2mon(const int &i, mon &res)
Definition: placemon.hpp:288
MSKint32t k
Definition: mosek.h:2713
polbis operator*(const T &t)
Definition: pol2bis.hpp:33
C coeff_t
Definition: Monom.hpp:26
polbis & operator-=(const polbis &Q)
Definition: pol2bis.hpp:42
void * MAC_REV_MALLOC(int size)
Definition: memory.hpp:39
Definition: placemon3.hpp:14
polyalp invconv(const polbis< mon, T > &p, monomial_server &serv)
Definition: pol2bis.hpp:146
mon ind
Definition: pol2bis.hpp:16
int IsinB(const mon &m, const Base &b)
Definition: IsinB3.hpp:68
polbis & operator/=(const T &t)
Definition: pol2bis.hpp:138
Mon mon
Definition: solver_bb_floating.cpp:136
Definition: types.hpp:14
exponent_t GetDegree() const
Definition: Monom.hpp:70
#define polbis
Definition: pol2bis.hpp:2
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
int Iszero(const Scl< MPQ > &c)
Definition: Iszero.hpp:14
Monom< COEFF, dynamicexp<'x'> > Mon
Definition: solver_bb_floating.cpp:134
Mon divmon(const Mon &mon, int i, const Base &b)
Definition: pol2bis.hpp:177
mon monom_t
Definition: pol2bis.hpp:14
polbis convert(const polyalp &P, const Base &b, monomial_server &serv)
Definition: pol2bis.hpp:195
Definition: pol2bis.hpp:12
Multivariate monomials.
Definition: Monom.hpp:21
unsigned char * nfind
Definition: pol2bis.hpp:18
int sizenf
Definition: pol2bis.hpp:19
Home  |  Download & InstallContributions