- // private int[] findMinimalDistance() {
- // // if more than one minimal distances, always the first found is
- // // returned
- // // i could randomize this, so that any would be returned in a randomized
- // // fashion...
- // double minimum = Double.MAX_VALUE;
- // int otu_1 = -1;
- // int otu_2 = -1;
- // for( int j = 1; j < _n; ++j ) {
- // for( int i = 0; i < j; ++i ) {
- // if ( _m.getValue( i, j ) < minimum ) {
- // minimum = _m.getValue( i, j );
- // otu_1 = i;
- // otu_2 = j;
- // }
- // }
- // }
- // return new int[] { otu_1, otu_2 };
- // }
- private final PhylogenyNode getExternalPhylogenyNode( final int i ) {
- return _external_nodes[ _mappings[ i ] ];
+ private final void calculateDistancesFromNewNode( final int otu1, final int otu2, final double d ) {
+ final int m_otu1 = _mappings[ otu1 ];
+ final int m_otu2 = _mappings[ otu2 ];
+ for( int i = 0; i < _n; ++i ) {
+ if ( ( i == otu1 ) || ( i == otu2 ) ) {
+ continue;
+ }
+ final int m_i = _mappings[ i ];
+ if ( otu1 < i ) {
+ if ( otu2 > i ) {
+ _d_values[ m_otu1 ][ m_i ] = ( _d_values[ m_otu1 ][ m_i ] + _d_values[ m_i ][ m_otu2 ] - d ) / 2;
+ //System.out.print( DF.format( _d_values[ m_otu1 ][ m_i ] ) );
+ }
+ else {
+ _d_values[ m_otu1 ][ m_i ] = ( _d_values[ m_otu1 ][ m_i ] + _d_values[ m_otu2 ][ m_i ] - d ) / 2;
+ //System.out.print( DF.format( _d_values[ m_otu1 ][ m_i ] ) );
+ }
+ }
+ else {
+ if ( otu2 > i ) {
+ _d_values[ m_i ][ m_otu1 ] = ( _d_values[ m_i ][ m_otu1 ] + _d_values[ m_i ][ m_otu2 ] - d ) / 2;
+ //System.out.print( DF.format( _d_values[ m_i ][ m_otu1 ] ) );
+ }
+ else {
+ _d_values[ m_i ][ m_otu1 ] = ( _d_values[ m_i ][ m_otu1 ] + _d_values[ m_otu2 ][ m_i ] - d ) / 2;
+ // System.out.print( DF.format( _d_values[ m_otu1 ][ m_i ] ) );
+ }
+ }
+ //System.out.print( " " );
+ }
+ }
+
+ private final void calculateNetDivergences() {
+ double d;
+ for( int i = 0; i < _n; ++i ) {
+ d = 0;
+ final int m_i = _mappings[ i ];
+ for( int n = 0; n < _n; ++n ) {
+ if ( i != n ) {
+ if ( i > n ) {
+ d += _d_values[ _mappings[ n ] ][ m_i ];
+ }
+ else {
+ d += _d_values[ m_i ][ _mappings[ n ] ];
+ }
+ }
+ }
+ _r[ i ] = d;
+ }