001    /*
002     * $Id: ExpVectorShort.java 3295 2010-08-26 17:01:10Z kredel $
003     */
004    
005    package edu.jas.poly;
006    
007    
008    import java.util.Vector;
009    
010    
011    /**
012     * ExpVectorShort implements exponent vectors for polynomials using arrays of
013     * short as storage unit. This class is used by ExpVector internally, there is
014     * no need to use this class directly.
015     * @see ExpVector
016     * @author Heinz Kredel
017     */
018    
019    public class ExpVectorShort extends ExpVector
020    /*implements AbelianGroupElem<ExpVectorShort>*/{
021    
022    
023        /**
024         * The data structure is an array of longs.
025         */
026        /*package*/final short[] val;
027    
028    
029        /**
030         * Largest short.
031         */
032        public static long maxShort = (long) Short.MAX_VALUE / 2;
033    
034    
035        /**
036         * Smallest short.
037         */
038        public static long minShort = (long) Short.MIN_VALUE / 2;
039    
040    
041        /**
042         * Constructor for ExpVector.
043         * @param n length of exponent vector.
044         */
045        public ExpVectorShort(int n) {
046            this(new short[n]);
047        }
048    
049    
050        /**
051         * Constructor for ExpVector. Sets exponent i to e.
052         * @param n length of exponent vector.
053         * @param i index of exponent to be set.
054         * @param e exponent to be set.
055         */
056        public ExpVectorShort(int n, int i, short e) {
057            this(n);
058            val[i] = e;
059        }
060    
061    
062        /**
063         * Constructor for ExpVector. Sets exponent i to e.
064         * @param n length of exponent vector.
065         * @param i index of exponent to be set.
066         * @param e exponent to be set.
067         */
068        public ExpVectorShort(int n, int i, long e) {
069            this(n);
070            if (e >= maxShort || e <= minShort) {
071                throw new IllegalArgumentException("exponent to large: " + e);
072            }
073            val[i] = (short) e;
074        }
075    
076    
077        /**
078         * Internal constructor for ExpVector. Sets val.
079         * @param v internal representation array.
080         */
081        protected ExpVectorShort(short[] v) {
082            super();
083            val = v;
084        }
085    
086    
087        /**
088         * Constructor for ExpVector. Sets val, converts from long array.
089         * @param v long representation array.
090         */
091        public ExpVectorShort(long[] v) {
092            this(v.length);
093            for (int i = 0; i < v.length; i++) {
094                if (v[i] >= maxShort || v[i] <= minShort) {
095                    throw new IllegalArgumentException("exponent to large: " + v[i]);
096                }
097                val[i] = (short) v[i];
098            }
099        }
100    
101    
102        /**
103         * Constructor for ExpVector. Converts a String representation to an
104         * ExpVector. Accepted format = (1,2,3,4,5,6,7).
105         * @param s String representation.
106         */
107        public ExpVectorShort(String s) throws NumberFormatException {
108            super();
109            // first format = (1,2,3,4,5,6,7)
110            Vector<Short> exps = new Vector<Short>();
111            s = s.trim();
112            int b = s.indexOf('(');
113            int e = s.indexOf(')', b + 1);
114            String teil;
115            int k;
116            short a;
117            if (b >= 0 && e >= 0) {
118                b++;
119                while ((k = s.indexOf(',', b)) >= 0) {
120                    teil = s.substring(b, k);
121                    a = Short.parseShort(teil);
122                    exps.add(new Short(a));
123                    b = k + 1;
124                }
125                if (b <= e) {
126                    teil = s.substring(b, e);
127                    a = Short.parseShort(teil);
128                    exps.add(new Short(a));
129                }
130                int length = exps.size();
131                val = new short[length];
132                for (int j = 0; j < length; j++) {
133                    val[j] = exps.elementAt(j).shortValue();
134                }
135            } else {
136                // not implemented
137                val = null;
138                // length = -1;
139                //Vector names = new Vector();
140                //vars = s;
141            }
142        }
143    
144    
145        /**
146         * Clone this.
147         * @see java.lang.Object#clone()
148         */
149        @Override
150        public ExpVectorShort clone() {
151            short[] w = new short[val.length];
152            System.arraycopy(val, 0, w, 0, val.length);
153            return new ExpVectorShort(w);
154        }
155    
156    
157        /**
158         * Get the exponent vector.
159         * @return val as long.
160         */
161        @Override
162        /*package*/long[] getVal() {
163            long v[] = new long[val.length];
164            for (int i = 0; i < val.length; i++) {
165                v[i] = val[i];
166            }
167            return v;
168        }
169    
170    
171        /**
172         * Get the exponent at position i.
173         * @param i position.
174         * @return val[i].
175         */
176        @Override
177        public long getVal(int i) {
178            return val[i];
179        }
180    
181    
182        /**
183         * Set the exponent at position i to e.
184         * @param i
185         * @param e
186         * @return old val[i].
187         */
188        @Override
189        protected long setVal(int i, long e) {
190            short x = val[i];
191            if (e >= maxShort || e <= minShort) {
192                throw new IllegalArgumentException("exponent to large: " + e);
193            }
194            val[i] = (short) e;
195            hash = 0; // beware of race condition
196            return x;
197        }
198    
199    
200        /**
201         * Set the exponent at position i to e.
202         * @param i
203         * @param e
204         * @return old val[i].
205         */
206        protected short setVal(int i, short e) {
207            short x = val[i];
208            val[i] = e;
209            hash = 0; // beware of race condition
210            return x;
211        }
212    
213    
214        /**
215         * Get the length of this exponent vector.
216         * @return val.length.
217         */
218        @Override
219        public int length() {
220            return val.length;
221        }
222    
223    
224        /**
225         * Extend variables. Used e.g. in module embedding. Extend this by i
226         * elements and set val[j] to e.
227         * @param i number of elements to extend.
228         * @param j index of element to be set.
229         * @param e new exponent for val[j].
230         * @return extended exponent vector.
231         */
232        @Override
233        public ExpVectorShort extend(int i, int j, long e) {
234            short[] w = new short[val.length + i];
235            System.arraycopy(val, 0, w, i, val.length);
236            if (j >= i) {
237                throw new IllegalArgumentException("i " + i + " <= j " + j + " invalid");
238            }
239            if (e >= maxShort || e <= minShort) {
240                throw new IllegalArgumentException("exponent to large: " + e);
241            }
242            w[j] = (short) e;
243            return new ExpVectorShort(w);
244        }
245    
246    
247        /**
248         * Extend lower variables. Extend this by i lower elements and set val[j] to
249         * e.
250         * @param i number of elements to extend.
251         * @param j index of element to be set.
252         * @param e new exponent for val[j].
253         * @return extended exponent vector.
254         */
255        @Override
256        public ExpVectorShort extendLower(int i, int j, long e) {
257            short[] w = new short[val.length + i];
258            System.arraycopy(val, 0, w, 0, val.length);
259            if (j >= i) {
260                throw new IllegalArgumentException("i " + i + " <= j " + j + " invalid");
261            }
262            w[val.length + j] = (short) e;
263            return new ExpVectorShort(w);
264        }
265    
266    
267        /**
268         * Contract variables. Used e.g. in module embedding. Contract this to len
269         * elements.
270         * @param i position of first element to be copied.
271         * @param len new length.
272         * @return contracted exponent vector.
273         */
274        @Override
275        public ExpVectorShort contract(int i, int len) {
276            if (i + len > val.length) {
277                throw new IllegalArgumentException("len " + len + " > val.len " + val.length);
278            }
279            short[] w = new short[len];
280            System.arraycopy(val, i, w, 0, len);
281            return new ExpVectorShort(w);
282        }
283    
284    
285        /**
286         * Reverse variables. Used e.g. in opposite rings.
287         * @return reversed exponent vector.
288         */
289        @Override
290        public ExpVectorShort reverse() {
291            short[] w = new short[val.length];
292            for (int i = 0; i < val.length; i++) {
293                w[i] = val[val.length - 1 - i];
294            }
295            return new ExpVectorShort(w);
296        }
297    
298    
299        /**
300         * Reverse j variables. Used e.g. in opposite rings. Reverses the first j-1
301         * variables, the rest is unchanged.
302         * @param j index of first variable not reversed.
303         * @return reversed exponent vector.
304         */
305        @Override
306        public ExpVectorShort reverse(int j) {
307            if (j <= 0 || j > val.length) {
308                return this;
309            }
310            short[] w = new short[val.length];
311            for (int i = 0; i < j; i++) {
312                w[i] = val[j - 1 - i];
313            }
314            // copy rest
315            for (int i = j; i < val.length; i++) {
316                w[i] = val[i];
317            }
318            return new ExpVectorShort(w);
319        }
320    
321    
322        /**
323         * Combine with ExpVector. Combine this with the other ExpVector V.
324         * @param V the other exponent vector.
325         * @return combined exponent vector.
326         */
327        @Override
328        public ExpVectorShort combine(ExpVector V) {
329            if (V == null || V.length() == 0) {
330                return this;
331            }
332            ExpVectorShort Vi = (ExpVectorShort) V;
333            if (val.length == 0) {
334                return Vi;
335            }
336            short[] w = new short[val.length + Vi.val.length];
337            System.arraycopy(val, 0, w, 0, val.length);
338            System.arraycopy(Vi.val, 0, w, val.length, Vi.val.length);
339            return new ExpVectorShort(w);
340        }
341    
342    
343        /**
344         * Get the string representation.
345         * @see java.lang.Object#toString()
346         */
347        @Override
348        public String toString() {
349            return super.toString() + ":short";
350        }
351    
352    
353        /**
354         * Comparison with any other object.
355         * @see java.lang.Object#equals(java.lang.Object)
356         */
357        @Override
358        public boolean equals(Object B) {
359            if (!(B instanceof ExpVectorShort)) {
360                return false;
361            }
362            ExpVectorShort b = (ExpVectorShort) B;
363            int t = this.invLexCompareTo(b);
364            //System.out.println("equals: this = " + this + " B = " + B + " t = " + t);
365            return (0 == t);
366        }
367    
368    
369        /**
370         * ExpVector absolute value.
371         * @return abs(this).
372         */
373        @Override
374        public ExpVectorShort abs() {
375            short[] u = val;
376            short[] w = new short[u.length];
377            for (int i = 0; i < u.length; i++) {
378                if (u[i] >= 0L) {
379                    w[i] = u[i];
380                } else {
381                    w[i] = (short) (-u[i]);
382                }
383            }
384            return new ExpVectorShort(w);
385            //return EVABS(this);
386        }
387    
388    
389        /**
390         * ExpVector negate.
391         * @return -this.
392         */
393        @Override
394        public ExpVectorShort negate() {
395            short[] u = val;
396            short[] w = new short[u.length];
397            for (int i = 0; i < u.length; i++) {
398                w[i] = (short) (-u[i]);
399            }
400            return new ExpVectorShort(w);
401            // return EVNEG(this);
402        }
403    
404    
405        /**
406         * ExpVector summation.
407         * @param V
408         * @return this+V.
409         */
410        @Override
411        public ExpVectorShort sum(ExpVector V) {
412            short[] u = val;
413            short[] v = ((ExpVectorShort) V).val;
414            short[] w = new short[u.length];
415            for (int i = 0; i < u.length; i++) {
416                w[i] = (short) (u[i] + v[i]);
417            }
418            return new ExpVectorShort(w);
419            // return EVSUM(this, V);
420        }
421    
422    
423        /**
424         * ExpVector subtract. Result may have negative entries.
425         * @param V
426         * @return this-V.
427         */
428        @Override
429        public ExpVectorShort subtract(ExpVector V) {
430            short[] u = val;
431            short[] v = ((ExpVectorShort) V).val;
432            short[] w = new short[u.length];
433            for (int i = 0; i < u.length; i++) {
434                w[i] = (short) (u[i] - v[i]);
435            }
436            return new ExpVectorShort(w);
437            //return EVDIF(this, V);
438        }
439    
440    
441        /**
442         * ExpVector substitution. Clone and set exponent to d at position i.
443         * @param i position.
444         * @param d new exponent.
445         * @return substituted ExpVector.
446         */
447        public ExpVectorShort subst(int i, short d) {
448            ExpVectorShort V = (ExpVectorShort) this.clone();
449            long e = V.setVal(i, d);
450            return V;
451            //return EVSU(this, i, d);
452        }
453    
454    
455        /**
456         * ExpVector substitution. Clone and set exponent to d at position i.
457         * @param i position.
458         * @param d new exponent.
459         * @return substituted ExpVector.
460         */
461        @Override
462        public ExpVectorShort subst(int i, long d) {
463            ExpVectorShort V = (ExpVectorShort) this.clone();
464            long e = V.setVal(i, d);
465            return V;
466            //return EVSU(this, i, d);
467        }
468    
469    
470        /**
471         * ExpVector signum.
472         * @return 0 if this is zero, -1 if some entry is negative, 1 if no entry is
473         *         negative and at least one entry is positive.
474         */
475        @Override
476        public int signum() {
477            int t = 0;
478            short[] u = val;
479            for (int i = 0; i < u.length; i++) {
480                if (u[i] < 0) {
481                    return -1;
482                }
483                if (u[i] > 0) {
484                    t = 1;
485                }
486            }
487            return t;
488            //return EVSIGN(this);
489        }
490    
491    
492        /**
493         * ExpVector total degree.
494         * @return sum of all exponents.
495         */
496        @Override
497        public long totalDeg() {
498            long t = 0;
499            short[] u = val; // U.val;
500            for (int i = 0; i < u.length; i++) {
501                t += u[i];
502            }
503            return t;
504            //return EVTDEG(this);
505        }
506    
507    
508        /**
509         * ExpVector maximal degree.
510         * @return maximal exponent.
511         */
512        @Override
513        public long maxDeg() {
514            long t = 0;
515            short[] u = val;
516            for (int i = 0; i < u.length; i++) {
517                if (u[i] > t) {
518                    t = u[i];
519                }
520            }
521            return t;
522            //return EVMDEG(this);
523        }
524    
525    
526        /**
527         * ExpVector weighted degree.
528         * @param w weights.
529         * @return weighted sum of all exponents.
530         */
531        @Override
532        public long weightDeg(long[][] w) {
533            if (w == null || w.length == 0) {
534                return totalDeg(); // assume weight 1 
535            }
536            long t = 0;
537            short[] u = val;
538            for (int j = 0; j < w.length; j++) {
539                long[] wj = w[j];
540                for (int i = 0; i < u.length; i++) {
541                    t += wj[i] * u[i];
542                }
543            }
544            return t;
545            //return EVWDEG( w, this );
546        }
547    
548    
549        /**
550         * ExpVector least common multiple.
551         * @param V
552         * @return component wise maximum of this and V.
553         */
554        @Override
555        public ExpVectorShort lcm(ExpVector V) {
556            short[] u = val;
557            short[] v = ((ExpVectorShort) V).val;
558            short[] w = new short[u.length];
559            for (int i = 0; i < u.length; i++) {
560                w[i] = (u[i] >= v[i] ? u[i] : v[i]);
561            }
562            return new ExpVectorShort(w);
563            //return EVLCM(this, V);
564        }
565    
566    
567        /**
568         * ExpVector greatest common divisor.
569         * @param V
570         * @return component wise minimum of this and V.
571         */
572        @Override
573        public ExpVectorShort gcd(ExpVector V) {
574            short[] u = val;
575            short[] v = ((ExpVectorShort) V).val;
576            short[] w = new short[u.length];
577            for (int i = 0; i < u.length; i++) {
578                w[i] = (u[i] <= v[i] ? u[i] : v[i]);
579            }
580            return new ExpVectorShort(w);
581            //return EVGCD(this, V);
582        }
583    
584    
585        /**
586         * ExpVector dependency on variables.
587         * @return array of indices where val has positive exponents.
588         */
589        @Override
590        public int[] dependencyOnVariables() {
591            short[] u = val;
592            int l = 0;
593            for (int i = 0; i < u.length; i++) {
594                if (u[i] > 0) {
595                    l++;
596                }
597            }
598            int[] dep = new int[l];
599            if (l == 0) {
600                return dep;
601            }
602            int j = 0;
603            for (int i = 0; i < u.length; i++) {
604                if (u[i] > 0) {
605                    dep[j] = i;
606                    j++;
607                }
608            }
609            return dep;
610        }
611    
612    
613        /**
614         * ExpVector multiple test. Test if this is component wise greater or equal
615         * to V.
616         * @param V
617         * @return true if this is a multiple of V, else false.
618         */
619        @Override
620        public boolean multipleOf(ExpVector V) {
621            short[] u = val;
622            short[] v = ((ExpVectorShort) V).val;
623            boolean t = true;
624            for (int i = 0; i < u.length; i++) {
625                if (u[i] < v[i]) {
626                    return false;
627                }
628            }
629            return t;
630            //return EVMT(this, V);
631        }
632    
633    
634        /**
635         * ExpVector compareTo.
636         * @param V
637         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
638         */
639        //@Override
640        @Override
641        public int compareTo(ExpVector V) {
642            return this.invLexCompareTo(V);
643        }
644    
645    
646        /**
647         * ExpVector inverse lexicographical compareTo.
648         * @param V
649         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
650         */
651        @Override
652        public int invLexCompareTo(ExpVector V) {
653            short[] u = val;
654            short[] v = ((ExpVectorShort) V).val;
655            int t = 0;
656            for (int i = 0; i < u.length; i++) {
657                if (u[i] > v[i])
658                    return 1;
659                if (u[i] < v[i])
660                    return -1;
661            }
662            return t;
663            //return EVILCP(this, V);
664        }
665    
666    
667        /**
668         * ExpVector inverse lexicographical compareTo.
669         * @param V
670         * @param begin
671         * @param end
672         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
673         */
674        @Override
675        public int invLexCompareTo(ExpVector V, int begin, int end) {
676            short[] u = val;
677            short[] v = ((ExpVectorShort) V).val;
678            int t = 0;
679            for (int i = begin; i < end; i++) {
680                if (u[i] > v[i])
681                    return 1;
682                if (u[i] < v[i])
683                    return -1;
684            }
685            return t;
686            //return EVILCP(this, V, begin, end);
687        }
688    
689    
690        /**
691         * ExpVector inverse graded lexicographical compareTo.
692         * @param V
693         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
694         */
695        @Override
696        public int invGradCompareTo(ExpVector V) {
697            short[] u = val;
698            short[] v = ((ExpVectorShort) V).val;
699            int t = 0;
700            int i;
701            for (i = 0; i < u.length; i++) {
702                if (u[i] > v[i]) {
703                    t = 1;
704                    break;
705                }
706                if (u[i] < v[i]) {
707                    t = -1;
708                    break;
709                }
710            }
711            if (t == 0) {
712                return t;
713            }
714            long up = 0;
715            long vp = 0;
716            for (int j = i; j < u.length; j++) {
717                up += u[j];
718                vp += v[j];
719            }
720            if (up > vp) {
721                t = 1;
722            } else {
723                if (up < vp) {
724                    t = -1;
725                }
726            }
727            return t;
728            //return EVIGLC(this, V);
729        }
730    
731    
732        /**
733         * ExpVector inverse graded lexicographical compareTo.
734         * @param V
735         * @param begin
736         * @param end
737         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
738         */
739        @Override
740        public int invGradCompareTo(ExpVector V, int begin, int end) {
741            short[] u = val;
742            short[] v = ((ExpVectorShort) V).val;
743            int t = 0;
744            int i;
745            for (i = begin; i < end; i++) {
746                if (u[i] > v[i]) {
747                    t = 1;
748                    break;
749                }
750                if (u[i] < v[i]) {
751                    t = -1;
752                    break;
753                }
754            }
755            if (t == 0) {
756                return t;
757            }
758            long up = 0;
759            long vp = 0;
760            for (int j = i; j < end; j++) {
761                up += u[j];
762                vp += v[j];
763            }
764            if (up > vp) {
765                t = 1;
766            } else {
767                if (up < vp) {
768                    t = -1;
769                }
770            }
771            return t;
772            //return EVIGLC(this, V, begin, end);
773        }
774    
775    
776        /**
777         * ExpVector reverse inverse lexicographical compareTo.
778         * @param V
779         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
780         */
781        @Override
782        public int revInvLexCompareTo(ExpVector V) {
783            short[] u = val;
784            short[] v = ((ExpVectorShort) V).val;
785            int t = 0;
786            for (int i = u.length - 1; i >= 0; i--) {
787                if (u[i] > v[i])
788                    return 1;
789                if (u[i] < v[i])
790                    return -1;
791            }
792            return t;
793            //return EVRILCP(this, V);
794        }
795    
796    
797        /**
798         * ExpVector reverse inverse lexicographical compareTo.
799         * @param V
800         * @param begin
801         * @param end
802         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
803         */
804        @Override
805        public int revInvLexCompareTo(ExpVector V, int begin, int end) {
806            short[] u = val;
807            short[] v = ((ExpVectorShort) V).val;
808            int t = 0;
809            for (int i = end - 1; i >= begin; i--) {
810                if (u[i] > v[i])
811                    return 1;
812                if (u[i] < v[i])
813                    return -1;
814            }
815            return t;
816            //return EVRILCP(this, V, begin, end);
817        }
818    
819    
820        /**
821         * ExpVector reverse inverse graded compareTo.
822         * @param V
823         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
824         */
825        @Override
826        public int revInvGradCompareTo(ExpVector V) {
827            short[] u = val;
828            short[] v = ((ExpVectorShort) V).val;
829            int t = 0;
830            int i;
831            for (i = u.length - 1; i >= 0; i--) {
832                if (u[i] > v[i]) {
833                    t = 1;
834                    break;
835                }
836                if (u[i] < v[i]) {
837                    t = -1;
838                    break;
839                }
840            }
841            if (t == 0) {
842                return t;
843            }
844            long up = 0;
845            long vp = 0;
846            for (int j = i; j >= 0; j--) {
847                up += u[j];
848                vp += v[j];
849            }
850            if (up > vp) {
851                t = 1;
852            } else {
853                if (up < vp) {
854                    t = -1;
855                }
856            }
857            return t;
858            //return EVRIGLC(this, V);
859        }
860    
861    
862        /**
863         * ExpVector reverse inverse graded compareTo.
864         * @param V
865         * @param begin
866         * @param end
867         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
868         */
869        @Override
870        public int revInvGradCompareTo(ExpVector V, int begin, int end) {
871            short[] u = val;
872            short[] v = ((ExpVectorShort) V).val;
873            int t = 0;
874            int i;
875            for (i = end - 1; i >= begin; i--) {
876                if (u[i] > v[i]) {
877                    t = 1;
878                    break;
879                }
880                if (u[i] < v[i]) {
881                    t = -1;
882                    break;
883                }
884            }
885            if (t == 0) {
886                return t;
887            }
888            long up = 0;
889            long vp = 0;
890            for (int j = i; j >= begin; j--) {
891                up += u[j];
892                vp += v[j];
893            }
894            if (up > vp) {
895                t = 1;
896            } else {
897                if (up < vp) {
898                    t = -1;
899                }
900            }
901            return t;
902            //return EVRIGLC(this, V, begin, end);
903        }
904    
905    
906        /**
907         * ExpVector inverse weighted lexicographical compareTo.
908         * @param w weight array.
909         * @param V
910         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
911         */
912        @Override
913        public int invWeightCompareTo(long[][] w, ExpVector V) {
914            short[] u = val;
915            short[] v = ((ExpVectorShort) V).val;
916            int t = 0;
917            int i;
918            for (i = 0; i < u.length; i++) {
919                if (u[i] > v[i]) {
920                    t = 1;
921                    break;
922                }
923                if (u[i] < v[i]) {
924                    t = -1;
925                    break;
926                }
927            }
928            if (t == 0) {
929                return t;
930            }
931            for (int k = 0; k < w.length; k++) {
932                long[] wk = w[k];
933                long up = 0;
934                long vp = 0;
935                for (int j = i; j < u.length; j++) {
936                    up += wk[j] * u[j];
937                    vp += wk[j] * v[j];
938                }
939                if (up > vp) {
940                    return 1;
941                } else if (up < vp) {
942                    return -1;
943                }
944            }
945            return t;
946            //return EVIWLC(w, this, V);
947        }
948    
949    
950        /**
951         * ExpVector inverse weighted lexicographical compareTo.
952         * @param w weight array.
953         * @param V
954         * @param begin
955         * @param end
956         * @return 0 if U == V, -1 if U &lt; V, 1 if U &gt; V.
957         */
958        @Override
959        public int invWeightCompareTo(long[][] w, ExpVector V, int begin, int end) {
960            short[] u = val;
961            short[] v = ((ExpVectorShort) V).val;
962            int t = 0;
963            int i;
964            for (i = begin; i < end; i++) {
965                if (u[i] > v[i]) {
966                    t = 1;
967                    break;
968                }
969                if (u[i] < v[i]) {
970                    t = -1;
971                    break;
972                }
973            }
974            if (t == 0) {
975                return t;
976            }
977            for (int k = 0; k < w.length; k++) {
978                long[] wk = w[k];
979                long up = 0;
980                long vp = 0;
981                for (int j = i; j < end; j++) {
982                    up += wk[j] * u[j];
983                    vp += wk[j] * v[j];
984                }
985                if (up > vp) {
986                    return 1;
987                } else if (up < vp) {
988                    return -1;
989                }
990            }
991            return t;
992            //return EVIWLC(w, this, V, begin, end);
993        }
994    
995    }