16 #ifndef polybori_groebner_minimal_elements_h_
17 #define polybori_groebner_minimal_elements_h_
58 s1=s1.diff(s0.unateProduct(
Polynomial(s1).usedVariablesExp().divisors(s.
ring())));
61 return s0.unite(s1.
change(i));
77 if ((cv.size()>0) && (s.
length()==cv.size())){
83 for(z=cv.size()-1;z>=0;z--){
85 cv_set=cv_set.unite(mv.
diagram());
87 for(z=0;z<cv.size();z++){
93 if (s.
isZero())
return result;
126 s1=s1.diff(s0.unateProduct(
Polynomial(s1).usedVariables().divisors()));
129 return s0.unite(s1.
change(i)).unite(result);
133 inline std::vector<Exponent>
135 std::vector<Exponent> result;
136 if (s.
isZero())
return result;
152 std::vector<Exponent> exponents;
156 std::vector<std::vector<int> > occ_vecs(nvars);
161 occ_vecs[*it].push_back(i);
170 std::vector<bool> still_minimal(exponents.size());
172 still_minimal[i]=
true;
177 if (still_minimal[i]){
182 std::vector<int> occ_set=occ_vecs[first_index];
186 std::vector<int> occ_set_next;
190 occ_vecs[*it].begin(),
192 std::back_insert_iterator<std::vector<int> >(occ_set_next));
193 occ_set=occ_set_next;
197 std::vector<int>::const_iterator oc_it= occ_set.begin();
198 std::vector<int>::const_iterator oc_end= occ_set.end();
199 while(oc_it!=oc_end){
200 still_minimal[*oc_it]=
false;
204 it=((
const Exponent&) exponents[i]).begin();
206 std::vector<int> occ_set_difference;
208 occ_vecs[*it].begin(),
212 std::back_insert_iterator<std::vector<int> >(occ_set_difference));
213 occ_vecs[*it]=occ_set_difference;
216 result.push_back(exponents[i]);
237 std::cout <<
"ERROR minimalElements"<<std::endl;
238 std::cout <<
"orig "<<s<< std::endl;
239 std::cout <<
"correct "<<minElts<< std::endl;
263 typedef PBORI::CacheManager<CCacheTypes::minimal_elements>
268 cache_mgr_type cache_mgr(m.
ring());
269 PBORI::BoolePolynomial::navigator cached =
270 cache_mgr.find(m_nav);
274 if (cached.isValid() ){
275 return cache_mgr.generate(cached);
281 if ((minimal_else.
navigation()==ms0) &&(minimal_then.navigation()==ms1)) result=m;
283 result=
MonomialSet(*m_nav,minimal_then,minimal_else);
285 cache_mgr.insert(m_nav, result.navigation());
308 if (m.
isZero())
return cv;
309 bool cv_empty=cv.
isZero();
320 while((!(nav_mod.
isConstant())) && (index>*nav_mod)){
332 typedef PBORI::CacheManager<CCacheTypes::minimal_mod>
337 cache_mgr_type cache_mgr(m.
ring());
338 PBORI::BoolePolynomial::navigator cached =
339 cache_mgr.find(m_nav, mod_nav);
343 if (cached.isValid() ){
344 return cv.unite((
MonomialSet)cache_mgr.generate(cached));
360 cache_mgr.generate(ms1),result0.unite(mod));
361 if (result1.isZero()) {result=result0;}
373 result0.unite(cache_mgr.generate(ms0).unite(cache_mgr.generate(mod1))));
378 if (cv_empty)
return result;
380 return cv.unite(result);
399 return m.unateProduct(lm.
set());
404 inline std::vector<Monomial>
408 return std::vector<Monomial>(result.
begin(), result.
end());
414 #ifdef MIN_ELEMENTS_BINARY
418 if (m.divisorsOf(lm).isZero()){
419 m=divide_monomial_divisors_out(m,lm);
423 return m.ring().one();
447 std::vector<Exponent>& result){
449 result.resize(elements.
length());
450 std::copy(elements.
expBegin(), elements.
expEnd(), result.begin());