001/*
002 * $Id: CriticalPairComparator.java 4052 2012-07-25 19:20:25Z kredel $
003 */
004
005package edu.jas.gb;
006
007import java.io.Serializable;
008import java.util.Comparator;
009
010import edu.jas.structure.RingElem;
011
012import edu.jas.poly.ExpVector;
013import 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 */
022public class CriticalPairComparator<C extends RingElem<C> > 
023             implements Serializable, Comparator<AbstractPair<C>> {
024
025
026    public final TermOrder tord;
027    protected final TermOrder.EVComparator 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}