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
The UIBC acts as an interface between
PBMill and an
ideal. It handles
every request of an
ideal to a
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
The only non-mutable one is
gens, which is a vector of
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.
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 is a subclass of
JBMill it would be better if (in case of delta-regular coordinates) we only store a
It would be useful to set different Janet basis computation strategies via the ideal implementation. But for this we need
Involutive::StrategyFlag already in
SparsePolyRing.C. But that is not a clean solution... (See discussion in redmine!)