001/*
002 * $Id$
003 */
004
005package edu.jas.poly;
006
007
008import java.util.ArrayList;
009import java.util.Arrays;
010import java.util.List;
011
012import edu.jas.arith.BigInteger;
013
014import junit.framework.Test;
015import junit.framework.TestCase;
016import junit.framework.TestSuite;
017
018
019/**
020 * ExpVector tests with JUnit. Tests arithmetic operations, for comparison tests
021 * see TermOrderTest.
022 * @author Heinz Kredel
023 */
024
025public class ExpVectorTest extends TestCase {
026
027
028    /**
029     * main
030     */
031    public static void main(String[] args) {
032        junit.textui.TestRunner.run(suite());
033    }
034
035
036    /**
037     * Constructs a <CODE>ExpVectorTest</CODE> object.
038     * @param name String.
039     */
040    public ExpVectorTest(String name) {
041        super(name);
042    }
043
044
045    /**
046     */
047    public static Test suite() {
048        TestSuite suite = new TestSuite(ExpVectorTest.class);
049        return suite;
050    }
051
052
053    ExpVector a, b, c, d;
054
055
056    @Override
057    protected void setUp() {
058        a = b = c = d = null;
059    }
060
061
062    @Override
063    protected void tearDown() {
064        a = b = c = d = null;
065    }
066
067
068    /**
069     * Test constructor and toString.
070     */
071    public void testConstructor() {
072        a = ExpVector.create(0);
073        b = ExpVector.create(0);
074        assertEquals("() = ()", a, b);
075        assertEquals("length( () ) = 0", a.length(), 0);
076        assertTrue("isZERO( () )", a.isZERO());
077
078        a = ExpVector.create(10);
079        b = ExpVector.create(10);
080        assertEquals("10e = 10e", a, b);
081        assertEquals("length( 10e ) = 10", a.length(), 10);
082        assertTrue("isZERO( ( 10e ) )", a.isZERO());
083
084        String s = "(0,0,0,0,0,0,0,0,0,0)";
085        a = ExpVector.create(s);
086        String t = a.toString().substring(0, s.length());
087
088        assertEquals("stringConstr = toString", s, t);
089        assertTrue("isZERO( ( 10e ) )", a.isZERO());
090
091        s = a.toScript();
092        //System.out.println("a.toScript: " + s + ", " + s.length());
093        assertEquals("#s == 0: " + s, s.length(), 0);
094    }
095
096
097    /**
098     * Test bitLength.
099     */
100    public void testBitLength() {
101        a = ExpVector.create(0);
102        assertEquals("blen(0) = 0", 0, a.bitLength());
103
104        b = ExpVector.create(10);
105        assertEquals("blen(0) = 10", 10, b.bitLength());
106
107        c = ExpVector.random(10, 20, 0.5f);
108        //System.out.println("c = " + c);
109        //System.out.println("blen(c) = " + c.bitLength());
110        assertTrue("blen(random) >= 0", 0 <= c.bitLength());
111    }
112
113
114    /**
115     * Test random integer.
116     */
117    public void testRandom() {
118        float q = (float) 0.3;
119
120        a = ExpVector.random(5, 10, q);
121        String s = a.toString();
122        if (s.indexOf(":") >= 0) {
123            s = s.substring(0, s.indexOf(":"));
124        }
125        b = ExpVector.create(s);
126
127        assertEquals("a == b", true, a.equals(b));
128
129        c = ExpVector.EVDIF(b, a);
130
131        assertTrue("a-b = 0", c.isZERO());
132
133        c = a.reverse();
134        //System.out.println("c = " + c);
135        d = c.reverse(0);
136        //System.out.println("d = " + d);
137        assertEquals("rev(rev(a),0) == a", a, d);
138    }
139
140
141    /**
142     * Test addition.
143     */
144    public void testAddition() {
145        float q = (float) 0.2;
146
147        a = ExpVector.random(5, 10, q);
148
149        b = ExpVector.EVSUM(a, a);
150        c = ExpVector.EVDIF(b, a);
151
152        assertEquals("a+a-a = a", c, a);
153        assertTrue("a+a-a = a", c.equals(a));
154
155        boolean t;
156        t = ExpVector.EVMT(b, a);
157        assertTrue("a | a+a", t);
158
159        a = ExpVector.random(5, 10, q);
160        b = ExpVector.random(5, 10, q);
161
162        c = ExpVector.EVSUM(a, b);
163        d = ExpVector.EVSUM(b, a);
164        assertTrue("a+b = b+a", c.equals(d));
165    }
166
167
168    /**
169     * Test lcm.
170     */
171    public void testLcm() {
172        float q = (float) 0.2;
173
174        a = ExpVector.random(5, 10, q);
175        b = ExpVector.random(5, 10, q);
176        c = ExpVector.EVLCM(a, b);
177        d = ExpVector.EVLCM(b, a);
178
179        assertTrue("lcm(a,b) = lcm(b,a)", c.equals(d));
180
181        assertTrue("a | lcm(a,b)", ExpVector.EVMT(c, a));
182        assertTrue("b | lcm(a,b)", ExpVector.EVMT(c, b));
183
184        d = ExpVector.EVDIF(c, a);
185        assertTrue("sign(lcm(a,b)-a) >= 0", ExpVector.EVSIGN(d) >= 0);
186        d = ExpVector.EVDIF(c, b);
187        assertTrue("sign(lcm(a,b)-b) >= 0", ExpVector.EVSIGN(d) >= 0);
188    }
189
190
191    /**
192     * Test tdeg.
193     */
194    public void testTdeg() {
195        a = ExpVector.create(100);
196        assertTrue("tdeg(a) = 0", ExpVector.EVTDEG(a) == 0);
197
198        float q = (float) 0.2;
199
200        a = ExpVector.random(5, 10, q);
201        b = ExpVector.random(5, 10, q);
202
203        assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0);
204        assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0);
205
206        c = ExpVector.EVSUM(a, b);
207        assertTrue("tdeg(a+b) >= tdeg(a)", ExpVector.EVTDEG(c) >= ExpVector.EVTDEG(a));
208        assertTrue("tdeg(a+b) >= tdeg(b)", ExpVector.EVTDEG(c) >= ExpVector.EVTDEG(b));
209
210        c = ExpVector.EVLCM(a, b);
211        assertTrue("tdeg(lcm(a,b)) >= tdeg(a)", ExpVector.EVTDEG(c) >= ExpVector.EVTDEG(a));
212        assertTrue("tdeg(lcm(a,b)) >= tdeg(b)", ExpVector.EVTDEG(c) >= ExpVector.EVTDEG(b));
213    }
214
215
216    /**
217     * Test weight degree.
218     */
219    public void testWeightdeg() {
220        a = ExpVector.create(100);
221        assertTrue("tdeg(a) = 0", ExpVector.EVTDEG(a) == 0);
222        assertTrue("wdeg(a) = 0", ExpVector.EVWDEG(null, a) == 0);
223
224        float q = (float) 0.2;
225
226        a = ExpVector.random(5, 10, q);
227        b = ExpVector.random(5, 10, q);
228        long[][] w = new long[][] { new long[] { 1l, 1l, 1l, 1l, 1l } };
229
230        assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0);
231        assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0);
232
233        assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w, a) >= 0);
234        assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w, b) >= 0);
235
236        assertEquals("tdeg(a) == wdeg(a)", ExpVector.EVTDEG(a), ExpVector.EVWDEG(w, a));
237        assertEquals("tdeg(b) == wdeg(b)", ExpVector.EVTDEG(b), ExpVector.EVWDEG(w, b));
238
239        c = ExpVector.EVSUM(a, b);
240        assertTrue("wdeg(a+b) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
241        assertTrue("wdeg(a+b) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
242
243        c = ExpVector.EVLCM(a, b);
244        assertTrue("wdeg(lcm(a,b)) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
245        assertTrue("wdeg(lcm(a,b)) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
246
247
248        w = new long[][] { new long[] { 10l, 1l, 3l, 9l, 100l } };
249
250        assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0);
251        assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0);
252
253        assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w, a) >= 0);
254        assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w, b) >= 0);
255
256        assertTrue("tdeg(a) <= wdeg(a)", ExpVector.EVTDEG(a) <= ExpVector.EVWDEG(w, a));
257        assertTrue("tdeg(b) <= wdeg(b)", ExpVector.EVTDEG(b) <= ExpVector.EVWDEG(w, b));
258
259        c = ExpVector.EVSUM(a, b);
260        assertTrue("wdeg(a+b) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
261        assertTrue("wdeg(a+b) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
262
263        c = ExpVector.EVLCM(a, b);
264        assertTrue("wdeg(lcm(a,b)) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
265        assertTrue("wdeg(lcm(a,b)) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
266
267
268        w = new long[][] { new long[] { 10l, 1l, 3l, 9l, 100l }, new long[] { 1l, 1l, 1l, 1l, 1l } };
269
270        assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0);
271        assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0);
272
273        assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w, a) >= 0);
274        assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w, b) >= 0);
275
276        assertTrue("tdeg(a) <= wdeg(a)", ExpVector.EVTDEG(a) <= ExpVector.EVWDEG(w, a));
277        assertTrue("tdeg(b) <= wdeg(b)", ExpVector.EVTDEG(b) <= ExpVector.EVWDEG(w, b));
278
279        c = ExpVector.EVSUM(a, b);
280        assertTrue("wdeg(a+b) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
281        assertTrue("wdeg(a+b) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
282
283        c = ExpVector.EVLCM(a, b);
284        assertTrue("wdeg(lcm(a,b)) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
285        assertTrue("wdeg(lcm(a,b)) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
286    }
287
288
289    /**
290     * Test dependency on variables.
291     */
292    public void testDependency() {
293        int[] exp;
294        int[] dep;
295
296        a = ExpVector.create(10, 5, 2l);
297        exp = new int[] { 5 };
298        dep = ExpVector.EVDOV(a);
299        assertTrue("[5] = [5]", Arrays.equals(exp, dep));
300
301        b = ExpVector.create(10, 3, 9l);
302        exp = new int[] { 3 };
303        dep = ExpVector.EVDOV(b);
304        assertTrue("[3] = [3]", Arrays.equals(exp, dep));
305
306        c = ExpVector.EVSUM(a, b);
307        exp = new int[] { 3, 5 };
308        dep = ExpVector.EVDOV(c);
309        assertTrue("[3,5] = [3,5] " + Arrays.toString(exp) + "," + Arrays.toString(dep),
310                        Arrays.equals(exp, dep));
311
312        b = ExpVector.create(10);
313        exp = new int[] {};
314        dep = ExpVector.EVDOV(b);
315        assertTrue("[] = []", Arrays.equals(exp, dep));
316
317        b = ExpVector.create(0);
318        exp = new int[] {};
319        dep = ExpVector.EVDOV(b);
320        assertTrue("[] = []", Arrays.equals(exp, dep));
321
322        b = ExpVector.create(1, 0, 1l);
323        exp = new int[] { 0 };
324        dep = ExpVector.EVDOV(b);
325        assertTrue("[0] = [0]", Arrays.equals(exp, dep));
326    }
327
328
329    /**
330     * Test random exp vector 2.
331     */
332    public void testRandom2() {
333        float q = (float) 0.2;
334
335        a = ExpVector.random(5, 10, q);
336        b = ExpVector.create("" + a);
337
338        assertEquals("a == b", true, a.equals(b));
339
340        c = b.subtract(a);
341
342        assertTrue("a-b = 0", c.isZERO());
343    }
344
345
346    /**
347     * Test addition.
348     */
349    public void testAddition2() {
350        float q = (float) 0.2;
351
352        a = ExpVector.random(5, 10, q);
353
354        b = a.sum(a);
355        c = b.subtract(a);
356
357        assertEquals("a+a-a = a", c, a);
358        assertTrue("a+a-a = a", c.equals(a));
359
360        boolean t;
361        t = b.multipleOf(a);
362        assertTrue("a | a+a", t);
363
364        a = ExpVector.random(5, 10, q);
365        b = ExpVector.random(5, 10, q);
366
367        c = a.sum(b);
368        d = b.sum(a);
369        assertTrue("a+b = b+a", c.equals(d));
370    }
371
372
373    /**
374     * Test lcm.
375     */
376    public void testLcm2() {
377        float q = (float) 0.2;
378
379        a = ExpVector.random(5, 10, q);
380        b = ExpVector.random(5, 10, q);
381        c = a.lcm(b);
382        d = b.lcm(a);
383
384        assertTrue("lcm(a,b) = lcm(b,a)", c.equals(d));
385
386        assertTrue("a | lcm(a,b)", c.multipleOf(a));
387        assertTrue("b | lcm(a,b)", c.multipleOf(b));
388
389        d = c.subtract(a);
390        assertTrue("sign(lcm(a,b)-a) >= 0", d.signum() >= 0);
391        d = c.subtract(b);
392        assertTrue("sign(lcm(a,b)-b) >= 0", d.signum() >= 0);
393    }
394
395
396    /**
397     * Test tdeg.
398     */
399    public void testTdeg2() {
400        a = ExpVector.create(100);
401        assertTrue("tdeg(a) = 0", ExpVector.EVTDEG(a) == 0);
402
403        float q = (float) 0.2;
404
405        a = ExpVector.random(5, 10, q);
406        b = ExpVector.random(5, 10, q);
407
408        assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0);
409        assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0);
410
411        c = a.sum(b);
412        assertTrue("tdeg(a+b) >= tdeg(a)", ExpVector.EVTDEG(c) >= ExpVector.EVTDEG(a));
413        assertTrue("tdeg(a+b) >= tdeg(b)", ExpVector.EVTDEG(c) >= ExpVector.EVTDEG(b));
414
415        c = a.lcm(b);
416        assertTrue("tdeg(lcm(a,b)) >= tdeg(a)", ExpVector.EVTDEG(c) >= ExpVector.EVTDEG(a));
417        assertTrue("tdeg(lcm(a,b)) >= tdeg(b)", ExpVector.EVTDEG(c) >= ExpVector.EVTDEG(b));
418    }
419
420
421    /**
422     * Test weighted.
423     */
424    public void testWeightdeg2() {
425        a = ExpVector.create(100);
426        assertTrue("tdeg(a) = 0", ExpVector.EVTDEG(a) == 0);
427        assertTrue("wdeg(a) = 0", ExpVector.EVWDEG(null, a) == 0);
428
429        float q = (float) 0.2;
430
431        a = ExpVector.random(5, 10, q);
432        b = ExpVector.random(5, 10, q);
433        long[][] w = new long[][] { new long[] { 1l, 1l, 1l, 1l, 1l } };
434
435        assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0);
436        assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0);
437
438        assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w, a) >= 0);
439        assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w, b) >= 0);
440
441        assertEquals("tdeg(a) == wdeg(a)", ExpVector.EVTDEG(a), ExpVector.EVWDEG(w, a));
442        assertEquals("tdeg(b) == wdeg(b)", ExpVector.EVTDEG(b), ExpVector.EVWDEG(w, b));
443
444        c = a.sum(b);
445        assertTrue("wdeg(a+b) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
446        assertTrue("wdeg(a+b) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
447
448        c = a.lcm(b);
449        assertTrue("wdeg(lcm(a,b)) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
450        assertTrue("wdeg(lcm(a,b)) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
451
452
453        w = new long[][] { new long[] { 10l, 1l, 3l, 9l, 100l } };
454
455        assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0);
456        assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0);
457
458        assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w, a) >= 0);
459        assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w, b) >= 0);
460
461        assertTrue("tdeg(a) <= wdeg(a)", ExpVector.EVTDEG(a) <= ExpVector.EVWDEG(w, a));
462        assertTrue("tdeg(b) <= wdeg(b)", ExpVector.EVTDEG(b) <= ExpVector.EVWDEG(w, b));
463
464        c = a.sum(b);
465        assertTrue("wdeg(a+b) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
466        assertTrue("wdeg(a+b) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
467
468        c = a.lcm(b);
469        assertTrue("wdeg(lcm(a,b)) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
470        assertTrue("wdeg(lcm(a,b)) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
471
472
473        w = new long[][] { new long[] { 10l, 1l, 3l, 9l, 100l }, new long[] { 1l, 1l, 1l, 1l, 1l } };
474
475        assertTrue("tdeg(a) >= 0", ExpVector.EVTDEG(a) >= 0);
476        assertTrue("tdeg(b) >= 0", ExpVector.EVTDEG(b) >= 0);
477
478        assertTrue("wdeg(a) >= 0", ExpVector.EVWDEG(w, a) >= 0);
479        assertTrue("wdeg(b) >= 0", ExpVector.EVWDEG(w, b) >= 0);
480
481        assertTrue("tdeg(a) <= wdeg(a)", ExpVector.EVTDEG(a) <= ExpVector.EVWDEG(w, a));
482        assertTrue("tdeg(b) <= wdeg(b)", ExpVector.EVTDEG(b) <= ExpVector.EVWDEG(w, b));
483
484        c = a.sum(b);
485        assertTrue("wdeg(a+b) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
486        assertTrue("wdeg(a+b) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
487
488        c = a.lcm(b);
489        assertTrue("wdeg(lcm(a,b)) >= wdeg(a)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, a));
490        assertTrue("wdeg(lcm(a,b)) >= wdeg(b)", ExpVector.EVWDEG(w, c) >= ExpVector.EVWDEG(w, b));
491
492    }
493
494
495    /**
496     * Test dependency on variables.
497     */
498    public void testDependency2() {
499        int[] exp;
500        int[] dep;
501
502        a = ExpVector.create(10, 5, 2l);
503        exp = new int[] { 5 };
504        dep = a.dependencyOnVariables();
505        assertTrue("[5] = [5]", Arrays.equals(exp, dep));
506
507        b = ExpVector.create(10, 3, 9l);
508        exp = new int[] { 3 };
509        dep = b.dependencyOnVariables();
510        assertTrue("[3] = [3]", Arrays.equals(exp, dep));
511
512        c = a.sum(b);
513        exp = new int[] { 3, 5 };
514        dep = c.dependencyOnVariables();
515        assertTrue("[3,5] = [3,5] " + Arrays.toString(exp) + "," + Arrays.toString(dep),
516                        Arrays.equals(exp, dep));
517
518        b = ExpVector.create(10);
519        exp = new int[] {};
520        dep = b.dependencyOnVariables();
521        assertTrue("[] = []", Arrays.equals(exp, dep));
522
523        b = ExpVector.create(0);
524        exp = new int[] {};
525        dep = b.dependencyOnVariables();
526        assertTrue("[] = []", Arrays.equals(exp, dep));
527
528        b = ExpVector.create(1, 0, 1l);
529        exp = new int[] { 0 };
530        dep = b.dependencyOnVariables();
531        assertTrue("[0] = [0]", Arrays.equals(exp, dep));
532    }
533
534
535    /**
536     * Test evaluation.
537     */
538    public void testEvaluation() {
539        float q = (float) 0.2;
540        int rl = 5;
541
542        a = ExpVector.random(rl, 10, q);
543        b = ExpVector.random(rl, 10, q);
544        BigInteger fv = new BigInteger(0);
545        List<BigInteger> v = new ArrayList<BigInteger>(a.length());
546        for (int i = 0; i < a.length(); i++) {
547            v.add(fv.random(4));
548        }
549
550        BigInteger av = a.evaluate(fv, v);
551        BigInteger bv = b.evaluate(fv, v);
552
553        c = a.sum(b);
554        BigInteger cv = c.evaluate(fv, v);
555        BigInteger dv = av.multiply(bv);
556
557        assertEquals("a(v)*b(v) = (a+b)(v) ", cv, dv);
558
559        c = ExpVector.create(rl);
560        cv = c.evaluate(fv, v);
561        dv = fv.getONE();
562        assertEquals("0(v) = 1 ", cv, dv);
563
564        v.clear();
565        for (int i = 0; i < a.length(); i++) {
566            v.add(fv.getZERO());
567        }
568        cv = c.evaluate(fv, v);
569        dv = fv.getONE();
570        assertEquals("0(0) = 1 ", cv, dv);
571
572        av = a.evaluate(fv, v);
573        if (a.isZERO()) {
574            dv = fv.getONE();
575            assertEquals("0(0) = 1 ", av, dv);
576        } else {
577            dv = fv.getZERO();
578            assertEquals("a(0) = 0 ", av, dv);
579        }
580    }
581
582
583    /**
584     * Test ExpVectorInteger.
585     */
586    public void testInteger() {
587        a = new ExpVectorInteger(10);
588        b = new ExpVectorInteger(10);
589        assertEquals("10e = 10e", a, b);
590        assertEquals("length( 10e ) = 10", a.length(), 10);
591        assertTrue("isZERO( ( 10e ) )", a.isZERO());
592
593        String s = "(0,0,0,0,0,0,0,0,0,0)";
594        a = new ExpVectorInteger(s);
595        String t = a.toString().substring(0, s.length());
596        assertEquals("stringConstr = toString", s, t);
597        assertTrue("isZERO( ( 10e ) )", a.isZERO());
598
599        a = ExpVectorInteger.valueOf(ExpVector.random(10, 20, 0.5f));
600        //System.out.println("a = " + a);
601        t = a.toString();
602        b = new ExpVectorInteger(t);
603        //System.out.println("b = " + b);
604        assertEquals("parse(toString(a)) == a", a, b);
605
606        b = ExpVectorInteger.valueOf(ExpVector.random(10, 20, 0.5f));
607        //System.out.println("b = " + b);
608        c = new ExpVectorInteger(b.getVal());
609        //System.out.println("c = " + c);
610        assertEquals("int(b) == c", b, c);
611
612        c = a.lcm(b);
613        //System.out.println("c = " + c);
614        assertTrue("deg(lcm(a,b)) >= deg(a)", c.totalDeg() >= a.totalDeg());
615        assertTrue("deg(lcm(a,b)) >= deg(b)", c.totalDeg() >= b.totalDeg());
616        assertTrue("a | lcm(a,b)", c.multipleOf(a));
617        assertTrue("b | lcm(a,b)", c.multipleOf(b));
618
619        d = a.gcd(b);
620        //System.out.println("d = " + d);
621        ExpVector e, f;
622        e = c.sum(d);
623        f = a.sum(b);
624        //System.out.println("e = " + e);
625        //System.out.println("f = " + f);
626        assertEquals("lcm(a,b)*gcd(a,b) == a*b", e, f);
627
628        c = a.reverse();
629        //System.out.println("c = " + c);
630        d = c.reverse(0);
631        //System.out.println("d = " + d);
632        assertEquals("rev(rev(a),0) == a", a, d);
633    }
634
635
636    /**
637     * Test ExpVectorShort.
638     */
639    public void testShort() {
640        a = new ExpVectorShort(10);
641        b = new ExpVectorShort(10);
642        assertEquals("10e = 10e", a, b);
643        assertEquals("length( 10e ) = 10", a.length(), 10);
644        assertTrue("isZERO( ( 10e ) )", a.isZERO());
645
646        String s = "(0,0,0,0,0,0,0,0,0,0)";
647        a = new ExpVectorShort(s);
648        String t = a.toString().substring(0, s.length());
649        assertEquals("stringConstr = toString", s, t);
650        assertTrue("isZERO( ( 10e ) )", a.isZERO());
651
652        a = ExpVectorShort.valueOf(ExpVector.random(10, 20, 0.5f));
653        //System.out.println("a = " + a); // + ", " + a.toScript());
654        t = a.toString();
655        b = new ExpVectorShort(t);
656        assertEquals("parse(toString(a)) == a", a, b);
657
658        b = ExpVectorShort.valueOf(ExpVector.random(10, 20, 0.5f));
659        //System.out.println("b = " + b);
660        c = new ExpVectorShort(b.getVal());
661        //System.out.println("c = " + c);
662        assertEquals("short(a) == a", b, c);
663
664        c = a.lcm(b);
665        //System.out.println("c = " + c);
666        assertTrue("deg(lcm(a,b)) >= deg(a)", c.totalDeg() >= a.totalDeg());
667        assertTrue("deg(lcm(a,b)) >= deg(b)", c.totalDeg() >= b.totalDeg());
668        assertTrue("a | lcm(a,b)", c.multipleOf(a));
669        assertTrue("b | lcm(a,b)", c.multipleOf(b));
670
671        d = a.gcd(b);
672        //System.out.println("d = " + d);
673        ExpVector e, f;
674        e = c.sum(d);
675        f = a.sum(b);
676        //System.out.println("e = " + e);
677        //System.out.println("f = " + f);
678        assertEquals("lcm(a,b)*gcd(a,b) == a*b", e, f);
679
680        c = a.reverse();
681        //System.out.println("c = " + c);
682        d = c.reverse(0);
683        //System.out.println("d = " + d);
684        assertEquals("rev(rev(a),0) == a", a, d);
685    }
686
687
688    /**
689     * Test ExpVectorByte.
690     */
691    public void testByte() {
692        a = new ExpVectorByte(10);
693        b = new ExpVectorByte(10);
694        assertEquals("10e = 10e", a, b);
695        assertEquals("length( 10e ) = 10", a.length(), 10);
696        assertTrue("isZERO( ( 10e ) )", a.isZERO());
697
698        String s = "(0,0,0,0,0,0,0,0,0,0)";
699        a = new ExpVectorByte(s);
700        String t = a.toString().substring(0, s.length());
701        assertEquals("stringConstr = toString", s, t);
702        assertTrue("isZERO( ( 10e ) )", a.isZERO());
703
704        a = ExpVectorByte.valueOf(ExpVector.random(10, 20, 0.5f));
705        //System.out.println("a = " + a); // + ", " + a.toScript());
706        t = a.toString();
707        b = new ExpVectorByte(t);
708        assertEquals("parse(toString(a)) == a", a, b);
709
710        b = ExpVectorByte.valueOf(ExpVector.random(10, 20, 0.5f));
711        //System.out.println("b = " + b);
712        c = new ExpVectorByte(b.getVal());
713        //System.out.println("c = " + c);
714        assertEquals("byte(a) == c", b, c);
715
716        c = a.lcm(b);
717        //System.out.println("c = " + c);
718        assertTrue("deg(lcm(a,b)) >= deg(a)", c.totalDeg() >= a.totalDeg());
719        assertTrue("deg(lcm(a,b)) >= deg(b)", c.totalDeg() >= b.totalDeg());
720        assertTrue("a | lcm(a,b)", c.multipleOf(a));
721        assertTrue("b | lcm(a,b)", c.multipleOf(b));
722
723        d = a.gcd(b);
724        //System.out.println("d = " + d);
725        ExpVector e, f;
726        e = c.sum(d);
727        f = a.sum(b);
728        //System.out.println("e = " + e);
729        //System.out.println("f = " + f);
730        assertEquals("lcm(a,b)*gcd(a,b) == a*b", e, f);
731
732        c = a.reverse();
733        //System.out.println("c = " + c);
734        d = c.reverse(0);
735        //System.out.println("d = " + d);
736        assertEquals("rev(rev(a),0) == a", a, d);
737    }
738
739
740    /**
741     * Test weight degree, long, integer, short and byte.
742     */
743    public void testWeightdegIntShortByte() {
744        float q = (float) 0.2;
745        a = new ExpVectorInteger(100);
746        assertTrue("tdeg(a) = 0", a.totalDeg() == 0);
747        assertTrue("wdeg(a) = 0", a.weightDeg((long[][])null) == 0);
748
749        a = ExpVectorInteger.valueOf(ExpVector.random(5, 10, q));
750        b = ExpVectorInteger.valueOf(ExpVector.random(5, 10, q));
751        //System.out.println("a = " + a);
752        //System.out.println("b = " + b);
753        runWeightdeg(a,b);
754
755        a = ExpVectorShort.valueOf(ExpVector.random(5, 10, q));
756        b = ExpVectorShort.valueOf(ExpVector.random(5, 10, q));
757        //System.out.println("a = " + a);
758        //System.out.println("b = " + b);
759        runWeightdeg(a,b);
760
761        a = ExpVectorByte.valueOf(ExpVector.random(5, 10, q));
762        b = ExpVectorByte.valueOf(ExpVector.random(5, 10, q));
763        //System.out.println("a = " + a);
764        //System.out.println("b = " + b);
765        runWeightdeg(a,b);
766
767        a = ExpVectorLong.valueOf(ExpVector.random(5, 10, q));
768        b = ExpVectorLong.valueOf(ExpVector.random(5, 10, q));
769        //System.out.println("a = " + a);
770        //System.out.println("b = " + b);
771        runWeightdeg(a,b);
772    }
773
774
775    /**
776     * Run weight degree tests.
777     */
778    public void runWeightdeg(ExpVector a, ExpVector b) {
779        long[][] w = new long[][] { new long[] { 1l, 1l, 1l, 1l, 1l } };
780
781        assertTrue("tdeg(a) >= 0", a.totalDeg() >= 0);
782        assertTrue("tdeg(b) >= 0", b.totalDeg() >= 0);
783        assertTrue("madeg(a) >= 0", a.maxDeg() >= 0);
784        assertTrue("madeg(b) >= 0", b.maxDeg() >= 0);
785        assertTrue("mideg(a) >= 0", a.minDeg() >= 0);
786        assertTrue("mideg(b) >= 0", b.minDeg() >= 0);
787        assertTrue("wdeg(a) >= 0", a.weightDeg(w) >= 0);
788        assertTrue("wdeg(b) >= 0", b.weightDeg(w) >= 0);
789        assertEquals("tdeg(a) == wdeg(a)", a.totalDeg(), a.weightDeg(w));
790        assertEquals("tdeg(b) == wdeg(b)", b.totalDeg(), b.weightDeg(w));
791
792        ExpVector c = a.sum(b);
793        assertTrue("wdeg(a+b) >= wdeg(a)", c.weightDeg(w) >= a.weightDeg(w));
794        assertTrue("wdeg(a+b) >= wdeg(b)", c.weightDeg(w) >= b.weightDeg(w));
795
796        c = a.lcm(b);
797        assertTrue("wdeg(lcm(a,b)) >= wdeg(a)", c.weightDeg(w) >= a.weightDeg(w));
798        assertTrue("wdeg(lcm(a,b)) >= wdeg(b)", c.weightDeg(w) >= b.weightDeg(w));
799
800
801        //w = new long[][] { new long[] { 10l, 1l, 3l, 9l, 100l } };
802        long[] v = new long[] { 10l, 1l, 3l, 9l, 100l };
803
804        assertTrue("tdeg(a) >= 0", a.totalDeg() >= 0);
805        assertTrue("tdeg(b) >= 0", b.totalDeg() >= 0);
806        assertTrue("wdeg(a) >= 0", a.weightDeg(v) >= 0);
807        assertTrue("wdeg(b) >= 0", b.weightDeg(v) >= 0);
808        assertTrue("tdeg(a) <= wdeg(a)", a.totalDeg() <= a.weightDeg(v));
809        assertTrue("tdeg(b) <= wdeg(b)", b.totalDeg() <= b.weightDeg(v));
810
811        c = a.sum(b);
812        assertTrue("wdeg(a+b) >= wdeg(a)", c.weightDeg(v) >= a.weightDeg(v));
813        assertTrue("wdeg(a+b) >= wdeg(b)", c.weightDeg(v) >= b.weightDeg(v));
814
815        c = a.lcm(b);
816        assertTrue("wdeg(lcm(a,b)) >= wdeg(a)", c.weightDeg(v) >= a.weightDeg(v));
817        assertTrue("wdeg(lcm(a,b)) >= wdeg(b)", c.weightDeg(v) >= b.weightDeg(v));
818
819
820        w = new long [][] { v, w[0] };
821
822        assertTrue("tdeg(a) >= 0", a.totalDeg() >= 0);
823        assertTrue("tdeg(b) >= 0", b.totalDeg() >= 0);
824        assertTrue("wdeg(a) >= 0", a.weightDeg(w) >= 0);
825        assertTrue("wdeg(b) >= 0", b.weightDeg(w) >= 0);
826        assertTrue("tdeg(a) <= wdeg(a)", a.totalDeg() <= a.weightDeg(w));
827        assertTrue("tdeg(b) <= wdeg(b)", b.totalDeg() <= b.weightDeg(w));
828
829        c = a.sum(b);
830        assertTrue("wdeg(a+b) >= wdeg(a)", c.weightDeg(w) >= a.weightDeg(w));
831        assertTrue("wdeg(a+b) >= wdeg(b)", c.weightDeg(w) >= b.weightDeg(w));
832
833        c = a.lcm(b);
834        assertTrue("wdeg(lcm(a,b)) >= wdeg(a)", c.weightDeg(w) >= a.weightDeg(w));
835        assertTrue("wdeg(lcm(a,b)) >= wdeg(b)", c.weightDeg(w) >= b.weightDeg(w));
836
837        int t = a.invWeightCompareTo(w,b) + b.invWeightCompareTo(w,a);
838        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
839        t = a.invWeightCompareTo(w,b,0,3) + b.invWeightCompareTo(w,a,0,3);
840        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
841
842        t = a.revInvLexCompareTo(b) + b.revInvLexCompareTo(a);
843        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
844        t = a.revInvLexCompareTo(b,0,3) + b.revInvLexCompareTo(a,0,3);
845        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
846
847        t = a.revInvGradCompareTo(b) + b.revInvGradCompareTo(a);
848        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
849        t = a.revInvGradCompareTo(b,0,3) + b.revInvGradCompareTo(a,0,3);
850        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
851
852        t = a.invLexCompareTo(b) + b.invLexCompareTo(a);
853        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
854        t = a.invLexCompareTo(b,0,3) + b.invLexCompareTo(a,0,3);
855        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
856
857        t = a.invGradCompareTo(b) + b.invGradCompareTo(a);
858        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
859        t = a.invGradCompareTo(b,0,3) + b.invGradCompareTo(a,0,3);
860        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
861
862        if (a instanceof ExpVectorShort || a instanceof ExpVectorByte) {
863            return;
864        }
865        t = a.invTdegCompareTo(b) + b.invTdegCompareTo(a);
866        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
867
868        t = a.revLexInvTdegCompareTo(b) + b.revLexInvTdegCompareTo(a);
869        assertTrue("(a <= b) + (b <= a) == 0", t == 0);
870    }
871
872}