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