001 /*
002 * $Id: GBProxy.java 3211 2010-07-05 12:54:22Z kredel $
003 */
004
005 package edu.jas.gb;
006
007
008 import java.util.ArrayList;
009 import java.util.List;
010 import java.util.concurrent.Callable;
011 import java.util.concurrent.ExecutionException;
012 import java.util.concurrent.ExecutorService;
013
014 import org.apache.log4j.Logger;
015
016 import edu.jas.kern.ComputerThreads;
017 import edu.jas.kern.PreemptingException;
018 import edu.jas.poly.GenPolynomial;
019 import edu.jas.structure.GcdRingElem;
020
021
022 /**
023 * Groebner bases parallel proxy.
024 * @author Heinz Kredel
025 */
026
027 public class GBProxy<C extends GcdRingElem<C>> extends GroebnerBaseAbstract<C> {
028
029
030 private static final Logger logger = Logger.getLogger(GBProxy.class);
031
032
033 private final boolean debug = logger.isDebugEnabled(); //logger.isInfoEnabled();
034
035
036 /**
037 * GB engines.
038 */
039 public final GroebnerBaseAbstract<C> e1;
040
041
042 public final GroebnerBaseAbstract<C> e2;
043
044
045 /**
046 * Thread pool.
047 */
048 protected ExecutorService pool;
049
050
051 /**
052 * Proxy constructor.
053 */
054 public GBProxy(GroebnerBaseAbstract<C> e1, GroebnerBaseAbstract<C> e2) {
055 this.e1 = e1;
056 this.e2 = e2;
057 if (pool == null) {
058 pool = ComputerThreads.getPool();
059 //System.out.println("pool 2 = "+pool);
060 }
061 }
062
063
064 /**
065 * Get the String representation with GB engines.
066 * @see java.lang.Object#toString()
067 */
068 @Override
069 public String toString() {
070 return "GBProxy[ " + e1.getClass().getName() + ", " + e2.getClass().getName() + " ]";
071 }
072
073
074 /**
075 * Cleanup and terminate ThreadPool.
076 */
077 public void terminate() {
078 e1.terminate();
079 e2.terminate();
080 }
081
082
083 /**
084 * Cancel ThreadPool.
085 */
086 public int cancel() {
087 int s = e1.cancel();
088 s += e2.cancel();
089 return s;
090 }
091
092
093 /**
094 * Groebner base.
095 * @param modv module variable number.
096 * @param F polynomial list.
097 * @return GB(F) a Groebner base of F.
098 */
099 //JAVA6only: @Override
100 public List<GenPolynomial<C>> GB( final int modv, final List<GenPolynomial<C>> F ) {
101 if (F == null || F.isEmpty()) {
102 return F;
103 }
104 // parallel case
105 List<GenPolynomial<C>> G = null;
106 List<Callable<List<GenPolynomial<C>>>> cs = new ArrayList<Callable<List<GenPolynomial<C>>>>(2);
107 cs.add(new Callable<List<GenPolynomial<C>>>() {
108 public List<GenPolynomial<C>> call() {
109 try {
110 //System.out.println("starting e1 " + e1.getClass().getName());
111 List<GenPolynomial<C>> G = e1.GB(modv,F);
112 if (debug) {
113 logger.info("GBProxy done e1 " + e1.getClass().getName());
114 }
115 return G;
116 } catch (PreemptingException e) {
117 throw new RuntimeException("GBProxy e1 preempted " + e);
118 //return P.ring.getONE();
119 } catch (Exception e) {
120 //e.printStackTrace();
121 logger.info("GBProxy e1 " + e);
122 logger.info("Exception GBProxy F = " + F);
123 throw new RuntimeException("GBProxy e1 " + e);
124 //return P.ring.getONE();
125 }
126 }
127 });
128 cs.add(new Callable<List<GenPolynomial<C>>>() {
129 public List<GenPolynomial<C>> call() {
130 try {
131 //System.out.println("starting e2 " + e2.getClass().getName());
132 List<GenPolynomial<C>> G = e2.GB(modv,F);
133 if (debug) {
134 logger.info("GBProxy done e2 " + e2.getClass().getName());
135 }
136 return G;
137 } catch (PreemptingException e) {
138 throw new RuntimeException("GBProxy e2 preempted " + e);
139 //return P.ring.getONE();
140 } catch (Exception e) {
141 //e.printStackTrace();
142 logger.info("GBProxy e2 " + e);
143 logger.info("Exception GBProxy F = " + F);
144 throw new RuntimeException("GBProxy e2 " + e);
145 //return P.ring.getONE();
146 }
147 }
148 });
149 try {
150 G = pool.invokeAny(cs);
151 } catch (InterruptedException ignored) {
152 logger.info("InterruptedException " + ignored);
153 Thread.currentThread().interrupt();
154 } catch (ExecutionException e) {
155 logger.info("ExecutionException " + e);
156 Thread.currentThread().interrupt();
157 }
158 return G;
159 }
160
161 }