Some notes for how to modify the current code. Todo list --------- > Remove unnecessary/old code > Remove unnecessary parentheses > Separate CompTable modifying functions from service-functions.m2 (see discussion below). > Strategy "Markov basis" --- only subduct on generators of the binomial ideal (rather than a GB), which we can compute quickly using FourTiTwo. -- do we have an implementation that would work with just the binomial generators > Which subductions to export? Anything without compTable ? Can we export only some methods ? > Determine what "subduction" and "%" should do with (RingElement, SAGBIBasis) -- currently this "subduction" is not implemented and "%" performs a subduction. > [DONE - Needs Checking] Implement the correct caching behaviour in subalgebraBasis and sagbi: -- A subring is an immutable object - in its cache we store the 'most computationally advanced' SAGBIBasis object -- When resuming a subalgebraBasis or sagbi computation from a SAGBIBasis object, use the previously selected options * Only adjust the Limit option -- Add another option to sagbi / subalgebraBasis: RenewOptions (default: false) * if RenewOptions == true then set all the options to ones supplied by the user * RenewOptions is false by default because the first priority is to recover the options from the previous computation -- matrices cache a Subring which, in turn, cache the SAGBIBasis > [DONE] When picking up where a computation left off, if the original set of generators was autosubducted then don't autosubduct again. -- Could be implemented by setting the AutoSubduce option to false once autosubduction is done > sort out keys for subrings - remove the quotes around the keys ? Can we use unexported symbols for keys in classes ? > [DONE - Needs Checking] sagbi and subalgebraBasis always uses the sagbiBasis object of the subring in the cache of the passed in object -- E.g. sagbi M (matrix) --> sagbi M.cache#"Subring".cache."SAGBIBasis" (or something like that) -- In the above example, if the matrix has no subring cached then calling sagbi on a matrix makes a subring -- methodology: have only 1 subring floating around linked with the latest computation object > [DONE - Needs Checking] groebner membership test for quotients ? Can we just sum the ideal I and the quotienting ideal (lifted to the tensor ring) ? > Add more asserts! > [DONE] Add groebnerNormalForm method. It should be a non-exported method that returns an element of the tensor ring -- it can be used by groebnerMembershipTest and % -- this method may also want to return a projection map from the tensorRing to the ambientRing > [DONE] copy over the intersection of subrings method to classes. -- Add other input options: e.g. intersection(SAGBIBasis, SAGBIBasis), etc. > [DONE] forceSAGBI - assert that a subring / matrix of generators is a sagbi basis > intrinsic subductionQuotient the subduction quotient is currently implemented in an extrinsic way that uses % to compute the normal form and a factorised form (in terms of the generators) of a given element f of the ambient ring. Using subduction, we can also construct this factorised form. When a sagbi basis is computed, we must: -- Keep track of the factorisation of the new sagbi generators in terms of the subring generators Then, given an element f of the ambient ring, when we perform subduction on it with respect to a sagbi basis we must keep track of the factorisation of the lead terms that cancel the lead terms of monomials of f Discussion ---------- Ollie: It would be great to have a separate file(s) for subduction/sagbi related functions. Currently, service-functions.m2 is getting very crowded and contains many levels of functions: E.g. updateComputation passes off to one of three different functions. There are at least two ways to solve this: 1) Have functions that do similar things in one file, such as the four update-related functions above 2) Have functions on a similar level in one file, such as updateComputation in a higher-level file than what it calls We already do this for sagbi, since it sits in one file and calls stuff in service-functions.m2