001 /* 002 * $Id: GBDistSP.java 3295 2010-08-26 17:01:10Z kredel $ 003 */ 004 005 package edu.jas.gb; 006 007 008 import java.io.IOException; 009 import java.util.List; 010 011 import edu.jas.poly.GenPolynomial; 012 import edu.jas.structure.RingElem; 013 import edu.jas.util.DistThreadPool; 014 import edu.jas.util.RemoteExecutable; 015 016 017 /** 018 * Setup to run a distributed GB example. 019 * @author Heinz Kredel 020 */ 021 022 public class GBDistSP<C extends RingElem<C>> { 023 024 025 /** 026 * machine file to use. 027 */ 028 private final String mfile; 029 030 031 /** 032 * Number of threads to use. 033 */ 034 protected final int threads; 035 036 037 /** 038 * Server port to use. 039 */ 040 protected final int port; 041 042 043 /** 044 * GB algorithm to use. 045 */ 046 private final GroebnerBaseSeqPairDistributed<C> bbd; 047 048 049 /** 050 * Distributed thread pool to use. 051 */ 052 private final DistThreadPool dtp; 053 054 055 /** 056 * Constructor. 057 * @param threads number of threads respectivly processes. 058 * @param mfile name of the machine file. 059 * @param port for GB server. 060 */ 061 public GBDistSP(int threads, String mfile, int port) { 062 this.threads = threads; 063 if (mfile == null || mfile.length() == 0) { 064 this.mfile = "../util/machines"; 065 } else { 066 this.mfile = mfile; 067 } 068 this.port = port; 069 bbd = new GroebnerBaseSeqPairDistributed<C>(threads, port); 070 dtp = new DistThreadPool(threads, mfile); 071 } 072 073 074 /** 075 * Execute a distributed GB example. Distribute clients and start master. 076 * Obsolete version. 077 * @param F list of polynomials 078 * @return GB(F) a Groebner base for F. public List<GenPolynomial<C>> 079 * executeOld(List<GenPolynomial<C>> F) { final int numc = threads; 080 * List<GenPolynomial<C>> G = null; ExecutableChannels ec = null; 081 * try { ec = new ExecutableChannels( mfile ); } catch 082 * (FileNotFoundException e) { e.printStackTrace(); return G; } try 083 * { ec.open(numc); } catch (IOException e) { e.printStackTrace(); 084 * return G; } GBClient<C> gbc = new GBClient<C>( 085 * ec.getMasterHost(), ec.getMasterPort() ); try { for ( int i = 0; 086 * i < numc; i++ ) { ec.send( i, gbc ); } } catch (IOException e) { 087 * e.printStackTrace(); return G; } G = bbd.GB( F ); try { for ( int 088 * i = 0; i < numc; i++ ) { Object o = ec.receive( i ); } } catch 089 * (IOException e) { e.printStackTrace(); return G; } catch 090 * (ClassNotFoundException e) { e.printStackTrace(); return G; } 091 * ec.close(); bbd.terminate(); return G; } 092 */ 093 094 095 /** 096 * Execute a distributed GB example. Distribute clients and start master. 097 * @param F list of polynomials 098 * @return GB(F) a Groebner base for F. 099 */ 100 public List<GenPolynomial<C>> execute(List<GenPolynomial<C>> F) { 101 String master = dtp.getEC().getMasterHost(); 102 int port = dtp.getEC().getMasterPort(); 103 GBClientSP<C> gbc = new GBClientSP<C>(master, port); 104 for (int i = 0; i < threads; i++) { 105 // schedule remote clients 106 dtp.addJob(gbc); 107 } 108 // run master 109 List<GenPolynomial<C>> G = bbd.GB(F); 110 return G; 111 } 112 113 114 /** 115 * Terminates the distributed thread pools. 116 * @param shutDown true, if shut-down of the remote executable servers is 117 * requested, false, if remote executable servers stay alive. 118 */ 119 public void terminate(boolean shutDown) { 120 bbd.terminate(); 121 dtp.terminate(shutDown); 122 } 123 124 } 125 126 127 /** 128 * Objects of this class are to be send to a ExecutableServer. 129 */ 130 131 class GBClientSP<C extends RingElem<C>> implements RemoteExecutable { 132 133 134 String host; 135 136 137 int port; 138 139 140 /** 141 * GBClient. 142 * @param host 143 * @param port 144 */ 145 public GBClientSP(String host, int port) { 146 this.host = host; 147 this.port = port; 148 } 149 150 151 /** 152 * run. 153 */ 154 public void run() { 155 GroebnerBaseSeqPairDistributed<C> bbd; 156 bbd = new GroebnerBaseSeqPairDistributed<C>(1, null, port); 157 try { 158 bbd.clientPart(host); 159 } catch (IOException ignored) { 160 } 161 bbd.terminate(); 162 } 163 164 }