001    /*
002     * $Id: IteratorsTest.java 3444 2010-12-25 17:13:53Z kredel $
003     */
004    
005    package edu.jas.ps;
006    
007    
008    import java.util.ArrayList;
009    import java.util.List;
010    import java.util.Map;
011    import java.util.Set;
012    import java.util.TreeMap;
013    import java.util.TreeSet;
014    
015    import junit.framework.Test;
016    import junit.framework.TestCase;
017    import junit.framework.TestSuite;
018    
019    import edu.jas.arith.BigInteger;
020    import edu.jas.arith.ModInteger;
021    import edu.jas.arith.ModIntegerRing;
022    import edu.jas.poly.ExpVector;
023    import edu.jas.poly.GenPolynomial;
024    import edu.jas.poly.GenPolynomialRing;
025    import edu.jas.poly.TermOrder;
026    import edu.jas.util.CartesianProductInfinite;
027    import edu.jas.util.CartesianProductLong;
028    import edu.jas.util.LongIterable;
029    
030    
031    /**
032     * Iterator tests with JUnit.
033     * @author Heinz Kredel.
034     */
035    
036    public class IteratorsTest extends TestCase {
037    
038    
039        /**
040         * main.
041         */
042        public static void main(String[] args) {
043            junit.textui.TestRunner.run(suite());
044        }
045    
046    
047        /**
048         * Constructs a <CODE>ListUtilTest</CODE> object.
049         * @param name String.
050         */
051        public IteratorsTest(String name) {
052            super(name);
053        }
054    
055    
056        /**
057         */
058        public static Test suite() {
059            TestSuite suite = new TestSuite(IteratorsTest.class);
060            return suite;
061        }
062    
063    
064        @Override
065        protected void setUp() {
066        }
067    
068    
069        @Override
070        protected void tearDown() {
071        }
072    
073    
074        /**
075         * Test ExpVector iterator.
076         * 
077         */
078        public void testExpVector() {
079            int n = 5;
080            LongIterable li = new LongIterable();
081            li.setNonNegativeIterator();
082    
083            List<Iterable<Long>> tlist = new ArrayList<Iterable<Long>>(n);
084            for (int i = 0; i < n; i++) {
085                tlist.add(li);
086            }
087            //System.out.println("tlist = " + tlist);
088    
089            Set<ExpVector> set = new TreeSet<ExpVector>((new TermOrder()).getDescendComparator());
090    
091            Iterable<List<Long>> ib = new CartesianProductInfinite<Long>(tlist);
092    
093            long t = 0L;
094            for (List<Long> i : ib) {
095                //System.out.println("i = " + i);
096                ExpVector e = ExpVector.create(i);
097                //System.out.println("e = " + e);
098                assertFalse("e in set", set.contains(e));
099                set.add(e);
100                t++;
101                if (t > 100L) {
102                    //System.out.println("i = " + i);
103                    break;
104                }
105            }
106            //System.out.println("set = " + set);
107            assertTrue("#set", set.size() == t);
108        }
109    
110    
111        /**
112         * Test GenPolynomial iterator.
113         * 
114         */
115        public void testGenPolynomial() {
116            ModIntegerRing mi = new ModIntegerRing(5, true);
117            int n = 3;
118            GenPolynomialRing<ModInteger> ring = new GenPolynomialRing<ModInteger>(mi, n);
119    
120            Set<GenPolynomial<ModInteger>> set = new TreeSet<GenPolynomial<ModInteger>>();
121    
122            long t = 0;
123            for (GenPolynomial<ModInteger> p : ring) {
124                //System.out.println("p = " + p);
125                if (set.contains(p)) {
126                    System.out.println("p = " + p);
127                    System.out.println("set = " + set);
128                    assertFalse("p in set ", true);
129                }
130                set.add(p);
131                t++;
132                if (t > 650L) {
133                    //System.out.println("i = " + i);
134                    break;
135                }
136            }
137            //System.out.println("set = " + set);
138            assertTrue("#set", set.size() == t);
139        }
140    
141    
142        /**
143         * Test GenPolynomial monomial iterator.
144         * 
145         */
146        public void testGenPolynomialMonomial() {
147            BigInteger bi = new BigInteger(1);
148            int n = 3;
149            GenPolynomialRing<BigInteger> ring = new GenPolynomialRing<BigInteger>(bi, n);
150    
151            Set<GenPolynomial<BigInteger>> set = new TreeSet<GenPolynomial<BigInteger>>();
152    
153            long t = 0;
154            for (GenPolynomial<BigInteger> p : ring) {
155                //System.out.println("p = " + p);
156                if (set.contains(p)) {
157                    System.out.println("p = " + p);
158                    //System.out.println("set = " + set);
159                    assertFalse("p in set ", true);
160                }
161                set.add(p);
162                t++;
163                if (t > 650L) {
164                    //System.out.println("i = " + i);
165                    break;
166                }
167            }
168            //System.out.println("set = " + set);
169            assertTrue("#set", set.size() == t);
170        }
171    
172    
173        /**
174         * Test total degree ExpVector iterator.
175         * 
176         */
177        public void testTotalDegExpVector() {
178            int n = 4;
179    
180            Set<ExpVector> set = new TreeSet<ExpVector>((new TermOrder()).getDescendComparator());
181    
182            Map<Long, Set<ExpVector>> degset = new TreeMap<Long, Set<ExpVector>>();
183    
184            long t = 0L;
185            for (long k = 0; k < 14; k++) {
186                LongIterable li = new LongIterable();
187                li.setNonNegativeIterator();
188                li.setUpperBound(k);
189                List<LongIterable> tlist = new ArrayList<LongIterable>(n);
190                for (int i = 0; i < n; i++) {
191                    tlist.add(li); // can reuse li
192                }
193                long kdeg = k;
194                //if ( kdeg > 5 ) { // kdeg < k ok but kdeg > k not allowed
195                //    kdeg -= 2;
196                //}
197                Iterable<List<Long>> ib = new CartesianProductLong(tlist, kdeg);
198                //System.out.println("kdeg = " + kdeg);
199                for (List<Long> i : ib) {
200                    //System.out.println("i = " + i);
201                    ExpVector e = ExpVector.create(i);
202                    long tdeg = e.totalDeg();
203                    //System.out.println("e = " + e + ", deg = " + tdeg);
204                    assertTrue("tdeg == k", tdeg == kdeg);
205                    Set<ExpVector> es = degset.get(tdeg);
206                    if (es == null) {
207                        es = new TreeSet<ExpVector>((new TermOrder()).getDescendComparator());
208                        degset.put(tdeg, es);
209                    }
210                    es.add(e);
211                    //assertFalse("e in set", set.contains(e) );
212                    set.add(e);
213                    t++;
214                    if (t > 500000L) {
215                        //System.out.println("i = " + i);
216                        break;
217                    }
218                }
219            }
220            //System.out.println("waste = " + w + ", of " + t);
221            //System.out.println("set = " + set);
222            //System.out.println("degset = " + degset);
223            for (Set<ExpVector> es : degset.values()) {
224                //System.out.println("#es = " + es.size() + ", es = " + es);
225                //System.out.println("#es = " + es.size() + ", deg = " + es.iterator().next().totalDeg());
226            }
227            assertTrue("#set", set.size() == t);
228        }
229    
230    
231        /**
232         * Test total degree ExpVector iterator.
233         * 
234         */
235        public void testTotalDegExpVectorIteratorInf() {
236            int n = 4;
237    
238            Set<ExpVector> set = new TreeSet<ExpVector>((new TermOrder()).getDescendComparator());
239    
240            ExpVectorIterable eiter = new ExpVectorIterable(n);
241            long t = 0;
242            for (ExpVector e : eiter) {
243                //System.out.println("e = " + e + ", deg = " + e.totalDeg());
244                t++;
245                if (t > 500L) {
246                    //System.out.println("i = " + i);
247                    break;
248                }
249                assertFalse("e in set", set.contains(e));
250                set.add(e);
251            }
252    
253        }
254    
255    
256        /**
257         * Test total degree ExpVector iterator.
258         * 
259         */
260        public void testTotalDegExpVectorIteratorFin() {
261            int n = 4;
262    
263            Set<ExpVector> set = new TreeSet<ExpVector>((new TermOrder()).getDescendComparator());
264    
265            ExpVectorIterable eiter = new ExpVectorIterable(n, 5);
266            long t = 0;
267            for (ExpVector e : eiter) {
268                //System.out.println("e = " + e + ", deg = " + e.totalDeg());
269                t++;
270                if (t > 500L) {
271                    //System.out.println("i = " + i);
272                    break;
273                }
274                assertFalse("e in set", set.contains(e));
275                set.add(e);
276            }
277    
278        }
279    
280    
281        /**
282         * Test total degree ExpVector iterator.
283         * 
284         */
285        public void testTotalDegExpVectorIteratorAllFin() {
286            int n = 4;
287    
288            Set<ExpVector> set = new TreeSet<ExpVector>((new TermOrder()).getDescendComparator());
289    
290            ExpVectorIterable eiter = new ExpVectorIterable(n, true, 5);
291            long t = 0;
292            for (ExpVector e : eiter) {
293                //System.out.println("e = " + e + ", deg = " + e.totalDeg());
294                t++;
295                if (t > 500L) {
296                    //System.out.println("i = " + i);
297                    break;
298                }
299                assertFalse("e in set", set.contains(e));
300                set.add(e);
301            }
302    
303        }
304    
305    }