001    /*
002     * $Id: CriticalPair.java 3416 2010-12-19 15:45:06Z kredel $
003     */
004    
005    package edu.jas.gb;
006    
007    import java.io.Serializable;
008    
009    import edu.jas.structure.RingElem;
010    
011    import edu.jas.poly.ExpVector;
012    import edu.jas.poly.GenPolynomial;
013    
014    
015    /**
016     * Serializable subclass to hold critical pairs of polynomials.
017     * Used also to manage reduction status of the pair.
018     * @param <C> coefficient type
019     * @author Heinz Kredel.
020     */
021    public class CriticalPair<C extends RingElem<C> > extends AbstractPair<C>
022                 implements Serializable {
023    
024        protected volatile boolean inReduction;
025        protected volatile GenPolynomial<C> reductum;
026        //public final ExpVector sugar;
027    
028    
029        /**
030         * CriticalPair constructor.
031         * @param e lcm(lt(pi),lt(pj).
032         * @param pi polynomial i.
033         * @param pj polynomial j.
034         * @param i index of pi.
035         * @param j index pf pj.
036         */
037        public CriticalPair(ExpVector e,
038                            GenPolynomial<C> pi, GenPolynomial<C> pj, 
039                            int i, int j) {
040            super(e,pi,pj,i,j);
041            inReduction = false; 
042            reductum = null;
043        }
044    
045    
046        /**
047         * toString.
048         */
049        @Override
050        public String toString() {
051            StringBuffer s = new StringBuffer(super.toString() + "[ ");
052            if ( inReduction ) {
053               s.append("," + inReduction);
054            } 
055            if ( reductum != null ) {
056               s.append("," + reductum.leadingExpVector());
057            } 
058            s.append(" ]");
059            return s.toString();
060        }
061    
062    
063        /**
064         * Set in reduction status.
065         * inReduction is set to true.
066         */
067        public void setInReduction() {
068            if ( inReduction ) {
069               throw new IllegalStateException("already in reduction " + this);
070            }
071            inReduction = true;
072        }
073    
074    
075        /**
076         * Get in reduction status.
077         * @return true if the polynomial is currently in reduction, else false.
078         */
079        public boolean getInReduction() {
080            return inReduction;
081        }
082    
083    
084        /**
085         * Get reduced polynomial.
086         * @return the reduced polynomial or null if not done.
087         */
088        public GenPolynomial<C> getReductum() {
089            return reductum;
090        }
091    
092    
093        /**
094         * Set reduced polynomial.
095         * @param r the reduced polynomial.
096         */
097        public void setReductum(GenPolynomial<C> r) {
098            if ( r == null ) {
099               throw new IllegalArgumentException("reduction null not allowed " + this);
100            }
101            inReduction = false;
102            reductum = r;
103        }
104    
105    
106        /**
107         * Is reduced to zero.
108         * @return true if the S-polynomial of this CriticalPair 
109         *         was reduced to ZERO, else false.
110         */
111        public boolean isZERO() {
112            if ( reductum == null ) { // not jet done
113                return false;
114            }
115            return reductum.isZERO();
116        }
117    
118    
119        /**
120         * Is reduced to one.
121         * @return true if the S-polynomial of this CriticalPair was 
122         *         reduced to ONE, else false.
123         */
124        public boolean isONE() {
125            if ( reductum == null ) { // not jet done
126                return false;
127            }
128            return reductum.isONE();
129        }
130    
131    }
132