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 }