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 }