JAL-1953 equals and hashCode now takes node ID in account
[jalview.git] / forester / java / src / org / forester / evoinference / distance / Sarray.java
1
2 package org.forester.evoinference.distance;
3
4 import java.text.DecimalFormat;
5 import java.util.ArrayList;
6 import java.util.List;
7 import java.util.Map.Entry;
8 import java.util.Set;
9 import java.util.SortedMap;
10 import java.util.TreeMap;
11
12 import org.forester.evoinference.matrix.distance.BasicSymmetricalDistanceMatrix;
13 import org.forester.evoinference.matrix.distance.DistanceMatrix;
14
15 public final class Sarray {
16
17     public final static int                       FACTOR = 1000000;
18     private final static boolean                  DEBUG  = true;
19     private final List<SortedMap<Integer, int[]>> _data;
20
21     public Sarray() {
22         _data = new ArrayList<SortedMap<Integer, int[]>>();
23     }
24
25     final public void addPairing( final double key, final int value, final int j ) {
26         addPairing( ( int ) ( FACTOR * key ), value, getS( j ) );
27     }
28
29     final public void addPairing( final int key, final int value, final int j ) {
30         addPairing( key, value, getS( j ) );
31     }
32
33     final public SortedMap<Integer, int[]> getS( final int j ) {
34         return _data.get( j );
35     }
36
37     final public int[] getValues( final int key, final int j ) {
38         return getS( j ).get( key );
39     }
40
41     final public void initialize( final DistanceMatrix d ) {
42         for( int j = 0; j < d.getSize(); ++j ) {
43             final TreeMap<Integer, int[]> map = new TreeMap<Integer, int[]>();
44             _data.add( map );
45             for( int i = 0; i < j; ++i ) {
46                 addPairing( ( int ) ( FACTOR * d.getValues()[ i ][ j ] ), i, map );
47             }
48         }
49         //System.out.println( toString() );
50     }
51
52     final public void initialize( final int size ) {
53         for( int j = 0; j < size; ++j ) {
54             final TreeMap<Integer, int[]> map = new TreeMap<Integer, int[]>();
55             _data.add( map );
56         }
57     }
58
59     final public void removePairing( final double key, final int value, final int j ) {
60         removePairing( ( int ) ( key * FACTOR ), value, j );
61     }
62
63     final public void removePairing( final int key, final int value, final int j ) {
64         final SortedMap<Integer, int[]> m = _data.get( j );
65         final int[] x = m.get( key );
66         if ( x == null ) {
67             System.out.println();
68             System.out
69             .println( "________________________________________________________________________________________" );
70             System.out.println( toString() );
71             throw new IllegalArgumentException( "key " + key + " (->" + value + ") does not exist for row " + j );
72         }
73         if ( x.length == 1 ) {
74             m.remove( key );
75         }
76         else {
77             final int[] xnew = new int[ x.length - 1 ];
78             int xc = 0;
79             for( int i = 0; ++i < x.length; ++i ) {
80                 final int xv = x[ i ];
81                 if ( xv != value ) {
82                     xnew[ xc++ ] = xv;
83                 }
84             }
85             m.put( key, xnew );
86         }
87     }
88
89     final public int size() {
90         return _data.size();
91     }
92
93     // Slow, only for testing
94     @SuppressWarnings( "unchecked")
95     final public Set<Integer>[] toArray( final int j ) {
96         return _data.get( j ).values().toArray( new Set[ _data.get( j ).size() ] );
97     }
98
99     @Override
100     final public String toString() {
101         final DecimalFormat df = new DecimalFormat( "0.000000" );
102         final StringBuilder sb = new StringBuilder();
103         for( int j = 0; j < size(); ++j ) {
104             sb.append( j );
105             sb.append( ": " );
106             for( final Entry<Integer, int[]> entry : getSentrySet( j ) ) {
107                 final double key = entry.getKey();
108                 final int[] values = entry.getValue();
109                 sb.append( df.format( key / FACTOR ) + "->" );
110                 boolean first = true;
111                 for( final int v : values ) {
112                     if ( !first ) {
113                         sb.append( "," );
114                     }
115                     first = false;
116                     sb.append( v );
117                 }
118                 sb.append( "  " );
119             }
120             sb.append( "\n" );
121         }
122         return sb.toString();
123     }
124
125     final Set<Entry<Integer, int[]>> getSentrySet( final int j ) {
126         return getS( j ).entrySet();
127     }
128
129     final private static void addPairing( final int key, final int value, final SortedMap<Integer, int[]> m ) {
130         if ( !m.containsKey( key ) ) {
131             final int[] x = new int[ 1 ];
132             x[ 0 ] = value;
133             m.put( key, x );
134         }
135         else {
136             final int[] x = new int[ m.get( key ).length + 1 ];
137             for( int i = 0; i < ( x.length - 1 ); i++ ) {
138                 x[ i ] = m.get( key )[ i ];
139             }
140             x[ x.length - 1 ] = value;
141             m.put( key, x );
142         }
143     }
144 }