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