2 package org.forester.evoinference.distance;
4 import java.text.DecimalFormat;
5 import java.util.ArrayList;
7 import java.util.Map.Entry;
9 import java.util.SortedMap;
10 import java.util.TreeMap;
12 import org.forester.evoinference.matrix.distance.BasicSymmetricalDistanceMatrix;
14 public final class Sarray {
16 public final static int FACTOR = 1000000;
17 private final static boolean DEBUG = true;
18 private final List<SortedMap<Integer, int[]>> _data;
21 _data = new ArrayList<SortedMap<Integer, int[]>>();
24 final public void addPairing( final double key, final int value, final int j ) {
25 addPairing( ( int ) ( FACTOR * key ), value, getS( j ) );
28 final public void addPairing( final int key, final int value, final int j ) {
29 addPairing( key, value, getS( j ) );
32 final public SortedMap<Integer, int[]> getS( final int j ) {
33 return _data.get( j );
36 final public int[] getValues( final int key, final int j ) {
37 return getS( j ).get( key );
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[]>();
44 for( int i = 0; i < j; ++i ) {
45 addPairing( ( int ) ( FACTOR * d.getValues()[ i ][ j ] ), i, map );
48 //System.out.println( toString() );
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[]>();
58 final public void removePairing( final double key, final int value, final int j ) {
59 removePairing( ( int ) ( key * FACTOR ), value, j );
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 );
68 .println( "________________________________________________________________________________________" );
69 System.out.println( toString() );
70 throw new IllegalArgumentException( "key " + key + " (->" + value + ") does not exist for row " + j );
72 if ( x.length == 1 ) {
76 final int[] xnew = new int[ x.length - 1 ];
78 for( int i = 0; ++i < x.length; ++i ) {
79 final int xv = x[ i ];
88 final public int size() {
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() ] );
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 ) {
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 ) {
121 return sb.toString();
124 final Set<Entry<Integer, int[]>> getSentrySet( final int j ) {
125 return getS( j ).entrySet();
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 ];
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 ];
139 x[ x.length - 1 ] = value;