Borderbasix

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