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