001    /*
002     * $Id: CriticalPairComparator.java 3420 2010-12-19 21:34:25Z kredel $
003     */
004    
005    package edu.jas.gb;
006    
007    import java.io.Serializable;
008    import java.util.Comparator;
009    
010    import edu.jas.structure.RingElem;
011    
012    import edu.jas.poly.ExpVector;
013    import edu.jas.poly.TermOrder;
014    
015    
016    /**
017     * Comparator for critical pairs of polynomials.
018     * Immutable objects.
019     * @param <C> coefficient type
020     * @author Heinz Kredel.
021     */
022    public class CriticalPairComparator<C extends RingElem<C> > 
023                 implements Serializable, Comparator<AbstractPair<C>> {
024    
025    
026        public final TermOrder tord;
027        protected final Comparator<ExpVector> ec;
028    
029    
030        /**
031         * Constructor.
032         * @param t TermOrder.
033         */
034        public CriticalPairComparator(TermOrder t){
035            tord = t;
036            ec = tord.getAscendComparator();
037        }
038    
039    
040        /**
041         * Compare.
042         * Compares exponents and if equal, compares polynomial indices.
043         * @param p1 first critical pair.
044         * @param p2 second critical pair.
045         * @return 0 if ( p1 == p2 ), -1 if ( p1 < p2 ) and +1 if ( p1 > p2 ).
046         */
047        public int compare(AbstractPair<C> p1, AbstractPair<C> p2) {
048            int s = ec.compare( p1.e, p2.e );
049            if ( s == 0 ) {
050                /* not ok  
051               if ( p1.j < p2.j ) {
052                  s = -1;
053               } else if ( p1.j > p2.j ) {
054                   s = 1;
055               } else if ( p1.i < p2.i ) {
056                   s = -1;
057               } else if ( p1.i > p2.i ) {
058                   s = 1;
059               } else {
060                   s = 0;
061               }
062                */
063               /* ok */
064               if ( p1.j > p2.j ) {
065                  s = -1;
066               } else if ( p1.j < p2.j ) {
067                   s = 1;
068               } else if ( p1.i > p2.i ) {
069                   s = -1;
070               } else if ( p1.i < p2.i ) {
071                   s = 1;
072               } else {
073                   s = 0;
074               }
075               /* */
076            }
077            return s;
078        }
079    
080    
081        /**
082         * toString.
083         */
084        @Override
085         public String toString() {
086            return "CriticalPairComparator(" + tord + ")";
087        }
088    
089    }