e1593f4ada902510517c4bb6e5f74abce8ded07d
[jalview.git] / forester / java / src / org / forester / evoinference / distance / S.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.SortedSet;
11 import java.util.TreeMap;
12 import java.util.TreeSet;
13
14 import org.forester.evoinference.matrix.distance.BasicSymmetricalDistanceMatrix;
15
16 public class S {
17
18     private final List<SortedMap<Double, SortedSet<Integer>>> _data;
19
20     S() {
21         _data = new ArrayList<SortedMap<Double, SortedSet<Integer>>>();
22     }
23
24     @Override
25     public String toString() {
26         final DecimalFormat df = new DecimalFormat( "0.00" );
27         final StringBuilder sb = new StringBuilder();
28         for( int j = 1; j < size(); ++j ) {
29             for( final Entry<Double, SortedSet<Integer>> entry : getSentrySet( j ) ) {
30                 final double key = entry.getKey();
31                 final SortedSet<Integer> values = entry.getValue();
32                 sb.append( df.format( key ) + "->" );
33                 boolean first = true;
34                 for( final Integer v : values ) {
35                     if ( !first ) {
36                         sb.append( "," );
37                     }
38                     first = false;
39                     sb.append( v );
40                 }
41                 sb.append( "  " );
42             }
43             sb.append( "\n" );
44         }
45         return sb.toString();
46     }
47
48     void addPairing( final double key, final int value, final int j ) {
49         final SortedMap<Double, SortedSet<Integer>> m = getS( j );
50         addPairing( key, value, m );
51     }
52
53     SortedMap<Double, SortedSet<Integer>> getS( final int j ) {
54         return _data.get( j );
55     }
56
57     Set<Entry<Double, SortedSet<Integer>>> getSentrySet( final int j ) {
58         return getS( j ).entrySet();
59     }
60
61     void initialize( final BasicSymmetricalDistanceMatrix d ) {
62         for( int j = 0; j < d.getSize(); ++j ) {
63             final TreeMap<Double, SortedSet<Integer>> map = new TreeMap<Double, SortedSet<Integer>>();
64             _data.add( map );
65             for( int i = 0; i < j; ++i ) {
66                 addPairing( d.getValues()[ i ][ j ], i, map );
67             }
68         }
69         System.out.println( toString() );
70     }
71
72     void removePairing( final double key, final int value, final int j ) {
73         final SortedMap<Double, SortedSet<Integer>> m = _data.get( j );
74         final SortedSet<Integer> x = m.get( key );
75         if ( x.size() == 1 ) {
76             if ( !x.contains( value ) ) {
77                 //TODO remove me later
78                 throw new IllegalStateException( "pairing " + key + " -> " + value + " does not exist" );
79             }
80             m.remove( key );
81         }
82         else if ( x.size() > 1 ) {
83             final boolean removed = x.remove( value );
84             if ( !removed ) {
85                 //TODO remove me later
86                 throw new IllegalStateException( "pairing " + key + " -> " + value + " does not exist/was not removed" );
87             }
88         }
89         else {
90             //TODO remove me later
91             throw new IllegalStateException( "empty" );
92         }
93     }
94
95     int size() {
96         return _data.size();
97     }
98
99     private static void addPairing( final double key, final int value, final SortedMap<Double, SortedSet<Integer>> m ) {
100         if ( !m.containsKey( key ) ) {
101             final TreeSet<Integer> x = new TreeSet<Integer>();
102             x.add( value );
103             m.put( key, x );
104         }
105         else {
106             if ( m.get( key ).contains( value ) ) {
107                 //TODO remove me later
108                 throw new IllegalStateException( "pairing " + key + " -> " + value + " already exists" );
109             }
110             m.get( key ).add( value );
111         }
112     }
113 }