Borderbasix

gotzman.hpp
Go to the documentation of this file.
1 #include<iterator>
2 #include<set>
3 #include<list>
4 template<typename Base, typename typstock, typename typdump>
5 void enumeratemon_in_B(typstock &stockmon, int k,
6  const Base &b, const typdump &dump)
7 {
8  typedef typename typstock::value_type mon;
9  //int maxdeg=0;
10  std::set<mon> current;
11  current.insert(mon(1));
12  //
13  //
14  //on a le degre max : k
15  // on part de 1 et on decrit le reste en multipliant par les variables
16  //
17  //
18  std::set<mon> tmpcurrent=current;
19  for(int i=0;i<k;i++)
20  {
21  // cout<<"tour de boulce "<<i<<endl;
22 
23 
24  current.erase(current.begin(),current.end());
25  for(int i=0;i<b.nbvar();i++)
26  {
27  for(typename std::set<mon>::iterator iter=tmpcurrent.begin();
28  iter!=tmpcurrent.end();iter++)
29  {
30  mon tmpmon=(*iter)*mon(i,1);
31  tmpmon.SetCoeff(1);
32  current.insert(tmpmon);
33  // cout<<"est insere "<<tmpmon<<endl;
34  }
35  }
36  //maintenant on tri;
37  tmpcurrent.erase(tmpcurrent.begin(),tmpcurrent.end());
38  for(typename std::set<mon>::iterator iter=current.begin();
39  iter!=current.end();iter++)
40  {
41  // cout<<"j'examine "<<*iter<<" IsinB "<<IsinB(*iter,b)<<endl;
42  if(IsinB(*iter,b))
43  {
44  tmpcurrent.insert(*iter);
45  }
46  }
47  }
48  for(typename std::set<mon>::iterator iter=tmpcurrent.begin();
49  iter!=tmpcurrent.end();iter++)
50  {
51  // cout<<"je rajoute "<<*iter<<endl;
52  stockmon.push_back(*iter);
53  }
54 }
55 
56 template<typename Base, typename typdump, typename typserv>
57 void initial_mon(const Base &b,typdump & dump,typserv &serv)
58 {
59  typedef typename typserv::monom_t mon;
60  std::list<mon> stockmon;
61  enumeratemon_in_B(stockmon,dump.front().k,b,dump);
62  dump.back().moninB.erase(dump.back().moninB.begin(),
63  dump.back().moninB.end());
64  for(typename std::list<mon>::iterator iter=stockmon.begin()
65  ;iter!=stockmon.end();iter++)
66  dump.back().moninB.push_back(*iter);
67  // copy(stockmon.begin(),stockmon.end(),dump.back().moninB.begin());
68  //cout<<"stockmon.k "<<stockmon.size()<<endl;
69  //cout<<"dump.back().k "<<dump.back().k<<" "<<dump.back().moninB.size()<<endl;
70 }
71 
72 
73 template<typename Base, typename typdump,typename typserv >
74 void nextmon(const Base &b, typdump &dump, typserv &serv)
75 {
76  typedef typename typdump::value_type::mon mon;
77  typename typdump::reverse_iterator ante=dump.rbegin();
78  std::list<mon> stockmon;
79  ante++;
80  if(ante==dump.rend())
81  {
82  //on est en train de remplir
83  // le dump struct de plus bas degree donc pas moyende s'appuyer
84  //sur un truc avant
85  initial_mon(b,dump,serv);
86  }
87  else
88  {
89  //cout<<"ante "<<ante->moninB.size()<<" "<<ante->k<<endl;
90  // copy(ante->moninB.begin(),ante->moninB.end(),
91  // ostream_iterator<mon>(cout," "));
92  std::set<mon> current;
93 
94  for(int i=0;i<b.nbvar();i++)
95  {
96 
97  for(typename std::list<mon>::iterator iter=ante->moninB.begin();
98  iter!=ante->moninB.end();iter++)
99  {
100  mon tmpmon=(*iter)*mon(i,1);
101  tmpmon.SetCoeff(1);
102  current.insert(tmpmon);
103  // cout<<"est insere "<<tmpmon<<" "<<*iter<<endl;
104  }
105  }
106  dump.back().moninB.erase(dump.back().moninB.begin(),
107  dump.back().moninB.end());
108 
109  //maintenant on tri;
110  for(typename std::set<mon>::iterator iter=current.begin();
111  iter!=current.end();iter++)
112  {
113  // cout<<"j'examine "<<*iter<<" IsinB "<<IsinB(*iter,b)<<endl;
114  if(IsinB(*iter,b))
115  {
116  //current.erase(iter);
117  dump.back().moninB.push_back(*iter);
118  }
119  }
120  // copy(stockmon.begin(),stockmon.end(),dump.back().moninB.begin());
121  }
122 }
123 template<typename Base, typename typdump, typename typserv>
124 void initial_mon(int k,const Base &b,typdump & dump,typserv &serv)
125 {
126  typedef typename typserv::monom_t mon;
127  std::list<mon> stockmon;
128  enumeratemon_in_B(stockmon,k,b,dump);
129  dump.back().moninB.erase(dump.back().moninB.begin(),
130  dump.back().moninB.end());
131  for(typename std::list<mon>::iterator iter=stockmon.begin()
132  ;iter!=stockmon.end();iter++)
133  dump.back().moninB.push_back(*iter);
134  // copy(stockmon.begin(),stockmon.end(),dump.back().moninB.begin());
135  //cout<<"stockmon.k "<<stockmon.size()<<endl;
136  //cout<<"dump.back().k "<<dump.back().k<<" "<<dump.back().moninB.size()<<endl;
137 }
138 
139 template<typename Base, typename typdump,typename typserv >
140 void nextmon(int k,const Base &b, typdump &dump, typserv &serv)
141 {
142  typedef typename typdump::value_type::mon mon;
143  typename typdump::reverse_iterator ante=dump.rbegin();
144  std::list<mon> stockmon;
145  ante++;
146  if(ante==dump.rend())
147  {
148  //on est en train de remplir
149  // le dump struct de plus bas degree donc pas moyende s'appuyer
150  //sur un truc avant
151  initial_mon(k,b,dump,serv);
152  }
153  else
154  {
155  //cout<<"ante "<<ante->moninB.size()<<" "<<ante->k<<endl;
156  // copy(ante->moninB.begin(),ante->moninB.end(),
157  // ostream_iterator<mon>(cout," "));
158  std::set<mon> current;
159 
160  for(int i=0;i<b.nbvar();i++)
161  {
162 
163  for(typename std::list<mon>::iterator iter=ante->moninB.begin();
164  iter!=ante->moninB.end();iter++)
165  {
166  mon tmpmon=(*iter)*mon(i,1);
167  tmpmon.SetCoeff(1);
168  current.insert(tmpmon);
169  // cout<<"est insere "<<tmpmon<<" "<<*iter<<endl;
170  }
171  }
172  dump.back().moninB.erase(dump.back().moninB.begin(),
173  dump.back().moninB.end());
174 
175  //maintenant on tri;
176  for(typename std::set<mon>::iterator iter=current.begin();
177  iter!=current.end();iter++)
178  {
179  // cout<<"j'examine "<<*iter<<" IsinB "<<IsinB(*iter,b)<<endl;
180  if(IsinB(*iter,b))
181  {
182  //current.erase(iter);
183  dump.back().moninB.push_back(*iter);
184  }
185  }
186  // copy(stockmon.begin(),stockmon.end(),dump.back().moninB.begin());
187  }
188 }
189 
190 template<typename Base, typename typdump, typename typserv>
191 int critere_got(const Base &b,typdump &dump,typserv &serv)
192 {
193  static int last=-1;//C'est une dimension ca peut jamais valoir -1
194  //C 'est dc une bonne initialisation
195  //copy(dump.back().moninB.begin(),dump.back().moninB.end(),ostream_iterator<mon>(cout," prout \n"));
196  //cout<<"GOTZMANNN : j'attends "<<last<<" et j'ai : "<<dump.back().moninB.size()<<endl;
197  if((int)dump.back().moninB.size()==last)
198  return 1;
199  else
200  {
201  std::vector<int> macdec;
202  // cout<<"Debut Macdev"<<endl;
203  Macaulay_dec(macdec,dump.back().k,dump.back().moninB.size());
204 
205 
206 
207  //Macaulay_dec(macdec,b.nbvars-1,dump.back().moninB.size());
208  //cout<<"Mac dec de "<<dump.back().moninB.size()<<" et k "<<dump.back().k<<endl;
209  // copy(macdec.begin(),macdec.end(),std::ostream_iterator<int>(cout," "));
210  last=nextdim(macdec,dump.back().k);
211  // last=nextdim(macdec,b.nbvars-1);
212  //cout<<endl<<"nouvelle dim attendue "<<last<<endl;
213  }
214  return 0;
215 }
MSKaccmodee MSKint32t MSKint32t last
Definition: mosek.h:2545
long nextdim(std::vector< int > &coeff_mac, int k)
Definition: macaulay.hpp:45
void nextmon(const Base &b, typdump &dump, typserv &serv)
Definition: gotzman.hpp:74
int nbvar()
Definition: types.hpp:37
int critere_got(const Base &b, typdump &dump, typserv &serv)
Definition: gotzman.hpp:191
MSKint32t k
Definition: mosek.h:2713
void enumeratemon_in_B(typstock &stockmon, int k, const Base &b, const typdump &dump)
Definition: gotzman.hpp:5
int IsinB(const mon &m, const Base &b)
Definition: IsinB3.hpp:68
Mon mon
Definition: solver_bb_floating.cpp:136
Definition: types.hpp:14
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
void initial_mon(const Base &b, typdump &dump, typserv &serv)
Definition: gotzman.hpp:57
void SetCoeff(const C &c)
Definition: Monom.hpp:68
void Macaulay_dec(std::vector< int > &coeff_mac, int k, int dim)
Definition: macaulay.hpp:32
Home  |  Download & InstallContributions