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