Borderbasix

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