001    /*
002     * $Id: GroebnerBaseSeqPairDistTest.java 3265 2010-08-15 10:20:39Z kredel $
003     */
004    
005    package edu.jas.gb;
006    
007    //import edu.jas.poly.GroebnerBase;
008    
009    import java.util.List;
010    import java.util.ArrayList;
011    import java.io.IOException;
012    import java.io.Reader;
013    import java.io.StringReader;
014    
015    import junit.framework.Test;
016    import junit.framework.TestCase;
017    import junit.framework.TestSuite;
018    
019    import org.apache.log4j.BasicConfigurator;
020    //import org.apache.log4j.Logger;
021    
022    import edu.jas.structure.RingElem;
023    
024    import edu.jas.arith.BigRational;
025    import edu.jas.gb.GroebnerBase;
026    import edu.jas.gb.GroebnerBaseSeq;
027    
028    import edu.jas.poly.GenPolynomial;
029    import edu.jas.poly.GenPolynomialRing;
030    import edu.jas.poly.GenPolynomialTokenizer;
031    import edu.jas.poly.PolynomialList;
032    
033    
034    /**
035     * Groebner base distributed, sequential pair list, tests with JUnit.
036     * @author Heinz Kredel
037     */
038    
039    public class GroebnerBaseSeqPairDistTest extends TestCase {
040    
041        //private static final Logger logger = Logger.getLogger(GroebnerBaseSeqPairDistTest.class);
042    
043    /**
044     * main
045     */
046       public static void main (String[] args) {
047              BasicConfigurator.configure();
048              junit.textui.TestRunner.run( suite() );
049       }
050    
051    /**
052     * Constructs a <CODE>GroebnerBaseSeqPairDistTest</CODE> object.
053     * @param name String.
054     */
055    public GroebnerBaseSeqPairDistTest(String name) {
056              super(name);
057       }
058    
059    /**
060     * suite.
061     */ 
062     public static Test suite() {
063         TestSuite suite= new TestSuite(GroebnerBaseSeqPairDistTest.class);
064         return suite;
065       }
066    
067       int port = 4711;
068       String host = "localhost";
069    
070       GenPolynomialRing<BigRational> fac;
071    
072       List<GenPolynomial<BigRational>> L;
073       PolynomialList<BigRational> F;
074       List<GenPolynomial<BigRational>> G;
075    
076       GroebnerBase<BigRational> bbseq;
077       GroebnerBaseSeqPairDistributed<BigRational> bbdist;
078    
079       GenPolynomial<BigRational> a;
080       GenPolynomial<BigRational> b;
081       GenPolynomial<BigRational> c;
082       GenPolynomial<BigRational> d;
083       GenPolynomial<BigRational> e;
084    
085       int rl = 3; //4; //3; 
086       int kl = 3;
087       int ll = 7;
088       int el = 3;
089       float q = 0.2f; //0.4f
090    
091       int threads = 2;
092    
093       protected void setUp() {
094           BigRational coeff = new BigRational(9);
095           fac = new GenPolynomialRing<BigRational>(coeff,rl);
096           a = b = c = d = e = null;
097           bbseq = new GroebnerBaseSeq<BigRational>();
098           bbdist = new GroebnerBaseSeqPairDistributed<BigRational>(threads,port);
099       }
100    
101       protected void tearDown() {
102           a = b = c = d = e = null;
103           fac = null;
104           bbseq = null;
105           bbdist.terminate();
106           bbdist = null;
107       }
108    
109    
110    /**
111     * Helper method to start threads with distributed clients.
112     * 
113     */
114    
115      Thread[] startThreads() {
116         Thread[] clients = new Thread[threads];
117         for (int t = 0; t < threads; t++) {
118             clients[t] = new Thread( new JunitSeqPairClient(host,port) );
119             clients[t].start();
120         }
121         return clients;
122     }
123    
124    /**
125     * Helper method to stop threads with distributed clients.
126     * 
127     */
128    
129        void stopThreads(Thread[] clients) {
130            for (int t = 0; t < threads; t++) {
131                try {
132                    clients[t].join();
133                } catch (InterruptedException e) {
134                }
135            }
136        }
137    
138    
139    /**
140     * Test distributed GBase.
141     * 
142     */
143     public void testSeqPairDistributedGBase() {
144    
145         Thread[] clients;
146    
147         L = new ArrayList<GenPolynomial<BigRational>>();
148    
149         a = fac.random(kl, ll, el, q );
150         b = fac.random(kl, ll, el, q );
151         c = fac.random(kl, ll, el, q );
152         d = fac.random(kl, ll, el, q );
153         e = d; //fac.random(kl, ll, el, q );
154    
155         if ( a.isZERO() || b.isZERO() || c.isZERO() || d.isZERO() ) {
156            return;
157         }
158    
159         assertTrue("not isZERO( a )", !a.isZERO() );
160         L.add(a);
161    
162         clients = startThreads();
163         L = bbdist.GB( L );
164         stopThreads( clients );
165         assertTrue("isGB( { a } )", bbseq.isGB(L) );
166    
167         assertTrue("not isZERO( b )", !b.isZERO() );
168         L.add(b);
169         //System.out.println("L = " + L.size() );
170    
171         clients = startThreads();
172         L = bbdist.GB( L );
173         stopThreads( clients );
174         assertTrue("isGB( { a, b } )", bbseq.isGB(L) );
175    
176         assertTrue("not isZERO( c )", !c.isZERO() );
177         L.add(c);
178    
179         clients = startThreads();
180         L = bbdist.GB( L );
181         stopThreads( clients );
182         assertTrue("isGB( { a, b, c } )", bbseq.isGB(L) );
183    
184         assertTrue("not isZERO( d )", !d.isZERO() );
185         L.add(d);
186    
187         clients = startThreads();
188         L = bbdist.GB( L );
189         stopThreads( clients );
190         assertTrue("isGB( { a, b, c, d } )", bbseq.isGB(L) );
191    
192         assertTrue("not isZERO( e )", !e.isZERO() );
193         L.add(e);
194    
195         clients = startThreads();
196         L = bbdist.GB( L );
197         stopThreads( clients );
198         assertTrue("isGB( { a, b, c, d, e } )", bbseq.isGB(L) );
199     }
200    
201    
202    /**
203     * Test compare sequential with distributed GBase.
204     * 
205     */
206     public void testSequentialSeqPairDistributedGBase() {
207    
208         Thread[] clients;
209    
210         List<GenPolynomial<BigRational>> Gs, Gp = null;
211    
212         L = new ArrayList<GenPolynomial<BigRational>>();
213    
214         a = fac.random(kl, ll, el, q );
215         b = fac.random(kl, ll, el, q );
216         c = fac.random(kl, ll, el, q );
217         d = fac.random(kl, ll, el, q );
218         e = d; //fac.random(kl, ll, el, q );
219    
220         if ( a.isZERO() || b.isZERO() || c.isZERO() || d.isZERO() ) {
221            return;
222         }
223    
224         L.add(a);
225         Gs = bbseq.GB( L );
226         clients = startThreads();
227         Gp = bbdist.GB( L );
228         stopThreads( clients );
229    
230         assertTrue("Gs.containsAll(Gp)" + Gs + ", " + Gp, Gs.containsAll(Gp) );
231         assertTrue("Gp.containsAll(Gs)" + Gs + ", " + Gp, Gp.containsAll(Gs) );
232    
233         L = Gs;
234         L.add(b);
235         Gs = bbseq.GB( L );
236         clients = startThreads();
237         Gp = bbdist.GB( L );
238         stopThreads( clients );
239         assertTrue("Gs.containsAll(Gp)" + Gs + ", " + Gp, Gs.containsAll(Gp) );
240         assertTrue("Gp.containsAll(Gs)" + Gs + ", " + Gp, Gp.containsAll(Gs) );
241    
242         L = Gs;
243         L.add(c);
244         Gs = bbseq.GB( L );
245         clients = startThreads();
246         Gp = bbdist.GB( L );
247         stopThreads( clients );
248    
249         assertTrue("Gs.containsAll(Gp)" + Gs + ", " + Gp, Gs.containsAll(Gp) );
250         assertTrue("Gp.containsAll(Gs)" + Gs + ", " + Gp, Gp.containsAll(Gs) );
251    
252         L = Gs;
253         L.add(d);
254         Gs = bbseq.GB( L );
255         clients = startThreads();
256         Gp = bbdist.GB( L );
257         stopThreads( clients );
258    
259         assertTrue("Gs.containsAll(Gp)" + Gs + ", " + Gp, Gs.containsAll(Gp) );
260         assertTrue("Gp.containsAll(Gs)" + Gs + ", " + Gp, Gp.containsAll(Gs) );
261    
262         L = Gs;
263         L.add(e);
264         Gs = bbseq.GB( L );
265         clients = startThreads();
266         Gp = bbdist.GB( L );
267         stopThreads( clients );
268    
269         assertTrue("Gs.containsAll(Gp)" + Gs + ", " + Gp, Gs.containsAll(Gp) );
270         assertTrue("Gp.containsAll(Gs)" + Gs + ", " + Gp, Gp.containsAll(Gs) );
271     }
272    
273    
274    /**
275     * Test Trinks7 GBase.
276     * 
277     */
278     public void testTrinks7GBase() {
279         Thread[] clients;
280         String exam = "(B,S,T,Z,P,W) L "
281                     + "( "  
282                     + "( 45 P + 35 S - 165 B - 36 ), " 
283                     + "( 35 P + 40 Z + 25 T - 27 S ), "
284                     + "( 15 W + 25 S P + 30 Z - 18 T - 165 B**2 ), "
285                     + "( - 9 W + 15 T P + 20 S Z ), "
286                     + "( P W + 2 T Z - 11 B**3 ), "
287                     + "( 99 W - 11 B S + 3 B**2 ), "
288                     + "( B**2 + 33/50 B + 2673/10000 ) "
289                     + ") ";
290         Reader source = new StringReader( exam );
291         GenPolynomialTokenizer parser
292                      = new GenPolynomialTokenizer( source );
293         try {
294             F = (PolynomialList<BigRational>) parser.nextPolynomialSet();
295         } catch(IOException e) {
296             fail(""+e);
297         }
298         //System.out.println("F = " + F);
299    
300         clients = startThreads();
301         G = bbdist.GB( F.list );
302         stopThreads( clients );
303    
304         assertTrue("isGB( GB(Trinks7) )", bbseq.isGB(G) );
305         assertEquals("#GB(Trinks7) == 6", 6, G.size() );
306         PolynomialList<BigRational> trinks 
307               = new PolynomialList<BigRational>(F.ring,G);
308         //System.out.println("G = " + trinks);
309    
310     }
311    
312    }
313    
314    
315    /**
316     * Unit Test client to be executed by test threads.
317     */
318    
319    class JunitSeqPairClient<C extends RingElem<C>> implements Runnable {
320        private final String host;
321        private final int port;
322    
323        JunitSeqPairClient(String host, int port) {
324            this.host = host;
325            this.port = port;
326        }
327    
328        public void run() {
329            GroebnerBaseSeqPairDistributed<C> bbd;
330            bbd = new GroebnerBaseSeqPairDistributed<C>(1,null,port);
331            try {
332                bbd.clientPart(host);
333            } catch (IOException ignored) {
334            }
335            bbd.terminate();
336        }
337    }
338