The normal user should not use this class directly. The class UniversalInvolutiveBasisContainer (short UIBC) is only an interface between everything which is related to involutive bases and the ideal
class.
The UIBC acts as an interface between JBMill
/PBMill
and an ideal
. It handles
every request of an ideal
to a JBMill
/PBMill
and computes if necessary a
Janet or Pommaret basis. In addition to that the UIBC stores every computed
value which is related to a Janet or Pommaret basis. Therefore it needs to
compute values like the dimension only once, because for additional calls it
already knows these values.
The UIBC is designed as a subclass of IntrusiveReferenceCount
. The reason for that
is that we use this class as a SmartPtrIRC
. Nearly every datamember of UIBC is mutable
one.
The only non-mutable one is gens
, which is a vector of RingElem
s. gens
is constant e.g.
after the initialization we can't change this value anymore. As all other data members of
UIBC are directly dependent from this generating set we make them mutable. In general
every mutable data member is 'empty'. Only if the user requests one of this values we check
if this value is non-empty and return it. If is empty we compute this value and return it.
The class SparsePolyRing::IdealImpl
contains SmartPtrIRC<Involutive::UniversalInvolutiveBasisContainer>
as data member. It implements several methods to compute values via the UIBC. In addition to that
we have some non-member methods in the namespace Involutive
, which access these methods.
At the moment UIBC contains a JBMill
and a PBMill
. Because PBMill
is a subclass of JBMill
which
only extens JBMill
it would be better if (in case of delta-regular coordinates) we only store a PBMill
.
It would be useful to set different Janet basis computation strategies via the ideal implementation. But for this we need
to know Involutive::StrategyFlag
already in SparsePolyRing.C
. But that is not a clean solution... (See discussion in redmine!)