public final class NeighborJoining {
+ private final static DecimalFormat DF = new DecimalFormat( "0.00000" );
private BasicSymmetricalDistanceMatrix _d;
private double[][] _d_values;
private final DecimalFormat _df;
updateM();
final int otu1 = _min_i;
final int otu2 = _min_j;
+ //System.out.println( _min_i + " " + _min_j );
// It is a condition that otu1 < otu2.
final PhylogenyNode node = new PhylogenyNode();
final double d = _d_values[ _mappings[ otu1 ] ][ _mappings[ otu2 ] ];
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;
+ _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;
+ _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;
+ _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;
+ _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 printProgress( final int otu1, final int otu2 ) {
- final PhylogenyNode n1 = getExternalPhylogenyNode( otu1 );
- final PhylogenyNode n2 = getExternalPhylogenyNode( otu2 );
- System.out.println( "Node " + ( ForesterUtil.isEmpty( n1.getName() ) ? n1.getId() : n1.getName() ) + " joins "
- + ( ForesterUtil.isEmpty( n2.getName() ) ? n2.getId() : n2.getName() ) );
+ System.out.println( "Node " + printProgressNodeToString( getExternalPhylogenyNode( otu1 ) ) + " joins "
+ + ( printProgressNodeToString( getExternalPhylogenyNode( otu2 ) ) ) );
+ }
+
+ private final String printProgressNodeToString( final PhylogenyNode n ) {
+ if ( n.isExternal() ) {
+ if ( ForesterUtil.isEmpty( n.getName() ) ) {
+ return Long.toString( n.getId() );
+ }
+ return n.getName();
+ }
+ return n.getId()
+ + " ("
+ + ( ForesterUtil.isEmpty( n.getChildNode1().getName() ) ? n.getChildNode1().getId() : n.getChildNode1()
+ .getName() )
+ + "+"
+ + ( ForesterUtil.isEmpty( n.getChildNode2().getName() ) ? n.getChildNode2().getId() : n.getChildNode2()
+ .getName() ) + ")";
}
// only the values in the lower triangle are used.
}
}
}
+ // for( int j = 1; j < _n; ++j ) {
+ // final double r_j = _r[ j ];
+ // final int m_j = _mappings[ j ];
+ // for( int i = 0; i < j; ++i ) {
+ // System.out.print( i );
+ // System.out.print( "->" );
+ // System.out.print( DF.format( _r[ i ] ) );
+ // System.out.print( " " );
+ // }
+ // System.out.println();
+ // }
}
// otu2 will, in effect, be "deleted" from the matrix.