Borderbasix

dump.hpp
Go to the documentation of this file.
1 template<typename pol>
2 struct dumpstruct
3 {
4  typedef pol pol_t;
5  int k;
6  int size;
7  pol * nf;
8 };
9 template<typename poldense,typename polsparse>
10 void sparsify(const poldense &p, polsparse & res)
11 {
12  typedef typename poldense::monom_t mon;
13  mon tmpmon;
14  int comp=0;
15  res.ind=p.ind;
16  res.size=0;
17  for(int i=0;i<p.size;i++)
18  if(!Iszero(p.nf[i])) res.size++;
19  res.nf=(mon*)MAC_REV_MALLOC<mon>(res.size*sizeof(mon));
20  for(int i=0;i<p.size;i++)
21  if(!Iszero(p.nf[i]))
22  {
23  int2mon(i,tmpmon);
24  tmpmon.SetCoeff(p.nf[i]);
25  res.nf[comp++]=tmpmon;
26  }
27 }
28 
29 template<typename poldense,typename polsparse>
30 void densify(const polsparse & p, poldense &res)
31 {
32  typedef typename poldense::coeff_t coeff;
33  res.ind=p.ind;
34  res.size=0;
35  for(int i=0;i<p.size;i++)
36  if(mon2int(p.nf[i])>res.size) res.size=mon2int(p.nf[i]);
37  res.size++;
38  res.nf=(coeff*)MAC_REV_MALLOC<coeff>(res.size*sizeof(coeff));
39  for(int i=0;i<res.size;i++)
40  res.nf[i]=0;
41  for(int i=0;i<p.size;i++)
42  {
43  res.nf[mon2int(p.nf[i])]=p.nf[i].GetCoeff();
44  }
45 }
46 
47 template<typename typPk, typename typdump>
48 void Dump(const typPk & Pk ,typdump &dump)
49 {
50  typedef typename typdump::value_type dumpstruct;
51  int i=0;
52  dumpstruct next;
53  if(!Pk.empty())
54  {
55  next.k=Pk.front().ind.GetDegree();
56  next.size=Pk.size();
57  next.nf=(typename dumpstruct::pol_t *)MAC_REV_MALLOC
58  <typename dumpstruct::pol_t>(Pk.size()*
59  sizeof(typename dumpstruct::pol_t));
60  for(typename typPk::const_iterator iter=Pk.begin();iter!=Pk.end();iter++,i++)
61  {
62  next.nf[i]=*iter;
63  //Tue Dec 4 16:12:10 MET 2001
64  //sparsify(*iter,next.nf[i]);
65  //Tue Dec 4 16:12:10 MET 2001
66  next.nf[i].ind.SetCoeff(1);
67  // cout<<"dans le dump "<<iter->ind<<" "<<next.nf[i].ind<<endl;
68  //cout<<"et le ptr "<<iter->nf<<" "<<next.nf[i].nf<<endl;
69  }
70  dump.push_back(next);
71  }
72  return;
73 }
74 template<typename Base,typename typdump,typename typrecall>
75 void forget(Base &b,typdump &dump,int k,typrecall & recall)
76 
77  //template<typename Base,typename typdump>
78  //void forget(Base &b,typdump &dump,const int &k)
79 {
80  typedef typename Base::mon mon;
81  typedef typename mon::coeff_t coeff;
82  typedef typename typdump::value_type::pol_t pol;
83  typename typdump::iterator iterdump=dump.begin(),stockiter=dump.end();
84  //Tue Dec 4 16:12:10 MET 2001
85  //for(typename typrecall::iterator iter=recall.begin();iter!=recall.end();iter++)
86  //MAC_REV_FREE<mon>(iter->nf,iter->size*sizeof(mon));
87  //Tue Dec 4 16:12:10 MET 2001
88  for(typename typrecall::iterator iter=recall.begin();iter!=recall.end();iter++)
89  MAC_REV_FREE<coeff>(iter->nf,iter->size*sizeof(coeff));
90  recall.erase(recall.begin(),recall.end());
91  //cout<<"destruction dans B"<<endl;
92  for(typename Base::iterator iter=b.begin();iter!=b.end();iter++)
93  {
94  mon *tmp=(mon*)MAC_REV_MALLOC<mon>(iter->taille1*sizeof(mon));
95  int tmptaille=0;
96  for(int i=0;i<iter->taille1;i++)
97  if(iter->accept[i].GetDegree()<=k)
98  //27/08/2001(iter->refuse[i].GetDegree()<=k)
99  {
100  tmp[tmptaille++]=iter->accept[i];
101  }
102  //on suppose que le monomes se detruisent tout seuls
103  //rajouter un destroy mon sinon
104  if(tmptaille==0)
105  {
106  MAC_REV_FREE<mon>(tmp,iter->taille1*sizeof(mon));
107  MAC_REV_FREE<mon>(iter->accept,iter->taille1*sizeof(mon));
108  MAC_REV_FREE<mon>(iter->refuse,iter->taille2*sizeof(mon));
109  b.erase(iter--);
110  continue;
111  //tmp[tmptaille++]=mon(1);
112  }
113  MAC_REV_FREE<mon>(iter->accept,iter->taille1*sizeof(mon));
114  iter->accept=(mon*)MAC_REV_REALLOC<mon>((void*)tmp
115  ,iter->taille1*sizeof(mon)
116  ,tmptaille*sizeof(mon));
117  iter->taille1=tmptaille;
118  //pour les refuses
119  tmp=(mon*)MAC_REV_MALLOC<mon>(iter->taille2*sizeof(mon));
120  tmptaille=0;
121  for(int i=0;i<iter->taille2;i++)
122  if(iter->refuse[i].GetDegree()<=k)
123  //27/08/2001(iter->refuse[i].GetDegree()<=k)
124  {
125  tmp[tmptaille++]=iter->refuse[i];
126  }
127  //on suppose que les monomes se detruisent tout seuls
128  //rajouter un destroy mon sinon
129  MAC_REV_FREE<mon>(iter->refuse,iter->taille2*sizeof(mon));
130  //iter->taille2=tmptaille;
131  //if(tmptaille==0)
132  //{
133  /*free(iter->refuse);*/
134  // iter->refuse=NULL;
135  //}
136  //else
137  {
138  iter->refuse=(mon*)MAC_REV_REALLOC<mon>((void*)tmp
139  ,iter->taille2*sizeof(mon)
140  ,tmptaille*sizeof(mon));
141  }
142  iter->taille2=tmptaille;
143  }
144  //on vire des differentes composantes B les monomes de degre>k
145  //ca ralentit l'algo mais c coherent sinon on cherche des nf
146  //que l'on ne connait pas
147  //ya un opti a faire ici
148 
149  for(iterdump=dump.begin();iterdump!=stockiter/*dump.end()*/ && iterdump->k<k;iterdump++);
150  // cout<<"je detruit tout a partir du degre "<<k<<endl;
151  if(iterdump!=stockiter)
152  stockiter=iterdump++;//on suppose qu'on a fait
153  if(stockiter!=dump.end())
154  free(stockiter->nf);
155  //un recover avant du meme degre sinon il y a fuite de memoire
156 
157  if(k==0) {cout<<"pas de sol"<<endl;exit(0);}
158  //cout<<"iter!=dump.end()"<<(iter!=dump.end())<<endl;
159  if(0&&iterdump!=dump.end())
160  {
161  for(int i=0;i<iterdump->size;i++)
162  recall.push_back(iterdump->nf[i]);
163  iterdump++;
164  }
165  for(;iterdump!=dump.end();iterdump++)
166  {
167  //destruction de pol de cette couche
168  //for(int i=0;i<iterdump->size;i++)
169  // recall.push_back(iterdump->nf[i]);
170  //recall.push_back(invconv<typename typP::value_type>(iterdump->nf[i]));
171  {
172 
173  // cout<<"le pointeur "<<(double*)iterdump->nf[i].nf<<endl;
174  //Tue Dec 4
175  //for(int ii=0;ii<(iterdump->size);ii++)
176  // MAC_REV_FREE<mon>(iterdump->nf[ii].nf
177  // ,iterdump->nf[ii].size*sizeof(mon));
178  //Tue Dec 4
179  for(int ii=0;ii<(iterdump->size);ii++)
180  MAC_REV_FREE<coeff>(iterdump->nf[ii].nf
181  ,iterdump->nf[ii].size*sizeof(coeff));
182  MAC_REV_FREE<pol>(iterdump->nf,iterdump->size*sizeof(pol));
183  }
184  //free(iterdump->nf);
185  }
186  //cout<<"au tour de B "<<endl;
187  dump.erase(stockiter,dump.end());
188 
189 }
190 
191 template<typename typPk, typename typMk, typename typdump>
192 void recover(typPk &Pk,typMk &Mk, const typdump & dump, int k)
193 {
194  typedef typename typPk::value_type pol;
195  typename typdump::const_iterator iter;
196  typedef typename pol::coeff_t coeff;
197  //if (k!=Pk.front().GetDegree())
198  {
199  //les mecs dans Pkont ete dumpe normalment donc il faut pas les detruire
200  //sinon on est embette par forget qui va chercher a la faire aussi
201  Pk.erase(Pk.begin(),Pk.end());
202  Mk.erase(Mk.begin(),Mk.end());
203  for(iter=dump.begin();(iter!=dump.end())&&(iter->k<k);iter++);
204  // if (iter!=dump.end()) cout<<"iter->k "<<iter->k<<endl;
205  if ((iter!=dump.end())&&(iter->k==k))
206  for(int i=0;i<iter->size;i++)
207  {
208  //Tue Dec 4 16:12:10 MET 2001
209  // pol tmppol;
210  //densify(iter->nf[i],tmppol);
211  //Pk.push_back(tmppol);
212  //Tue Dec 4 16:12:10 MET 2001
213  Pk.push_back(iter->nf[i]);
214  Mk.push_back(Pk.rbegin()->ind);
215  }
216  }
217  return;
218 }
219 
220 
Definition: dump.hpp:2
int size
Definition: dump.hpp:6
pol pol_t
Definition: dump.hpp:4
void free(void *)
Definition: pol.hpp:6
list< predicat >::iterator iterator
Definition: types.hpp:20
int k
Definition: dump.hpp:5
void recover(typPk &Pk, typMk &Mk, const typdump &dump, int k)
Definition: dump.hpp:192
void Dump(const typPk &Pk, typdump &dump)
Definition: dump.hpp:48
T coeff_t
Definition: pol.hpp:9
int mon2int(const mon &mm)
Definition: placemon.hpp:294
void int2mon(const int &i, mon &res)
Definition: placemon.hpp:288
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 Iszero(const Scl< MPQ > &c)
Definition: Iszero.hpp:14
void sparsify(const poldense &p, polsparse &res)
Definition: dump.hpp:10
void forget(Base &b, typdump &dump, int k, typrecall &recall)
Definition: dump.hpp:75
pol * nf
Definition: dump.hpp:7
iterator begin()
Definition: types.hpp:25
void densify(const polsparse &p, poldense &res)
Definition: dump.hpp:30
predicat::monom_t mon
Definition: types.hpp:19
#define pol
Definition: pol2ter.hpp:3
void SetCoeff(const C &c)
Definition: Monom.hpp:68
mon ind
Definition: pol.hpp:11
iterator erase(iterator first, iterator last)
Definition: types.hpp:35
Home  |  Download & InstallContributions