001/*
002 * $Id$
003 */
004
005package edu.jas.gbmod;
006
007
008import java.util.ArrayList;
009import java.util.List;
010
011import org.apache.logging.log4j.Logger;
012import org.apache.logging.log4j.LogManager; 
013
014import edu.jas.poly.GenSolvablePolynomial;
015import edu.jas.poly.GenSolvablePolynomialRing;
016import edu.jas.poly.ModuleList;
017import edu.jas.poly.PolynomialList;
018import edu.jas.poly.TermOrder;
019import edu.jas.structure.RingElem;
020
021
022/**
023 * Module solvable Groebner Bases abstract class. Implements module solvable
024 * Groebner bases and GB test.
025 * @param <C> coefficient type
026 * @author Heinz Kredel
027 * @deprecated use respective methods from SolvableGroebnerBaseAbstract
028 */
029@Deprecated
030public abstract class ModSolvableGroebnerBaseAbstract<C extends RingElem<C>> implements
031                ModSolvableGroebnerBase<C> {
032
033
034    private static final Logger logger = LogManager.getLogger(ModSolvableGroebnerBaseAbstract.class);
035
036
037    private static final boolean debug = logger.isDebugEnabled();
038
039
040    /**
041     * Module left Groebner base test.
042     * @param M a module basis.
043     * @return true, if M is a left Groebner base, else false.
044     */
045    public boolean isLeftGB(ModuleList<C> M) {
046        if (M == null || M.list == null) {
047            return true;
048        }
049        if (M.rows == 0 || M.cols == 0) {
050            return true;
051        }
052        int modv = M.cols; // > 0  
053        PolynomialList<C> F = M.getPolynomialList();
054        return isLeftGB(modv, F.castToSolvableList());
055    }
056
057
058    /**
059     * Left Groebner base using pairlist class.
060     * @param M a module basis.
061     * @return leftGB(M) a left Groebner base for M.
062     */
063    @SuppressWarnings("unchecked")
064    public ModuleList<C> leftGB(ModuleList<C> M) {
065        ModuleList<C> N = M;
066        if (M == null || M.list == null) {
067            return N;
068        }
069        if (M.rows == 0 || M.cols == 0) {
070            return N;
071        }
072        PolynomialList<C> F = M.getPolynomialList();
073        if (debug) {
074            logger.info("F left +++++++++++++++++++ \n{}", F);
075        }
076        GenSolvablePolynomialRing<C> sring = (GenSolvablePolynomialRing<C>) F.ring;
077        int modv = M.cols;
078        List<GenSolvablePolynomial<C>> G = leftGB(modv, F.castToSolvableList());
079        F = new PolynomialList<C>(sring, G);
080        if (debug) {
081            logger.info("G left +++++++++++++++++++ \n{}", F);
082        }
083        N = F.getModuleList(modv);
084        return N;
085    }
086
087
088    /**
089     * Module twosided Groebner base test.
090     * @param M a module basis.
091     * @return true, if M is a twosided Groebner base, else false.
092     */
093    public boolean isTwosidedGB(ModuleList<C> M) {
094        if (M == null || M.list == null) {
095            return true;
096        }
097        if (M.rows == 0 || M.cols == 0) {
098            return true;
099        }
100        PolynomialList<C> F = M.getPolynomialList();
101        int modv = M.cols; // > 0  
102        return isTwosidedGB(modv, F.castToSolvableList());
103    }
104
105
106    /**
107     * Twosided Groebner base using pairlist class.
108     * @param M a module basis.
109     * @return tsGB(M) a twosided Groebner base for M.
110     */
111    @SuppressWarnings("unchecked")
112    public ModuleList<C> twosidedGB(ModuleList<C> M) {
113        ModuleList<C> N = M;
114        if (M == null || M.list == null) {
115            return N;
116        }
117        if (M.rows == 0 || M.cols == 0) {
118            return N;
119        }
120        PolynomialList<C> F = M.getPolynomialList();
121        GenSolvablePolynomialRing<C> sring = (GenSolvablePolynomialRing<C>) F.ring;
122        int modv = M.cols;
123        List<GenSolvablePolynomial<C>> G = twosidedGB(modv, F.castToSolvableList());
124        F = new PolynomialList<C>(sring, G);
125        N = F.getModuleList(modv);
126        return N;
127    }
128
129
130    /**
131     * Module right Groebner base test.
132     * @param M a module basis.
133     * @return true, if M is a right Groebner base, else false.
134     */
135    public boolean isRightGB(ModuleList<C> M) {
136        if (M == null || M.list == null) {
137            return true;
138        }
139        if (M.rows == 0 || M.cols == 0) {
140            return true;
141        }
142        int modv = M.cols; // > 0  
143        PolynomialList<C> F = M.getPolynomialList();
144        //System.out.println("F test = " + F);
145        return isRightGB(modv, F.castToSolvableList());
146    }
147
148
149    /**
150     * Right Groebner base using pairlist class.
151     * @param M a module basis.
152     * @return rightGB(M) a right Groebner base for M.
153     */
154    @SuppressWarnings("unchecked")
155    public ModuleList<C> rightGB(ModuleList<C> M) {
156        ModuleList<C> N = M;
157        if (M == null || M.list == null) {
158            return N;
159        }
160        if (M.rows == 0 || M.cols == 0) {
161            return N;
162        }
163        if (debug) {
164            logger.info("M ====================== \n{}", M);
165        }
166        TermOrder to = M.ring.tord;
167        if (to.getSplit() <= M.ring.nvar) {
168            throw new IllegalArgumentException("extended TermOrders not supported for rightGBs: " + to);
169        }
170        List<List<GenSolvablePolynomial<C>>> mlist = M.castToSolvableList();
171        GenSolvablePolynomialRing<C> sring = (GenSolvablePolynomialRing<C>) M.ring;
172        GenSolvablePolynomialRing<C> rring = sring.reverse(true); //true
173        sring = rring.reverse(true); // true
174
175        List<List<GenSolvablePolynomial<C>>> nlist = new ArrayList<List<GenSolvablePolynomial<C>>>(M.rows);
176        for (List<GenSolvablePolynomial<C>> row : mlist) {
177            List<GenSolvablePolynomial<C>> nrow = new ArrayList<GenSolvablePolynomial<C>>(row.size());
178            for (GenSolvablePolynomial<C> elem : row) {
179                GenSolvablePolynomial<C> nelem = (GenSolvablePolynomial<C>) elem.reverse(rring);
180                nrow.add(nelem);
181            }
182            nlist.add(nrow);
183        }
184        ModuleList<C> rM = new ModuleList<C>(rring, nlist);
185        if (debug) {
186            logger.info("rM -------------------- \n{}", rM);
187        }
188        ModuleList<C> rMg = leftGB(rM);
189        if (debug) {
190            logger.info("rMg -------------------- \n{}", rMg);
191            logger.info("isLeftGB(rMg) ---------- {}", isLeftGB(rMg));
192        }
193        mlist = rMg.castToSolvableList();
194        nlist = new ArrayList<List<GenSolvablePolynomial<C>>>(rMg.rows);
195        for (List<GenSolvablePolynomial<C>> row : mlist) {
196            List<GenSolvablePolynomial<C>> nrow = new ArrayList<GenSolvablePolynomial<C>>(row.size());
197            for (GenSolvablePolynomial<C> elem : row) {
198                GenSolvablePolynomial<C> nelem = (GenSolvablePolynomial<C>) elem.reverse(sring);
199                nrow.add(nelem);
200            }
201            nlist.add(nrow);
202        }
203        ModuleList<C> Mg = new ModuleList<C>(sring, nlist);
204        if (debug) {
205            logger.info("Mg -------------------- \n{}", Mg);
206            logger.info("isRightGB(Mg) --------- {}", isRightGB(Mg));
207        }
208        return Mg;
209    }
210
211
212    /**
213     * Cleanup and terminate ThreadPool.
214     */
215    public void terminate() {
216        logger.info("terminate not implemented");
217    }
218
219
220    /**
221     * Cancel ThreadPool.
222     */
223    public int cancel() {
224        logger.info("cancel not implemented");
225        return 0;
226    }
227
228}