Borderbasix

dump3sdp.hpp
Go to the documentation of this file.
1 #ifndef ALREADY_dump3
2 #define ALREADY_dump3
3 template<typename pol>
4 struct dumpstruct
5 {
6  typedef pol pol_t;
7  int k;
8  int size;
9  pol * nf;
12 };
13 
14 template<typename typPk, typename typdump>
15 void Dump(const typPk & Pk ,typdump &dump)
16 {
17  typedef typename typdump::value_type dumpstruct;
18  int i=0;
19  dumpstruct next;
20  if(!Pk.empty())
21  {
22  next.k=Pk.front().ind.GetDegree();
23  next.size=Pk.size();
24 // cout<<"le malloc dans dump"<<endl;
25  next.nf=(typename dumpstruct::pol_t *)MAC_REV_MALLOC
26  <typename dumpstruct::pol_t>(Pk.size()*
27  sizeof(typename dumpstruct::pol_t));
28 // cout<<"fin du malloc"<<endl;
29  for(typename typPk::const_iterator iter=Pk.begin()
30  ;iter!=Pk.end();iter++,i++)
31  {
32  next.nf[i]=*iter;
33  next.nf[i].ind.SetCoeff(1);
34  }
35  dump.push_back(next);
36  }
37  return;
38 }
39 
40 template<typename Base,typename typdump,typename typrecall>
41 void forget(Base &b,typdump &dump,int k,typrecall & recall)
42 
43  //template<typename Base,typename typdump>
44  //void forget(Base &b,typdump &dump,const int &k)
45 {
46  typedef typename Base::mon mon;
47  typedef typename mon::coeff_t coeff;
48  typedef typename typdump::value_type::pol_t pol;
49  typename typdump::iterator iterdump=dump.begin(),stockiter=dump.end();
50  for(typename typrecall::iterator iter=recall.begin()
51  ;iter!=recall.end();iter++)
52  {
53  MAC_REV_FREE<coeff>(iter->nf,iter->size*sizeof(coeff));
54  MAC_REV_FREE<char>(iter->nfind,iter->sizenf);
55  }
56  recall.erase(recall.begin(),recall.end());
57  //cout<<"destruction dans B"<<endl;
58  for(typename Base::iterator iter=b.begin();iter!=b.end();iter++)
59  {
60  mon *tmp=(mon*)MAC_REV_MALLOC<mon>(iter->taille1*sizeof(mon));
61  int tmptaille=0;
62  for(int i=0;i<iter->taille1;i++)
63  if(iter->accept[i].GetDegree()<=k)
64  //27/08/2001(iter->refuse[i].GetDegree()<=k)
65  {
66  tmp[tmptaille++]=iter->accept[i];
67  }
68  //on suppose que le monomes se detruisent tout seuls
69  //rajouter un destroy mon sinon
70  if(tmptaille==0)
71  {
72  MAC_REV_FREE<mon>(tmp,iter->taille1*sizeof(mon));
73  MAC_REV_FREE<mon>(iter->accept,iter->taille1*sizeof(mon));
74  MAC_REV_FREE<mon>(iter->refuse,iter->taille2*sizeof(mon));
75  b.erase(iter--);
76  continue;
77  //tmp[tmptaille++]=mon(1);
78  }
79  MAC_REV_FREE<mon>(iter->accept,iter->taille1*sizeof(mon));
80  iter->accept=(mon*)MAC_REV_REALLOC<mon>((void*)tmp
81  ,iter->taille1*sizeof(mon)
82  ,tmptaille*sizeof(mon));
83  iter->taille1=tmptaille;
84  //pour les refuses
85  tmp=(mon*)MAC_REV_MALLOC<mon>(iter->taille2*sizeof(mon));
86  tmptaille=0;
87  for(int i=0;i<iter->taille2;i++)
88  //#ifdef BONRAJOUT
89  if (1)
90  //#else
91  if((iter->refuse[i].GetDegree()<=k))
92  //#endif
93  //27/08/2001(iter->refuse[i].GetDegree()<=k)
94  {
95  tmp[tmptaille++]=iter->refuse[i];
96  }
97  //on suppose que les monomes se detruisent tout seuls
98  //rajouter un destroy mon sinon
99  MAC_REV_FREE<mon>(iter->refuse,iter->taille2*sizeof(mon));
100  //iter->taille2=tmptaille;
101  //if(tmptaille==0)
102  //{
103  /*free(iter->refuse);*/
104  // iter->refuse=NULL;
105  //}
106  //else
107  {
108  iter->refuse=(mon*)MAC_REV_REALLOC<mon>((void*)tmp
109  ,iter->taille2*sizeof(mon)
110  ,tmptaille*sizeof(mon));
111  }
112  iter->taille2=tmptaille;
113  }
114  //on vire des differentes composantes B les monomes de degre>k
115  //ca ralentit l'algo mais c coherent sinon on cherche des nf
116  //que l'on ne connait pas
117  //ya un opti a faire ici
118 
119  for(iterdump=dump.begin();iterdump!=stockiter/*dump.end()*/ && iterdump->k<k;iterdump++);
120  // cout<<"je detruit tout a partir du degre "<<k<<endl;
121  if(iterdump!=stockiter)
122  stockiter=iterdump++;//on suppose qu'on a fait
123  if(stockiter!=dump.end())
124  free(stockiter->nf);
125  //un recover avant du meme degre sinon il y a fuite de memoire
126 
127  if(k==0) {cout<<"pas de sol"<<endl;exit(0);}
128  //cout<<"iter!=dump.end()"<<(iter!=dump.end())<<endl;
129 #if 0
130  if(0&&iterdump!=dump.end())
131  {
132  for(int i=0;i<iterdump->size;i++)
133  recall.push_back(iterdump->nf[i]);
134  iterdump++;
135  }
136 #endif
137  for(;iterdump!=dump.end();iterdump++)
138  {
139  //destruction de pol de cette couche
140  //for(int i=0;i<iterdump->size;i++)
141  // recall.push_back(iterdump->nf[i]);
142  //recall.push_back(invconv<typename typP::value_type>(iterdump->nf[i]));
143  {
144 
145  // cout<<"le pointeur "<<(double*)iterdump->nf[i].nf<<endl;
146  //Tue Dec 4
147  //for(int ii=0;ii<(iterdump->size);ii++)
148  // MAC_REV_FREE<mon>(iterdump->nf[ii].nf
149  // ,iterdump->nf[ii].size*sizeof(mon));
150  //Tue Dec 4
151  for(int ii=0;ii<(iterdump->size);ii++)
152  {
153  MAC_REV_FREE<coeff>(iterdump->nf[ii].nf
154  ,iterdump->nf[ii].size*sizeof(coeff));
155  MAC_REV_FREE<char>(iterdump->nf[ii].nfind
156  ,iterdump->nf[ii].sizenf);
157  }
158  MAC_REV_FREE<pol>(iterdump->nf,iterdump->size*sizeof(pol));
159  }
160  //free(iterdump->nf);
161  }
162  //cout<<"au tour de B "<<endl;
163  dump.erase(stockiter,dump.end());
164 
165 }
166 
167 template<typename typPk, typename typMk, typename typdump>
168 void recover(typPk &Pk,typMk &Mk, const typdump & dump, int k)
169 {
170  typedef typename typPk::value_type pol;
171  typename typdump::const_iterator iter;
172  typedef typename pol::coeff_t coeff;
173  //if (k!=Pk.front().GetDegree())
174  {
175  //les mecs dans Pk ont ete dumpes normalment donc ne pas les detruire
176  //sinon on est embette par forget qui va chercher a le faire aussi
177  Pk.erase(Pk.begin(),Pk.end());
178  Mk.erase(Mk.begin(),Mk.end());
179  for(iter=dump.begin();(iter!=dump.end())&&(iter->k<k);iter++);
180  // if (iter!=dump.end()) cout<<"iter->k "<<iter->k<<endl;
181  if ((iter!=dump.end())&&(iter->k==k))
182  for(int i=0;i<iter->size;i++)
183  {
184  //Tue Dec 4 16:12:10 MET 2001
185  // pol tmppol;
186  //densify(iter->nf[i],tmppol);
187  //Pk.push_back(tmppol);
188  //Tue Dec 4 16:12:10 MET 2001
189  Pk.push_back(iter->nf[i]);
190  Mk.push_back(Pk.rbegin()->ind);
191  }
192  }
193  return;
194 }
195 
196 template<typename Base,typename typdump,typename typrecall>
197 void forget0(Base &b,typdump &dump,int k,typrecall & recall)
198 
199  //template<typename Base,typename typdump>
200  //void forget(Base &b,typdump &dump,const int &k)
201 {
202  typedef typename Base::mon mon;
203  typedef typename mon::coeff_t coeff;
204  typedef typename typdump::value_type::pol_t pol;
205  typename typdump::iterator iterdump=dump.begin(),stockiter=dump.end();
206  for(typename typrecall::iterator iter=recall.begin()
207  ;iter!=recall.end();iter++)
208  {
209  MAC_REV_FREE<coeff>(iter->nf,iter->size*sizeof(coeff));
210  MAC_REV_FREE<char>(iter->nfind,iter->sizenf);
211  }
212  recall.erase(recall.begin(),recall.end());
213  //cout<<"destruction dans B"<<endl;
214  for(typename Base::iterator iter=b.begin();iter!=b.end();iter++)
215  {
216  mon *tmp=(mon*)MAC_REV_MALLOC<mon>(iter->taille1*sizeof(mon));
217  int tmptaille=0;
218  for(int i=0;i<iter->taille1;i++)
219  if(iter->accept[i].GetDegree()<=k)
220  //27/08/2001(iter->refuse[i].GetDegree()<=k)
221  {
222  tmp[tmptaille++]=iter->accept[i];
223  }
224  //on suppose que le monomes se detruisent tout seuls
225  //rajouter un destroy mon sinon
226  if(tmptaille==0)
227  {
228  MAC_REV_FREE<mon>(tmp,iter->taille1*sizeof(mon));
229  MAC_REV_FREE<mon>(iter->accept,iter->taille1*sizeof(mon));
230  MAC_REV_FREE<mon>(iter->refuse,iter->taille2*sizeof(mon));
231  b.erase(iter--);
232  continue;
233  //tmp[tmptaille++]=mon(1);
234  }
235  MAC_REV_FREE<mon>(iter->accept,iter->taille1*sizeof(mon));
236  iter->accept=(mon*)MAC_REV_REALLOC<mon>((void*)tmp
237  ,iter->taille1*sizeof(mon)
238  ,tmptaille*sizeof(mon));
239  iter->taille1=tmptaille;
240  //pour les refuses
241  tmp=(mon*)MAC_REV_MALLOC<mon>(iter->taille2*sizeof(mon));
242  tmptaille=0;
243  for(int i=0;i<iter->taille2;i++)
244  //#ifdef BONRAJOUT
245  if (1)
246  //#else
247  if((iter->refuse[i].GetDegree()<=k))
248  //#endif
249  //27/08/2001(iter->refuse[i].GetDegree()<=k)
250  {
251  tmp[tmptaille++]=iter->refuse[i];
252  }
253  //on suppose que les monomes se detruisent tout seuls
254  //rajouter un destroy mon sinon
255  MAC_REV_FREE<mon>(iter->refuse,iter->taille2*sizeof(mon));
256  //iter->taille2=tmptaille;
257  //if(tmptaille==0)
258  //{
259  /*free(iter->refuse);*/
260  // iter->refuse=NULL;
261  //}
262  //else
263  {
264  iter->refuse=(mon*)MAC_REV_REALLOC<mon>((void*)tmp
265  ,iter->taille2*sizeof(mon)
266  ,tmptaille*sizeof(mon));
267  }
268  iter->taille2=tmptaille;
269  }
270  //on vire des differentes composantes B les monomes de degre>k
271  //ca ralentit l'algo mais c coherent sinon on cherche des nf
272  //que l'on ne connait pas
273  //ya un opti a faire ici
274 
275  for(iterdump=dump.begin();iterdump!=stockiter/*dump.end()*/ && iterdump->k<k;iterdump++);
276  // cout<<"je detruit tout a partir du degre "<<k<<endl;
277  if(iterdump!=stockiter)
278  stockiter=iterdump++;//on suppose qu'on a fait
279  if(stockiter!=dump.end())
280  free(stockiter->nf);
281  //un recover avant du meme degre sinon il y a fuite de memoire
282 
283  // if(k==0) {cout<<"pas de sol"<<endl;exit(0);}
284  //cout<<"iter!=dump.end()"<<(iter!=dump.end())<<endl;
285 #if 0
286  if(0&&iterdump!=dump.end())
287  {
288  for(int i=0;i<iterdump->size;i++)
289  recall.push_back(iterdump->nf[i]);
290  iterdump++;
291  }
292 #endif
293  for(;iterdump!=dump.end();iterdump++)
294  {
295  //destruction de pol de cette couche
296  //for(int i=0;i<iterdump->size;i++)
297  // recall.push_back(iterdump->nf[i]);
298  //recall.push_back(invconv<typename typP::value_type>(iterdump->nf[i]));
299  {
300 
301  // cout<<"le pointeur "<<(double*)iterdump->nf[i].nf<<endl;
302  //Tue Dec 4
303  //for(int ii=0;ii<(iterdump->size);ii++)
304  // MAC_REV_FREE<mon>(iterdump->nf[ii].nf
305  // ,iterdump->nf[ii].size*sizeof(mon));
306  //Tue Dec 4
307  for(int ii=0;ii<(iterdump->size);ii++)
308  {
309  MAC_REV_FREE<coeff>(iterdump->nf[ii].nf
310  ,iterdump->nf[ii].size*sizeof(coeff));
311  MAC_REV_FREE<char>(iterdump->nf[ii].nfind
312  ,iterdump->nf[ii].sizenf);
313  }
314  MAC_REV_FREE<pol>(iterdump->nf,iterdump->size*sizeof(pol));
315  }
316  //free(iterdump->nf);
317  }
318  //cout<<"au tour de B "<<endl;
319  dump.erase(stockiter,dump.end());
320 
321 }
322 
323 
324 #endif // ALREADY_dump3
void recover(typPk &Pk, typMk &Mk, const typdump &dump, int k)
Definition: dump3sdp.hpp:168
void forget(Base &b, typdump &dump, int k, typrecall &recall)
Definition: dump3sdp.hpp:41
Definition: dump.hpp:2
int size
Definition: dump.hpp:6
pol pol_t
Definition: dump3sdp.hpp:6
void free(void *)
void forget0(Base &b, typdump &dump, int k, typrecall &recall)
Definition: dump3sdp.hpp:197
Definition: pol.hpp:6
list< predicat >::iterator iterator
Definition: types.hpp:20
int k
Definition: dump.hpp:5
void Dump(const typPk &Pk, typdump &dump)
Definition: dump3sdp.hpp:15
T coeff_t
Definition: pol.hpp:9
MSKint32t k
Definition: mosek.h:2713
C coeff_t
Definition: Monom.hpp:26
void * MAC_REV_MALLOC(int size)
Definition: memory.hpp:39
iterator end()
Definition: types.hpp:30
Mon mon
Definition: solver_bb_floating.cpp:136
Definition: types.hpp:14
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
int sizemonquo
Definition: dump3sdp.hpp:11
pol * nf
Definition: dump.hpp:7
iterator begin()
Definition: types.hpp:25
predicat::monom_t mon
Definition: types.hpp:19
#define pol
Definition: pol2ter.hpp:3
mon * monquo
Definition: dump3sdp.hpp:10
void SetCoeff(const C &c)
Definition: Monom.hpp:68
mon ind
Definition: pol.hpp:11
Multivariate monomials.
Definition: Monom.hpp:21
iterator erase(iterator first, iterator last)
Definition: types.hpp:35
Home  |  Download & InstallContributions