001    /*
002     * $Id: ColoredSystem.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.GenPolynomial;
016    import edu.jas.structure.GcdRingElem;
017    
018    
019    /**
020     * Container for a condition, a corresponding colored polynomial list and a
021     * Groebner base pair list.
022     * @param <C> coefficient type
023     */
024    public class ColoredSystem<C extends GcdRingElem<C>> implements Cloneable {
025    
026    
027        private static final Logger logger = Logger.getLogger(ColoredSystem.class);
028    
029    
030        private final boolean debug = logger.isDebugEnabled();
031    
032    
033        /**
034         * Condition determinig this colored system.
035         */
036        public final Condition<C> condition;
037    
038    
039        /**
040         * Colored polynomials of this system.
041         */
042        public final List<ColorPolynomial<C>> list;
043    
044    
045        /**
046         * Groebner base pair list of this system.
047         */
048        public final OrderedCPairlist<C> pairlist;
049    
050    
051        /**
052         * Constructor for a colored polynomial system.
053         * @param cond a condition.
054         * @param S a list of colored polynomials.
055         */
056        public ColoredSystem(Condition<C> cond, List<ColorPolynomial<C>> S) {
057            this(cond, S, null);
058        }
059    
060    
061        /**
062         * Constructor for a colored polynomial system.
063         * @param cond a condition.
064         * @param S a list of colored polynomials.
065         * @param pl a ordered pair list.
066         */
067        public ColoredSystem(Condition<C> cond, List<ColorPolynomial<C>> S, OrderedCPairlist<C> pl) {
068            this.condition = cond;
069            this.list = S;
070            this.pairlist = pl;
071        }
072    
073    
074        /**
075         * Clone this colored polynomial system.
076         * @return a clone of this.
077         */
078        @Override
079        public ColoredSystem<C> clone() {
080            return new ColoredSystem<C>(condition, list, pairlist.clone());
081        }
082    
083    
084        /**
085         * Add to list of colored systems. This is added to the list of colored
086         * systems, if a system with the same condition is not already contained.
087         * @param L a list of colored systems.
088         * @return L.add(this) if this not in L, else L.
089         */
090        public List<ColoredSystem<C>> addToList(List<ColoredSystem<C>> L) {
091            List<ColoredSystem<C>> S = new ArrayList<ColoredSystem<C>>(L.size() + 1);
092            boolean contained = false;
093            for (ColoredSystem<C> x : L) {
094                if (condition.equals(x.condition) && list.equals(x.list)) {
095                    logger.info("replaced system = " + x.condition);
096                    S.add(this);
097                    contained = true;
098                } else { // copy existing
099                    // System.out.println("kept system = " + x);
100                    S.add(x);
101                }
102            }
103            if (!contained) {
104                S.add(this);
105            }
106            return S;
107        }
108    
109    
110        /**
111         * Get the String representation.
112         * @see java.lang.Object#toString()
113         */
114        @Override
115        public String toString() {
116            StringBuffer s = new StringBuffer("ColoredSystem: \n");
117            if (list.size() > 0) {
118                s.append("polynomial ring : " + list.get(0).green.ring + "\n");
119            } else {
120                s.append("parameter polynomial ring : " + condition.zero.getRing() + "\n");
121            }
122            s.append("conditions == 0 : " + getConditionZero() + "\n");
123            s.append("conditions != 0 : " + getConditionNonZero() + "\n");
124            if (debug) {
125                s.append("green coefficients:\n" + getGreenCoefficients() + "\n");
126                s.append("red coefficients:\n" + getRedCoefficients() + "\n");
127            }
128            s.append("colored polynomials:\n" + list + "\n");
129            s.append("uncolored polynomials:\n" + getPolynomialList() + "\n");
130            if (debug) {
131                s.append("essential polynomials:\n" + getEssentialPolynomialList() + "\n");
132            }
133            if (pairlist != null) {
134                s.append(pairlist.toString() + "\n");
135            }
136            return s.toString();
137        }
138    
139    
140        /**
141         * Is this colored system equal to other.
142         * @param c other colored system.
143         * @return true, if this is equal to other, else false.
144         */
145        @Override
146        @SuppressWarnings("unchecked")
147        public boolean equals(Object c) {
148            ColoredSystem<C> cs = null;
149            try {
150                cs = (ColoredSystem<C>) c;
151            } catch (ClassCastException e) {
152                return false;
153            }
154            if (cs == null) {
155                return false;
156            }
157            boolean t = (condition.equals(cs.condition) && list.equals(cs.list));
158            if (!t) {
159                return t;
160            }
161            // now t == true
162            t = pairlist.equals(cs.pairlist);
163            if (!t) {
164                System.out.println("pairlists not equal " + pairlist + ", " + cs.pairlist);
165            }
166            return true; // if lists are equal ignore pairlists
167        }
168    
169    
170        /**
171         * Hash code for this colored system.
172         * @see java.lang.Object#hashCode()
173         */
174        @Override
175        public int hashCode() {
176            int h;
177            h = condition.hashCode();
178            h = h << 17;
179            h += list.hashCode();
180            // h = h << 11;
181            // h += pairlist.hashCode();
182            return h;
183        }
184    
185    
186        /**
187         * Get zero condition.
188         * @return condition.zero.
189         */
190        public List<GenPolynomial<C>> getConditionZero() {
191            return condition.zero.getList();
192        }
193    
194    
195        /**
196         * Get non zero condition.
197         * @return condition.nonZero.
198         */
199        public List<GenPolynomial<C>> getConditionNonZero() {
200            return condition.nonZero.mset;
201        }
202    
203    
204        /**
205         * Get list of red coefficients of polynomials.
206         * @return list of all red coefficients of polynomials.
207         */
208        public List<GenPolynomial<C>> getRedCoefficients() {
209            Set<GenPolynomial<C>> F = new HashSet<GenPolynomial<C>>();
210            for (ColorPolynomial<C> s : list) {
211                F.addAll(s.red.getMap().values());
212            }
213            List<GenPolynomial<C>> M = new ArrayList<GenPolynomial<C>>(F);
214            return M;
215        }
216    
217    
218        /**
219         * Get list of green coefficients of polynomials.
220         * @return list of all green coefficients of polynomials.
221         */
222        public List<GenPolynomial<C>> getGreenCoefficients() {
223            Set<GenPolynomial<C>> F = new HashSet<GenPolynomial<C>>();
224            for (ColorPolynomial<C> s : list) {
225                F.addAll(s.green.getMap().values());
226            }
227            List<GenPolynomial<C>> M = new ArrayList<GenPolynomial<C>>(F);
228            return M;
229        }
230    
231    
232        /**
233         * Get list of full polynomials.
234         * @return list of all full polynomials.
235         */
236        public List<GenPolynomial<GenPolynomial<C>>> getPolynomialList() {
237            List<GenPolynomial<GenPolynomial<C>>> F = new ArrayList<GenPolynomial<GenPolynomial<C>>>();
238            for (ColorPolynomial<C> s : list) {
239                F.add(s.getPolynomial());
240            }
241            return F;
242        }
243    
244    
245        /**
246         * Get list of essential polynomials.
247         * @return list of all essential polynomials.
248         */
249        public List<GenPolynomial<GenPolynomial<C>>> getEssentialPolynomialList() {
250            List<GenPolynomial<GenPolynomial<C>>> F = new ArrayList<GenPolynomial<GenPolynomial<C>>>();
251            for (ColorPolynomial<C> s : list) {
252                F.add(s.getEssentialPolynomial());
253            }
254            return F;
255        }
256    
257    
258        /**
259         * Check invariants. Check if all polynomials are determined and if the
260         * color of all coefficients is correct with respect to the condition.
261         * @return true, if all invariants are met, else false.
262         */
263        public boolean checkInvariant() {
264            if (!isDetermined()) {
265                return false;
266            }
267            if (!condition.isDetermined(list)) {
268                return false;
269            }
270            // Condition<C> cond = condition;
271            for (ColorPolynomial<C> s : list) {
272                if (!s.checkInvariant()) {
273                    System.out.println("notInvariant " + s);
274                    System.out.println("condition:   " + condition);
275                    return false;
276                }
277                for (GenPolynomial<C> g : s.green.getMap().values()) {
278                    if (condition.color(g) != Condition.Color.GREEN) {
279                        System.out.println("notGreen   " + g);
280                        System.out.println("condition: " + condition);
281                        System.out.println("colors:    " + s);
282                        return false;
283                    }
284                }
285                for (GenPolynomial<C> r : s.red.getMap().values()) {
286                    if (condition.color(r) != Condition.Color.RED) {
287                        System.out.println("notRed     " + r);
288                        System.out.println("condition: " + condition);
289                        System.out.println("colors:    " + s);
290                        return false;
291                    }
292                }
293                for (GenPolynomial<C> w : s.white.getMap().values()) {
294                    if (condition.color(w) != Condition.Color.WHITE) {
295                        // System.out.println("notWhite " + w);
296                        // System.out.println("condition: " + condition);
297                        // System.out.println("colors: " + s);
298                        continue; // no error
299                        // return false;
300                    }
301                }
302            }
303            return true;
304        }
305    
306    
307        /**
308         * Is this colored system completely determined.
309         * @return true, if each ColorPolynomial is determined, else false.
310         */
311        public boolean isDetermined() {
312            for (ColorPolynomial<C> s : list) {
313                if (s.isZERO()) {
314                    continue;
315                }
316                if (!s.isDetermined()) {
317                    System.out.println("not simple determined " + s);
318                    System.out.println("condition:            " + condition);
319                    return false;
320                }
321                if (!condition.isDetermined(s)) {
322                    return false;
323                }
324            }
325            return true;
326        }
327    
328    
329        /**
330         * Re determine colorings of polynomials.
331         * @return colored system with re determined colored polynomials.
332         */
333        public ColoredSystem<C> reDetermine() {
334            if (condition == null || condition.zero.isONE()) {
335                return this;
336            }
337            List<ColorPolynomial<C>> Sn = new ArrayList<ColorPolynomial<C>>(list.size());
338            for (ColorPolynomial<C> c : list) {
339                ColorPolynomial<C> a = condition.reDetermine(c);
340                // if ( !a.isZERO() ) {
341                Sn.add(a); // must also add zeros
342                // }
343            }
344            return new ColoredSystem<C>(condition, Sn, pairlist);
345        }
346    
347    }