001/*
002 * $Id: IteratorsTest.java 4071 2012-07-27 19:59:38Z kredel $
003 */
004
005package edu.jas.ps;
006
007
008import java.util.ArrayList;
009import java.util.List;
010import java.util.Map;
011import java.util.Set;
012import java.util.TreeMap;
013import java.util.TreeSet;
014
015import junit.framework.Test;
016import junit.framework.TestCase;
017import junit.framework.TestSuite;
018
019import edu.jas.arith.BigInteger;
020import edu.jas.arith.ModInteger;
021import edu.jas.arith.ModIntegerRing;
022import edu.jas.poly.ExpVector;
023import edu.jas.poly.GenPolynomial;
024import edu.jas.poly.GenPolynomialRing;
025import edu.jas.poly.TermOrder;
026import edu.jas.util.CartesianProductInfinite;
027import edu.jas.util.CartesianProductLong;
028import edu.jas.util.LongIterable;
029
030
031/**
032 * Iterator tests with JUnit.
033 * @author Heinz Kredel.
034 */
035
036public 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            assertFalse("es != null", es == null);
225            //System.out.println("#es = " + es.size() + ", es = " + es);
226            //System.out.println("#es = " + es.size() + ", deg = " + es.iterator().next().totalDeg());
227        }
228        assertTrue("#set", set.size() == t);
229    }
230
231
232    /**
233     * Test total degree ExpVector iterator.
234     * 
235     */
236    public void testTotalDegExpVectorIteratorInf() {
237        int n = 4;
238
239        Set<ExpVector> set = new TreeSet<ExpVector>((new TermOrder()).getDescendComparator());
240
241        ExpVectorIterable eiter = new ExpVectorIterable(n);
242        long t = 0;
243        for (ExpVector e : eiter) {
244            //System.out.println("e = " + e + ", deg = " + e.totalDeg());
245            t++;
246            if (t > 500L) {
247                //System.out.println("i = " + i);
248                break;
249            }
250            assertFalse("e in set", set.contains(e));
251            set.add(e);
252        }
253
254    }
255
256
257    /**
258     * Test total degree ExpVector iterator.
259     * 
260     */
261    public void testTotalDegExpVectorIteratorFin() {
262        int n = 4;
263
264        Set<ExpVector> set = new TreeSet<ExpVector>((new TermOrder()).getDescendComparator());
265
266        ExpVectorIterable eiter = new ExpVectorIterable(n, 5);
267        long t = 0;
268        for (ExpVector e : eiter) {
269            //System.out.println("e = " + e + ", deg = " + e.totalDeg());
270            t++;
271            if (t > 500L) {
272                //System.out.println("i = " + i);
273                break;
274            }
275            assertFalse("e in set", set.contains(e));
276            set.add(e);
277        }
278
279    }
280
281
282    /**
283     * Test total degree ExpVector iterator.
284     * 
285     */
286    public void testTotalDegExpVectorIteratorAllFin() {
287        int n = 4;
288
289        Set<ExpVector> set = new TreeSet<ExpVector>((new TermOrder()).getDescendComparator());
290
291        ExpVectorIterable eiter = new ExpVectorIterable(n, true, 5);
292        long t = 0;
293        for (ExpVector e : eiter) {
294            //System.out.println("e = " + e + ", deg = " + e.totalDeg());
295            t++;
296            if (t > 500L) {
297                //System.out.println("i = " + i);
298                break;
299            }
300            assertFalse("e in set", set.contains(e));
301            set.add(e);
302        }
303
304    }
305
306}