001 /* 002 * $Id: GroebnerSystem.java 3426 2010-12-24 13:17:58Z kredel $ 003 */ 004 005 package edu.jas.application; 006 007 008 import java.util.ArrayList; 009 import java.util.HashSet; 010 import java.util.List; 011 import java.util.Set; 012 013 import org.apache.log4j.Logger; 014 015 import edu.jas.poly.PolynomialList; 016 import edu.jas.poly.OrderedPolynomialList; 017 import edu.jas.poly.GenPolynomial; 018 import edu.jas.poly.GenPolynomialRing; 019 import edu.jas.structure.GcdRingElem; 020 021 022 /** 023 * Container for a Groebner system. 024 * It contains a list of colored systems and a 025 * list of parametric polynomials representing the 026 * corresponding comprehensive Groebner base. 027 * @param <C> coefficient type 028 */ 029 public class GroebnerSystem<C extends GcdRingElem<C>> { 030 031 032 private static final Logger logger = Logger.getLogger(GroebnerSystem.class); 033 034 035 private final boolean debug = logger.isDebugEnabled(); 036 037 038 /** 039 * List of colored systems. 040 */ 041 public final List<ColoredSystem<C>> list; 042 043 044 /** 045 * List of conditions for this Groebner system. 046 */ 047 protected List<Condition<C>> conds; 048 049 050 /** 051 * Comprehensive Groebner base for this Groebner system. 052 */ 053 protected PolynomialList<GenPolynomial<C>> cgb; 054 055 056 /** 057 * Constructor for a Groebner system. 058 * @param S a list of colored systems. 059 */ 060 public GroebnerSystem(List<ColoredSystem<C>> S) { 061 this.list = S; 062 this.conds = null; 063 this.cgb = null; 064 } 065 066 067 /** 068 * Get the String representation. 069 * @see java.lang.Object#toString() 070 */ 071 @Override 072 public String toString() { 073 StringBuffer sb = new StringBuffer("GroebnerSystem: \n"); 074 boolean first = true; 075 for (ColoredSystem<C> cs : list) { 076 if ( first ) { 077 first = false; 078 } else { 079 sb.append("\n"); 080 } 081 sb.append( cs.toString() ); 082 } 083 sb.append("Conditions:\n"); 084 first = true; 085 for ( Condition<C> cond : getConditions() ) { 086 if ( first ) { 087 first = false; 088 } else { 089 sb.append("\n"); 090 } 091 sb.append( cond.toString() ); 092 } 093 sb.append("\n"); 094 if ( cgb == null ) { 095 sb.append("Comprehensive Groebner Base not jet computed\n"); 096 } else { 097 sb.append("Comprehensive Groebner Base:\n"); 098 first = true; 099 for ( GenPolynomial<GenPolynomial<C>> p : getCGB() ) { 100 if ( first ) { 101 first = false; 102 } else { 103 sb.append(",\n"); 104 } 105 sb.append( p.toString() ); 106 } 107 sb.append("\n"); 108 } 109 return sb.toString(); 110 } 111 112 113 /** 114 * Is this Groebner system equal to other. 115 * @param c other Groebner system. 116 * @return true, if this is equal to other, else false. 117 */ 118 @Override 119 @SuppressWarnings("unchecked") 120 public boolean equals(Object c) { 121 GroebnerSystem<C> cs = null; 122 try { 123 cs = (GroebnerSystem<C>) c; 124 } catch (ClassCastException e) { 125 return false; 126 } 127 if (cs == null) { 128 return false; 129 } 130 boolean t = list.equals(cs.list); 131 return t; 132 } 133 134 135 /** 136 * Hash code for this colored system. 137 * @see java.lang.Object#hashCode() 138 */ 139 @Override 140 public int hashCode() { 141 int h; 142 h = list.hashCode(); 143 return h; 144 } 145 146 147 /** 148 * Check invariants. Check if all colored systems are determined and 149 * all invariants are met. 150 * @return true, if all invariants are met, else false. 151 */ 152 public boolean checkInvariant() { 153 for (ColoredSystem<C> s : list) { 154 if (!s.checkInvariant()) { 155 return false; 156 } 157 } 158 return true; 159 } 160 161 162 /** 163 * Is each colored system completely determined. 164 * @return true, if each ColoredSystem is determined, else false. 165 */ 166 public boolean isDetermined() { 167 for (ColoredSystem<C> s : list) { 168 if (!s.isDetermined()) { 169 return false; 170 } 171 } 172 return true; 173 } 174 175 176 /** 177 * Get list of conditions determining this Groebner system. 178 * @return list of determining conditions. 179 */ 180 public List<Condition<C>> getConditions() { 181 if ( conds != null ) { 182 return conds; 183 } 184 List<Condition<C>> cd = new ArrayList<Condition<C>>( list.size() ); 185 for (ColoredSystem<C> cs : list) { 186 cd.add(cs.condition); 187 } 188 conds = cd; 189 return conds; 190 } 191 192 193 /** 194 * Get comprehensive Groebner base. 195 * @return the comprehensive Groebner base for this Groebner system. 196 */ 197 public List<GenPolynomial<GenPolynomial<C>>> getCGB() { 198 if ( cgb != null ) { 199 return cgb.list; 200 } 201 // assure conditions are collected 202 List<Condition<C>> unused = getConditions(); 203 // combine for CGB 204 Set<GenPolynomial<GenPolynomial<C>>> Gs 205 = new HashSet<GenPolynomial<GenPolynomial<C>>>(); 206 for (ColoredSystem<C> cs : list) { 207 if (debug) { 208 if (!cs.isDetermined()) { 209 System.out.println("not determined, cs = " + cs); 210 } 211 if (!cs.checkInvariant()) { 212 System.out.println("not invariant, cs = " + cs); 213 } 214 } 215 for (ColorPolynomial<C> p : cs.list) { 216 GenPolynomial<GenPolynomial<C>> f = p.getPolynomial(); 217 Gs.add(f); 218 } 219 } 220 List<GenPolynomial<GenPolynomial<C>>> G 221 = new ArrayList<GenPolynomial<GenPolynomial<C>>>(Gs); 222 GenPolynomialRing<GenPolynomial<C>> ring = null; 223 if ( G.size() > 0 ) { 224 ring = G.get(0).ring; 225 } 226 cgb = new OrderedPolynomialList<GenPolynomial<C>>(ring,G); 227 return G; 228 } 229 230 }