using System;
using System.Collections.Generic;
namespace Legalsoft.Truffer
{
public class Phylo_nj : Phylagglom
{
public double[] u;
public override void premin(double[,] d, int[] nextp)
{
int ncurr = 0;
for (int i = 0; i >= 0; i = nextp[i])
{
ncurr++;
}
for (int i = 0; i >= 0; i = nextp[i])
{
double sum = 0.0;
for (int j = 0; j >= 0; j = nextp[j])
{
if (i != j)
{
sum += d[i, j];
}
}
u[i] = sum / (ncurr - 2);
}
}
public override double dminfn(double[,] d, int i, int j)
{
return d[i, j] - u[i] - u[j];
}
public override double dbranchfn(double[,] d, int i, int j)
{
return 0.5 * (d[i, j] + u[i] - u[j]);
}
public override double dnewfn(double[,] d, int k, int i, int j, int ni, int nj)
{
return 0.5 * (d[i, k] + d[j, k] - d[i, j]);
}
public override void drootbranchfn(double[,] d, int i, int j, int ni, int nj, ref double bi, ref double bj)
{
bi = d[i, j] * (nj - 1 + 1.0e-15) / (ni + nj - 2 + 2.0e-15);
bj = d[i, j] * (ni - 1 + 1.0e-15) / (ni + nj - 2 + 2.0e-15);
}
public Phylo_nj(double[,] dist, int fsr = -1) : base(dist, fsr)
{
this.u = new double[n];
makethetree(dist);
}
}
}
using System;
using System.Collections.Generic;
namespace Legalsoft.Truffer
{
public class Phylo_nj : Phylagglom
{
public double[] u;
public override void premin(double[,] d, int[] nextp)
{
int ncurr = 0;
for (int i = 0; i >= 0; i = nextp[i])
{
ncurr++;
}
for (int i = 0; i >= 0; i = nextp[i])
{
double sum = 0.0;
for (int j = 0; j >= 0; j = nextp[j])
{
if (i != j)
{
sum += d[i, j];
}
}
u[i] = sum / (ncurr - 2);
}
}
public override double dminfn(double[,] d, int i, int j)
{
return d[i, j] - u[i] - u[j];
}
public override double dbranchfn(double[,] d, int i, int j)
{
return 0.5 * (d[i, j] + u[i] - u[j]);
}
public override double dnewfn(double[,] d, int k, int i, int j, int ni, int nj)
{
return 0.5 * (d[i, k] + d[j, k] - d[i, j]);
}
public override void drootbranchfn(double[,] d, int i, int j, int ni, int nj, ref double bi, ref double bj)
{
bi = d[i, j] * (nj - 1 + 1.0e-15) / (ni + nj - 2 + 2.0e-15);
bj = d[i, j] * (ni - 1 + 1.0e-15) / (ni + nj - 2 + 2.0e-15);
}
public Phylo_nj(double[,] dist, int fsr = -1) : base(dist, fsr)
{
this.u = new double[n];
makethetree(dist);
}
}
}