PolyBoRi
RelatedTermsBase.h
Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00014 //*****************************************************************************
00015 
00016 #ifndef polybori_groebner_RelatedTermsBase_h_
00017 #define polybori_groebner_RelatedTermsBase_h_
00018 
00019 #include "minimal_elements.h"
00020 #include <polybori/ring/CMemberFunctionTraits.h>
00021 #include "BoundedDivisorsOf.h"
00022 
00023 // include basic definitions
00024 #include "groebner_defs.h"
00025 
00026 BEGIN_NAMESPACE_PBORIGB
00027 
00032 class RelatedTermsBase {
00033 
00034 public:
00036   RelatedTermsBase(const BoolePolyRing& ring):
00037     m_lead(ring), m_ignorable(ring), m_ext_prod_terms(ring),
00038     m_related(ring), m_divisors_of(ring, ring) { }
00039 
00041   RelatedTermsBase(const Monomial& lead, const MonomialSet& terms,
00042                    const MonomialSet& ignorable, const MonomialSet& significant):
00043     m_lead(lead), m_ignorable(ignorable),  m_ext_prod_terms(lead.ring()),
00044     m_related(lead.ring()), m_divisors_of(lead, significant)  {
00045 
00046     init(significant, unrelated_terms(significant));
00047   }
00048 
00050   const MonomialSet& related_terms() const { return m_related; }
00051 
00053   const BoundedDivisorsOf& divisors_of() const { return  m_divisors_of; }
00054 
00056   MonomialSet factors(const MonomialSet& terms) const {
00057     return minimal_elements_divided(critical_terms_base(terms), m_lead,
00058                                     m_ext_prod_terms);
00059   }
00060 
00062   MonomialSet critical_terms_base(const MonomialSet& terms) const {
00063     return mod_mon_set(m_related.intersect(terms), m_ignorable);
00064   }
00065 
00067   MonomialSet unrelated_terms(const MonomialSet& terms) const {
00068     return std::accumulate(m_lead.begin(), m_lead.end(), terms,
00069                            member_function_operator(&MonomialSet::subset0) );
00070   }
00071 
00072 private:
00074   void init(const MonomialSet& significant, const MonomialSet& unrelated) {
00075     PBORI_ASSERT(!m_ignorable.owns(m_lead) && !significant.ownsOne());
00076     m_related = significant.diff(unrelated);
00077     m_ext_prod_terms = m_ignorable.existAbstract(m_lead).diff(unrelated);
00078   }
00079 
00080   Monomial m_lead;
00081   MonomialSet m_ignorable;
00082   MonomialSet m_ext_prod_terms; // Contains terms of @c m_ignorable related to
00083                                 // @c m_lead with its variables substituted by 1
00084   MonomialSet m_related;
00085   BoundedDivisorsOf m_divisors_of;
00086 };
00087 
00088 END_NAMESPACE_PBORIGB
00089 
00090 #endif /* polybori_groebner_RelatedTermsBase_h_ */