001/*
002 * $Id: JLAdapterFactory.java 5244 2015-05-01 13:29:44Z kredel $
003 */
004
005package edu.jas.jlinalg;
006
007
008import java.util.Random;
009
010import org.jlinalg.IRingElement;
011import org.jlinalg.IRingElementFactory;
012import org.jlinalg.Matrix;
013import org.jlinalg.Vector;
014
015import edu.jas.structure.ElemFactory;
016import edu.jas.structure.Element;
017import edu.jas.structure.RingElem;
018import edu.jas.structure.RingFactory;
019
020
021/**
022 * Class that wraps a JAS <code>RingFactory</code> in an JLinALg
023 * <code>IRingElementFactory</code>.
024 * @param <C> JAS ring element type
025 * @author Heinz Kredel
026 */
027
028public class JLAdapterFactory<C extends RingElem<C>> implements IRingElementFactory<JLAdapter<C>> {
029
030
031    public final RingFactory<C> fac;
032
033
034    /**
035     * @param f
036     */
037    public JLAdapterFactory(RingFactory<C> f) {
038        fac = f;
039    }
040
041
042    /**
043     * @param f element factory
044     */
045    @SuppressWarnings("unchecked")
046    public JLAdapterFactory(ElemFactory<C> f) {
047        this((RingFactory<C>) f);
048    }
049
050
051    /**
052     * Get the string representation.
053     * @see java.lang.Object#toString()
054     */
055    @SuppressWarnings("unchecked")
056    @Override
057    public String toString() {
058        StringBuffer s = new StringBuffer();
059        //s.append("JLAdapterFactory(");
060        String f = null;
061        try {
062            f = ((Element<C>) fac).toScriptFactory();
063        } catch (Exception ignored) {
064            f = fac.toScript();
065        }
066        if (f != null) {
067            s.append(f);
068        }
069        //s.append(")");
070        return s.toString();
071    }
072
073
074    /**
075     * @see java.lang.Object#equals(java.lang.Object)
076     */
077    @SuppressWarnings("unchecked")
078    @Override
079    public boolean equals(Object obj) {
080        //System.out.println("factory equals, this = " + this + ", obj = " + obj);
081        if (!(obj instanceof IRingElementFactory)) {
082            return false;
083        }
084        IRingElementFactory other = (IRingElementFactory) obj;
085        if (!(other instanceof JLAdapterFactory)) {
086            return false;
087        }
088        JLAdapterFactory<C> fother = (JLAdapterFactory<C>) other;
089        RingFactory<C> ofac = fother.fac;
090        //System.out.println("factory equals, this = " + fac.getClass() + ", obj = " + ofac.getClass());
091        if (!fac.getClass().getName().equals(ofac.getClass().getName())) {
092            return false;
093        }
094        RingFactory<C> ofac1 = null;
095        try {
096            ofac1 = (RingFactory<C>) ((RingElem<C>) ofac).factory();
097        } catch (ClassCastException e) {
098        }
099        if ( /*fac*/ofac.equals(ofac1)) { // case BigInteger etc
100            return true;
101        }
102        System.out.println("factory equals, this = " + ofac + ", obj = " + ofac1);
103        //  if (fac.characteristic().equals(ffac.characteristic())) {
104        //      return true;
105        //  }
106        return fac.equals(ofac);
107    }
108
109
110    /**
111     * @see java.lang.Object#hashCode()
112     */
113    @Override
114    public int hashCode() {
115        RingFactory<C> fac1 = null;
116        try {
117            fac1 = (RingFactory<C>) ((RingElem<C>) fac).factory();
118        } catch (ClassCastException e) {
119        }
120        if (fac.equals(fac1)) { // case BigInteger etc
121            //int h = fac.getClass().getSimpleName().hashCode();
122            //h = h * 37 + fac.characteristic().hashCode();
123            return fac.getClass().getName().hashCode();
124        }
125        return fac.hashCode();
126    }
127
128
129    @Override
130    public JLAdapter<C> get(Object o) {
131        if (o == null) {
132            return null;
133        }
134        String s = o.toString();
135        return new JLAdapter<C>(fac.parse(s));
136    }
137
138
139    @Override
140    public JLAdapter<C> get(int i) {
141        return new JLAdapter<C>(fac.fromInteger(i));
142    }
143
144
145    @Override
146    public JLAdapter<C> get(long i) {
147        return new JLAdapter<C>(fac.fromInteger(i));
148    }
149
150
151    @Override
152    public JLAdapter<C> get(double d) {
153        throw new RuntimeException("not implemented " + d);
154    }
155
156
157    @SuppressWarnings({ "unchecked", "cast" })
158    @Override
159    public JLAdapter<C>[] getArray(int size) {
160        JLAdapter<C>[] arr = (JLAdapter<C>[]) new JLAdapter[size];
161        for (int i = 0; i < arr.length; i++) {
162            arr[i] = zero();
163        }
164        return arr;
165    }
166
167
168    @SuppressWarnings({ "unchecked", "cast" })
169    @Override
170    public JLAdapter<C>[][] getArray(int rows, int columns) {
171        JLAdapter<C>[][] arr = (JLAdapter<C>[][]) new JLAdapter[rows][columns];
172        for (int i = 0; i < arr.length; i++) {
173            arr[i] = getArray(columns);
174        }
175        return arr;
176    }
177
178
179    /**
180     * Minus one? OK
181     * @see org.jlinalg.IRingElementFactory#m_one()
182     */
183    @Override
184    public JLAdapter<C> m_one() {
185        return new JLAdapter<C>(fac.getONE().negate());
186    }
187
188
189    @Override
190    public JLAdapter<C> one() {
191        return new JLAdapter<C>(fac.getONE());
192    }
193
194
195    @Override
196    public JLAdapter<C> zero() {
197        return new JLAdapter<C>(fac.getZERO());
198    }
199
200
201    @Deprecated
202    @Override
203    public JLAdapter<C> randomValue(Random random) {
204        return new JLAdapter<C>(fac.random(3, random));
205    }
206
207
208    @Override
209    public JLAdapter<C> randomValue() {
210        return new JLAdapter<C>(fac.random(3));
211    }
212
213
214    @Deprecated
215    @Override
216    public JLAdapter<C> gaussianRandomValue(Random random) {
217        throw new RuntimeException("not implemented " + random);
218    }
219
220
221    @Override
222    public JLAdapter<C> gaussianRandomValue() {
223        throw new RuntimeException("not implemented");
224    }
225
226
227    @Deprecated
228    @Override
229    public JLAdapter<C> randomValue(Random random, JLAdapter<C> min, JLAdapter<C> max) {
230        throw new RuntimeException("not implemented");
231    }
232
233
234    @Override
235    public JLAdapter<C> randomValue(JLAdapter<C> min, JLAdapter<C> max) {
236        throw new RuntimeException("not implemented");
237    }
238
239
240    @SuppressWarnings({ "unchecked", "cast" })
241    @Override
242    public Vector<JLAdapter<C>> convert(Vector<? extends IRingElement<?>> from) {
243        //if (true) {
244        //    throw new RuntimeException("not implemented");
245        //}
246        JLAdapter<C>[] to = (JLAdapter<C>[]) new JLAdapter[from.length()];
247        for (int row = 0; row < from.length(); row++) {
248            to[row] = this.get(from.getEntry(row));
249        }
250        return new Vector<JLAdapter<C>>(to, this);
251    }
252
253
254    @SuppressWarnings({ "unchecked", "cast" })
255    @Override
256    public Matrix<JLAdapter<C>> convert(Matrix<? extends IRingElement<?>> from) {
257        //if (true) {
258        //    throw new RuntimeException("not implemented");
259        //}
260        JLAdapter<C>[][] to = (JLAdapter<C>[][]) new JLAdapter[from.getRows()][from.getCols()];
261        for (int row = 0; row < from.getRows(); row++) {
262            for (int col = 0; col < from.getCols(); col++) {
263                to[row][col] = this.get(from.get(row, col));
264            }
265        }
266        return new Matrix<JLAdapter<C>>(to, this);
267    }
268
269}