001    /*
002     * $Id: GenVector.java 3571 2011-03-18 22:02:51Z kredel $
003     */
004    
005    package edu.jas.vector;
006    
007    
008    import java.util.ArrayList;
009    import java.util.List;
010    
011    import org.apache.log4j.Logger;
012    
013    import edu.jas.kern.PrettyPrint;
014    import edu.jas.structure.ModulElem;
015    import edu.jas.structure.RingElem;
016    
017    
018    /**
019     * GenVector implements generic vectors with RingElem entries. Vectors of n
020     * columns over C.
021     * @author Heinz Kredel
022     */
023    
024    public class GenVector<C extends RingElem<C>> implements ModulElem<GenVector<C>, C> {
025    
026    
027        private static final Logger logger = Logger.getLogger(GenVector.class);
028    
029    
030        public final GenVectorModul<C> modul;
031    
032    
033        public final List<C> val;
034    
035    
036        /**
037         * Constructor for GenVector.
038         */
039        public GenVector(GenVectorModul<C> m) {
040            this(m, m.getZERO().val);
041        }
042    
043    
044        /**
045         * Constructor for GenVector.
046         */
047        public GenVector(GenVectorModul<C> m, List<C> v) {
048            if (m == null || v == null) {
049                throw new IllegalArgumentException("Empty m or v not allowed, m = " + m + ", v = " + v);
050            }
051            modul = m;
052            val = v;
053        }
054    
055    
056        /**
057         * Get the String representation as RingElem.
058         * @see java.lang.Object#toString()
059         */
060        @Override
061        public String toString() {
062            StringBuffer s = new StringBuffer();
063            s.append("[ ");
064            boolean first = true;
065            for (C c : val) {
066                if (first) {
067                    first = false;
068                } else {
069                    s.append(", ");
070                }
071                s.append(c.toString());
072            }
073            s.append(" ]");
074            if (!PrettyPrint.isTrue()) {
075                s.append(" :: " + modul.toString());
076                s.append("\n");
077            }
078            return s.toString();
079        }
080    
081    
082        /**
083         * Get a scripting compatible string representation.
084         * @return script compatible representation for this Element.
085         * @see edu.jas.structure.Element#toScript()
086         */
087        //JAVA6only: @Override
088        public String toScript() {
089            // Python case
090            StringBuffer s = new StringBuffer();
091            s.append("( ");
092            boolean first = true;
093            for (C c : val) {
094                if (first) {
095                    first = false;
096                } else {
097                    s.append(", ");
098                }
099                s.append(c.toScript());
100            }
101            s.append(" )");
102            return s.toString();
103        }
104    
105    
106        /**
107         * Get a scripting compatible string representation of the factory.
108         * @return script compatible representation for this ElemFactory.
109         * @see edu.jas.structure.Element#toScriptFactory()
110         */
111        //JAVA6only: @Override
112        public String toScriptFactory() {
113            // Python case
114            return factory().toScript();
115        }
116    
117    
118        /**
119         * Get the corresponding element factory.
120         * @return factory for this Element.
121         * @see edu.jas.structure.Element#factory()
122         */
123        public GenVectorModul<C> factory() {
124            return modul;
125        }
126    
127    
128        /**
129         * clone method.
130         * @see java.lang.Object#clone()
131         */
132        @Override
133        @SuppressWarnings("unchecked")
134        public GenVector<C> clone() {
135            //return modul.copy(this);
136            ArrayList<C> av = (ArrayList<C>) val;
137            return new GenVector<C>(modul, (List<C>) av.clone());
138        }
139    
140    
141        /**
142         * test if this is equal to a zero vector.
143         */
144        public boolean isZERO() {
145            return (0 == this.compareTo(modul.getZERO()));
146        }
147    
148    
149        /**
150         * equals method.
151         */
152        @Override
153        public boolean equals(Object other) {
154            if (!(other instanceof GenVector)) {
155                return false;
156            }
157            GenVector ovec = (GenVector) other;
158            if (!modul.equals(ovec.modul)) {
159                return false;
160            }
161            if (!val.equals(ovec.val)) {
162                return false;
163            }
164            return true;
165        }
166    
167    
168        /**
169         * Hash code for this GenVector.
170         * @see java.lang.Object#hashCode()
171         */
172        @Override
173        public int hashCode() {
174            return 37 * val.hashCode() + modul.hashCode();
175        }
176    
177    
178        /**
179         * compareTo, lexicogaphical comparison.
180         * @param b other
181         * @return 1 if (this &lt; b), 0 if (this == b) or -1 if (this &gt; b).
182         */
183        //JAVA6only: @Override
184        public int compareTo(GenVector<C> b) {
185            if (!modul.equals(b.modul)) {
186                return -1;
187            }
188            List<C> oval = b.val;
189            int i = 0;
190            for (C c : val) {
191                int s = c.compareTo(oval.get(i++));
192                if (s != 0) {
193                    return s;
194                }
195            }
196            return 0;
197        }
198    
199    
200        /**
201         * sign of vector.
202         * @return 1 if (this &lt; 0), 0 if (this == 0) or -1 if (this &gt; 0).
203         */
204        public int signum() {
205            return compareTo(modul.getZERO());
206        }
207    
208    
209        /**
210         * Sum of vectors.
211         * @return this+b
212         */
213        public GenVector<C> sum(GenVector<C> b) {
214            List<C> oval = b.val;
215            ArrayList<C> a = new ArrayList<C>(modul.cols);
216            int i = 0;
217            for (C c : val) {
218                C e = c.sum(oval.get(i++));
219                a.add(e);
220            }
221            return new GenVector<C>(modul, a);
222        }
223    
224    
225        /**
226         * Difference of vectors.
227         * @return this-b
228         */
229        public GenVector<C> subtract(GenVector<C> b) {
230            List<C> oval = b.val;
231            ArrayList<C> a = new ArrayList<C>(modul.cols);
232            int i = 0;
233            for (C c : val) {
234                C e = c.subtract(oval.get(i++));
235                a.add(e);
236            }
237            return new GenVector<C>(modul, a);
238        }
239    
240    
241        /**
242         * Negative of this vector.
243         * @return -this
244         */
245        public GenVector<C> negate() {
246            ArrayList<C> a = new ArrayList<C>(modul.cols);
247            for (C c : val) {
248                C e = c.negate();
249                a.add(e);
250            }
251            return new GenVector<C>(modul, a);
252        }
253    
254    
255        /**
256         * Absolute value of this vector.
257         * @return abs(this)
258         */
259        public GenVector<C> abs() {
260            if (signum() < 0) {
261                return negate();
262            }
263            return this;
264        }
265    
266    
267        /**
268         * Product of this vector with scalar.
269         * @return this*s
270         */
271        public GenVector<C> scalarMultiply(C s) {
272            ArrayList<C> a = new ArrayList<C>(modul.cols);
273            for (C c : val) {
274                C e = c.multiply(s);
275                a.add(e);
276            }
277            return new GenVector<C>(modul, a);
278        }
279    
280    
281        /**
282         * Left product of this vector with scalar.
283         * @return s*this
284         */
285        public GenVector<C> leftScalarMultiply(C s) {
286            ArrayList<C> a = new ArrayList<C>(modul.cols);
287            for (C c : val) {
288                C e = s.multiply(c);
289                a.add(e);
290            }
291            return new GenVector<C>(modul, a);
292        }
293    
294    
295        /**
296         * Linear compination of this vector with scalar multiple of other vector.
297         * @return this*s+b*t
298         */
299        public GenVector<C> linearCombination(C s, GenVector<C> b, C t) {
300            List<C> oval = b.val;
301            ArrayList<C> a = new ArrayList<C>(modul.cols);
302            int i = 0;
303            for (C c : val) {
304                C c1 = c.multiply(s);
305                C c2 = oval.get(i++).multiply(t);
306                C e = c1.sum(c2);
307                a.add(e);
308            }
309            return new GenVector<C>(modul, a);
310        }
311    
312    
313        /**
314         * Linear compination of this vector with scalar multiple of other vector.
315         * @return this+b*t
316         */
317        public GenVector<C> linearCombination(GenVector<C> b, C t) {
318            List<C> oval = b.val;
319            ArrayList<C> a = new ArrayList<C>(modul.cols);
320            int i = 0;
321            for (C c : val) {
322                C c2 = oval.get(i++).multiply(t);
323                C e = c.sum(c2);
324                a.add(e);
325            }
326            return new GenVector<C>(modul, a);
327        }
328    
329    
330        /**
331         * Left linear compination of this vector with scalar multiple of other
332         * vector.
333         * @return this+t*b
334         */
335        public GenVector<C> linearCombination(C t, GenVector<C> b) {
336            List<C> oval = b.val;
337            ArrayList<C> a = new ArrayList<C>(modul.cols);
338            int i = 0;
339            for (C c : val) {
340                C c2 = t.multiply(oval.get(i++));
341                C e = c.sum(c2);
342                a.add(e);
343            }
344            return new GenVector<C>(modul, a);
345        }
346    
347    
348        /**
349         * left linear compination of this vector with scalar multiple of other
350         * vector.
351         * @return s*this+t*b
352         */
353        public GenVector<C> leftLinearCombination(C s, C t, GenVector<C> b) {
354            List<C> oval = b.val;
355            ArrayList<C> a = new ArrayList<C>(modul.cols);
356            int i = 0;
357            for (C c : val) {
358                C c1 = s.multiply(c);
359                C c2 = t.multiply(oval.get(i++));
360                C e = c1.sum(c2);
361                a.add(e);
362            }
363            return new GenVector<C>(modul, a);
364        }
365    
366    
367        /**
368         * scalar / dot product of this vector with other vector.
369         * @return this . b
370         */
371        public C scalarProduct(GenVector<C> b) {
372            C a = modul.coFac.getZERO();
373            List<C> oval = b.val;
374            int i = 0;
375            for (C c : val) {
376                C c2 = c.multiply(oval.get(i++));
377                a = a.sum(c2);
378            }
379            return a;
380        }
381    
382    
383        /**
384         * scalar / dot product of this vector with list of other vectors.
385         * @return this * b
386         */
387        public GenVector<C> scalarProduct(List<GenVector<C>> B) {
388            GenVector<C> A = modul.getZERO();
389            int i = 0;
390            for (C c : val) {
391                GenVector<C> b = B.get(i++);
392                GenVector<C> a = b.leftScalarMultiply(c);
393                A = A.sum(a);
394            }
395            return A;
396        }
397    
398    
399        /**
400         * right scalar / dot product of this vector with list of other vectors.
401         * @return b * this
402         */
403        public GenVector<C> rightScalarProduct(List<GenVector<C>> B) {
404            GenVector<C> A = modul.getZERO();
405            int i = 0;
406            for (C c : val) {
407                GenVector<C> b = B.get(i++);
408                GenVector<C> a = b.scalarMultiply(c);
409                A = A.sum(a);
410            }
411            return A;
412        }
413    
414    }