001/*
002 * $Id$
003 */
004
005package edu.jas.poly;
006
007
008import java.util.ArrayList;
009import java.util.List;
010
011import edu.jas.arith.BigRational;
012
013import junit.framework.Test;
014import junit.framework.TestCase;
015import junit.framework.TestSuite;
016
017
018/**
019 * TermOrderOptimization tests with JUnit.
020 * @author Heinz Kredel
021 */
022public class TermOrderOptimizationTest extends TestCase {
023
024
025    /**
026     * main.
027     */
028    public static void main(String[] args) {
029        junit.textui.TestRunner.run(suite());
030    }
031
032
033    /**
034     * Constructs a <CODE>TermOrderOptimizationTest</CODE> object.
035     * @param name String.
036     */
037    public TermOrderOptimizationTest(String name) {
038        super(name);
039    }
040
041
042    /**
043     * suite.
044     */
045    public static Test suite() {
046        TestSuite suite = new TestSuite(TermOrderOptimizationTest.class);
047        return suite;
048    }
049
050
051    int rl = 7;
052
053
054    int kl = 3;
055
056
057    int ll = 10;
058
059
060    int el = 7;
061
062
063    float q = 0.5f;
064
065
066    GenPolynomialRing<BigRational> fac;
067
068
069    GenPolynomial<BigRational> a, b, c, d, e;
070
071
072    GenPolynomialRing<GenPolynomial<BigRational>> rfac;
073
074
075    GenPolynomial<GenPolynomial<BigRational>> ar, br, cr, dr, er;
076
077
078    @Override
079    protected void setUp() {
080    }
081
082
083    @Override
084    protected void tearDown() {
085    }
086
087
088    /**
089     * Test permutations.
090     */
091    public void testPermutation() {
092        List<Integer> P = new ArrayList<Integer>();
093        P.add(2);
094        P.add(1);
095        P.add(4);
096        P.add(0);
097        P.add(3);
098        //System.out.println("P = " + P);
099
100        List<Integer> S = TermOrderOptimization.inversePermutation(P);
101        //System.out.println("S = " + S);
102        assertFalse("P != id", TermOrderOptimization.isIdentityPermutation(P));
103        assertFalse("S != id", TermOrderOptimization.isIdentityPermutation(S));
104
105        List<Integer> T = TermOrderOptimization.multiplyPermutation(P, S);
106        //System.out.println("T = " + T);
107        List<Integer> U = TermOrderOptimization.multiplyPermutation(S, P);
108        //System.out.println("U = " + U);
109
110        assertTrue("T == id", TermOrderOptimization.isIdentityPermutation(T));
111        assertTrue("U == id", TermOrderOptimization.isIdentityPermutation(U));
112    }
113
114
115    /**
116     * Test polynomial optimization.
117     */
118    public void testPolyOptimization() {
119        BigRational cf = new BigRational();
120        fac = new GenPolynomialRing<BigRational>(cf, rl);
121        //System.out.println("fac = " + fac);
122
123        a = fac.random(kl, ll, el, q);
124        b = fac.random(kl, ll, el, q);
125        c = fac.random(kl, ll, el, q);
126        d = fac.random(kl, ll, el, q);
127        e = fac.random(kl, ll, el, q);
128
129        List<GenPolynomial<BigRational>> F = new ArrayList<GenPolynomial<BigRational>>();
130        F.add(a);
131        F.add(b);
132        F.add(c);
133        F.add(d);
134        F.add(e);
135        //System.out.println("F = " + F);
136        long t = F.toString().length();
137
138        OptimizedPolynomialList<BigRational> Fo, Fo2;
139        Fo = TermOrderOptimization.<BigRational> optimizeTermOrder(fac, F);
140        //System.out.println("Fo = " + Fo.perm);
141
142        Fo2 = TermOrderOptimization.<BigRational> optimizeTermOrder(Fo.ring, Fo.list);
143        //System.out.println("Fo2 = " + Fo2.perm);
144        assertEquals("Fo == Fo2: ", Fo, Fo2);
145
146        List<Integer> S = TermOrderOptimization.inversePermutation(Fo.perm);
147
148        GenPolynomialRing<BigRational> faci = Fo.ring.permutation(S);
149        //System.out.println("faci = " + faci);
150        List<GenPolynomial<BigRational>> Fi = TermOrderOptimization.permutation(S, faci, Fo.list);
151
152        //System.out.println("Fi = " + Fi);
153        //System.out.println("Fi = " + Fi);
154        assertEquals("r == ri: ", fac, faci);
155        assertEquals("F == Fi: ", F, Fi);
156
157        String s = Fo.toString();
158        //System.out.println("t = " + t + ", #ss = " + s.length());
159        assertTrue("#s >= t: " + s, s.length() >= t);
160    }
161
162
163    /**
164     * Test polynomial coefficients optimization.
165     */
166    public void testPolyCoefOptimization() {
167        BigRational cf = new BigRational();
168        fac = new GenPolynomialRing<BigRational>(cf, rl);
169        //System.out.println("fac = " + fac);
170
171        rfac = new GenPolynomialRing<GenPolynomial<BigRational>>(fac, 3);
172        //System.out.println("rfac = " + rfac);
173
174        ar = rfac.random(kl, ll, el, q);
175        br = rfac.random(kl, ll, el, q);
176        cr = rfac.random(kl, ll, el, q);
177        dr = rfac.random(kl, ll, el, q);
178        er = rfac.random(kl, ll, el, q);
179
180        List<GenPolynomial<GenPolynomial<BigRational>>> F = new ArrayList<GenPolynomial<GenPolynomial<BigRational>>>();
181        F.add(ar);
182        F.add(br);
183        F.add(cr);
184        F.add(dr);
185        F.add(er);
186        //System.out.println("F = " + F);
187
188        OptimizedPolynomialList<GenPolynomial<BigRational>> Fo, Fo2;
189        Fo = TermOrderOptimization.<BigRational> optimizeTermOrderOnCoefficients(rfac, F);
190        //System.out.println("Fo = " + Fo.perm);
191
192        Fo2 = TermOrderOptimization.<BigRational> optimizeTermOrderOnCoefficients(Fo.ring, Fo.list);
193        //System.out.println("Fo2 = " + Fo2.perm);
194        assertEquals("Fo == Fo2: ", Fo, Fo2);
195
196        List<Integer> S = TermOrderOptimization.inversePermutation(Fo.perm);
197
198        GenPolynomialRing<BigRational> cof = (GenPolynomialRing<BigRational>) Fo.ring.coFac;
199        cof = cof.permutation(S);
200
201        GenPolynomialRing<GenPolynomial<BigRational>> faci = new GenPolynomialRing<GenPolynomial<BigRational>>(
202                        cof, rfac);
203        //System.out.println("faci = " + faci);
204        List<GenPolynomial<GenPolynomial<BigRational>>> Fi = TermOrderOptimization
205                        .permutationOnCoefficients(S, faci, Fo.list);
206
207        //System.out.println("Fi = " + Fi);
208        //System.out.println("Fi = " + Fi);
209        assertEquals("r == ri: ", rfac, faci);
210        assertEquals("F == Fi: ", F, Fi);
211    }
212
213}